better lifecycle for actions

fixes #76419
This commit is contained in:
Joao Moreno 2019-07-03 10:35:28 +02:00
parent 33c187558e
commit 9c71dd0cfb
3 changed files with 21 additions and 8 deletions

View file

@ -258,7 +258,7 @@ class DirtyDiffWidget extends PeekViewWidget {
this._actionbarWidget.push([previous, next], { label: false, icon: true });
const actions: IAction[] = [];
createAndFillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions);
this._disposables.add(createAndFillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions));
this._actionbarWidget.push(actions, { label: false, icon: true });
}

View file

@ -5,7 +5,7 @@
import 'vs/css!./media/scmViewlet';
import { Event, Emitter } from 'vs/base/common/event';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions';
import { IAction } from 'vs/base/common/actions';
@ -37,6 +37,8 @@ export class SCMMenus implements IDisposable {
private contextKeyService: IContextKeyService;
private titleMenu: IMenu;
private titleActionDisposable: IDisposable = Disposable.None;
private titleActions: IAction[] = [];
private titleSecondaryActions: IAction[] = [];
@ -76,12 +78,15 @@ export class SCMMenus implements IDisposable {
const primary: IAction[] = [];
const secondary: IAction[] = [];
createAndFillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary });
const disposable = createAndFillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary });
if (equals(primary, this.titleActions, actionEquals) && equals(secondary, this.titleSecondaryActions, actionEquals)) {
disposable.dispose();
return;
}
this.titleActionDisposable.dispose();
this.titleActionDisposable = disposable;
this.titleActions = primary;
this.titleSecondaryActions = secondary;

View file

@ -8,7 +8,7 @@ import { localize } from 'vs/nls';
import { Event, Emitter } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/event';
import { basename } from 'vs/base/common/resources';
import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle';
import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet';
import { append, $, addClass, toggleClass, trackFocus, removeClass, addClasses } from 'vs/base/browser/dom';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@ -108,26 +108,32 @@ class StatusBarActionViewItem extends ActionViewItem {
}
function connectPrimaryMenuToInlineActionBar(menu: IMenu, actionBar: ActionBar): IDisposable {
let cachedDisposable: IDisposable = Disposable.None;
let cachedPrimary: IAction[] = [];
const updateActions = () => {
const primary: IAction[] = [];
const secondary: IAction[] = [];
const result = { primary, secondary };
createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result, g => /^inline/.test(g));
const disposable = createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, { primary, secondary }, g => /^inline/.test(g));
if (equals(cachedPrimary, primary, (a, b) => a.id === b.id)) {
disposable.dispose();
return;
}
cachedDisposable = disposable;
cachedPrimary = primary;
actionBar.clear();
actionBar.push(primary, { icon: true, label: false });
};
updateActions();
return menu.onDidChange(updateActions);
return combinedDisposable(menu.onDidChange(updateActions), toDisposable(() => {
cachedDisposable.dispose();
}));
}
interface RepositoryTemplateData {
@ -299,7 +305,7 @@ export class MainPanel extends ViewletPanel {
const secondary: IAction[] = [];
const result = { primary, secondary };
createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline');
const disposable = createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline');
menu.dispose();
contextKeyService.dispose();
@ -313,6 +319,8 @@ export class MainPanel extends ViewletPanel {
getActions: () => secondary,
getActionsContext: () => repository.provider
});
disposable.dispose();
}
private onListSelectionChange(e: IListEvent<ISCMRepository>): void {