Skip to content

Commit

Permalink
feat: preferred size
Browse files Browse the repository at this point in the history
  • Loading branch information
mathuo committed May 1, 2024
1 parent 58aba53 commit 672da85
Show file tree
Hide file tree
Showing 9 changed files with 95 additions and 33 deletions.
11 changes: 8 additions & 3 deletions packages/dockview-core/src/api/dockviewPanelApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ export interface DockviewPanelApi
readonly group: DockviewGroupPanel;
readonly isGroupActive: boolean;
readonly renderer: DockviewPanelRenderer;
readonly preferredSize: number | undefined;
readonly preferredWidth: number | undefined;
readonly preferredHeight: number | undefined;
readonly title: string | undefined;
readonly onDidActiveGroupChange: Event<ActiveGroupEvent>;
readonly onDidGroupChange: Event<GroupChangedEvent>;
Expand Down Expand Up @@ -107,8 +108,12 @@ export class DockviewPanelApiImpl
return this.panel.renderer;
}

get preferredSize(): number | undefined {
return this.panel.preferredSize;
get preferredHeight(): number | undefined {
return this.panel.preferredHeight;
}

get preferredWidth(): number | undefined {
return this.panel.preferredWidth;
}

set group(value: DockviewGroupPanel) {
Expand Down
3 changes: 2 additions & 1 deletion packages/dockview-core/src/dockview/deserializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ export class DefaultDockviewDeserialzier implements IPanelDeserializer {
{
renderer: panelData.renderer,
priority: panelData.priority,
preferredSize: panelData.preferredSize,
preferredWidth: panelData.preferredWidth,
preferredHeight: panelData.preferredHeight,
}
);

Expand Down
73 changes: 52 additions & 21 deletions packages/dockview-core/src/dockview/dockviewComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,6 @@ export class DockviewComponent
}[] = [];
private readonly _rootDropTarget: Droptarget;

private _ignoreEvents = 0;

private readonly _onDidRemoveGroup = new Emitter<DockviewGroupPanel>();
readonly onDidRemoveGroup: Event<DockviewGroupPanel> =
this._onDidRemoveGroup.event;
Expand Down Expand Up @@ -591,8 +589,14 @@ export class DockviewComponent
group: this.orthogonalize(
event.position,
data.panelId
? this.getGroupPanel(data.panelId)?.api
.preferredSize
? {
width: this.getGroupPanel(
data.panelId
)?.api.preferredWidth,
height: this.getGroupPanel(
data.panelId
)?.api.preferredHeight,
}
: undefined
),
position: 'center',
Expand Down Expand Up @@ -999,7 +1003,10 @@ export class DockviewComponent

private orthogonalize(
position: Position,
size?: number
options?: {
width?: number;
height?: number;
}
): DockviewGroupPanel {
switch (position) {
case 'top':
Expand All @@ -1026,10 +1033,13 @@ export class DockviewComponent
case 'top':
case 'left':
case 'center':
return this.createGroupAtLocation([0], size); // insert into first position
return this.createGroupAtLocation([0], options); // insert into first position
case 'bottom':
case 'right':
return this.createGroupAtLocation([this.gridview.length], size); // insert into last position
return this.createGroupAtLocation(
[this.gridview.length],
options
); // insert into last position
default:
throw new Error(`unsupported position ${position}`);
}
Expand Down Expand Up @@ -1447,7 +1457,10 @@ export class DockviewComponent
} else {
const group = this.orthogonalize(
directionToPosition(<Direction>options.position.direction),
options.preferredSize
{
width: options.preferredWidth,
height: options.preferredHeight,
}
);

const panel = this.createPanel(options, group);
Expand Down Expand Up @@ -1517,7 +1530,11 @@ export class DockviewComponent
);
const group = this.createGroupAtLocation(
relativeLocation,
options.preferredSize

{
width: options.preferredWidth,
height: options.preferredHeight,
}
);
panel = this.createPanel(options, group);
group.model.openPanel(panel, {
Expand Down Expand Up @@ -1551,10 +1568,10 @@ export class DockviewComponent
skipSetGroupActive: options.inactive,
});
} else {
const group = this.createGroupAtLocation(
undefined,
options.preferredSize
);
const group = this.createGroupAtLocation(undefined, {
width: options.preferredWidth,
height: options.preferredHeight,
});
panel = this.createPanel(options, group);
group.model.openPanel(panel, {
skipSetActive: options.inactive,
Expand Down Expand Up @@ -1676,7 +1693,10 @@ export class DockviewComponent
} else {
const group = this.orthogonalize(
directionToPosition(<Direction>options.direction),
options.preferredSize
{
width: options.preferredWidth,
height: options.preferredHeight,
}
);
if (!options.skipSetActive) {
this.doSetGroupAndPanelActive(group);
Expand Down Expand Up @@ -1963,7 +1983,10 @@ export class DockviewComponent
this.doAddGroup(
targetGroup,
location,
targetGroup.activePanel?.api.preferredSize
this.gridview.predictOrientation(location) ===
Orientation.HORIZONTAL
? targetGroup.activePanel?.api.preferredWidth
: targetGroup.activePanel?.api.preferredHeight
)
);
this.doSetGroupAndPanelActive(targetGroup);
Expand All @@ -1990,10 +2013,10 @@ export class DockviewComponent
destinationTarget
);

const group = this.createGroupAtLocation(
dropLocation,
removedPanel.api.preferredSize
);
const group = this.createGroupAtLocation(dropLocation, {
width: removedPanel.api.preferredWidth,
height: removedPanel.api.preferredHeight,
});
this.movingLock(() =>
group.model.openPanel(removedPanel, {
skipSetGroupActive: true,
Expand Down Expand Up @@ -2248,7 +2271,8 @@ export class DockviewComponent
{
renderer: options.renderer,
priority: options.priority,
preferredSize: options.preferredSize,
preferredWidth: options.preferredWidth,
preferredHeight: options.preferredHeight,
}
);

Expand All @@ -2262,9 +2286,16 @@ export class DockviewComponent

private createGroupAtLocation(
location: number[] = [0],
size?: number
options?: { width?: number; height?: number }
): DockviewGroupPanel {
const group = this.createGroup();

const size =
this.gridview.predictOrientation(location) ===
Orientation.HORIZONTAL
? options?.width
: options?.height;

this.doAddGroup(group, location, size);
return group;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import {
} from './options';
import { OverlayRenderContainer } from '../overlayRenderContainer';
import { TitleEvent } from '../api/dockviewPanelApi';
import { readonly } from 'vue';

interface GroupMoveEvent {
groupId: string;
Expand All @@ -56,7 +57,8 @@ export interface GroupOptions extends CoreGroupOptions {
readonly panels?: IDockviewPanel[];
readonly activePanel?: IDockviewPanel;
readonly id?: string;
readonly preferredSize?: number;
readonly preferredWidth?: number;
readonly preferredHeight?: number;
}

export interface GroupPanelViewState extends CoreGroupOptions {
Expand Down
17 changes: 12 additions & 5 deletions packages/dockview-core/src/dockview/dockviewPanel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ export class DockviewPanel
private _title: string | undefined;
private _renderer: DockviewPanelRenderer | undefined;
private _priority: number | undefined;
private _preferredSize: number | undefined;
private _preferredWidth: number | undefined;
private _preferredHeight: number | undefined;

get params(): Parameters | undefined {
return this._params;
Expand All @@ -58,10 +59,14 @@ export class DockviewPanel
return this._renderer ?? this.accessor.renderer;
}

get preferredSize(): number | undefined {
return this._preferredSize;
get preferredWidth(): number | undefined {
return this._preferredWidth;
}

get preferredHeight(): number | undefined {
return this._preferredHeight;
}

get priority(): number {
return this._priority ?? 0;
}
Expand All @@ -77,13 +82,15 @@ export class DockviewPanel
options: {
renderer?: DockviewPanelRenderer;
priority?: number;
preferredSize?: number;
preferredWidth?: number;
preferredHeight?: number;
}
) {
super();
this._renderer = options.renderer;
this._priority = options.priority;
this._preferredSize = options.preferredSize;
this._preferredWidth = options.preferredWidth;
this._preferredHeight = options.preferredHeight;
this._group = group;

this.api = new DockviewPanelApiImpl(
Expand Down
3 changes: 2 additions & 1 deletion packages/dockview-core/src/dockview/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ export type AddPanelOptions<P extends object = Parameters> = {
* Panel resizing priority
*/
priority?: number;
preferredSize?: number;
preferredWidth?: number;
preferredHeight?: number;
} & Partial<AddPanelOptionsUnion>;

type AddGroupOptionsWithPanel = {
Expand Down
3 changes: 2 additions & 1 deletion packages/dockview-core/src/dockview/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ export interface GroupviewPanelState {
title?: string;
renderer?: DockviewPanelRenderer;
priority?: number;
preferredSize?: number;
preferredWidth?: number;
preferredHeight?: number;
params?: { [key: string]: any };
}
12 changes: 12 additions & 0 deletions packages/dockview-core/src/gridview/gridview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,18 @@ export class Gridview implements IDisposable {
parent.moveChild(from, to);
}

predictOrientation(location: number[]): Orientation {
const [rest, index] = tail(location);
const [pathToParent, parent] = this.getNode(rest);

if (parent instanceof BranchNode) {
return parent.orientation;
} else {
const [grandParent, ..._] = [...pathToParent].reverse();
return orthogonal(grandParent.orientation);
}
}

public addView(
view: IGridView,
size: number | Sizing,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ export const GridActions = (props: {
component: 'default',
title: `Tab ${nextId()}`,
inactive: options?.inactive,
preferredWidth: 200,
preferredHeight: 400,
});
};

Expand Down

0 comments on commit 672da85

Please sign in to comment.