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', () => {
const container = document.createElement('div');
const didPanelTitleChangeHandler = jest.fn();
const { dispose: disposeDidPanelTitleChangeHandler } =
dockview.onDidPanelTitleChange(didPanelTitleChangeHandler);
const didLayoutChangeHandler = jest.fn();
const { dispose: disposeDidLayoutChangeHandler } =
dockview.onDidLayoutChange(didLayoutChangeHandler);
@ -4642,20 +4636,12 @@ describe('dockviewComponent', () => {
jest.runAllTimers();
expect(didPanelTitleChangeHandler).toHaveBeenCalledTimes(1);
expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1);
disposeDidPanelTitleChangeHandler();
disposeDidLayoutChangeHandler();
});
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 { dispose: disposeDidLayoutChangeHandler } =
dockview.onDidLayoutChange(didLayoutChangeHandler);
@ -4664,10 +4650,8 @@ describe('dockviewComponent', () => {
jest.runAllTimers();
expect(didPanelParametersChangeHandler).toHaveBeenCalledTimes(1);
expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1);
disposeDidPanelParametersChangeHandler();
disposeDidLayoutChangeHandler();
});
});

View File

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

View File

@ -24,8 +24,7 @@ export interface PanelApi {
readonly onDidFocusChange: Event<FocusEvent>;
readonly onDidVisibilityChange: Event<VisibilityEvent>;
readonly onDidActiveChange: Event<ActiveEvent>;
readonly onDidHiddenChange: Event<HiddenEvent>;
readonly onUpdateParameters: Event<Parameters>;
readonly onDidParametersChange: Event<Parameters>;
setActive(): void;
setVisible(isVisible: boolean): void;
updateParameters(parameters: Parameters): void;
@ -55,6 +54,8 @@ export interface PanelApi {
readonly height: number;
readonly onWillFocus: Event<WillFocusEvent>;
getParameters<T extends Parameters = Parameters>(): T;
}
export class WillFocusEvent extends DockviewEvent {
@ -72,6 +73,7 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
private _isVisible = true;
private _width = 0;
private _height = 0;
private _parameters: Parameters = {};
private readonly panelUpdatesDisposable = new MutableDisposable();
@ -99,9 +101,9 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
readonly _onActiveChange = new Emitter<void>();
readonly onActiveChange: Event<void> = this._onActiveChange.event;
readonly _onUpdateParameters = new Emitter<Parameters>();
readonly onUpdateParameters: Event<Parameters> =
this._onUpdateParameters.event;
readonly _onDidParametersChange = new Emitter<Parameters>();
readonly onDidParametersChange: Event<Parameters> =
this._onDidParametersChange.event;
get isFocused(): boolean {
return this._isFocused;
@ -149,13 +151,18 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
this._onActiveChange,
this._onWillFocus,
this._onWillVisibilityChange,
this._onUpdateParameters
this._onDidParametersChange
);
}
getParameters<T extends Parameters = Parameters>(): T {
return this._parameters as T;
}
public initialize(panel: IPanel): void {
this.panelUpdatesDisposable.value = this._onUpdateParameters.event(
this.panelUpdatesDisposable.value = this._onDidParametersChange.event(
(parameters) => {
this._parameters = parameters;
panel.update({
params: parameters,
});
@ -172,6 +179,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi {
}
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>();
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>();
readonly onDidLayoutFromJSON: Event<void> = this._onDidLayoutFromJSON.event;
@ -495,9 +487,7 @@ export class DockviewComponent
Event.any(
this.onDidAddPanel,
this.onDidRemovePanel,
this.onDidActivePanelChange,
this.onDidPanelTitleChange,
this.onDidPanelParametersChange
this.onDidActivePanelChange
)(() => {
this._bufferOnDidLayoutChange.fire();
}),
@ -2187,11 +2177,11 @@ export class DockviewComponent
this._onDidActivePanelChange.fire(event.panel);
}
}),
view.model.onDidPanelTitleChange((event) => {
this._onDidPanelTitleChange.fire(event);
}),
view.model.onDidPanelParametersChange((event) => {
this._onDidPanelParametersChange.fire(event);
Event.any(
view.model.onDidPanelTitleChange,
view.model.onDidPanelParametersChange
)(() => {
this._bufferOnDidLayoutChange.fire();
})
);

View File

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