feat: title and parameter events

This commit is contained in:
mathuo 2024-03-11 20:20:19 +00:00
parent 1c33ee46a2
commit c55c3e4a2f
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
5 changed files with 42 additions and 59 deletions

View File

@ -4628,12 +4628,6 @@ describe('dockviewComponent', () => {
}); });
test('that emits onDidPanelTitleChange and onDidLayoutChange when the panel set a title', () => { test('that emits onDidPanelTitleChange and onDidLayoutChange when the panel set a title', () => {
const container = document.createElement('div');
const didPanelTitleChangeHandler = jest.fn();
const { dispose: disposeDidPanelTitleChangeHandler } =
dockview.onDidPanelTitleChange(didPanelTitleChangeHandler);
const didLayoutChangeHandler = jest.fn(); const didLayoutChangeHandler = jest.fn();
const { dispose: disposeDidLayoutChangeHandler } = const { dispose: disposeDidLayoutChangeHandler } =
dockview.onDidLayoutChange(didLayoutChangeHandler); dockview.onDidLayoutChange(didLayoutChangeHandler);
@ -4642,20 +4636,12 @@ describe('dockviewComponent', () => {
jest.runAllTimers(); jest.runAllTimers();
expect(didPanelTitleChangeHandler).toHaveBeenCalledTimes(1);
expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1); expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1);
disposeDidPanelTitleChangeHandler();
disposeDidLayoutChangeHandler(); disposeDidLayoutChangeHandler();
}); });
test('that emits onDidPanelParametersChange and onDidLayoutChange when the panel updates parameters', () => { test('that emits onDidPanelParametersChange and onDidLayoutChange when the panel updates parameters', () => {
const didPanelParametersChangeHandler = jest.fn();
const { dispose: disposeDidPanelParametersChangeHandler } =
dockview.onDidPanelParametersChange(
didPanelParametersChangeHandler
);
const didLayoutChangeHandler = jest.fn(); const didLayoutChangeHandler = jest.fn();
const { dispose: disposeDidLayoutChangeHandler } = const { dispose: disposeDidLayoutChangeHandler } =
dockview.onDidLayoutChange(didLayoutChangeHandler); dockview.onDidLayoutChange(didLayoutChangeHandler);
@ -4664,10 +4650,8 @@ describe('dockviewComponent', () => {
jest.runAllTimers(); jest.runAllTimers();
expect(didPanelParametersChangeHandler).toHaveBeenCalledTimes(1);
expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1); expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1);
disposeDidPanelParametersChangeHandler();
disposeDidLayoutChangeHandler(); disposeDidLayoutChangeHandler();
}); });
}); });

View File

