fix: dockview panel group should derive constraints

This commit is contained in:
mathuo 2023-03-18 23:45:23 +04:00
parent d1f67828e3
commit a74daf410e
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
4 changed files with 46 additions and 42 deletions

View File

@ -12,7 +12,11 @@ export interface TitleEvent {
* omit visibility modifiers since the visibility of a single group doesn't make sense * omit visibility modifiers since the visibility of a single group doesn't make sense
* because it belongs to a groupview * because it belongs to a groupview
*/ */
export interface DockviewPanelApi extends Omit<GridviewPanelApi, 'setVisible'> { export interface DockviewPanelApi
extends Omit<
GridviewPanelApi,
'setVisible' | 'onDidConstraintsChange' | 'setConstraints'
> {
readonly group: DockviewGroupPanel; readonly group: DockviewGroupPanel;
readonly isGroupActive: boolean; readonly isGroupActive: boolean;
readonly title: string; readonly title: string;

View File

@ -4,13 +4,14 @@ import { GridviewPanelApi } from '../api/gridviewPanelApi';
import { import {
DockviewGroupPanelModel, DockviewGroupPanelModel,
GroupOptions, GroupOptions,
IDockviewGroupPanelModel,
IHeader, IHeader,
} from './dockviewGroupPanelModel'; } from './dockviewGroupPanelModel';
import { GridviewPanel, IGridviewPanel } from '../gridview/gridviewPanel'; import { GridviewPanel, IGridviewPanel } from '../gridview/gridviewPanel';
import { IDockviewPanel } from '../dockview/dockviewPanel'; import { IDockviewPanel } from '../dockview/dockviewPanel';
export interface IDockviewGroupPanel extends IGridviewPanel { export interface IDockviewGroupPanel extends IGridviewPanel {
model: DockviewGroupPanelModel; model: IDockviewGroupPanelModel;
locked: boolean; locked: boolean;
readonly size: number; readonly size: number;
readonly panels: IDockviewPanel[]; readonly panels: IDockviewPanel[];
@ -25,7 +26,7 @@ export class DockviewGroupPanel
extends GridviewPanel extends GridviewPanel
implements IDockviewGroupPanel implements IDockviewGroupPanel
{ {
private readonly _model: DockviewGroupPanelModel; private readonly _model: IDockviewGroupPanelModel;
get panels(): IDockviewPanel[] { get panels(): IDockviewPanel[] {
return this._model.panels; return this._model.panels;
@ -39,26 +40,10 @@ export class DockviewGroupPanel
return this._model.size; return this._model.size;
} }
get model(): DockviewGroupPanelModel { get model(): IDockviewGroupPanelModel {
return this._model; 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 { get locked(): boolean {
return this._model.locked; return this._model.locked;
} }
@ -76,7 +61,10 @@ export class DockviewGroupPanel
id: string, id: string,
options: GroupOptions options: GroupOptions
) { ) {
super(id, 'groupview_default'); super(id, 'groupview_default', {
minimumHeight: 100,
minimumWidth: 100,
});
this._model = new DockviewGroupPanelModel( this._model = new DockviewGroupPanelModel(
this.element, this.element,

View File

@ -4,10 +4,9 @@ import { Droptarget, Position } from '../dnd/droptarget';
import { DockviewComponent } from './dockviewComponent'; import { DockviewComponent } from './dockviewComponent';
import { isAncestor, toggleClass } from '../dom'; import { isAncestor, toggleClass } from '../dom';
import { addDisposableListener, Emitter, Event } from '../events'; import { addDisposableListener, Emitter, Event } from '../events';
import { IGridPanelView } from '../gridview/baseComponentGridview';
import { IViewSize } from '../gridview/gridview'; import { IViewSize } from '../gridview/gridview';
import { CompositeDisposable } from '../lifecycle'; import { CompositeDisposable } from '../lifecycle';
import { PanelInitParameters, PanelUpdateEvent } from '../panel/types'; import { IPanel, PanelInitParameters, PanelUpdateEvent } from '../panel/types';
import { import {
ContentContainer, ContentContainer,
IContentContainer, IContentContainer,
@ -82,7 +81,7 @@ export interface IHeader {
height: number | undefined; height: number | undefined;
} }
export interface IDockviewGroupPanelModel extends IGridPanelView { export interface IDockviewGroupPanelModel extends IPanel {
readonly isActive: boolean; readonly isActive: boolean;
readonly size: number; readonly size: number;
readonly panels: IDockviewPanel[]; readonly panels: IDockviewPanel[];
@ -95,13 +94,20 @@ export interface IDockviewGroupPanelModel extends IGridPanelView {
readonly onDidActivePanelChange: Event<GroupviewChangeEvent>; readonly onDidActivePanelChange: Event<GroupviewChangeEvent>;
readonly onMove: Event<GroupMoveEvent>; readonly onMove: Event<GroupMoveEvent>;
locked: boolean; locked: boolean;
setActive(isActive: boolean): void;
initialize(): void;
// state // state
isPanelActive: (panel: IDockviewPanel) => boolean; isPanelActive: (panel: IDockviewPanel) => boolean;
indexOf(panel: IDockviewPanel): number; indexOf(panel: IDockviewPanel): number;
// panel lifecycle // panel lifecycle
openPanel( openPanel(
panel: IDockviewPanel, panel: IDockviewPanel,
options?: { index?: number; skipFocus?: boolean } options?: {
index?: number;
skipFocus?: boolean;
skipSetPanelActive?: boolean;
skipSetGroupActive?: boolean;
}
): void; ): void;
closePanel(panel: IDockviewPanel): void; closePanel(panel: IDockviewPanel): void;
closeAllPanels(): void; closeAllPanels(): void;
@ -199,22 +205,6 @@ export class DockviewGroupPanelModel
return this._panels.length === 0; 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 { get hasWatermark(): boolean {
return !!( return !!(
this.watermark && this.container.contains(this.watermark.element) this.watermark && this.container.contains(this.watermark.element)

View File

@ -126,9 +126,31 @@ export abstract class GridviewPanel
return this.api.isActive; 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)); 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.api.initialize(this); // TODO: required to by-pass 'super before this' requirement
this.addDisposables( this.addDisposables(