fix watermark

This commit is contained in:
mathuo 2022-04-24 13:12:00 +01:00
parent 03b6c62239
commit bc7731a39d
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
4 changed files with 124 additions and 42 deletions

View File

@ -25,6 +25,14 @@ import { selectedPanelAtom } from './footer';
import { ExampleFunctions } from './panels/exampleFunctions'; import { ExampleFunctions } from './panels/exampleFunctions';
import { CompositeDisposable } from '../lifecycle'; import { CompositeDisposable } from '../lifecycle';
const WatermarkComponent = () => {
return (
<div style={{ backgroundColor: 'black', color: 'white' }}>
Watermark component
</div>
);
};
const Test = (props: IDockviewPanelProps) => { const Test = (props: IDockviewPanelProps) => {
const [counter, setCounter] = React.useState<number>(0); const [counter, setCounter] = React.useState<number>(0);
@ -109,6 +117,7 @@ const components: PanelCollection<IDockviewPanelProps> = {
<DockviewReact <DockviewReact
onReady={onReady} onReady={onReady}
components={components} components={components}
watermarkComponent={WatermarkComponent}
tabHeight={20} tabHeight={20}
debug={true} debug={true}
/> />
@ -140,7 +149,9 @@ export const TestGrid = (props: IGridviewPanelProps) => {
}; };
const setSelectedPanel = useRecoilCallback( const setSelectedPanel = useRecoilCallback(
({ set }) => (value: string) => set(selectedPanelAtom, value), ({ set }) =>
(value: string) =>
set(selectedPanelAtom, value),
[] []
); );
@ -192,11 +203,12 @@ export const TestGrid = (props: IGridviewPanelProps) => {
}; };
}, [api]); }, [api]);
const [coord, setCoord] = React.useState<{ const [coord, setCoord] =
x: number; React.useState<{
y: number; x: number;
panel: IGroupPanel; y: number;
}>(undefined); panel: IGroupPanel;
}>(undefined);
const onTabContextMenu = React.useMemo( const onTabContextMenu = React.useMemo(
() => (event: TabContextMenuEvent) => { () => (event: TabContextMenuEvent) => {
@ -276,7 +288,6 @@ export const TestGrid = (props: IGridviewPanelProps) => {
const Watermark = (props: IWatermarkPanelProps) => { const Watermark = (props: IWatermarkPanelProps) => {
const [groups, setGroups] = React.useState<number>(props.containerApi.size); const [groups, setGroups] = React.useState<number>(props.containerApi.size);
React.useEffect(() => { React.useEffect(() => {
console.log('mount');
const disposable = new CompositeDisposable( const disposable = new CompositeDisposable(
props.containerApi.onDidLayoutChange(() => { props.containerApi.onDidLayoutChange(() => {
console.log(`groups2 ${props.containerApi.size}`); console.log(`groups2 ${props.containerApi.size}`);
@ -285,7 +296,6 @@ const Watermark = (props: IWatermarkPanelProps) => {
); );
return () => { return () => {
console.log('unmount');
disposable.dispose(); disposable.dispose();
}; };
}, []); }, []);
@ -332,30 +342,7 @@ const Watermark = (props: IWatermarkPanelProps) => {
justifyContent: 'center', justifyContent: 'center',
}} }}
> >
{/* <svg <span>Watermark component</span>
width="300"
height="300"
viewBox="0 0 300 300"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect
x="12.5"
y="12.5"
width="175"
height="275"
stroke="black"
stroke-width="25"
/>
<rect
x="112.5"
y="62.5"
width="175"
height="175"
stroke="black"
stroke-width="25"
/>
</svg> */}
</div> </div>
</div> </div>
); );

View File

@ -465,7 +465,7 @@ describe('dockviewComponent', () => {
await panel2.api.close(); await panel2.api.close();
expect(dockview.size).toBe(0); expect(dockview.size).toBe(1); // watermark
expect(dockview.totalPanels).toBe(0); expect(dockview.totalPanels).toBe(0);
}); });
@ -1178,6 +1178,89 @@ describe('dockviewComponent', () => {
expect(panel1Spy).toBeCalledTimes(1); expect(panel1Spy).toBeCalledTimes(1);
}); });
test('can add panel of same id if already removed', () => {
const container = document.createElement('div');
const dockview = new DockviewComponent(container, {
components: { default: PanelContentPartTest },
});
dockview.layout(500, 1000);
const panel1 = dockview.addPanel({
id: 'panel1',
component: 'default',
tabComponent: 'default',
});
expect(dockview.totalPanels).toBe(1);
panel1.api.close();
expect(dockview.totalPanels).toBe(0);
const panel1Again = dockview.addPanel({
id: 'panel1',
component: 'default',
tabComponent: 'default',
});
expect(dockview.totalPanels).toBe(1);
panel1Again.api.close();
expect(dockview.totalPanels).toBe(0);
});
test('last group is retained for watermark', () => {
const container = document.createElement('div');
const dockview = new DockviewComponent(container, {
components: { default: PanelContentPartTest },
});
dockview.layout(500, 1000);
const panel1 = dockview.addPanel({
id: 'panel1',
component: 'default',
tabComponent: 'default',
});
expect(dockview.size).toBe(1);
expect(dockview.totalPanels).toBe(1);
const group = panel1.group;
dockview.removePanel(panel1);
expect(group.model.hasWatermark).toBeTruthy();
expect(dockview.size).toBe(1);
expect(dockview.totalPanels).toBe(0);
const panel2 = dockview.addPanel({
id: 'panel2',
component: 'default',
tabComponent: 'default',
});
expect(group.model.hasWatermark).toBeFalsy();
const panel3 = dockview.addPanel({
id: 'panel3',
component: 'default',
tabComponent: 'default',
});
expect(dockview.size).toBe(1);
expect(dockview.totalPanels).toBe(2);
panel2.api.close();
expect(group.model.hasWatermark).toBeFalsy();
panel3.api.close();
expect(group.model.hasWatermark).toBeTruthy();
});
test('panel is disposed of when removed', () => { test('panel is disposed of when removed', () => {
const container = document.createElement('div'); const container = document.createElement('div');

View File

@ -470,7 +470,13 @@ export class DockviewComponent
panel.dispose(); panel.dispose();
if (group.model.size === 0 && options.removeEmptyGroup) { const retainGroupForWatermark = this.size === 1;
if (
!retainGroupForWatermark &&
group.model.size === 0 &&
options.removeEmptyGroup
) {
this.removeGroup(group); this.removeGroup(group);
} }
} }

View File

@ -150,38 +150,44 @@ export class Groupview extends CompositeDisposable implements IGroupview {
this.layout(this._width, this._height); this.layout(this._width, this._height);
} }
get isActive() { get isActive(): boolean {
return this._isGroupActive; return this._isGroupActive;
} }
get panels() { get panels(): IGroupPanel[] {
return this._panels; return this._panels;
} }
get size() { get size(): number {
return this._panels.length; return this._panels.length;
} }
get isEmpty() { get isEmpty(): boolean {
return this._panels.length === 0; return this._panels.length === 0;
} }
get minimumHeight() { get minimumHeight(): number {
return 100; return 100;
} }
get maximumHeight() { get maximumHeight(): number {
return Number.MAX_SAFE_INTEGER; return Number.MAX_SAFE_INTEGER;
} }
get minimumWidth() { get minimumWidth(): number {
return 100; return 100;
} }
get maximumWidth() { get maximumWidth(): number {
return Number.MAX_SAFE_INTEGER; return Number.MAX_SAFE_INTEGER;
} }
get hasWatermark(): boolean {
return !!(
this.watermark && this.container.contains(this.watermark.element)
);
}
constructor( constructor(
private readonly container: HTMLElement, private readonly container: HTMLElement,
private accessor: IDockviewComponent, private accessor: IDockviewComponent,