This commit is contained in:
Matthew O'Connor 2020-10-22 21:20:14 +01:00
parent 72b0f8861c
commit a2a930a714
13 changed files with 102 additions and 37 deletions

View File

@ -37,7 +37,7 @@ export const Application = () => {
// return; // return;
event.api.addComponent({ event.api.addComponent({
id: '0', id: 'i',
component: 'activitybar', component: 'activitybar',
minimumWidth: 48, minimumWidth: 48,
maximumWidth: 48, maximumWidth: 48,
@ -45,7 +45,7 @@ export const Application = () => {
}); });
event.api.addComponent({ event.api.addComponent({
id: '4', id: 'footer',
component: 'footer', component: 'footer',
location: [1], location: [1],
maximumHeight: 22, maximumHeight: 22,
@ -53,7 +53,7 @@ export const Application = () => {
}); });
event.api.addComponent({ event.api.addComponent({
id: '2', id: 'editor',
component: 'editor', component: 'editor',
snap: true, snap: true,
location: [0, 1], location: [0, 1],
@ -64,15 +64,15 @@ export const Application = () => {
id: 'sidebar', id: 'sidebar',
component: 'sidebar', component: 'sidebar',
snap: true, snap: true,
position: { reference: '2', direction: 'left' }, position: { reference: 'editor', direction: 'left' },
minimumWidth: 170, minimumWidth: 170,
size: 100, size: 100,
}); });
event.api.addComponent({ event.api.addComponent({
id: '3', id: 'panel',
component: 'panel', component: 'panel',
position: { reference: '2', direction: 'below' }, position: { reference: 'editor', direction: 'below' },
size: 200, size: 200,
snap: true, snap: true,
}); });

View File

@ -20,8 +20,16 @@ export const Panel = (props: IGridviewPanelProps) => {
}; };
}, []); }, []);
const onClick = () => { const onToggle = () => {
props.api.setSize({ height: 500 }); 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 ( return (
@ -36,7 +44,8 @@ export const Panel = (props: IGridviewPanelProps) => {
<div style={{ display: 'flex', padding: '5px' }}> <div style={{ display: 'flex', padding: '5px' }}>
<span>This panel is outside of the dockable layer</span> <span>This panel is outside of the dockable layer</span>
<span style={{ flexGrow: 1 }} /> <span style={{ flexGrow: 1 }} />
<button onClick={onClick}>Resize</button> <button onClick={onToggle}>Resize</button>
<button onClick={onClose}>Close</button>
</div> </div>
<div style={{ padding: '0px 5px' }}> <div style={{ padding: '0px 5px' }}>
<div>{`isPanelActive: ${active} isPanelFocused: ${focused}`}</div> <div>{`isPanelActive: ${active} isPanelFocused: ${focused}`}</div>

View File

@ -44,6 +44,8 @@ export interface IBaseViewApi {
onDidVisibilityChange: Event<VisibilityEvent>; onDidVisibilityChange: Event<VisibilityEvent>;
onDidActiveChange: Event<ActiveEvent>; onDidActiveChange: Event<ActiveEvent>;
onFocusEvent: Event<void>; onFocusEvent: Event<void>;
//
setVisible(isVisible: boolean): void;
// state // state
setState(key: string, value: StateObject): void; setState(key: string, value: StateObject): void;
setState(state: State): void; setState(state: State): void;
@ -64,7 +66,7 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi {
private _state: State = {}; private _state: State = {};
private _isFocused = false; private _isFocused = false;
private _isActive = false; private _isActive = false;
private _isVisible = false; private _isVisible = true;
private _width = 0; private _width = 0;
private _height = 0; private _height = 0;
@ -92,6 +94,11 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi {
readonly onDidVisibilityChange: Event<VisibilityEvent> = this readonly onDidVisibilityChange: Event<VisibilityEvent> = this
._onDidVisibilityChange.event; ._onDidVisibilityChange.event;
// //
readonly _onVisibilityChange = new Emitter<VisibilityEvent>();
readonly onVisibilityChange: Event<VisibilityEvent> = this
._onVisibilityChange.event;
//
readonly _onDidActiveChange = new Emitter<ActiveEvent>({ readonly _onDidActiveChange = new Emitter<ActiveEvent>({
replay: true, replay: true,
}); });
@ -144,6 +151,10 @@ export class BaseViewApi extends CompositeDisposable implements IBaseViewApi {
); );
} }
setVisible(isVisible: boolean) {
this._onVisibilityChange.fire({ isVisible });
}
setState( setState(
key: string | { [key: string]: StateObject }, key: string | { [key: string]: StateObject },
value?: StateObject value?: StateObject

View File

@ -40,6 +40,10 @@ export class SplitviewApi {
this.component.removePanel(panel, sizing); this.component.removePanel(panel, sizing);
} }
setVisible(panel: SplitviewPanel, isVisible: boolean) {
return this.component.setVisible(panel, isVisible);
}
getPanels(): SplitviewPanel[] { getPanels(): SplitviewPanel[] {
return this.component.getPanels(); return this.component.getPanels();
} }

View File

@ -10,7 +10,7 @@ import {
GroupChangeEvent, GroupChangeEvent,
GroupDropEvent, GroupDropEvent,
} from '../groupview/groupview'; } from '../groupview/groupview';
import { DefaultPanel } from '../groupview/panel/panel'; import { GroupviewPanel } from '../groupview/groupviewPanel';
import { import {
CompositeDisposable, CompositeDisposable,
IDisposable, IDisposable,
@ -535,7 +535,7 @@ export class ComponentDockview
options.tabComponentName options.tabComponentName
); );
const panel = new DefaultPanel(options.id, this._api); const panel = new GroupviewPanel(options.id, this._api);
panel.init({ panel.init({
headerPart, headerPart,
contentPart, contentPart,

View File

@ -11,8 +11,8 @@ import { CompositeDisposable } from '../../../lifecycle';
export class Watermark extends CompositeDisposable implements WatermarkPart { export class Watermark extends CompositeDisposable implements WatermarkPart {
private _element: HTMLElement; private _element: HTMLElement;
private accessor: IComponentDockview;
private group: IGroupview; private group: IGroupview;
private params: GroupPanelPartInitParameters;
get id() { get id() {
return 'watermark'; return 'watermark';
@ -47,7 +47,7 @@ export class Watermark extends CompositeDisposable implements WatermarkPart {
this.addDisposables( this.addDisposables(
addDisposableListener(closeAnchor, 'click', (ev) => { addDisposableListener(closeAnchor, 'click', (ev) => {
ev.preventDefault(); 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) { public init(params: GroupPanelPartInitParameters) {
// this.accessor = params.accessor; this.params = params;
this.addDisposables( this.addDisposables(
this.accessor.onDidLayoutChange((event) => { this.params.containerApi.onDidLayoutChange((event) => {
this.render(); this.render();
}) })
); );
@ -78,7 +78,7 @@ export class Watermark extends CompositeDisposable implements WatermarkPart {
} }
private render() { private render() {
const isOneGroup = this.accessor.size <= 1; const isOneGroup = this.params.containerApi.size <= 1;
toggleClass(this.element, 'has-actions', isOneGroup); toggleClass(this.element, 'has-actions', isOneGroup);
} }

View File

@ -65,6 +65,11 @@ export abstract class GridviewPanel
super(id, component, new GridPanelApi()); super(id, component, new GridPanelApi());
this.addDisposables( this.addDisposables(
this.api.onVisibilityChange((event) => {
const { isVisible } = event;
const { containerApi } = this.params as GridviewInitParameters;
containerApi.setVisible(this, isVisible);
}),
this.api.onDidConstraintsChange((event) => { this.api.onDidConstraintsChange((event) => {
if ( if (
typeof event.minimumWidth === 'number' || typeof event.minimumWidth === 'number' ||

View File

@ -1,17 +1,17 @@
import { IGroupPanel } from './parts'; import { IGroupPanel } from './panel/parts';
import { GroupPanelApi } from '../../api/groupPanelApi'; import { GroupPanelApi } from '../api/groupPanelApi';
import { Event } from '../../events'; import { Event } from '../events';
import { IGroupview, GroupChangeKind } from '../groupview'; import { IGroupview, GroupChangeKind } from './groupview';
import { MutableDisposable, CompositeDisposable } from '../../lifecycle'; import { MutableDisposable, CompositeDisposable } from '../lifecycle';
import { import {
PanelContentPart, PanelContentPart,
PanelHeaderPart, PanelHeaderPart,
IGroupPanelInitParameters, IGroupPanelInitParameters,
} from './parts'; } from './panel/parts';
import { PanelUpdateEvent } from '../../panel/types'; import { PanelUpdateEvent } from '../panel/types';
import { DockviewApi } from '../../api/component.api'; 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(); private readonly mutableDisposable = new MutableDisposable();
readonly api: GroupPanelApi; readonly api: GroupPanelApi;

View File

@ -8,7 +8,7 @@ export * from './groupview/panel/content/content';
export * from './groupview/panel/tab/tab'; export * from './groupview/panel/tab/tab';
export * from './events'; export * from './events';
export * from './lifecycle'; export * from './lifecycle';
export * from './groupview/panel/panel'; export * from './groupview/groupviewPanel';
export * from './api/groupPanelApi'; export * from './api/groupPanelApi';
export * from './api/component.api'; export * from './api/component.api';
export * from './react/react'; export * from './react/react';

View File

@ -1,5 +1,5 @@
import { ComponentDockview } from '../dockview/componentDockview'; import { ComponentDockview } from '../dockview/componentDockview';
import { DefaultPanel } from '../groupview/panel/panel'; import { GroupviewPanel } from '../groupview/groupviewPanel';
import { import {
PanelContentPart, PanelContentPart,
PanelHeaderPart, PanelHeaderPart,
@ -40,7 +40,7 @@ export class ReactPanelDeserialzier implements IPanelDeserializer {
this.layout.options.frameworkComponentFactory.tab this.layout.options.frameworkComponentFactory.tab
) as PanelHeaderPart; ) as PanelHeaderPart;
const panel = new DefaultPanel(panelId, new DockviewApi(this.layout)); const panel = new GroupviewPanel(panelId, new DockviewApi(this.layout));
// TODO container api // TODO container api
panel.init({ panel.init({

View File

@ -13,7 +13,6 @@ import {
import { BaseComponentOptions } from '../panel/types'; import { BaseComponentOptions } from '../panel/types';
import { Emitter, Event } from '../events'; import { Emitter, Event } from '../events';
import { SplitviewApi } from '../api/component.api'; import { SplitviewApi } from '../api/component.api';
import { Paneview } from '../paneview/paneview';
import { SplitviewPanel } from './splitviewPanel'; import { SplitviewPanel } from './splitviewPanel';
export interface AddSplitviewComponentOptions extends BaseComponentOptions { export interface AddSplitviewComponentOptions extends BaseComponentOptions {
@ -37,6 +36,7 @@ export interface IComponentSplitview extends IDisposable {
setActive(view: SplitviewPanel, skipFocus?: boolean): void; setActive(view: SplitviewPanel, skipFocus?: boolean): void;
removePanel(panel: SplitviewPanel, sizing?: Sizing): void; removePanel(panel: SplitviewPanel, sizing?: Sizing): void;
getPanels(): SplitviewPanel[]; getPanels(): SplitviewPanel[];
setVisible(panel: SplitviewPanel, visible: boolean): void;
} }
/** /**
@ -86,6 +86,16 @@ export class ComponentSplitview
this._activePanel?.focus(); 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) { setActive(view: SplitviewPanel, skipFocus?: boolean) {
this._activePanel = view; this._activePanel = view;

View File

@ -181,7 +181,6 @@ export class Splitview {
} }
style(styles: ISplitviewStyles): void { style(styles: ISplitviewStyles): void {
console.log('styles', styles);
if (styles?.separatorBorder === 'transparent') { if (styles?.separatorBorder === 'transparent') {
removeClasses(this.element, 'separator-border'); removeClasses(this.element, 'separator-border');
this.element.style.removeProperty('--separator-border'); this.element.style.removeProperty('--separator-border');
@ -744,6 +743,32 @@ export class Splitview {
return undefined; 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 { private updateSashEnablement(): void {
let previous = false; let previous = false;
const collapsesDown = this.views.map( const collapsesDown = this.views.map(
@ -791,18 +816,14 @@ export class Splitview {
if ( if (
snappedBefore && snappedBefore &&
collapsesUp[index] && collapsesUp[index] &&
// ( (position > 0 || this.startSnappingEnabled)
position > 0
// || this.startSnappingEnabled)
) { ) {
this.updateSash(sash, SashState.MINIMUM); this.updateSash(sash, SashState.MINIMUM);
// sash.state = SashState.Minimum; // sash.state = SashState.Minimum;
} else if ( } else if (
snappedAfter && snappedAfter &&
collapsesDown[index] && collapsesDown[index] &&
// ( (position < this.contentSize || this.endSnappingEnabled)
position < this.contentSize
// || this.endSnappingEnabled)
) { ) {
// sash.state = SashState.Maximum; // sash.state = SashState.Maximum;
this.updateSash(sash, SashState.MAXIMUM); this.updateSash(sash, SashState.MAXIMUM);

View File

@ -40,6 +40,11 @@ export abstract class SplitviewPanel
super(id, componentName, new PanelApi()); super(id, componentName, new PanelApi());
this.addDisposables( this.addDisposables(
this.api.onVisibilityChange((event) => {
const { isVisible } = event;
const { containerApi } = this.params as PanelViewInitParameters;
containerApi.setVisible(this, isVisible);
}),
this.api.onDidConstraintsChange((event) => { this.api.onDidConstraintsChange((event) => {
if ( if (
typeof event.minimumSize === 'number' || typeof event.minimumSize === 'number' ||