Skip to content

Commit 46c9291

Browse files
authored
Add tooltip message to indicate selected (#134)
1 parent 71f356d commit 46c9291

File tree

7 files changed

+77
-10
lines changed

7 files changed

+77
-10
lines changed

src/common/localize.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,8 @@ export namespace ProjectCreatorString {
138138

139139
export const noProjectsFound = l10n.t('No projects found');
140140
}
141+
142+
export namespace EnvViewStrings {
143+
export const selectedGlobalTooltip = l10n.t('This environment is selected for non-workspace files');
144+
export const selectedWorkspaceTooltip = l10n.t('This environment is selected for workspace files');
145+
}

src/common/utils/pythonPath.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Uri, Progress, CancellationToken } from 'vscode';
22
import { PythonEnvironment } from '../../api';
33
import { InternalEnvironmentManager } from '../../internal.api';
44
import { showErrorMessage } from '../errors/utils';
5-
import { traceInfo, traceVerbose, traceError } from '../logging';
5+
import { traceVerbose, traceError } from '../logging';
66
import { PYTHON_EXTENSION_ID } from '../constants';
77

88
const priorityOrder = [
@@ -47,10 +47,10 @@ export async function handlePythonPath(
4747
return;
4848
}
4949
reporter?.report({ message: `Checking ${manager.displayName}` });
50-
traceInfo(`Checking ${manager.displayName} (${manager.id}) for ${interpreterUri.fsPath}`);
50+
traceVerbose(`Checking ${manager.displayName} (${manager.id}) for ${interpreterUri.fsPath}`);
5151
const env = await manager.resolve(interpreterUri);
5252
if (env) {
53-
traceInfo(`Using ${manager.displayName} (${manager.id}) to handle ${interpreterUri.fsPath}`);
53+
traceVerbose(`Using ${manager.displayName} (${manager.id}) to handle ${interpreterUri.fsPath}`);
5454
return env;
5555
}
5656
traceVerbose(`Manager ${manager.displayName} (${manager.id}) cannot handle ${interpreterUri.fsPath}`);
@@ -66,10 +66,10 @@ export async function handlePythonPath(
6666
return;
6767
}
6868
reporter?.report({ message: `Checking ${manager.displayName}` });
69-
traceInfo(`Checking ${manager.displayName} (${manager.id}) for ${interpreterUri.fsPath}`);
69+
traceVerbose(`Checking ${manager.displayName} (${manager.id}) for ${interpreterUri.fsPath}`);
7070
const env = await manager.resolve(interpreterUri);
7171
if (env) {
72-
traceInfo(`Using ${manager.displayName} (${manager.id}) to handle ${interpreterUri.fsPath}`);
72+
traceVerbose(`Using ${manager.displayName} (${manager.id}) to handle ${interpreterUri.fsPath}`);
7373
return env;
7474
}
7575
}

src/common/window.apis.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
CancellationToken,
44
Disposable,
55
ExtensionTerminalOptions,
6+
FileDecorationProvider,
67
InputBox,
78
InputBoxOptions,
89
LogOutputChannel,
@@ -290,3 +291,7 @@ export function createOutputChannel(name: string, languageId?: string): OutputCh
290291
export function createLogOutputChannel(name: string): LogOutputChannel {
291292
return window.createOutputChannel(name, { log: true });
292293
}
294+
295+
export function registerFileDecorationProvider(provider: FileDecorationProvider): Disposable {
296+
return window.registerFileDecorationProvider(provider);
297+
}

src/extension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
212212
updateViewsAndStatus(statusBar, workspaceView, managerView, api);
213213
}),
214214
envManagers.onDidChangeEnvironmentFiltered(async (e) => {
215+
managerView.environmentChanged(e);
215216
const location = e.uri?.fsPath ?? 'global';
216217
traceInfo(
217218
`Internal: Changed environment from ${e.old?.displayName} to ${e.new?.displayName} for: ${location}`,

src/features/views/envManagersView.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Disposable, Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem, TreeView, window } from 'vscode';
2-
import { EnvironmentGroupInfo, PythonEnvironment } from '../../api';
2+
import { DidChangeEnvironmentEventArgs, EnvironmentGroupInfo, PythonEnvironment } from '../../api';
33
import {
44
DidChangeEnvironmentManagerEventArgs,
55
DidChangePackageManagerEventArgs,
@@ -32,6 +32,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
3232
private revealMap = new Map<string, PythonEnvTreeItem>();
3333
private managerViews = new Map<string, EnvManagerTreeItem>();
3434
private packageRoots = new Map<string, PackageRootTreeItem>();
35+
private selected: Map<string, string> = new Map();
3536
private disposables: Disposable[] = [];
3637

3738
public constructor(public providers: EnvironmentManagers) {
@@ -44,6 +45,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
4445
this.packageRoots.clear();
4546
this.revealMap.clear();
4647
this.managerViews.clear();
48+
this.selected.clear();
4749
}),
4850
this.treeView,
4951
this.treeDataChanged,
@@ -99,7 +101,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
99101
const views: EnvTreeItem[] = [];
100102
const envs = await manager.getEnvironments('all');
101103
envs.filter((e) => !e.group).forEach((env) => {
102-
const view = new PythonEnvTreeItem(env, element as EnvManagerTreeItem);
104+
const view = new PythonEnvTreeItem(env, element as EnvManagerTreeItem, this.selected.get(env.envId.id));
103105
views.push(view);
104106
this.revealMap.set(env.envId.id, view);
105107
});
@@ -142,7 +144,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
142144
});
143145

