diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index bbf6fb7b245..ff18883e95e 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -33,6 +33,7 @@ import { AuthenticationSession } from 'vs/editor/common/modes'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class ViewContainerActivityAction extends ActivityAction { @@ -41,6 +42,7 @@ export class ViewContainerActivityAction extends ActivityAction { private readonly viewletService: IViewletService; private readonly layoutService: IWorkbenchLayoutService; private readonly telemetryService: ITelemetryService; + private readonly configurationService: IConfigurationService; private lastRun: number; @@ -48,7 +50,8 @@ export class ViewContainerActivityAction extends ActivityAction { activity: IActivity, @IViewletService viewletService: IViewletService, @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @ITelemetryService telemetryService: ITelemetryService + @ITelemetryService telemetryService: ITelemetryService, + @IConfigurationService configurationService: IConfigurationService ) { super(activity); @@ -56,6 +59,7 @@ export class ViewContainerActivityAction extends ActivityAction { this.viewletService = viewletService; this.layoutService = layoutService; this.telemetryService = telemetryService; + this.configurationService = configurationService; } updateActivity(activity: IActivity): void { @@ -76,11 +80,22 @@ export class ViewContainerActivityAction extends ActivityAction { const sideBarVisible = this.layoutService.isVisible(Parts.SIDEBAR_PART); const activeViewlet = this.viewletService.getActiveViewlet(); + const focusBehavior = this.configurationService.getValue('workbench.activityBar.iconClickBehavior'); - // Hide sidebar if selected viewlet already visible if (sideBarVisible && activeViewlet?.getId() === this.activity.id) { - this.logAction('hide'); - this.layoutService.setSideBarHidden(true); + switch (focusBehavior) { + case 'focus': + this.logAction('refocus'); + this.viewletService.openViewlet(this.activity.id, true); + break; + case 'toggle': + default: + // Hide sidebar if selected viewlet already visible + this.logAction('hide'); + this.layoutService.setSideBarHidden(true); + break; + } + return; } diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 88e1c72abb7..c482eae8ef3 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -231,6 +231,16 @@ import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuratio 'default': true, 'description': nls.localize('activityBarVisibility', "Controls the visibility of the activity bar in the workbench.") }, + 'workbench.activityBar.iconClickBehavior': { + 'type': 'string', + 'enum': ['toggle', 'focus'], + 'default': 'toggle', + 'description': nls.localize('activityBarIconClickBehavior', "Controls the behavior of clicking an activity bar icon in the workbench."), + 'enumDescriptions': [ + nls.localize('workbench.activityBar.iconClickBehavior.toggle', "Hide the side bar if the clicked item is already visible."), + nls.localize('workbench.activityBar.iconClickBehavior.focus', "Focus side bar if the clicked item is already visible.") + ] + }, 'workbench.view.alwaysShowHeaderActions': { 'type': 'boolean', 'default': false,