From a2a930a714534833de402d4ee9d066211485bdbf Mon Sep 17 00:00:00 2001 From: Matthew O'Connor Date: Thu, 22 Oct 2020 21:20:14 +0100 Subject: [PATCH] code --- .../src/layout-grid/application.tsx | 12 +++---- .../splitview-demo/src/layout-grid/panel.tsx | 15 ++++++-- packages/splitview/src/api/api.ts | 13 ++++++- packages/splitview/src/api/component.api.ts | 4 +++ .../src/dockview/componentDockview.ts | 4 +-- .../components/watermark/watermark.ts | 10 +++--- .../splitview/src/gridview/gridviewPanel.ts | 5 +++ .../{panel/panel.ts => groupviewPanel.ts} | 18 +++++----- packages/splitview/src/index.ts | 2 +- packages/splitview/src/react/deserializer.ts | 4 +-- .../src/splitview/componentSplitview.ts | 12 ++++++- .../splitview/src/splitview/core/splitview.ts | 35 +++++++++++++++---- .../splitview/src/splitview/splitviewPanel.ts | 5 +++ 13 files changed, 102 insertions(+), 37 deletions(-) rename packages/splitview/src/groupview/{panel/panel.ts => groupviewPanel.ts} (89%) diff --git a/packages/splitview-demo/src/layout-grid/application.tsx b/packages/splitview-demo/src/layout-grid/application.tsx index c932309c6..43651b666 100644 --- a/packages/splitview-demo/src/layout-grid/application.tsx +++ b/packages/splitview-demo/src/layout-grid/application.tsx @@ -37,7 +37,7 @@ export const Application = () => { // return; event.api.addComponent({ - id: '0', + id: 'i', component: 'activitybar', minimumWidth: 48, maximumWidth: 48, @@ -45,7 +45,7 @@ export const Application = () => { }); event.api.addComponent({ - id: '4', + id: 'footer', component: 'footer', location: [1], maximumHeight: 22, @@ -53,7 +53,7 @@ export const Application = () => { }); event.api.addComponent({ - id: '2', + id: 'editor', component: 'editor', snap: true, location: [0, 1], @@ -64,15 +64,15 @@ export const Application = () => { id: 'sidebar', component: 'sidebar', snap: true, - position: { reference: '2', direction: 'left' }, + position: { reference: 'editor', direction: 'left' }, minimumWidth: 170, size: 100, }); event.api.addComponent({ - id: '3', + id: 'panel', component: 'panel', - position: { reference: '2', direction: 'below' }, + position: { reference: 'editor', direction: 'below' }, size: 200, snap: true, }); diff --git a/packages/splitview-demo/src/layout-grid/panel.tsx b/packages/splitview-demo/src/layout-grid/panel.tsx index 9ce01c3ae..6578e874d 100644 --- a/packages/splitview-demo/src/layout-grid/panel.tsx +++ b/packages/splitview-demo/src/layout-grid/panel.tsx @@ -20,8 +20,16 @@ export const Panel = (props: IGridviewPanelProps) => { }; }, []); - const onClick = () => { - props.api.setSize({ height: 500 }); + const onToggle = () => { + const editorPanel = props.containerApi.getPanel('editor'); + editorPanel.api.setVisible(!editorPanel.api.isVisible); + }; + + const onClose = () => { + const editorPanel = props.containerApi.getPanel('editor'); + + editorPanel.api.setVisible(true); + props.api.setVisible(false); }; return ( @@ -36,7 +44,8 @@ export const Panel = (props: IGridviewPanelProps) => {
This panel is outside of the dockable layer - + +
{`isPanelActive: ${active} isPanelFocused: ${focused}`}
diff --git a/packages/splitview/src/api/api.ts b/packages/splitview/src/api/api.ts index 7dbe78790..f9b3692a2 100644 --- a/packages/splitview/src/api/api.ts +++ b/packages/splitview/src/api/api.ts @@ -44,6 +44,8 @@ export interface IBaseViewApi { onDidVisibilityChange: Event; onDidActiveChange: Event; onFocusEvent: Event; + // + setVisible(isVisible: boolean): void; // state setState(key: string, value: StateObject): void; setState(state: State): void; @@ -64,7 +66,7 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi { private _state: State = {}; private _isFocused = false; private _isActive = false; - private _isVisible = false; + private _isVisible = true; private _width = 0; private _height = 0; @@ -92,6 +94,11 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi { readonly onDidVisibilityChange: Event = this ._onDidVisibilityChange.event; // + + readonly _onVisibilityChange = new Emitter(); + readonly onVisibilityChange: Event = this + ._onVisibilityChange.event; + // readonly _onDidActiveChange = new Emitter({ replay: true, }); @@ -144,6 +151,10 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi { ); } + setVisible(isVisible: boolean) { + this._onVisibilityChange.fire({ isVisible }); + } + setState( key: string | { [key: string]: StateObject }, value?: StateObject diff --git a/packages/splitview/src/api/component.api.ts b/packages/splitview/src/api/component.api.ts index 95fd67dfd..791bd2c31 100644 --- a/packages/splitview/src/api/component.api.ts +++ b/packages/splitview/src/api/component.api.ts @@ -40,6 +40,10 @@ export class SplitviewApi { this.component.removePanel(panel, sizing); } + setVisible(panel: SplitviewPanel, isVisible: boolean) { + return this.component.setVisible(panel, isVisible); + } + getPanels(): SplitviewPanel[] { return this.component.getPanels(); } diff --git a/packages/splitview/src/dockview/componentDockview.ts b/packages/splitview/src/dockview/componentDockview.ts index f40f29d69..6cd3ae76e 100644 --- a/packages/splitview/src/dockview/componentDockview.ts +++ b/packages/splitview/src/dockview/componentDockview.ts @@ -10,7 +10,7 @@ import { GroupChangeEvent, GroupDropEvent, } from '../groupview/groupview'; -import { DefaultPanel } from '../groupview/panel/panel'; +import { GroupviewPanel } from '../groupview/groupviewPanel'; import { CompositeDisposable, IDisposable, @@ -535,7 +535,7 @@ export class ComponentDockview options.tabComponentName ); - const panel = new DefaultPanel(options.id, this._api); + const panel = new GroupviewPanel(options.id, this._api); panel.init({ headerPart, contentPart, diff --git a/packages/splitview/src/dockview/components/watermark/watermark.ts b/packages/splitview/src/dockview/components/watermark/watermark.ts index 3f9ca0bb6..78aa79d4b 100644 --- a/packages/splitview/src/dockview/components/watermark/watermark.ts +++ b/packages/splitview/src/dockview/components/watermark/watermark.ts @@ -11,8 +11,8 @@ import { CompositeDisposable } from '../../../lifecycle'; export class Watermark extends CompositeDisposable implements WatermarkPart { private _element: HTMLElement; - private accessor: IComponentDockview; private group: IGroupview; + private params: GroupPanelPartInitParameters; get id() { return 'watermark'; @@ -47,7 +47,7 @@ export class Watermark extends CompositeDisposable implements WatermarkPart { this.addDisposables( addDisposableListener(closeAnchor, 'click', (ev) => { ev.preventDefault(); - this.accessor.removeGroup(this.group); + this.params.containerApi.removeGroup(this.group); }) ); } @@ -57,10 +57,10 @@ export class Watermark extends CompositeDisposable implements WatermarkPart { } public init(params: GroupPanelPartInitParameters) { - // this.accessor = params.accessor; + this.params = params; this.addDisposables( - this.accessor.onDidLayoutChange((event) => { + this.params.containerApi.onDidLayoutChange((event) => { this.render(); }) ); @@ -78,7 +78,7 @@ export class Watermark extends CompositeDisposable implements WatermarkPart { } private render() { - const isOneGroup = this.accessor.size <= 1; + const isOneGroup = this.params.containerApi.size <= 1; toggleClass(this.element, 'has-actions', isOneGroup); } diff --git a/packages/splitview/src/gridview/gridviewPanel.ts b/packages/splitview/src/gridview/gridviewPanel.ts index b4606363b..f2e361992 100644 --- a/packages/splitview/src/gridview/gridviewPanel.ts +++ b/packages/splitview/src/gridview/gridviewPanel.ts @@ -65,6 +65,11 @@ export abstract class GridviewPanel super(id, component, new GridPanelApi()); this.addDisposables( + this.api.onVisibilityChange((event) => { + const { isVisible } = event; + const { containerApi } = this.params as GridviewInitParameters; + containerApi.setVisible(this, isVisible); + }), this.api.onDidConstraintsChange((event) => { if ( typeof event.minimumWidth === 'number' || diff --git a/packages/splitview/src/groupview/panel/panel.ts b/packages/splitview/src/groupview/groupviewPanel.ts similarity index 89% rename from packages/splitview/src/groupview/panel/panel.ts rename to packages/splitview/src/groupview/groupviewPanel.ts index 40d618d97..b8a857d47 100644 --- a/packages/splitview/src/groupview/panel/panel.ts +++ b/packages/splitview/src/groupview/groupviewPanel.ts @@ -1,17 +1,17 @@ -import { IGroupPanel } from './parts'; -import { GroupPanelApi } from '../../api/groupPanelApi'; -import { Event } from '../../events'; -import { IGroupview, GroupChangeKind } from '../groupview'; -import { MutableDisposable, CompositeDisposable } from '../../lifecycle'; +import { IGroupPanel } from './panel/parts'; +import { GroupPanelApi } from '../api/groupPanelApi'; +import { Event } from '../events'; +import { IGroupview, GroupChangeKind } from './groupview'; +import { MutableDisposable, CompositeDisposable } from '../lifecycle'; import { PanelContentPart, PanelHeaderPart, IGroupPanelInitParameters, -} from './parts'; -import { PanelUpdateEvent } from '../../panel/types'; -import { DockviewApi } from '../../api/component.api'; +} from './panel/parts'; +import { PanelUpdateEvent } from '../panel/types'; +import { DockviewApi } from '../api/component.api'; -export class DefaultPanel extends CompositeDisposable implements IGroupPanel { +export class GroupviewPanel extends CompositeDisposable implements IGroupPanel { private readonly mutableDisposable = new MutableDisposable(); readonly api: GroupPanelApi; diff --git a/packages/splitview/src/index.ts b/packages/splitview/src/index.ts index 39c23ec59..f2a3ce5a1 100644 --- a/packages/splitview/src/index.ts +++ b/packages/splitview/src/index.ts @@ -8,7 +8,7 @@ export * from './groupview/panel/content/content'; export * from './groupview/panel/tab/tab'; export * from './events'; export * from './lifecycle'; -export * from './groupview/panel/panel'; +export * from './groupview/groupviewPanel'; export * from './api/groupPanelApi'; export * from './api/component.api'; export * from './react/react'; diff --git a/packages/splitview/src/react/deserializer.ts b/packages/splitview/src/react/deserializer.ts index 5e2362e35..ef92a4d31 100644 --- a/packages/splitview/src/react/deserializer.ts +++ b/packages/splitview/src/react/deserializer.ts @@ -1,5 +1,5 @@ import { ComponentDockview } from '../dockview/componentDockview'; -import { DefaultPanel } from '../groupview/panel/panel'; +import { GroupviewPanel } from '../groupview/groupviewPanel'; import { PanelContentPart, PanelHeaderPart, @@ -40,7 +40,7 @@ export class ReactPanelDeserialzier implements IPanelDeserializer { this.layout.options.frameworkComponentFactory.tab ) as PanelHeaderPart; - const panel = new DefaultPanel(panelId, new DockviewApi(this.layout)); + const panel = new GroupviewPanel(panelId, new DockviewApi(this.layout)); // TODO container api panel.init({ diff --git a/packages/splitview/src/splitview/componentSplitview.ts b/packages/splitview/src/splitview/componentSplitview.ts index 6e15595ea..16d45fb09 100644 --- a/packages/splitview/src/splitview/componentSplitview.ts +++ b/packages/splitview/src/splitview/componentSplitview.ts @@ -13,7 +13,6 @@ import { import { BaseComponentOptions } from '../panel/types'; import { Emitter, Event } from '../events'; import { SplitviewApi } from '../api/component.api'; -import { Paneview } from '../paneview/paneview'; import { SplitviewPanel } from './splitviewPanel'; export interface AddSplitviewComponentOptions extends BaseComponentOptions { @@ -37,6 +36,7 @@ export interface IComponentSplitview extends IDisposable { setActive(view: SplitviewPanel, skipFocus?: boolean): void; removePanel(panel: SplitviewPanel, sizing?: Sizing): void; getPanels(): SplitviewPanel[]; + setVisible(panel: SplitviewPanel, visible: boolean): void; } /** @@ -86,6 +86,16 @@ export class ComponentSplitview this._activePanel?.focus(); } + setVisible(panel: SplitviewPanel, visible: boolean) { + const index = this.getPanels().indexOf(panel); + + if (index < 0) { + throw new Error('invalid operation'); + } + + this.splitview.setViewVisible(index, visible); + } + setActive(view: SplitviewPanel, skipFocus?: boolean) { this._activePanel = view; diff --git a/packages/splitview/src/splitview/core/splitview.ts b/packages/splitview/src/splitview/core/splitview.ts index 7a5b995a0..572fb96fa 100644 --- a/packages/splitview/src/splitview/core/splitview.ts +++ b/packages/splitview/src/splitview/core/splitview.ts @@ -181,7 +181,6 @@ export class Splitview { } style(styles: ISplitviewStyles): void { - console.log('styles', styles); if (styles?.separatorBorder === 'transparent') { removeClasses(this.element, 'separator-border'); this.element.style.removeProperty('--separator-border'); @@ -744,6 +743,32 @@ export class Splitview { return undefined; } + private _startSnappingEnabled = true; + get startSnappingEnabled(): boolean { + return this._startSnappingEnabled; + } + set startSnappingEnabled(startSnappingEnabled: boolean) { + if (this._startSnappingEnabled === startSnappingEnabled) { + return; + } + + this._startSnappingEnabled = startSnappingEnabled; + this.updateSashEnablement(); + } + + private _endSnappingEnabled = true; + get endSnappingEnabled(): boolean { + return this._endSnappingEnabled; + } + set endSnappingEnabled(endSnappingEnabled: boolean) { + if (this._endSnappingEnabled === endSnappingEnabled) { + return; + } + + this._endSnappingEnabled = endSnappingEnabled; + this.updateSashEnablement(); + } + private updateSashEnablement(): void { let previous = false; const collapsesDown = this.views.map( @@ -791,18 +816,14 @@ export class Splitview { if ( snappedBefore && collapsesUp[index] && - // ( - position > 0 - // || this.startSnappingEnabled) + (position > 0 || this.startSnappingEnabled) ) { this.updateSash(sash, SashState.MINIMUM); // sash.state = SashState.Minimum; } else if ( snappedAfter && collapsesDown[index] && - // ( - position < this.contentSize - // || this.endSnappingEnabled) + (position < this.contentSize || this.endSnappingEnabled) ) { // sash.state = SashState.Maximum; this.updateSash(sash, SashState.MAXIMUM); diff --git a/packages/splitview/src/splitview/splitviewPanel.ts b/packages/splitview/src/splitview/splitviewPanel.ts index 82b4767ea..9f6364ca7 100644 --- a/packages/splitview/src/splitview/splitviewPanel.ts +++ b/packages/splitview/src/splitview/splitviewPanel.ts @@ -40,6 +40,11 @@ export abstract class SplitviewPanel super(id, componentName, new PanelApi()); this.addDisposables( + this.api.onVisibilityChange((event) => { + const { isVisible } = event; + const { containerApi } = this.params as PanelViewInitParameters; + containerApi.setVisible(this, isVisible); + }), this.api.onDidConstraintsChange((event) => { if ( typeof event.minimumSize === 'number' ||