diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index e323439ee9a42705cb64ce382ec3c5bcf6248b29..5de79ae5dade3a5388795c8292cd9e5c6db1a612 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -306,10 +306,10 @@ export class ActivitybarPart extends Part { private enableCompositeActions(viewlet: ViewletDescriptor): void { const { activityAction, pinnedAction } = this.getCompositeActions(viewlet.id); if (activityAction instanceof PlaceHolderViewletActivityAction) { - activityAction.enable(viewlet); + activityAction.setActivity(viewlet); } if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) { - pinnedAction.enable(viewlet); + pinnedAction.setActivity(viewlet); } } @@ -376,9 +376,8 @@ class PlaceHolderViewletActivityAction extends ViewletActivityAction { this.enabled = false; } - enable(activity: IActivity): void { - this.label = activity.name; - this.class = activity.cssClass; + setActivity(activity: IActivity): void { + this.activity = activity; this.enabled = true; } @@ -393,7 +392,7 @@ class PlaceHolderToggleCompositePinnedAction extends ToggleCompositePinnedAction this.enabled = false; } - enable(activity: IActivity): void { + setActivity(activity: IActivity): void { this.label = activity.name; this.enabled = true; } diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositebar/compositeBarActions.ts index 2da7b86088f4112b9ab5d6f56937be252c65853b..7beeddb156ca59de528a79b9d36c5d16195cfa6e 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBarActions.ts @@ -54,6 +54,7 @@ export interface ICompositeBar { export class ActivityAction extends Action { private badge: IBadge; private clazz: string | undefined; + private _onDidChangeActivity = new Emitter(); private _onDidChangeBadge = new Emitter(); constructor(private _activity: IActivity) { @@ -66,6 +67,15 @@ export class ActivityAction extends Action { return this._activity; } + public set activity(activity: IActivity) { + this._activity = activity; + this._onDidChangeActivity.fire(this); + } + + public get onDidChangeActivity(): Event { + return this._onDidChangeActivity.event; + } + public get onDidChangeBadge(): Event { return this._onDidChangeBadge.event; } @@ -127,6 +137,7 @@ export class ActivityActionItem extends BaseActionItem { super(null, action, options); this.themeService.onThemeChange(this.onThemeChange, this, this._callOnDispose); + action.onDidChangeActivity(this.updateActivity, this, this._callOnDispose); action.onDidChangeBadge(this.updateBadge, this, this._callOnDispose); } @@ -165,8 +176,7 @@ export class ActivityActionItem extends BaseActionItem { // Make the container tab-able for keyboard navigation this.$container = $(container).attr({ tabIndex: '0', - role: 'button', - title: this.activity.name + role: 'button' }); // Try hard to prevent keyboard only focus feedback when using mouse @@ -186,27 +196,26 @@ export class ActivityActionItem extends BaseActionItem { // Label this.$label = $('a.action-label').appendTo(this.builder); - if (this.activity.cssClass) { - this.$label.addClass(this.activity.cssClass); - } - if (!this.options.icon) { - this.$label.text(this.getAction().label); - } this.$badge = this.builder.clone().div({ 'class': 'badge' }, badge => { this.$badgeContent = badge.div({ 'class': 'badge-content' }); }); - this.$badge.hide(); + this.updateActivity(); this.updateStyles(); - this.updateBadge(); } private onThemeChange(theme: ITheme): void { this.updateStyles(); } + protected updateActivity(): void { + this.updateLabel(); + this.updateTitle(this.activity.name); + this.updateBadge(); + } + protected updateBadge(): void { const action = this.getAction(); if (!this.$badge || !this.$badgeContent || !(action instanceof ActivityAction)) { @@ -271,7 +280,19 @@ export class ActivityActionItem extends BaseActionItem { } else { title = this.activity.name; } + this.updateTitle(title); + } + + private updateLabel(): void { + if (this.activity.cssClass) { + this.$label.addClass(this.activity.cssClass); + } + if (!this.options.icon) { + this.$label.text(this.getAction().label); + } + } + private updateTitle(title: string): void { [this.$label, this.$badge, this.$container].forEach(b => { if (b) { b.attr('aria-label', title); @@ -409,6 +430,8 @@ export class CompositeActionItem extends ActivityActionItem { if (!CompositeActionItem.manageExtensionAction) { CompositeActionItem.manageExtensionAction = instantiationService.createInstance(ManageExtensionAction); } + + compositeActivityAction.onDidChangeActivity(() => { this.compositeActivity = null; this.updateActivity(); }, this, this._callOnDispose); } protected get activity(): IActivity {