From a74daf410e01241343179ed7e06cabd454581c8b Mon Sep 17 00:00:00 2001 From: mathuo <6710312+mathuo@users.noreply.github.com> Date: Sat, 18 Mar 2023 23:45:23 +0400 Subject: [PATCH] fix: dockview panel group should derive constraints --- .../dockview-core/src/api/dockviewPanelApi.ts | 6 +++- .../src/dockview/dockviewGroupPanel.ts | 28 +++++------------ .../src/dockview/dockviewGroupPanelModel.ts | 30 +++++++------------ .../src/gridview/gridviewPanel.ts | 24 ++++++++++++++- 4 files changed, 46 insertions(+), 42 deletions(-) diff --git a/packages/dockview-core/src/api/dockviewPanelApi.ts b/packages/dockview-core/src/api/dockviewPanelApi.ts index 8d037d5fb..48978c688 100644 --- a/packages/dockview-core/src/api/dockviewPanelApi.ts +++ b/packages/dockview-core/src/api/dockviewPanelApi.ts @@ -12,7 +12,11 @@ export interface TitleEvent { * omit visibility modifiers since the visibility of a single group doesn't make sense * because it belongs to a groupview */ -export interface DockviewPanelApi extends Omit { +export interface DockviewPanelApi + extends Omit< + GridviewPanelApi, + 'setVisible' | 'onDidConstraintsChange' | 'setConstraints' + > { readonly group: DockviewGroupPanel; readonly isGroupActive: boolean; readonly title: string; diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanel.ts index f5e7b943f..b8391306c 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanel.ts @@ -4,13 +4,14 @@ import { GridviewPanelApi } from '../api/gridviewPanelApi'; import { DockviewGroupPanelModel, GroupOptions, + IDockviewGroupPanelModel, IHeader, } from './dockviewGroupPanelModel'; import { GridviewPanel, IGridviewPanel } from '../gridview/gridviewPanel'; import { IDockviewPanel } from '../dockview/dockviewPanel'; export interface IDockviewGroupPanel extends IGridviewPanel { - model: DockviewGroupPanelModel; + model: IDockviewGroupPanelModel; locked: boolean; readonly size: number; readonly panels: IDockviewPanel[]; @@ -25,7 +26,7 @@ export class DockviewGroupPanel extends GridviewPanel implements IDockviewGroupPanel { - private readonly _model: DockviewGroupPanelModel; + private readonly _model: IDockviewGroupPanelModel; get panels(): IDockviewPanel[] { return this._model.panels; @@ -39,26 +40,10 @@ export class DockviewGroupPanel return this._model.size; } - get model(): DockviewGroupPanelModel { + get model(): IDockviewGroupPanelModel { return this._model; } - get minimumHeight(): number { - return this._model.minimumHeight; - } - - get maximumHeight(): number { - return this._model.maximumHeight; - } - - get minimumWidth(): number { - return this._model.minimumWidth; - } - - get maximumWidth(): number { - return this._model.maximumWidth; - } - get locked(): boolean { return this._model.locked; } @@ -76,7 +61,10 @@ export class DockviewGroupPanel id: string, options: GroupOptions ) { - super(id, 'groupview_default'); + super(id, 'groupview_default', { + minimumHeight: 100, + minimumWidth: 100, + }); this._model = new DockviewGroupPanelModel( this.element, diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts index e917f2c42..37836691d 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts @@ -4,10 +4,9 @@ import { Droptarget, Position } from '../dnd/droptarget'; import { DockviewComponent } from './dockviewComponent'; import { isAncestor, toggleClass } from '../dom'; import { addDisposableListener, Emitter, Event } from '../events'; -import { IGridPanelView } from '../gridview/baseComponentGridview'; import { IViewSize } from '../gridview/gridview'; import { CompositeDisposable } from '../lifecycle'; -import { PanelInitParameters, PanelUpdateEvent } from '../panel/types'; +import { IPanel, PanelInitParameters, PanelUpdateEvent } from '../panel/types'; import { ContentContainer, IContentContainer, @@ -82,7 +81,7 @@ export interface IHeader { height: number | undefined; } -export interface IDockviewGroupPanelModel extends IGridPanelView { +export interface IDockviewGroupPanelModel extends IPanel { readonly isActive: boolean; readonly size: number; readonly panels: IDockviewPanel[]; @@ -95,13 +94,20 @@ export interface IDockviewGroupPanelModel extends IGridPanelView { readonly onDidActivePanelChange: Event; readonly onMove: Event; locked: boolean; + setActive(isActive: boolean): void; + initialize(): void; // state isPanelActive: (panel: IDockviewPanel) => boolean; indexOf(panel: IDockviewPanel): number; // panel lifecycle openPanel( panel: IDockviewPanel, - options?: { index?: number; skipFocus?: boolean } + options?: { + index?: number; + skipFocus?: boolean; + skipSetPanelActive?: boolean; + skipSetGroupActive?: boolean; + } ): void; closePanel(panel: IDockviewPanel): void; closeAllPanels(): void; @@ -199,22 +205,6 @@ export class DockviewGroupPanelModel return this._panels.length === 0; } - get minimumHeight(): number { - return 100; - } - - get maximumHeight(): number { - return Number.MAX_SAFE_INTEGER; - } - - get minimumWidth(): number { - return 100; - } - - get maximumWidth(): number { - return Number.MAX_SAFE_INTEGER; - } - get hasWatermark(): boolean { return !!( this.watermark && this.container.contains(this.watermark.element) diff --git a/packages/dockview-core/src/gridview/gridviewPanel.ts b/packages/dockview-core/src/gridview/gridviewPanel.ts index 8ea379901..530a3cc70 100644 --- a/packages/dockview-core/src/gridview/gridviewPanel.ts +++ b/packages/dockview-core/src/gridview/gridviewPanel.ts @@ -126,9 +126,31 @@ export abstract class GridviewPanel return this.api.isActive; } - constructor(id: string, component: string) { + constructor( + id: string, + component: string, + options?: { + minimumWidth?: number; + maximumWidth?: number; + minimumHeight?: number; + maximumHeight?: number; + } + ) { super(id, component, new GridviewPanelApiImpl(id)); + if (typeof options?.minimumWidth === 'number') { + this._minimumWidth = options.minimumWidth; + } + if (typeof options?.maximumWidth === 'number') { + this._maximumWidth = options.maximumWidth; + } + if (typeof options?.minimumHeight === 'number') { + this._minimumHeight = options.minimumHeight; + } + if (typeof options?.maximumHeight === 'number') { + this._maximumHeight = options.maximumHeight; + } + this.api.initialize(this); // TODO: required to by-pass 'super before this' requirement this.addDisposables(