diff --git a/terminus-core/src/components/baseTab.component.ts b/terminus-core/src/components/baseTab.component.ts index b67ddadc..fea8b950 100644 --- a/terminus-core/src/components/baseTab.component.ts +++ b/terminus-core/src/components/baseTab.component.ts @@ -14,6 +14,11 @@ export interface BaseTabProcess { * Abstract base class for custom tab components */ export abstract class BaseTabComponent { + /** + * Parent tab (usually a SplitTabComponent) + */ + parent: BaseTabComponent|null = null + /** * Current tab title */ diff --git a/terminus-core/src/components/splitTab.component.ts b/terminus-core/src/components/splitTab.component.ts index 0624ae3a..af02dbcd 100644 --- a/terminus-core/src/components/splitTab.component.ts +++ b/terminus-core/src/components/splitTab.component.ts @@ -358,6 +358,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit this.attachTabView(tab) setImmediate(() => { + tab.parent = this this.layout() this.tabAdded.next(tab) this.focus(tab) @@ -374,11 +375,11 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit parent.children.splice(index, 1) this.detachTabView(tab) + tab.parent = null this.layout() this.tabRemoved.next(tab) - if (this.root.children.length === 0) { this.destroy() } else { @@ -569,6 +570,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit if (recovered) { const tab = this.tabsService.create(recovered.type, recovered.options) children.push(tab) + tab.parent = this this.attachTabView(tab) } else { state.ratios.splice(state.children.indexOf(childState), 0) diff --git a/terminus-core/src/index.ts b/terminus-core/src/index.ts index 83c1eb1e..6dbb0052 100644 --- a/terminus-core/src/index.ts +++ b/terminus-core/src/index.ts @@ -36,7 +36,7 @@ import { ConfigService } from './services/config.service' import { StandardTheme, StandardCompactTheme, PaperTheme } from './theme' import { CoreConfigProvider } from './config' import { AppHotkeyProvider } from './hotkeys' -import { TaskCompletionContextMenu, CommonOptionsContextMenu, CloseContextMenu } from './tabContextMenu' +import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu } from './tabContextMenu' import 'perfect-scrollbar/css/perfect-scrollbar.css' import 'ng2-dnd/bundles/style.css' @@ -54,7 +54,7 @@ const PROVIDERS = [ { provide: Theme, useClass: PaperTheme, multi: true }, { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true }, { provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true }, - { provide: TabContextMenuItemProvider, useClass: CloseContextMenu, multi: true }, + { provide: TabContextMenuItemProvider, useClass: TabManagementContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true }, { provide: TabRecoveryProvider, useClass: SplitTabRecoveryProvider, multi: true }, { provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true } }, diff --git a/terminus-core/src/tabContextMenu.ts b/terminus-core/src/tabContextMenu.ts index f03b1b68..0f556312 100644 --- a/terminus-core/src/tabContextMenu.ts +++ b/terminus-core/src/tabContextMenu.ts @@ -4,11 +4,12 @@ import { Subscription } from 'rxjs' import { AppService } from './services/app.service' import { BaseTabComponent } from './components/baseTab.component' import { TabHeaderComponent } from './components/tabHeader.component' +import { SplitTabComponent, SplitDirection } from './components/splitTab.component' import { TabContextMenuItemProvider } from './api/tabContextMenuProvider' /** @hidden */ @Injectable() -export class CloseContextMenu extends TabContextMenuItemProvider { +export class TabManagementContextMenu extends TabContextMenuItemProvider { weight = -5 constructor ( @@ -19,7 +20,7 @@ export class CloseContextMenu extends TabContextMenuItemProvider { } async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise { - let items = [ + let items: Electron.MenuItemConstructorOptions[] = [ { label: 'Close', click: () => this.zone.run(() => { @@ -59,6 +60,24 @@ export class CloseContextMenu extends TabContextMenuItemProvider { }), }, ] + } else { + if (tab.parent instanceof SplitTabComponent) { + const directions: SplitDirection[] = ['r', 'b', 'l', 't'] + items.push({ + label: 'Split', + submenu: directions.map(dir => ({ + label: { + r: 'Right', + b: 'Down', + l: 'Left', + t: 'Up', + }[dir], + click: () => this.zone.run(() => { + (tab.parent as SplitTabComponent).splitTab(tab, dir) + }), + })) as Electron.MenuItemConstructorOptions[], + }) + } } return items } @@ -87,8 +106,10 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider { } async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise { + let items: Electron.MenuItemConstructorOptions[] = [] if (tabHeader) { - return [ + items = [ + ...items, { label: 'Rename', click: () => this.zone.run(() => tabHeader?.showRenameTabModal()), @@ -111,7 +132,7 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider { }, ] } - return [] + return items } }