mirror of
https://github.com/mathuo/dockview
synced 2025-03-13 01:12:08 +00:00
code
This commit is contained in:
parent
72b0f8861c
commit
a2a930a714
@ -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,
|
||||||
});
|
});
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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' ||
|
||||||
|
@ -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;
|
@ -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';
|
||||||
|
@ -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({
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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' ||
|
||||||
|
Loading…
Reference in New Issue
Block a user