mirror of
https://github.com/mathuo/dockview
synced 2025-02-02 14:35:46 +00:00
Merge pull request #535 from mathuo/534-setvisible-is-missing-from-splitviewpanelapiimpl
feat: cleanup setVisible api
This commit is contained in:
commit
f00b3d88e1
@ -2,6 +2,7 @@ import { DockviewPanelApiImpl } from '../../api/dockviewPanelApi';
|
|||||||
import { DockviewComponent } from '../../dockview/dockviewComponent';
|
import { DockviewComponent } from '../../dockview/dockviewComponent';
|
||||||
import { DockviewPanel, IDockviewPanel } from '../../dockview/dockviewPanel';
|
import { DockviewPanel, IDockviewPanel } from '../../dockview/dockviewPanel';
|
||||||
import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel';
|
import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel';
|
||||||
|
import { fromPartial } from '@total-typescript/shoehorn';
|
||||||
|
|
||||||
describe('groupPanelApi', () => {
|
describe('groupPanelApi', () => {
|
||||||
test('title', () => {
|
test('title', () => {
|
||||||
@ -17,12 +18,15 @@ describe('groupPanelApi', () => {
|
|||||||
setTitle: jest.fn(),
|
setTitle: jest.fn(),
|
||||||
} as any;
|
} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
|
|
||||||
const panel = new panelMock();
|
const panel = new panelMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const cut = new DockviewPanelApiImpl(
|
const cut = new DockviewPanelApiImpl(
|
||||||
panel,
|
panel,
|
||||||
|
@ -17,6 +17,7 @@ import {
|
|||||||
TabDragEvent,
|
TabDragEvent,
|
||||||
} from '../../dockview/components/titlebar/tabsContainer';
|
} from '../../dockview/components/titlebar/tabsContainer';
|
||||||
import { fromPartial } from '@total-typescript/shoehorn';
|
import { fromPartial } from '@total-typescript/shoehorn';
|
||||||
|
import { DockviewApi } from '../../api/component.api';
|
||||||
|
|
||||||
class PanelContentPartTest implements IContentRenderer {
|
class PanelContentPartTest implements IContentRenderer {
|
||||||
element: HTMLElement = document.createElement('div');
|
element: HTMLElement = document.createElement('div');
|
||||||
@ -4596,4 +4597,113 @@ describe('dockviewComponent', () => {
|
|||||||
expect(panel2.group.api.isActive).toBeFalsy();
|
expect(panel2.group.api.isActive).toBeFalsy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('that setVisible toggles visiblity', () => {
|
||||||
|
const container = document.createElement('div');
|
||||||
|
|
||||||
|
const dockview = new DockviewComponent({
|
||||||
|
parentElement: container,
|
||||||
|
components: {
|
||||||
|
default: PanelContentPartTest,
|
||||||
|
},
|
||||||
|
tabComponents: {
|
||||||
|
test_tab_id: PanelTabPartTest,
|
||||||
|
},
|
||||||
|
orientation: Orientation.HORIZONTAL,
|
||||||
|
});
|
||||||
|
const api = new DockviewApi(dockview);
|
||||||
|
|
||||||
|
dockview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = api.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
const panel2 = api.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'default',
|
||||||
|
position: { referencePanel: panel1, direction: 'within' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel3 = api.addPanel({
|
||||||
|
id: 'panel3',
|
||||||
|
component: 'default',
|
||||||
|
position: { referencePanel: panel1, direction: 'right' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel4 = api.addPanel({
|
||||||
|
id: 'panel4',
|
||||||
|
component: 'default',
|
||||||
|
position: { referencePanel: panel3, direction: 'within' },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(api.groups.length).toBe(2);
|
||||||
|
expect(panel1.group).toBe(panel2.group);
|
||||||
|
expect(panel3.group).toBe(panel4.group);
|
||||||
|
|
||||||
|
expect(panel1.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel3.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel4.group.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel3.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
// case #1
|
||||||
|
panel1.group.api.setVisible(false);
|
||||||
|
|
||||||
|
expect(panel1.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel4.group.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
// case #2
|
||||||
|
|
||||||
|
panel3.group.api.setVisible(false);
|
||||||
|
|
||||||
|
expect(panel1.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.group.api.isVisible).toBeFalsy();
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.api.isVisible).toBeFalsy();
|
||||||
|
|
||||||
|
// case #2
|
||||||
|
|
||||||
|
panel3.group.api.setVisible(true);
|
||||||
|
|
||||||
|
expect(panel1.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.group.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel4.group.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel3.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
// case #2
|
||||||
|
|
||||||
|
panel1.group.api.setVisible(true);
|
||||||
|
|
||||||
|
expect(panel1.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel3.group.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel4.group.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel3.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel4.api.isVisible).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -3,6 +3,7 @@ import { DockviewApi } from '../../api/component.api';
|
|||||||
import { DockviewPanel } from '../../dockview/dockviewPanel';
|
import { DockviewPanel } from '../../dockview/dockviewPanel';
|
||||||
import { IDockviewPanelModel } from '../../dockview/dockviewPanelModel';
|
import { IDockviewPanelModel } from '../../dockview/dockviewPanelModel';
|
||||||
import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel';
|
import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel';
|
||||||
|
import { fromPartial } from '@total-typescript/shoehorn';
|
||||||
|
|
||||||
describe('dockviewPanel', () => {
|
describe('dockviewPanel', () => {
|
||||||
test('update title', () => {
|
test('update title', () => {
|
||||||
@ -14,9 +15,7 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -26,7 +25,13 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
@ -61,9 +66,6 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -73,7 +75,13 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
@ -97,9 +105,6 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -110,7 +115,19 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest
|
||||||
|
.fn()
|
||||||
|
.mockReturnValue({ dispose: jest.fn() }),
|
||||||
|
onDidLocationChange: jest
|
||||||
|
.fn()
|
||||||
|
.mockReturnValue({ dispose: jest.fn() }),
|
||||||
|
onDidActiveChange: jest
|
||||||
|
.fn()
|
||||||
|
.mockReturnValue({ dispose: jest.fn() }),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
@ -131,9 +148,6 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -144,7 +158,13 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
@ -165,13 +185,6 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {
|
|
||||||
api: {
|
|
||||||
setSize: jest.fn(),
|
|
||||||
},
|
|
||||||
} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -182,7 +195,14 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
setSize: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
@ -202,9 +222,6 @@ describe('dockviewPanel', () => {
|
|||||||
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
const accessorMock = jest.fn<DockviewComponent, []>(() => {
|
||||||
return {} as any;
|
return {} as any;
|
||||||
});
|
});
|
||||||
const groupMock = jest.fn<DockviewGroupPanel, []>(() => {
|
|
||||||
return {} as any;
|
|
||||||
});
|
|
||||||
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
const panelModelMock = jest.fn<Partial<IDockviewPanelModel>, []>(() => {
|
||||||
return {
|
return {
|
||||||
update: jest.fn(),
|
update: jest.fn(),
|
||||||
@ -215,7 +232,13 @@ describe('dockviewPanel', () => {
|
|||||||
|
|
||||||
const api = new dockviewApiMock();
|
const api = new dockviewApiMock();
|
||||||
const accessor = new accessorMock();
|
const accessor = new accessorMock();
|
||||||
const group = new groupMock();
|
const group = fromPartial<DockviewGroupPanel>({
|
||||||
|
api: {
|
||||||
|
onDidVisibilityChange: jest.fn(),
|
||||||
|
onDidLocationChange: jest.fn(),
|
||||||
|
onDidActiveChange: jest.fn(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const model = <IDockviewPanelModel>new panelModelMock();
|
const model = <IDockviewPanelModel>new panelModelMock();
|
||||||
|
|
||||||
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
const cut = new DockviewPanel('fake-id', accessor, api, group, model, {
|
||||||
|
@ -2700,4 +2700,35 @@ describe('gridview', () => {
|
|||||||
|
|
||||||
expect(gridview.disableResizing).toBeTruthy();
|
expect(gridview.disableResizing).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('that setVisible toggles visiblity', () => {
|
||||||
|
const gridview = new GridviewComponent({
|
||||||
|
parentElement: container,
|
||||||
|
proportionalLayout: true,
|
||||||
|
orientation: Orientation.HORIZONTAL,
|
||||||
|
components: { default: TestGridview },
|
||||||
|
disableAutoResizing: true,
|
||||||
|
});
|
||||||
|
gridview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = gridview.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
const panel2 = gridview.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(false);
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(true);
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -514,4 +514,38 @@ describe('componentPaneview', () => {
|
|||||||
|
|
||||||
expect(paneview.disableResizing).toBeTruthy();
|
expect(paneview.disableResizing).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('that setVisible toggles visiblity', () => {
|
||||||
|
const paneview = new PaneviewComponent({
|
||||||
|
parentElement: container,
|
||||||
|
components: {
|
||||||
|
default: TestPanel,
|
||||||
|
},
|
||||||
|
disableAutoResizing: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
paneview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = paneview.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'default',
|
||||||
|
title: 'panel1',
|
||||||
|
});
|
||||||
|
const panel2 = paneview.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'default',
|
||||||
|
title: 'panel2',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(false);
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(true);
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -617,4 +617,36 @@ describe('componentSplitview', () => {
|
|||||||
|
|
||||||
expect(splitview.disableResizing).toBeTruthy();
|
expect(splitview.disableResizing).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('that setVisible toggles visiblity', () => {
|
||||||
|
const splitview = new SplitviewComponent({
|
||||||
|
parentElement: container,
|
||||||
|
orientation: Orientation.HORIZONTAL,
|
||||||
|
components: {
|
||||||
|
default: TestPanel,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
splitview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = splitview.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
const panel2 = splitview.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(false);
|
||||||
|
expect(panel1.api.isVisible).toBeFalsy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
|
||||||
|
panel1.api.setVisible(true);
|
||||||
|
expect(panel1.api.isVisible).toBeTruthy();
|
||||||
|
expect(panel2.api.isVisible).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -99,41 +99,14 @@ export class DockviewPanelApiImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
set group(value: DockviewGroupPanel) {
|
set group(value: DockviewGroupPanel) {
|
||||||
const isOldGroupActive = this.isGroupActive;
|
const oldGroup = this._group;
|
||||||
|
|
||||||
if (this._group !== value) {
|
if (this._group !== value) {
|
||||||
this._group = value;
|
this._group = value;
|
||||||
|
|
||||||
this._onDidGroupChange.fire({});
|
this._onDidGroupChange.fire({});
|
||||||
|
|
||||||
let _trackGroupActive = isOldGroupActive; // prevent duplicate events with same state
|
this.setupGroupEventListeners(oldGroup);
|
||||||
|
|
||||||
this.groupEventsDisposable.value = new CompositeDisposable(
|
|
||||||
this.group.api.onDidLocationChange((event) => {
|
|
||||||
if (this.group !== this.panel.group) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._onDidLocationChange.fire(event);
|
|
||||||
}),
|
|
||||||
this.group.api.onDidActiveChange(() => {
|
|
||||||
if (this.group !== this.panel.group) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_trackGroupActive !== this.isGroupActive) {
|
|
||||||
_trackGroupActive = this.isGroupActive;
|
|
||||||
this._onDidActiveGroupChange.fire({
|
|
||||||
isActive: this.isGroupActive,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// if (this.isGroupActive !== isOldGroupActive) {
|
|
||||||
// this._onDidActiveGroupChange.fire({
|
|
||||||
// isActive: this.isGroupActive,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
this._onDidLocationChange.fire({
|
this._onDidLocationChange.fire({
|
||||||
location: this.group.api.location,
|
location: this.group.api.location,
|
||||||
@ -155,6 +128,7 @@ export class DockviewPanelApiImpl
|
|||||||
this.initialize(panel);
|
this.initialize(panel);
|
||||||
|
|
||||||
this._group = group;
|
this._group = group;
|
||||||
|
this.setupGroupEventListeners();
|
||||||
|
|
||||||
this.addDisposables(
|
this.addDisposables(
|
||||||
this.groupEventsDisposable,
|
this.groupEventsDisposable,
|
||||||
@ -208,4 +182,40 @@ export class DockviewPanelApiImpl
|
|||||||
exitMaximized(): void {
|
exitMaximized(): void {
|
||||||
this.group.api.exitMaximized();
|
this.group.api.exitMaximized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setupGroupEventListeners(previousGroup?: DockviewGroupPanel) {
|
||||||
|
let _trackGroupActive = previousGroup?.isActive ?? false; // prevent duplicate events with same state
|
||||||
|
|
||||||
|
this.groupEventsDisposable.value = new CompositeDisposable(
|
||||||
|
this.group.api.onDidVisibilityChange((event) => {
|
||||||
|
if (!event.isVisible && this.isVisible) {
|
||||||
|
this._onDidVisibilityChange.fire(event);
|
||||||
|
} else if (
|
||||||
|
event.isVisible &&
|
||||||
|
!this.isVisible &&
|
||||||
|
this.group.model.isPanelActive(this.panel)
|
||||||
|
) {
|
||||||
|
this._onDidVisibilityChange.fire(event);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
this.group.api.onDidLocationChange((event) => {
|
||||||
|
if (this.group !== this.panel.group) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._onDidLocationChange.fire(event);
|
||||||
|
}),
|
||||||
|
this.group.api.onDidActiveChange(() => {
|
||||||
|
if (this.group !== this.panel.group) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_trackGroupActive !== this.isGroupActive) {
|
||||||
|
_trackGroupActive = this.isGroupActive;
|
||||||
|
this._onDidActiveGroupChange.fire({
|
||||||
|
isActive: this.isGroupActive,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,6 @@ export interface VisibilityEvent {
|
|||||||
readonly isVisible: boolean;
|
readonly isVisible: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HiddenEvent {
|
|
||||||
readonly isHidden: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ActiveEvent {
|
export interface ActiveEvent {
|
||||||
readonly isActive: boolean;
|
readonly isActive: boolean;
|
||||||
}
|
}
|
||||||
@ -28,8 +24,8 @@ export interface PanelApi {
|
|||||||
readonly onDidFocusChange: Event<FocusEvent>;
|
readonly onDidFocusChange: Event<FocusEvent>;
|
||||||
readonly onDidVisibilityChange: Event<VisibilityEvent>;
|
readonly onDidVisibilityChange: Event<VisibilityEvent>;
|
||||||
readonly onDidActiveChange: Event<ActiveEvent>;
|
readonly onDidActiveChange: Event<ActiveEvent>;
|
||||||
readonly onDidHiddenChange: Event<HiddenEvent>;
|
|
||||||
setActive(): void;
|
setActive(): void;
|
||||||
|
setVisible(isVisible: boolean): void;
|
||||||
updateParameters(parameters: Parameters): void;
|
updateParameters(parameters: Parameters): void;
|
||||||
/**
|
/**
|
||||||
* The id of the panel that would have been assigned when the panel was created
|
* The id of the panel that would have been assigned when the panel was created
|
||||||
@ -47,10 +43,6 @@ export interface PanelApi {
|
|||||||
* Whether the panel is visible
|
* Whether the panel is visible
|
||||||
*/
|
*/
|
||||||
readonly isVisible: boolean;
|
readonly isVisible: boolean;
|
||||||
/**
|
|
||||||
* Whether the panel is hidden
|
|
||||||
*/
|
|
||||||
readonly isHidden: boolean;
|
|
||||||
/**
|
/**
|
||||||
* The panel width in pixels
|
* The panel width in pixels
|
||||||
*/
|
*/
|
||||||
@ -76,7 +68,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
private _isFocused = false;
|
private _isFocused = false;
|
||||||
private _isActive = false;
|
private _isActive = false;
|
||||||
private _isVisible = true;
|
private _isVisible = true;
|
||||||
private _isHidden = false;
|
|
||||||
private _width = 0;
|
private _width = 0;
|
||||||
private _height = 0;
|
private _height = 0;
|
||||||
|
|
||||||
@ -95,9 +86,9 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
readonly onDidVisibilityChange: Event<VisibilityEvent> =
|
readonly onDidVisibilityChange: Event<VisibilityEvent> =
|
||||||
this._onDidVisibilityChange.event;
|
this._onDidVisibilityChange.event;
|
||||||
|
|
||||||
readonly _onDidHiddenChange = new Emitter<HiddenEvent>();
|
readonly _onWillVisibilityChange = new Emitter<VisibilityEvent>();
|
||||||
readonly onDidHiddenChange: Event<HiddenEvent> =
|
readonly onWillVisibilityChange: Event<VisibilityEvent> =
|
||||||
this._onDidHiddenChange.event;
|
this._onWillVisibilityChange.event;
|
||||||
|
|
||||||
readonly _onDidActiveChange = new Emitter<ActiveEvent>();
|
readonly _onDidActiveChange = new Emitter<ActiveEvent>();
|
||||||
readonly onDidActiveChange: Event<ActiveEvent> =
|
readonly onDidActiveChange: Event<ActiveEvent> =
|
||||||
@ -122,10 +113,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
return this._isVisible;
|
return this._isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isHidden(): boolean {
|
|
||||||
return this._isHidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
get width(): number {
|
get width(): number {
|
||||||
return this._width;
|
return this._width;
|
||||||
}
|
}
|
||||||
@ -147,9 +134,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
this.onDidVisibilityChange((event) => {
|
this.onDidVisibilityChange((event) => {
|
||||||
this._isVisible = event.isVisible;
|
this._isVisible = event.isVisible;
|
||||||
}),
|
}),
|
||||||
this.onDidHiddenChange((event) => {
|
|
||||||
this._isHidden = event.isHidden;
|
|
||||||
}),
|
|
||||||
this.onDidDimensionsChange((event) => {
|
this.onDidDimensionsChange((event) => {
|
||||||
this._width = event.width;
|
this._width = event.width;
|
||||||
this._height = event.height;
|
this._height = event.height;
|
||||||
@ -163,7 +147,7 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
this._onActiveChange,
|
this._onActiveChange,
|
||||||
this._onUpdateParameters,
|
this._onUpdateParameters,
|
||||||
this._onWillFocus,
|
this._onWillFocus,
|
||||||
this._onDidHiddenChange,
|
this._onWillVisibilityChange,
|
||||||
this._onUpdateParameters
|
this._onUpdateParameters
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -178,8 +162,8 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
setHidden(isHidden: boolean): void {
|
setVisible(isVisible: boolean): void {
|
||||||
this._onDidHiddenChange.fire({ isHidden });
|
this._onWillVisibilityChange.fire({ isVisible });
|
||||||
}
|
}
|
||||||
|
|
||||||
setActive(): void {
|
setActive(): void {
|
||||||
|
@ -674,7 +674,7 @@ export class DockviewComponent
|
|||||||
options?.overridePopoutGroup?.id ?? this.getNextGroupId(); //item.id;
|
options?.overridePopoutGroup?.id ?? this.getNextGroupId(); //item.id;
|
||||||
|
|
||||||
if (itemToPopout.api.location.type === 'grid') {
|
if (itemToPopout.api.location.type === 'grid') {
|
||||||
itemToPopout.api.setHidden(true);
|
itemToPopout.api.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const _window = new PopoutWindow(
|
const _window = new PopoutWindow(
|
||||||
@ -749,7 +749,7 @@ export class DockviewComponent
|
|||||||
|
|
||||||
switch (referenceLocation) {
|
switch (referenceLocation) {
|
||||||
case 'grid':
|
case 'grid':
|
||||||
referenceGroup.api.setHidden(true);
|
referenceGroup.api.setVisible(false);
|
||||||
break;
|
break;
|
||||||
case 'floating':
|
case 'floating':
|
||||||
case 'popout':
|
case 'popout':
|
||||||
@ -821,8 +821,8 @@ export class DockviewComponent
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
if (referenceGroup.api.isHidden) {
|
if (!referenceGroup.api.isVisible) {
|
||||||
referenceGroup.api.setHidden(false);
|
referenceGroup.api.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.getPanel(group.id)) {
|
if (this.getPanel(group.id)) {
|
||||||
@ -1596,7 +1596,7 @@ export class DockviewComponent
|
|||||||
private updateWatermark(): void {
|
private updateWatermark(): void {
|
||||||
if (
|
if (
|
||||||
this.groups.filter(
|
this.groups.filter(
|
||||||
(x) => x.api.location.type === 'grid' && !x.api.isHidden
|
(x) => x.api.location.type === 'grid' && x.api.isVisible
|
||||||
).length === 0
|
).length === 0
|
||||||
) {
|
) {
|
||||||
if (!this.watermark) {
|
if (!this.watermark) {
|
||||||
|
@ -158,11 +158,11 @@ export abstract class GridviewPanel<
|
|||||||
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(
|
||||||
this.api.onDidHiddenChange((event) => {
|
this.api.onWillVisibilityChange((event) => {
|
||||||
const { isHidden } = event;
|
const { isVisible } = event;
|
||||||
const { accessor } = this._params as GridviewInitParameters;
|
const { accessor } = this._params as GridviewInitParameters;
|
||||||
|
|
||||||
accessor.setVisible(this, !isHidden);
|
accessor.setVisible(this, isVisible);
|
||||||
}),
|
}),
|
||||||
this.api.onActiveChange(() => {
|
this.api.onActiveChange(() => {
|
||||||
const { accessor } = this._params as GridviewInitParameters;
|
const { accessor } = this._params as GridviewInitParameters;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
export interface IDisposable {
|
export interface IDisposable {
|
||||||
dispose: () => void;
|
dispose(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IValueDisposable<T> {
|
export interface IValueDisposable<T> {
|
||||||
|
@ -108,6 +108,10 @@ export class Paneview extends CompositeDisposable implements IDisposable {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setViewVisible(index: number, visible: boolean) {
|
||||||
|
this.splitview.setViewVisible(index, visible);
|
||||||
|
}
|
||||||
|
|
||||||
public addPane(
|
public addPane(
|
||||||
pane: PaneviewPanel,
|
pane: PaneviewPanel,
|
||||||
size?: number | Sizing,
|
size?: number | Sizing,
|
||||||
|
@ -125,6 +125,7 @@ export interface IPaneviewComponent extends IDisposable {
|
|||||||
getPanel(id: string): IPaneviewPanel | undefined;
|
getPanel(id: string): IPaneviewPanel | undefined;
|
||||||
movePanel(from: number, to: number): void;
|
movePanel(from: number, to: number): void;
|
||||||
updateOptions(options: Partial<PaneviewComponentOptions>): void;
|
updateOptions(options: Partial<PaneviewComponentOptions>): void;
|
||||||
|
setVisible(panel: IPaneviewPanel, visible: boolean): void;
|
||||||
clear(): void;
|
clear(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,6 +227,11 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
|
|||||||
this.addDisposables(this._disposable);
|
this.addDisposables(this._disposable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setVisible(panel: PaneviewPanel, visible: boolean): void {
|
||||||
|
const index = this.panels.indexOf(panel);
|
||||||
|
this.paneview.setViewVisible(index, visible);
|
||||||
|
}
|
||||||
|
|
||||||
focus(): void {
|
focus(): void {
|
||||||
//noop
|
//noop
|
||||||
}
|
}
|
||||||
@ -296,6 +302,7 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
|
|||||||
isExpanded: options.isExpanded,
|
isExpanded: options.isExpanded,
|
||||||
title: options.title,
|
title: options.title,
|
||||||
containerApi: new PaneviewApi(this),
|
containerApi: new PaneviewApi(this),
|
||||||
|
accessor: this,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.paneview.addPane(view, size, index);
|
this.paneview.addPane(view, size, index);
|
||||||
@ -430,6 +437,7 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
|
|||||||
title: data.title,
|
title: data.title,
|
||||||
isExpanded: !!view.expanded,
|
isExpanded: !!view.expanded,
|
||||||
containerApi: new PaneviewApi(this),
|
containerApi: new PaneviewApi(this),
|
||||||
|
accessor: this,
|
||||||
});
|
});
|
||||||
panel.orientation = this.paneview.orientation;
|
panel.orientation = this.paneview.orientation;
|
||||||
});
|
});
|
||||||
|
@ -15,6 +15,7 @@ import {
|
|||||||
Parameters,
|
Parameters,
|
||||||
} from '../panel/types';
|
} from '../panel/types';
|
||||||
import { IView, Orientation } from '../splitview/splitview';
|
import { IView, Orientation } from '../splitview/splitview';
|
||||||
|
import { PaneviewComponent } from './paneviewComponent';
|
||||||
|
|
||||||
export interface PanePanelViewState extends BasePanelViewState {
|
export interface PanePanelViewState extends BasePanelViewState {
|
||||||
headerComponent?: string;
|
headerComponent?: string;
|
||||||
@ -27,6 +28,7 @@ export interface PanePanelInitParameter extends PanelInitParameters {
|
|||||||
isExpanded?: boolean;
|
isExpanded?: boolean;
|
||||||
title: string;
|
title: string;
|
||||||
containerApi: PaneviewApi;
|
containerApi: PaneviewApi;
|
||||||
|
accessor: PaneviewComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PanePanelComponentInitParameter
|
export interface PanePanelComponentInitParameter
|
||||||
@ -176,6 +178,11 @@ export abstract class PaneviewPanel
|
|||||||
this.element.classList.add('pane');
|
this.element.classList.add('pane');
|
||||||
|
|
||||||
this.addDisposables(
|
this.addDisposables(
|
||||||
|
this.api.onWillVisibilityChange((event) => {
|
||||||
|
const { isVisible } = event;
|
||||||
|
const { accessor } = this._params as PanePanelInitParameter;
|
||||||
|
accessor.setVisible(this, isVisible);
|
||||||
|
}),
|
||||||
this.api.onDidSizeChange((event) => {
|
this.api.onDidSizeChange((event) => {
|
||||||
this._onDidChange.fire({ size: event.size });
|
this._onDidChange.fire({ size: event.size });
|
||||||
}),
|
}),
|
||||||
|
@ -209,20 +209,20 @@ export class SplitviewComponent
|
|||||||
this.splitview.setViewVisible(index, visible);
|
this.splitview.setViewVisible(index, visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
setActive(view: SplitviewPanel, skipFocus?: boolean): void {
|
setActive(panel: SplitviewPanel, skipFocus?: boolean): void {
|
||||||
this._activePanel = view;
|
this._activePanel = panel;
|
||||||
|
|
||||||
this.panels
|
this.panels
|
||||||
.filter((v) => v !== view)
|
.filter((v) => v !== panel)
|
||||||
.forEach((v) => {
|
.forEach((v) => {
|
||||||
v.api._onDidActiveChange.fire({ isActive: false });
|
v.api._onDidActiveChange.fire({ isActive: false });
|
||||||
if (!skipFocus) {
|
if (!skipFocus) {
|
||||||
v.focus();
|
v.focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
view.api._onDidActiveChange.fire({ isActive: true });
|
panel.api._onDidActiveChange.fire({ isActive: true });
|
||||||
if (!skipFocus) {
|
if (!skipFocus) {
|
||||||
view.focus();
|
panel.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,10 +89,10 @@ export abstract class SplitviewPanel
|
|||||||
|
|
||||||
this.addDisposables(
|
this.addDisposables(
|
||||||
this._onDidChange,
|
this._onDidChange,
|
||||||
this.api.onDidHiddenChange((event) => {
|
this.api.onWillVisibilityChange((event) => {
|
||||||
const { isHidden } = event;
|
const { isVisible } = event;
|
||||||
const { accessor } = this._params as PanelViewInitParameters;
|
const { accessor } = this._params as PanelViewInitParameters;
|
||||||
accessor.setVisible(this, !isHidden);
|
accessor.setVisible(this, isVisible);
|
||||||
}),
|
}),
|
||||||
this.api.onActiveChange(() => {
|
this.api.onActiveChange(() => {
|
||||||
const { accessor } = this._params as PanelViewInitParameters;
|
const { accessor } = this._params as PanelViewInitParameters;
|
||||||
|
@ -14,10 +14,6 @@ export interface PanelApiMetadata {
|
|||||||
value: boolean;
|
value: boolean;
|
||||||
count: number;
|
count: number;
|
||||||
};
|
};
|
||||||
isHidden: {
|
|
||||||
value: boolean;
|
|
||||||
count: number;
|
|
||||||
};
|
|
||||||
renderer: {
|
renderer: {
|
||||||
value: DockviewPanelRenderer;
|
value: DockviewPanelRenderer;
|
||||||
count: number;
|
count: number;
|
||||||
@ -69,7 +65,6 @@ export function usePanelApiMetadata(api: DockviewPanelApi): PanelApiMetadata {
|
|||||||
const [state, setState] = React.useState<PanelApiMetadata>({
|
const [state, setState] = React.useState<PanelApiMetadata>({
|
||||||
isActive: { value: api.isActive, count: 0 },
|
isActive: { value: api.isActive, count: 0 },
|
||||||
isVisible: { value: api.isVisible, count: 0 },
|
isVisible: { value: api.isVisible, count: 0 },
|
||||||
isHidden: { value: api.isHidden, count: 0 },
|
|
||||||
renderer: { value: api.renderer, count: 0 },
|
renderer: { value: api.renderer, count: 0 },
|
||||||
isGroupActive: { value: api.isGroupActive, count: 0 },
|
isGroupActive: { value: api.isGroupActive, count: 0 },
|
||||||
groupChanged: { count: 0 },
|
groupChanged: { count: 0 },
|
||||||
@ -125,15 +120,6 @@ export function usePanelApiMetadata(api: DockviewPanelApi): PanelApiMetadata {
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
const d6 = api.onDidHiddenChange((event) => {
|
|
||||||
setState((_) => ({
|
|
||||||
..._,
|
|
||||||
isHidden: {
|
|
||||||
value: event.isHidden,
|
|
||||||
count: _.isHidden.count + 1,
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
const d7 = api.onDidLocationChange((event) => {
|
const d7 = api.onDidLocationChange((event) => {
|
||||||
setState((_) => ({
|
setState((_) => ({
|
||||||
..._,
|
..._,
|
||||||
@ -168,7 +154,6 @@ export function usePanelApiMetadata(api: DockviewPanelApi): PanelApiMetadata {
|
|||||||
d3.dispose();
|
d3.dispose();
|
||||||
d4.dispose();
|
d4.dispose();
|
||||||
d5.dispose();
|
d5.dispose();
|
||||||
d6.dispose();
|
|
||||||
d7.dispose();
|
d7.dispose();
|
||||||
d8.dispose();
|
d8.dispose();
|
||||||
d9.dispose();
|
d9.dispose();
|
||||||
|
Loading…
Reference in New Issue
Block a user