diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json
index b8d35457a..d4a057c08 100644
--- a/.codesandbox/ci.json
+++ b/.codesandbox/ci.json
@@ -13,6 +13,8 @@
"/packages/docs/sandboxes/externaldnd-dockview",
"/packages/docs/sandboxes/floatinggroup-dockview",
"/packages/docs/sandboxes/fullwidthtab-dockview",
+ "/packages/docs/sandboxes/headeractions-dockview",
+ "/packages/docs/sandboxes/ide-example",
"/packages/docs/sandboxes/groupcontol-dockview",
"/packages/docs/sandboxes/iframe-dockview",
"/packages/docs/sandboxes/keyboard-dockview",
diff --git a/packages/dockview-core/src/__tests__/splitview/splitview.spec.ts b/packages/dockview-core/src/__tests__/splitview/splitview.spec.ts
index ec7654393..ed02acf4c 100644
--- a/packages/dockview-core/src/__tests__/splitview/splitview.spec.ts
+++ b/packages/dockview-core/src/__tests__/splitview/splitview.spec.ts
@@ -676,4 +676,100 @@ describe('splitview', () => {
expect(addEventListenerSpy).toBeCalledTimes(3);
expect(removeEventListenerSpy).toBeCalledTimes(3);
});
+
+ test('setViewVisible', () => {
+ const splitview = new Splitview(container, {
+ orientation: Orientation.HORIZONTAL,
+ proportionalLayout: false,
+ });
+ splitview.layout(900, 500);
+
+ const view1 = new Testview(0, 1000);
+ const view2 = new Testview(0, 1000);
+ const view3 = new Testview(0, 1000);
+
+ splitview.addView(view1);
+ splitview.addView(view2);
+ splitview.addView(view3);
+
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+
+ splitview.setViewVisible(0, false);
+ expect([view1.size, view2.size, view3.size]).toEqual([0, 300, 600]);
+
+ splitview.setViewVisible(0, true);
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+ });
+
+ test('setViewVisible with one view having high layout priority', () => {
+ const splitview = new Splitview(container, {
+ orientation: Orientation.HORIZONTAL,
+ proportionalLayout: false,
+ });
+ splitview.layout(900, 500);
+
+ const view1 = new Testview(0, 1000);
+ const view2 = new Testview(0, 1000, LayoutPriority.High);
+ const view3 = new Testview(0, 1000);
+
+ splitview.addView(view1);
+ splitview.addView(view2);
+ splitview.addView(view3);
+
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+
+ splitview.setViewVisible(0, false);
+ expect([view1.size, view2.size, view3.size]).toEqual([0, 600, 300]);
+
+ splitview.setViewVisible(0, true);
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+ });
+
+ test('set view size', () => {
+ const splitview = new Splitview(container, {
+ orientation: Orientation.HORIZONTAL,
+ proportionalLayout: false,
+ });
+ splitview.layout(900, 500);
+
+ const view1 = new Testview(0, 1000);
+ const view2 = new Testview(0, 1000);
+ const view3 = new Testview(0, 1000);
+
+ splitview.addView(view1);
+ splitview.addView(view2);
+ splitview.addView(view3);
+
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+
+ view1.fireChangeEvent({ size: 0 });
+ expect([view1.size, view2.size, view3.size]).toEqual([0, 300, 600]);
+
+ view1.fireChangeEvent({ size: 300 });
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+ });
+
+ test('set view size with one view having high layout priority', () => {
+ const splitview = new Splitview(container, {
+ orientation: Orientation.HORIZONTAL,
+ proportionalLayout: false,
+ });
+ splitview.layout(900, 500);
+
+ const view1 = new Testview(0, 1000);
+ const view2 = new Testview(0, 1000, LayoutPriority.High);
+ const view3 = new Testview(0, 1000);
+
+ splitview.addView(view1);
+ splitview.addView(view2);
+ splitview.addView(view3);
+
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+
+ view1.fireChangeEvent({ size: 0 });
+ expect([view1.size, view2.size, view3.size]).toEqual([0, 600, 300]);
+
+ view1.fireChangeEvent({ size: 300 });
+ expect([view1.size, view2.size, view3.size]).toEqual([300, 300, 300]);
+ });
});
diff --git a/packages/dockview-core/src/splitview/splitview.ts b/packages/dockview-core/src/splitview/splitview.ts
index 007a8e60a..0d56cce24 100644
--- a/packages/dockview-core/src/splitview/splitview.ts
+++ b/packages/dockview-core/src/splitview/splitview.ts
@@ -37,10 +37,11 @@ export interface SplitViewOptions {
readonly proportionalLayout?: boolean;
readonly styles?: ISplitviewStyles;
}
+
export enum LayoutPriority {
- Low = 'low',
- High = 'high',
- Normal = 'normal',
+ Low = 'low', // view is offered space last
+ High = 'high', // view is offered space first
+ Normal = 'normal', // view is offered space in view order
}
export interface IBaseView extends IDisposable {
@@ -340,7 +341,22 @@ export class Splitview {
item.size = size;
- this.relayout([index]);
+ const indexes = range(this.viewItems.length).filter((i) => i !== index);
+ const lowPriorityIndexes = [
+ ...indexes.filter(
+ (i) => this.viewItems[i].priority === LayoutPriority.Low
+ ),
+ index,
+ ];
+ const highPriorityIndexes = indexes.filter(
+ (i) => this.viewItems[i].priority === LayoutPriority.High
+ );
+
+ /**
+ * add this view we are changing to the low-index list since we have determined the size
+ * here and don't want it changed
+ */
+ this.relayout([...lowPriorityIndexes, index], highPriorityIndexes);
}
public addView(
diff --git a/packages/docs/docs/components/dockview.mdx b/packages/docs/docs/components/dockview.mdx
index 648185d7e..b8e6748e6 100644
--- a/packages/docs/docs/components/dockview.mdx
+++ b/packages/docs/docs/components/dockview.mdx
@@ -27,6 +27,7 @@ import DockviewTabheight from '@site/sandboxes/tabheight-dockview/src/app';
import DockviewWithIFrames from '@site/sandboxes/iframe-dockview/src/app';
import DockviewFloating from '@site/sandboxes/floatinggroup-dockview/src/app';
import DockviewLockedGroup from '@site/sandboxes/lockedgroup-dockview/src/app';
+import IDEExample from '@site/sandboxes/ide-example/src/app';
import DockviewKeyboard from '@site/sandboxes/keyboard-dockview/src/app';
import { attach as attachDockviewVanilla } from '@site/sandboxes/javascript/vanilla-dockview/src/app';
@@ -911,6 +912,14 @@ Keyboard shortcuts
react={DockviewKeyboard}
/>
+## Application with sidebars
+
+