144146
grouped.forEach((env) => {
145-
const view = new PythonEnvTreeItem(env, groupItem);
147+
const view = new PythonEnvTreeItem(env, groupItem, this.selected.get(env.envId.id));
146148
views.push(view);
147149
this.revealMap.set(env.envId.id, view);
148150
});
@@ -227,4 +229,29 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
227229
const roots = Array.from(this.packageRoots.values()).filter((r) => r.manager.id === args.manager.id);
228230
this.fireDataChanged(roots);
229231
}
232+
233+
public environmentChanged(e: DidChangeEnvironmentEventArgs) {
234+
const views = [];
235+
if (e.old) {
236+
this.selected.delete(e.old.envId.id);
237+
let view: EnvTreeItem | undefined = this.packageRoots.get(e.old.envId.id);
238+
if (!view) {
239+
view = this.managerViews.get(e.old.envId.managerId);
240+
}
241+
if (view) {
242+
views.push(view);
243+
}
244+
}
245+
if (e.new) {
246+
this.selected.set(e.new.envId.id, e.uri === undefined ? 'global' : e.uri.fsPath);
247+
let view: EnvTreeItem | undefined = this.packageRoots.get(e.new.envId.id);
248+
if (!view) {
249+
view = this.managerViews.get(e.new.envId.managerId);
250+
}
251+
if (view && !views.includes(view)) {
252+
views.push(view);
253+
}
254+
}
255+
this.fireDataChanged(views);
256+
}
230257
}

src/features/views/treeViewItems.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { InternalEnvironmentManager, InternalPackageManager } from '../../intern
33
import { PythonEnvironment, IconPath, Package, PythonProject, EnvironmentGroupInfo } from '../../api';
44
import { removable } from './utils';
55
import { isActivatableEnvironment } from '../common/activation';
6+
import { EnvViewStrings } from '../../common/localize';
67

78
export enum EnvTreeItemKind {
89
manager = 'python-env-manager',
@@ -66,11 +67,21 @@ export class PythonEnvTreeItem implements EnvTreeItem {
6667
constructor(
6768
public readonly environment: PythonEnvironment,
6869
public readonly parent: EnvManagerTreeItem | PythonGroupEnvTreeItem,
70+
public readonly selected?: string,
6971
) {
70-
const item = new TreeItem(environment.displayName ?? environment.name, TreeItemCollapsibleState.Collapsed);
72+
let name = environment.displayName ?? environment.name;
73+
let tooltip = environment.tooltip;
74+
if (selected) {
75+
const tooltipEnd = environment.tooltip ?? environment.description;
76+
tooltip =
77+
selected === 'global' ? EnvViewStrings.selectedGlobalTooltip : EnvViewStrings.selectedWorkspaceTooltip;
78+
tooltip = tooltipEnd ? `${tooltip}${tooltipEnd}` : tooltip;
79+
}
80+
81+
const item = new TreeItem(name, TreeItemCollapsibleState.Collapsed);
7182
item.contextValue = this.getContextValue();
7283
item.description = environment.description;
73-
item.tooltip = environment.tooltip;
84+
item.tooltip = tooltip;
7485
item.iconPath = environment.iconPath;
7586
this.treeItem = item;
7687
}

src/internal.api.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,26 @@ export interface EnvironmentManagers extends Disposable {
7171
registerEnvironmentManager(manager: EnvironmentManager): Disposable;
7272
registerPackageManager(manager: PackageManager): Disposable;
7373

74+
/**
75+
* This event is fired when any environment manager changes its collection of environments.
76+
* This can be any environment manager even if it is not the one selected by the user for the workspace.
77+
*/
7478
onDidChangeEnvironments: Event<InternalDidChangeEnvironmentsEventArgs>;
79+
80+
/**
81+
* This event is fired when an environment manager changes the environment for
82+
* a particular scope (global, uri, workspace, etc). This can be any environment manager even if it is not the
83+
* one selected by the user for the workspace. It is also fired if the change
84+
* involves unselected to selected or selected to unselected.
85+
*/
7586
onDidChangeEnvironment: Event<DidChangeEnvironmentEventArgs>;
87+
88+
/**
89+
* This event is fired when a selected environment manager changes the environment
90+
* for a particular scope (global, uri, workspace, etc). This is also only fired if
91+
* the previous and current environments are different. It is also fired if the change
92+
* involves unselected to selected or selected to unselected.
93+
*/
7694
onDidChangeEnvironmentFiltered: Event<DidChangeEnvironmentEventArgs>;
7795
onDidChangePackages: Event<InternalDidChangePackagesEventArgs>;
7896

0 commit comments

Comments
 (0)