diff --git a/packages/dockview/src/__tests__/api/component.api.spec.ts b/packages/dockview/src/__tests__/api/component.api.spec.ts index bd79d0f88..9f465f054 100644 --- a/packages/dockview/src/__tests__/api/component.api.spec.ts +++ b/packages/dockview/src/__tests__/api/component.api.spec.ts @@ -1,4 +1,3 @@ -import { DockviewComponent } from '../..'; import { SplitviewApi, PaneviewApi, @@ -8,6 +7,7 @@ import { import { GridviewComponent } from '../../gridview/gridviewComponent'; import { PaneviewComponent } from '../../paneview/paneviewComponent'; import { SplitviewComponent } from '../../splitview/splitviewComponent'; +import { DockviewComponent } from '../../dockview/dockviewComponent'; describe('component.api', () => { describe('splitview', () => { @@ -22,7 +22,7 @@ describe('component.api', () => { 'onDidLayoutChange', 'onDidAddView', 'onDidRemoveView', - 'getPanels', + 'panels', 'focus', 'resizeToFit', 'toJSON', diff --git a/packages/dockview/src/api/component.api.ts b/packages/dockview/src/api/component.api.ts index 41430f0d2..2b3621e05 100644 --- a/packages/dockview/src/api/component.api.ts +++ b/packages/dockview/src/api/component.api.ts @@ -102,7 +102,7 @@ export class SplitviewApi implements CommonApi { } getPanels(): ISplitviewPanel[] { - return this.component.getPanels(); + return this.component.panels; } focus(): void { @@ -121,8 +121,8 @@ export class SplitviewApi implements CommonApi { return this.component.layout(width, height); } - addPanel(options: AddSplitviewComponentOptions): void { - this.component.addPanel(options); + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel { + return this.component.addPanel(options); } resizeToFit(): void { @@ -216,8 +216,8 @@ export class PaneviewApi implements CommonApi { this.component.layout(width, height); } - addPanel(options: AddPaneviewComponentOptions): void { - this.component.addPanel(options); + addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel { + return this.component.addPanel(options); } resizeToFit(): void { @@ -300,8 +300,8 @@ export class GridviewApi implements CommonApi { this.component.layout(width, height, force); } - addPanel(options: AddComponentOptions): void { - this.component.addPanel(options); + addPanel(options: AddComponentOptions): IGridviewPanel { + return this.component.addPanel(options); } removePanel(panel: IGridviewPanel, sizing?: Sizing): void { diff --git a/packages/dockview/src/dockview/dockviewComponent.ts b/packages/dockview/src/dockview/dockviewComponent.ts index 66cd71801..7635b5026 100644 --- a/packages/dockview/src/dockview/dockviewComponent.ts +++ b/packages/dockview/src/dockview/dockviewComponent.ts @@ -21,7 +21,7 @@ import { createComponent } from '../panel/componentFactory'; import { AddGroupOptions, AddPanelOptions, - DockviewOptions as DockviewComponentOptions, + DockviewComponentOptions, MovementOptions, TabContextMenuEvent, } from './options'; diff --git a/packages/dockview/src/dockview/options.ts b/packages/dockview/src/dockview/options.ts index 2e76ec306..36c72d637 100644 --- a/packages/dockview/src/dockview/options.ts +++ b/packages/dockview/src/dockview/options.ts @@ -49,12 +49,11 @@ export interface ViewFactoryData { tab?: string; } -export interface DockviewOptions extends DockviewRenderFunctions { +export interface DockviewComponentOptions extends DockviewRenderFunctions { watermarkComponent?: WatermarkConstructor; watermarkFrameworkComponent?: any; frameworkComponentFactory?: GroupPanelFrameworkComponentFactory; tabHeight?: number; - debug?: boolean; orientation?: Orientation; styles?: ISplitviewStyles; showDndOverlay?: (event: DragEvent, target: DockviewDropTargets) => boolean; diff --git a/packages/dockview/src/gridview/gridviewComponent.ts b/packages/dockview/src/gridview/gridviewComponent.ts index 891792ac0..e7413925c 100644 --- a/packages/dockview/src/gridview/gridviewComponent.ts +++ b/packages/dockview/src/gridview/gridviewComponent.ts @@ -44,7 +44,7 @@ export interface AddComponentOptions extends BaseComponentOptions { maximumHeight?: number; position?: { direction: Direction; - reference: string; + referencePanel: string; }; location?: number[]; } @@ -62,7 +62,7 @@ export interface IGridviewComponent extends IBaseGrid { readonly orientation: Orientation; readonly onDidLayoutFromJSON: Event; updateOptions(options: Partial): void; - addPanel(options: AddComponentOptions): void; + addPanel(options: AddComponentOptions): IGridviewPanel; removePanel(panel: IGridviewPanel, sizing?: Sizing): void; toggleVisibility(panel: IGridviewPanel): void; focus(): void; @@ -273,17 +273,17 @@ export class GridviewComponent this.doAddGroup(removedPanel, relativeLocation, options.size); } - public addPanel(options: AddComponentOptions): void { + public addPanel(options: AddComponentOptions): IGridviewPanel { let relativeLocation: number[] = options.location || [0]; - if (options.position?.reference) { + if (options.position?.referencePanel) { const referenceGroup = this._groups.get( - options.position.reference + options.position.referencePanel )?.value; if (!referenceGroup) { throw new Error( - `reference group ${options.position.reference} does not exist` + `reference group ${options.position.referencePanel} does not exist` ); } @@ -329,6 +329,8 @@ export class GridviewComponent this.registerPanel(view); this.doAddGroup(view, relativeLocation, options.size); + + return view; } private registerPanel(panel: GridviewPanel) { diff --git a/packages/dockview/src/react/dockview/dockview.tsx b/packages/dockview/src/react/dockview/dockview.tsx index 4bbca69f2..06fbec100 100644 --- a/packages/dockview/src/react/dockview/dockview.tsx +++ b/packages/dockview/src/react/dockview/dockview.tsx @@ -36,11 +36,10 @@ export interface DockviewReadyEvent { } export interface IDockviewReactProps { - components?: PanelCollection; + components: PanelCollection; tabComponents?: PanelCollection; watermarkComponent?: React.FunctionComponent; - onReady?: (event: DockviewReadyEvent) => void; - debug?: boolean; + onReady: (event: DockviewReadyEvent) => void; tabHeight?: number; onTabContextMenu?: (event: TabContextMenuEvent) => void; onDidDrop?: (event: DockviewDropEvent) => void; @@ -127,7 +126,6 @@ export const DockviewReact = React.forwardRef( frameworkComponents: props.components, frameworkTabComponents: props.tabComponents, tabHeight: props.tabHeight, - debug: props.debug, watermarkFrameworkComponent: props.watermarkComponent, styles: props.hideBorders ? { separatorBorder: 'transparent' } diff --git a/packages/dockview/src/react/gridview/gridview.tsx b/packages/dockview/src/react/gridview/gridview.tsx index 65860da3c..d13db6eb2 100644 --- a/packages/dockview/src/react/gridview/gridview.tsx +++ b/packages/dockview/src/react/gridview/gridview.tsx @@ -22,8 +22,8 @@ export interface IGridviewPanelProps } export interface IGridviewReactProps { - orientation: Orientation; - onReady?: (event: GridviewReadyEvent) => void; + orientation?: Orientation; + onReady: (event: GridviewReadyEvent) => void; components: PanelCollection; hideBorders?: boolean; className?: string; @@ -64,7 +64,7 @@ export const GridviewReact = React.forwardRef( typeof props.proportionalLayout === 'boolean' ? props.proportionalLayout : true, - orientation: props.orientation, + orientation: props.orientation || Orientation.HORIZONTAL, frameworkComponents: props.components, frameworkComponentFactory: { createComponent: (id: string, componentId, component) => { diff --git a/packages/dockview/src/react/paneview/paneview.tsx b/packages/dockview/src/react/paneview/paneview.tsx index 33d8e7410..f57809a77 100644 --- a/packages/dockview/src/react/paneview/paneview.tsx +++ b/packages/dockview/src/react/paneview/paneview.tsx @@ -27,8 +27,8 @@ export interface PaneviewDropEvent extends PaneviewDropEvent2 { } export interface IPaneviewReactProps { - onReady?: (event: PaneviewReadyEvent) => void; - components?: PanelCollection; + onReady: (event: PaneviewReadyEvent) => void; + components: PanelCollection; headerComponents?: PanelCollection; className?: string; disableAutoResizing?: boolean; diff --git a/packages/dockview/src/react/splitview/splitview.tsx b/packages/dockview/src/react/splitview/splitview.tsx index bda1de124..7fe6877c8 100644 --- a/packages/dockview/src/react/splitview/splitview.tsx +++ b/packages/dockview/src/react/splitview/splitview.tsx @@ -22,8 +22,8 @@ export interface ISplitviewPanelProps } export interface ISplitviewReactProps { - orientation: Orientation; - onReady?: (event: SplitviewReadyEvent) => void; + orientation?: Orientation; + onReady: (event: SplitviewReadyEvent) => void; components: PanelCollection; proportionalLayout?: boolean; hideBorders?: boolean; @@ -58,7 +58,7 @@ export const SplitviewReact = React.forwardRef( React.useEffect(() => { const splitview = new SplitviewComponent(domRef.current!, { - orientation: props.orientation, + orientation: props.orientation || Orientation.HORIZONTAL, frameworkComponents: props.components, frameworkWrapper: { createComponent: ( diff --git a/packages/dockview/src/splitview/splitviewComponent.ts b/packages/dockview/src/splitview/splitviewComponent.ts index a0e223f39..53814596b 100644 --- a/packages/dockview/src/splitview/splitviewComponent.ts +++ b/packages/dockview/src/splitview/splitviewComponent.ts @@ -61,8 +61,9 @@ export interface ISplitviewComponent extends IDisposable { readonly onDidAddView: Event; readonly onDidRemoveView: Event; readonly onDidLayoutFromJSON: Event; + readonly panels: SplitviewPanel[]; updateOptions(options: Partial): void; - addPanel(options: AddSplitviewComponentOptions): void; + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel; layout(width: number, height: number): void; onDidLayoutChange: Event; toJSON(): SerializedSplitview; @@ -72,7 +73,7 @@ export interface ISplitviewComponent extends IDisposable { getPanel(id: string): ISplitviewPanel | undefined; setActive(view: ISplitviewPanel, skipFocus?: boolean): void; removePanel(panel: ISplitviewPanel, sizing?: Sizing): void; - getPanels(): SplitviewPanel[]; + setVisible(panel: ISplitviewPanel, visible: boolean): void; movePanel(from: number, to: number): void; } @@ -87,7 +88,7 @@ export class SplitviewComponent private _disposable = new MutableDisposable(); private _splitview!: Splitview; private _activePanel: SplitviewPanel | undefined; - private panels = new Map>(); + private _panels = new Map>(); private _options: SplitviewComponentOptions; private readonly _onDidLayoutfromJSON = new Emitter(); @@ -102,15 +103,23 @@ export class SplitviewComponent private readonly _onDidLayoutChange = new Emitter(); readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; - get options() { + get options(): SplitviewComponentOptions { return this._options; } - get orientation() { + get panels(): SplitviewPanel[] { + return this.splitview.getViews(); + } + + get length(): number { + return this._panels.size; + } + + get orientation(): Orientation { return this.splitview.orientation; } - get splitview() { + get splitview(): Splitview { return this._splitview; } @@ -128,30 +137,26 @@ export class SplitviewComponent ); } - get minimumSize() { + get minimumSize(): number { return this.splitview.minimumSize; } - get maximumSize() { + get maximumSize(): number { return this.splitview.maximumSize; } - get height() { + get height(): number { return this.splitview.orientation === Orientation.HORIZONTAL ? this.splitview.orthogonalSize : this.splitview.size; } - get width() { + get width(): number { return this.splitview.orientation === Orientation.HORIZONTAL ? this.splitview.size : this.splitview.orthogonalSize; } - get length() { - return this.panels.size; - } - constructor( private readonly element: HTMLElement, options: SplitviewComponentOptions @@ -195,23 +200,23 @@ export class SplitviewComponent ); } - focus() { + focus(): void { this._activePanel?.focus(); } - movePanel(from: number, to: number) { + movePanel(from: number, to: number): void { this.splitview.moveView(from, to); } - setVisible(panel: SplitviewPanel, visible: boolean) { - const index = this.getPanels().indexOf(panel); + setVisible(panel: SplitviewPanel, visible: boolean): void { + const index = this.panels.indexOf(panel); this.splitview.setViewVisible(index, visible); } - setActive(view: SplitviewPanel, skipFocus?: boolean) { + setActive(view: SplitviewPanel, skipFocus?: boolean): void { this._activePanel = view; - this.getPanels() + this.panels .filter((v) => v !== view) .forEach((v) => { v.api._onDidActiveChange.fire({ isActive: false }); @@ -225,12 +230,8 @@ export class SplitviewComponent } } - getPanels(): SplitviewPanel[] { - return this.splitview.getViews(); - } - - removePanel(panel: SplitviewPanel, sizing?: Sizing) { - const disposable = this.panels.get(panel.id); + removePanel(panel: SplitviewPanel, sizing?: Sizing): void { + const disposable = this._panels.get(panel.id); if (!disposable) { throw new Error(`unknown splitview panel ${panel.id}`); @@ -239,23 +240,23 @@ export class SplitviewComponent disposable.disposable.dispose(); disposable.value.dispose(); - this.panels.delete(panel.id); + this._panels.delete(panel.id); - const index = this.getPanels().findIndex((_) => _ === panel); + const index = this.panels.findIndex((_) => _ === panel); this.splitview.removeView(index, sizing); - const panels = this.getPanels(); + const panels = this.panels; if (panels.length > 0) { this.setActive(panels[panels.length - 1]); } } getPanel(id: string): SplitviewPanel | undefined { - return this.getPanels().find((view) => view.id === id); + return this.panels.find((view) => view.id === id); } - addPanel(options: AddSplitviewComponentOptions): void { - if (this.panels.has(options.id)) { + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel { + if (this._panels.has(options.id)) { throw new Error(`panel ${options.id} already exists`); } @@ -292,6 +293,8 @@ export class SplitviewComponent this.doAddView(view); this.setActive(view); + + return view; } /** @@ -314,7 +317,7 @@ export class SplitviewComponent this.splitview.layout(size, orthogonalSize); } - private doAddView(view: SplitviewPanel) { + private doAddView(view: SplitviewPanel): void { const disposable = view.api.onDidFocusChange((event) => { if (!event.isFocused) { return; @@ -322,7 +325,7 @@ export class SplitviewComponent this.setActive(view, true); }); - this.panels.set(view.id, { disposable, value: view }); + this._panels.set(view.id, { disposable, value: view }); } toJSON(): SerializedSplitview { @@ -349,11 +352,11 @@ export class SplitviewComponent fromJSON(serializedSplitview: SerializedSplitview): void { const { views, orientation, size, activeView } = serializedSplitview; - for (const [_, value] of this.panels.entries()) { + for (const [_, value] of this._panels.entries()) { value.disposable.dispose(); value.value.dispose(); } - this.panels.clear(); + this._panels.clear(); this.splitview.dispose(); const queue: Function[] = []; @@ -366,7 +369,7 @@ export class SplitviewComponent views: views.map((view) => { const data = view.data; - if (this.panels.has(data.id)) { + if (this._panels.has(data.id)) { throw new Error(`panel ${data.id} already exists`); } @@ -422,12 +425,12 @@ export class SplitviewComponent this._onDidLayoutfromJSON.fire(); } - dispose() { - for (const [_, value] of this.panels.entries()) { + dispose(): void { + for (const [_, value] of this._panels.entries()) { value.disposable.dispose(); value.value.dispose(); } - this.panels.clear(); + this._panels.clear(); this.splitview.dispose();