@ -38,11 +38,11 @@ import {
FocusEvent, FocusEvent,
VisibilityEvent, VisibilityEvent,
ActiveEvent, ActiveEvent,
HiddenEvent,
WillFocusEvent, WillFocusEvent,
} from '../../api/panelApi'; } from '../../api/panelApi';
import { Position } from '../../dnd/droptarget'; import { Position } from '../../dnd/droptarget';
import { Emitter, Event } from '../../events'; import { Emitter, Event } from '../../events';
import { fromPartial } from '@total-typescript/shoehorn';
enum GroupChangeKind2 { enum GroupChangeKind2 {
ADD_PANEL, ADD_PANEL,
@ -269,11 +269,11 @@ describe('dockviewGroupPanelModel', () => {
options = {}; options = {};
panelApi = { panelApi = fromPartial<DockviewPanelApi>({
renderer: 'onlyWhenVisibile', renderer: 'onlyWhenVisibile',
onDidTitleChange: new Emitter().event, onDidTitleChange: new Emitter().event,
onUpdateParameters: new Emitter().event, onDidParametersChange: new Emitter().event,
} as DockviewPanelApi; });
dockview = (<Partial<DockviewComponent>>{ dockview = (<Partial<DockviewComponent>>{
options: { parentElement: document.createElement('div') }, options: { parentElement: document.createElement('div') },

View File

@ -24,8 +24,7 @@ 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>; readonly onDidParametersChange: Event<Parameters>;
readonly onUpdateParameters: Event<Parameters>;
setActive(): void; setActive(): void;
setVisible(isVisible: boolean): void; setVisible(isVisible: boolean): void;
updateParameters(parameters: Parameters): void; updateParameters(parameters: Parameters): void;
@ -55,6 +54,8 @@ export interface PanelApi {
readonly height: number; readonly height: number;
readonly onWillFocus: Event<WillFocusEvent>; readonly onWillFocus: Event<WillFocusEvent>;
getParameters<T extends Parameters = Parameters>(): T;
} }
export class WillFocusEvent extends DockviewEvent { export class WillFocusEvent extends DockviewEvent {
@ -72,6 +73,7 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
private _isVisible = true; private _isVisible = true;
private _width = 0; private _width = 0;
private _height = 0; private _height = 0;
private _parameters: Parameters = {};
private readonly panelUpdatesDisposable = new MutableDisposable(); private readonly panelUpdatesDisposable = new MutableDisposable();
@ -99,9 +101,9 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
readonly _onActiveChange = new Emitter<void>(); readonly _onActiveChange = new Emitter<void>();
readonly onActiveChange: Event<void> = this._onActiveChange.event; readonly onActiveChange: Event<void> = this._onActiveChange.event;
readonly _onUpdateParameters = new Emitter<Parameters>(); readonly _onDidParametersChange = new Emitter<Parameters>();
readonly onUpdateParameters: Event<Parameters> = readonly onDidParametersChange: Event<Parameters> =
this._onUpdateParameters.event; this._onDidParametersChange.event;
get isFocused(): boolean { get isFocused(): boolean {
return this._isFocused; return this._isFocused;
@ -149,13 +151,18 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
this._onActiveChange, this._onActiveChange,
this._onWillFocus, this._onWillFocus,
this._onWillVisibilityChange, this._onWillVisibilityChange,
this._onUpdateParameters this._onDidParametersChange
); );
} }
getParameters<T extends Parameters = Parameters>(): T {
return this._parameters as T;
}
public initialize(panel: IPanel): void { public initialize(panel: IPanel): void {
this.panelUpdatesDisposable.value = this._onUpdateParameters.event( this.panelUpdatesDisposable.value = this._onDidParametersChange.event(
(parameters) => { (parameters) => {
this._parameters = parameters;
panel.update({ panel.update({
params: parameters, params: parameters,
}); });
@ -172,6 +179,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
} }
updateParameters(parameters: Parameters): void { updateParameters(parameters: Parameters): void {
this._onUpdateParameters.fire(parameters); this._onDidParametersChange.fire(parameters);
} }
} }

View File

@ -361,14 +361,6 @@ export class DockviewComponent
private readonly _onDidAddPanel = new Emitter<IDockviewPanel>(); private readonly _onDidAddPanel = new Emitter<IDockviewPanel>();
readonly onDidAddPanel: Event<IDockviewPanel> = this._onDidAddPanel.event; readonly onDidAddPanel: Event<IDockviewPanel> = this._onDidAddPanel.event;
private readonly _onDidPanelTitleChange = new Emitter<TitleEvent>();
readonly onDidPanelTitleChange: Event<TitleEvent> =
this._onDidPanelTitleChange.event;
private readonly _onDidPanelParametersChange = new Emitter<Parameters>();
readonly onDidPanelParametersChange: Event<Parameters> =
this._onDidPanelParametersChange.event;
private readonly _onDidLayoutFromJSON = new Emitter<void>(); private readonly _onDidLayoutFromJSON = new Emitter<void>();
readonly onDidLayoutFromJSON: Event<void> = this._onDidLayoutFromJSON.event; readonly onDidLayoutFromJSON: Event<void> = this._onDidLayoutFromJSON.event;
@ -495,9 +487,7 @@ export class DockviewComponent
Event.any( Event.any(
this.onDidAddPanel, this.onDidAddPanel,
this.onDidRemovePanel, this.onDidRemovePanel,
this.onDidActivePanelChange, this.onDidActivePanelChange
this.onDidPanelTitleChange,
this.onDidPanelParametersChange
)(() => { )(() => {
this._bufferOnDidLayoutChange.fire(); this._bufferOnDidLayoutChange.fire();
}), }),
@ -2187,11 +2177,11 @@ export class DockviewComponent
this._onDidActivePanelChange.fire(event.panel); this._onDidActivePanelChange.fire(event.panel);
} }
}), }),
view.model.onDidPanelTitleChange((event) => { Event.any(
this._onDidPanelTitleChange.fire(event); view.model.onDidPanelTitleChange,
}), view.model.onDidPanelParametersChange
view.model.onDidPanelParametersChange((event) => { )(() => {
this._onDidPanelParametersChange.fire(event); this._bufferOnDidLayoutChange.fire();
}) })
); );

View File

@ -239,8 +239,6 @@ export class DockviewGroupPanelModel
private _leftHeaderActions: IHeaderActionsRenderer | undefined; private _leftHeaderActions: IHeaderActionsRenderer | undefined;
private _prefixHeaderActions: IHeaderActionsRenderer | undefined; private _prefixHeaderActions: IHeaderActionsRenderer | undefined;
private _panelDisposables = new Map<string, IDisposable[]>();
private _location: DockviewGroupLocation = { type: 'grid' }; private _location: DockviewGroupLocation = { type: 'grid' };
private mostRecentlyUsed: IDockviewPanel[] = []; private mostRecentlyUsed: IDockviewPanel[] = [];
@ -253,6 +251,7 @@ export class DockviewGroupPanelModel
private _height = 0; private _height = 0;
private _panels: IDockviewPanel[] = []; private _panels: IDockviewPanel[] = [];
private readonly _panelDisposables = new Map<string, IDisposable>();
private readonly _onMove = new Emitter<GroupMoveEvent>(); private readonly _onMove = new Emitter<GroupMoveEvent>();
readonly onMove: Event<GroupMoveEvent> = this._onMove.event; readonly onMove: Event<GroupMoveEvent> = this._onMove.event;
@ -842,11 +841,11 @@ export class DockviewGroupPanelModel
); );
} }
const panelDisposables = this._panelDisposables.get(panel.id); const disposable = this._panelDisposables.get(panel.id);
if (disposable) {
this._panelDisposables.delete(panel.id); disposable.dispose();
this._panelDisposables.delete(panel.id);
panelDisposables?.forEach(({ dispose }) => dispose()); }
this._onDidRemovePanel.fire({ panel }); this._onDidRemovePanel.fire({ panel });
} }
@ -878,14 +877,17 @@ export class DockviewGroupPanelModel
this.updateMru(panel); this.updateMru(panel);
this.panels.splice(index, 0, panel); this.panels.splice(index, 0, panel);
this._panelDisposables.set(panel.id, [ this._panelDisposables.set(
panel.api.onDidTitleChange((event) => panel.id,
this._onDidPanelTitleChange.fire(event) new CompositeDisposable(
), panel.api.onDidTitleChange((event) =>
panel.api.onUpdateParameters((event) => this._onDidPanelTitleChange.fire(event)
this._onDidPanelParametersChange.fire(event) ),
), panel.api.onDidParametersChange((event) =>
]); this._onDidPanelParametersChange.fire(event)
)
)
);
this._onDidAddPanel.fire({ panel }); this._onDidAddPanel.fire({ panel });
} }