1
1
mirror of https://github.com/Eugeny/tabby.git synced 2024-11-10 23:14:32 +03:00

fixed #7030 - directional pane navigation

This commit is contained in:
Eugene Pankov 2022-10-04 20:51:20 +02:00
parent 48afeb98a5
commit 12f971da19
No known key found for this signature in database
GPG Key ID: 5896FCBBDD1CF4F4

View File

@ -620,6 +620,44 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
this.layout()
}
private getPaneRect (pane: BaseTabComponent): DOMRect {
const viewRef = this.viewRefs.get(pane)!
const element = viewRef.rootNodes[0] as HTMLElement
return element.getBoundingClientRect()
}
getNearestPaneInDirection (from: BaseTabComponent, direction: SplitDirection): BaseTabComponent {
const rect = this.getPaneRect(from)
let nearest: BaseTabComponent | null = null
let nearestDistance = Infinity
let panes = this.getAllTabs().map(pane => ({ pane, rect: this.getPaneRect(pane) }))
if (direction === 'l') {
panes = panes.filter(pane => pane.rect.right <= rect.left)
} else if (direction === 'r') {
panes = panes.filter(pane => pane.rect.left >= rect.right)
} else if (direction === 't') {
panes = panes.filter(pane => pane.rect.bottom <= rect.top)
} else {
panes = panes.filter(pane => pane.rect.top >= rect.bottom)
}
for (const pane of panes) {
if (pane.pane === from) {
continue
}
const distance = Math.abs(rect.left + rect.width / 2 - pane.rect.left - pane.rect.width / 2) + Math.abs(rect.top + rect.height / 2 - pane.rect.top - pane.rect.height / 2)
if (distance < nearestDistance) {
nearest = pane.pane
nearestDistance = distance
}
}
return nearest ?? from
}
/**
* Moves focus in the given direction
*/
@ -628,36 +666,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
return
}
let rel: BaseTabComponent | SplitContainer = this.focusedTab
let parent = this.getParentOf(rel)
if (!parent) {
return
}
const orientation = ['l', 'r'].includes(dir) ? 'h' : 'v'
while (parent !== this.root && parent.orientation !== orientation) {
rel = parent
parent = this.getParentOf(rel)
if (!parent) {
return
}
}
if (parent.orientation !== orientation) {
return
}
const index = parent.children.indexOf(rel)
if (['l', 't'].includes(dir)) {
if (index > 0) {
this.focusAnyIn(parent.children[index - 1])
}
} else {
if (index < parent.children.length - 1) {
this.focusAnyIn(parent.children[index + 1])
}
}
this.focus(this.getNearestPaneInDirection(this.focusedTab, dir))
}
navigateLinear (delta: number): void {