Allows the user to resize panes using hotkeys

Changes:
- Adds 4 hotkeys for resizing panes horizontally and vertically
- Updates the config files (default not set)
- Updates the window settings to allow the user to modify the pane
  resize increments
This commit is contained in:
christianbingman 2022-04-11 19:44:24 -05:00
parent 95ae4b84a6
commit 4cf9eda55f
7 changed files with 131 additions and 0 deletions

View file

@ -5,9 +5,11 @@ import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
import { TabsService, NewTabParameters } from '../services/tabs.service'
import { HotkeysService } from '../services/hotkeys.service'
import { TabRecoveryService } from '../services/tabRecovery.service'
import { ConfigService } from '../api'
export type SplitOrientation = 'v' | 'h'
export type SplitDirection = 'r' | 't' | 'b' | 'l'
export type ResizeDirection = 'v' | 'h' | 'dv' | 'dh'
/**
* Describes a horizontal or vertical split row or column
@ -250,6 +252,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
private hotkeys: HotkeysService,
private tabsService: TabsService,
private tabRecovery: TabRecoveryService,
private config: ConfigService,
) {
super()
this.root = new SplitContainer()
@ -313,6 +316,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
case 'close-pane':
this.removeTab(this.focusedTab)
break
case 'pane-increase-vertical':
this.resizePane('v')
break
case 'pane-decrease-vertical':
this.resizePane('dv')
break
case 'pane-increase-horizontal':
this.resizePane('h')
break
case 'pane-decrease-horizontal':
this.resizePane('dh')
break
}
})
}
@ -504,6 +519,81 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
this.updateTitle()
}
/**
* Changes the size of the focused pane in the given direction
*/
resizePane (direction: ResizeDirection): void {
const resizeIncrement = this.config.store.appearance.paneResize
// The direction of the resize pane, vertically or horizontally
let directionvh: SplitOrientation = 'h'
const isDecreasing: boolean = direction === 'dv' || direction === 'dh'
if (direction === 'dh') {
directionvh = 'h'
}
if (direction === 'dv') {
directionvh = 'v'
}
if (direction === 'h') {
directionvh = 'h'
}
if (direction === 'v') {
directionvh = 'v'
}
if (!this.focusedTab) {
console.debug('No currently focused tab')
return
}
let cur: BaseTabComponent | SplitContainer = this.focusedTab
let child: BaseTabComponent | SplitContainer | null = this.focusedTab
let curSplitOrientation: SplitOrientation | null = null
// Find the first split that is in the orientations that the user chooses to change
while (curSplitOrientation !== directionvh) {
const par = this.getParentOf(cur)
if (par == null) {
return
}
child = cur
cur = par
if (cur instanceof SplitContainer) {
curSplitOrientation = cur.orientation
}
}
const curSplit: SplitContainer = cur as SplitContainer
// Determine which index in the ratios refers to the child that will be modified
const currentChildIndex = (cur as SplitContainer).children.indexOf(child)
let updatedRatio = 0
if (isDecreasing) {
updatedRatio = curSplit.ratios[currentChildIndex] - resizeIncrement
if (updatedRatio < 0) {
return
}
} else {
updatedRatio = curSplit.ratios[currentChildIndex] + resizeIncrement
if (updatedRatio > 1) {
return
}
}
const ratioModifier = resizeIncrement / curSplit.ratios.length
// Modify all the ratios evenly to normalize the pane sizes
curSplit.ratios.forEach((ratio) => {
if (isDecreasing) {
curSplit.ratios[ratio] += ratioModifier
} else {
curSplit.ratios[ratio] -= ratioModifier
}
})
curSplit.ratios[currentChildIndex] = updatedRatio
this.layout()
}
/**
* Moves focus in the given direction
*/

View file

@ -75,6 +75,10 @@ hotkeys:
- 'Ctrl-Alt-]'
pane-maximize:
- 'Ctrl-Alt-Enter'
pane-increase-vertical: []
pane-decrease-vertical: []
pane-increase-horizontal: []
pane-decrease-horizontal: []
close-pane: []
switch-profile:
- 'Ctrl-Alt-T'

View file

@ -75,6 +75,10 @@ hotkeys:
- '⌘-⌥-Enter'
close-pane:
- '⌘-Shift-W'
pane-increase-vertical: []
pane-decrease-vertical: []
pane-increase-horizontal: []
pane-decrease-horizontal: []
profile-selector:
- '⌘-E'
switch-profile:

View file

@ -77,6 +77,10 @@ hotkeys:
pane-maximize:
- 'Ctrl-Alt-Enter'
close-pane: []
pane-increase-vertical: []
pane-decrease-vertical: []
pane-increase-horizontal: []
pane-decrease-horizontal: []
switch-profile:
- 'Ctrl-Alt-T'
profile-selector:

View file

@ -12,6 +12,7 @@ appearance:
frame: thin
css: '/* * { color: blue !important; } */'
opacity: 1.0
paneResize: 0.1
vibrancy: false
vibrancyType: 'blur'
terminal:

View file

@ -196,6 +196,22 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: 'close-pane',
name: this.translate.instant('Close focused pane'),
},
{
id: 'pane-increase-vertical',
name: this.translate.instant('Increase vertical split size'),
},
{
id: 'pane-decrease-vertical',
name: this.translate.instant('Decrease vertical split size'),
},
{
id: 'pane-increase-horizontal',
name: this.translate.instant('Increase horizontal split size'),
},
{
id: 'pane-decrease-horizontal',
name: this.translate.instant('Decrease horizontal split size'),
},
]
constructor (

View file

@ -66,6 +66,18 @@ h3.mb-3(translate) Window
step='0.01'
)
.form-line()
.header
.title(translate) Pane Resize Increment
input(
type='range',
[(ngModel)]='config.store.appearance.paneResize',
(ngModelChange)='saveConfiguration();',
min='0.1',
max='0.9',
step='0.05'
)
.form-line(*ngIf='platform.supportsWindowControls')
.header
.title(translate) Window frame