mirror of
https://github.com/Eugeny/tabby.git
synced 2025-08-27 11:41:54 +00:00
Merge pull request #6140 from ChristianBingman/pane-resizing-with-hotkeys
This commit is contained in:
@@ -5,9 +5,11 @@ import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
|
|||||||
import { TabsService, NewTabParameters } from '../services/tabs.service'
|
import { TabsService, NewTabParameters } from '../services/tabs.service'
|
||||||
import { HotkeysService } from '../services/hotkeys.service'
|
import { HotkeysService } from '../services/hotkeys.service'
|
||||||
import { TabRecoveryService } from '../services/tabRecovery.service'
|
import { TabRecoveryService } from '../services/tabRecovery.service'
|
||||||
|
import { ConfigService } from '../api'
|
||||||
|
|
||||||
export type SplitOrientation = 'v' | 'h'
|
export type SplitOrientation = 'v' | 'h'
|
||||||
export type SplitDirection = 'r' | 't' | 'b' | 'l'
|
export type SplitDirection = 'r' | 't' | 'b' | 'l'
|
||||||
|
export type ResizeDirection = 'v' | 'h' | 'dv' | 'dh'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes a horizontal or vertical split row or column
|
* Describes a horizontal or vertical split row or column
|
||||||
@@ -250,6 +252,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
private hotkeys: HotkeysService,
|
private hotkeys: HotkeysService,
|
||||||
private tabsService: TabsService,
|
private tabsService: TabsService,
|
||||||
private tabRecovery: TabRecoveryService,
|
private tabRecovery: TabRecoveryService,
|
||||||
|
private config: ConfigService,
|
||||||
) {
|
) {
|
||||||
super()
|
super()
|
||||||
this.root = new SplitContainer()
|
this.root = new SplitContainer()
|
||||||
@@ -313,6 +316,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
case 'close-pane':
|
case 'close-pane':
|
||||||
this.removeTab(this.focusedTab)
|
this.removeTab(this.focusedTab)
|
||||||
break
|
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,75 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
this.updateTitle()
|
this.updateTitle()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the size of the focused pane in the given direction
|
||||||
|
*/
|
||||||
|
resizePane (direction: ResizeDirection): void {
|
||||||
|
const resizeStep = this.config.store.terminal.paneResizeStep
|
||||||
|
|
||||||
|
// 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 currentContainer: 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 parentContainer = this.getParentOf(currentContainer)
|
||||||
|
if (!parentContainer) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
child = currentContainer
|
||||||
|
currentContainer = parentContainer
|
||||||
|
if (currentContainer instanceof SplitContainer) {
|
||||||
|
curSplitOrientation = currentContainer.orientation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(currentContainer instanceof SplitContainer)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine which index in the ratios refers to the child that will be modified
|
||||||
|
const currentChildIndex = currentContainer.children.indexOf(child)
|
||||||
|
|
||||||
|
let updatedRatio = 0
|
||||||
|
if (isDecreasing) {
|
||||||
|
updatedRatio = currentContainer.ratios[currentChildIndex] - resizeStep
|
||||||
|
if (updatedRatio < 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
updatedRatio = currentContainer.ratios[currentChildIndex] + resizeStep
|
||||||
|
if (updatedRatio > 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentContainer.ratios[currentChildIndex] = updatedRatio
|
||||||
|
this.layout()
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves focus in the given direction
|
* Moves focus in the given direction
|
||||||
*/
|
*/
|
||||||
|
@@ -75,6 +75,10 @@ hotkeys:
|
|||||||
- 'Ctrl-Alt-]'
|
- 'Ctrl-Alt-]'
|
||||||
pane-maximize:
|
pane-maximize:
|
||||||
- 'Ctrl-Alt-Enter'
|
- 'Ctrl-Alt-Enter'
|
||||||
|
pane-increase-vertical: []
|
||||||
|
pane-decrease-vertical: []
|
||||||
|
pane-increase-horizontal: []
|
||||||
|
pane-decrease-horizontal: []
|
||||||
close-pane: []
|
close-pane: []
|
||||||
switch-profile:
|
switch-profile:
|
||||||
- 'Ctrl-Alt-T'
|
- 'Ctrl-Alt-T'
|
||||||
|
@@ -75,6 +75,10 @@ hotkeys:
|
|||||||
- '⌘-⌥-Enter'
|
- '⌘-⌥-Enter'
|
||||||
close-pane:
|
close-pane:
|
||||||
- '⌘-Shift-W'
|
- '⌘-Shift-W'
|
||||||
|
pane-increase-vertical: []
|
||||||
|
pane-decrease-vertical: []
|
||||||
|
pane-increase-horizontal: []
|
||||||
|
pane-decrease-horizontal: []
|
||||||
profile-selector:
|
profile-selector:
|
||||||
- '⌘-E'
|
- '⌘-E'
|
||||||
switch-profile:
|
switch-profile:
|
||||||
|
@@ -77,6 +77,10 @@ hotkeys:
|
|||||||
pane-maximize:
|
pane-maximize:
|
||||||
- 'Ctrl-Alt-Enter'
|
- 'Ctrl-Alt-Enter'
|
||||||
close-pane: []
|
close-pane: []
|
||||||
|
pane-increase-vertical: []
|
||||||
|
pane-decrease-vertical: []
|
||||||
|
pane-increase-horizontal: []
|
||||||
|
pane-decrease-horizontal: []
|
||||||
switch-profile:
|
switch-profile:
|
||||||
- 'Ctrl-Alt-T'
|
- 'Ctrl-Alt-T'
|
||||||
profile-selector:
|
profile-selector:
|
||||||
|
@@ -17,6 +17,7 @@ appearance:
|
|||||||
terminal:
|
terminal:
|
||||||
showBuiltinProfiles: true
|
showBuiltinProfiles: true
|
||||||
showRecentProfiles: 3
|
showRecentProfiles: 3
|
||||||
|
paneResizeStep: 0.1
|
||||||
hotkeys:
|
hotkeys:
|
||||||
profile:
|
profile:
|
||||||
__nonStructural: true
|
__nonStructural: true
|
||||||
|
@@ -196,6 +196,22 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
|||||||
id: 'close-pane',
|
id: 'close-pane',
|
||||||
name: this.translate.instant('Close focused 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 (
|
constructor (
|
||||||
|
@@ -304,6 +304,21 @@ h3.mt-4(translate) Tabs
|
|||||||
(ngModelChange)='config.save();',
|
(ngModelChange)='config.save();',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
h3.mt-4(translate) Panes
|
||||||
|
|
||||||
|
.form-line()
|
||||||
|
.header
|
||||||
|
.title(translate) Pane resize step
|
||||||
|
.description(translate) For keyboard shortcuts
|
||||||
|
input(
|
||||||
|
type='range',
|
||||||
|
[(ngModel)]='config.store.terminal.paneResizeStep',
|
||||||
|
(ngModelChange)='saveConfiguration();',
|
||||||
|
min='0.1',
|
||||||
|
max='0.9',
|
||||||
|
step='0.05'
|
||||||
|
)
|
||||||
|
|
||||||
h3.mt-4(translate) Hacks
|
h3.mt-4(translate) Hacks
|
||||||
|
|
||||||
.form-line
|
.form-line
|
||||||
|
Reference in New Issue
Block a user