|
1 | | -import { Disposable, Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem, TreeView, window } from 'vscode'; |
| 1 | +import { Disposable, Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem, TreeView } from 'vscode'; |
2 | 2 | import { DidChangeEnvironmentEventArgs, EnvironmentGroupInfo, PythonEnvironment } from '../../api'; |
3 | 3 | import { ProjectViews } from '../../common/localize'; |
4 | 4 | import { createSimpleDebounce } from '../../common/utils/debounce'; |
| 5 | +import { createTreeView } from '../../common/window.apis'; |
5 | 6 | import { |
6 | 7 | DidChangeEnvironmentManagerEventArgs, |
7 | 8 | DidChangePackageManagerEventArgs, |
@@ -34,18 +35,23 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
34 | 35 | >(); |
35 | 36 | private revealMap = new Map<string, PythonEnvTreeItem>(); |
36 | 37 | private managerViews = new Map<string, EnvManagerTreeItem>(); |
| 38 | + private groupViews = new Map<string, PythonGroupEnvTreeItem>(); |
37 | 39 | private selected: Map<string, string> = new Map(); |
38 | 40 | private disposables: Disposable[] = []; |
39 | 41 |
|
40 | | - public constructor(public providers: EnvironmentManagers, private stateManager: ITemporaryStateManager) { |
41 | | - this.treeView = window.createTreeView<EnvTreeItem>('env-managers', { |
| 42 | + public constructor( |
| 43 | + public providers: EnvironmentManagers, |
| 44 | + private stateManager: ITemporaryStateManager, |
| 45 | + ) { |
| 46 | + this.treeView = createTreeView<EnvTreeItem>('env-managers', { |
42 | 47 | treeDataProvider: this, |
43 | 48 | }); |
44 | 49 |
|
45 | 50 | this.disposables.push( |
46 | 51 | new Disposable(() => { |
47 | 52 | this.revealMap.clear(); |
48 | 53 | this.managerViews.clear(); |
| 54 | + this.groupViews.clear(); |
49 | 55 | this.selected.clear(); |
50 | 56 | }), |
51 | 57 | this.treeView, |
@@ -107,6 +113,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
107 | 113 | if (!element) { |
108 | 114 | const views: EnvTreeItem[] = []; |
109 | 115 | this.managerViews.clear(); |
| 116 | + this.groupViews.clear(); |
110 | 117 | this.providers.managers.forEach((m) => { |
111 | 118 | const view = new EnvManagerTreeItem(m); |
112 | 119 | views.push(view); |
@@ -137,7 +144,10 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
137 | 144 | }); |
138 | 145 |
|
139 | 146 | groupObjects.forEach((group) => { |
140 | | - views.push(new PythonGroupEnvTreeItem(element as EnvManagerTreeItem, group)); |
| 147 | + const groupView = new PythonGroupEnvTreeItem(element as EnvManagerTreeItem, group); |
| 148 | + const groupName = typeof group === 'string' ? group : group.name; |
| 149 | + this.groupViews.set(`${manager.id}:${groupName}`, groupView); |
| 150 | + views.push(groupView); |
141 | 151 | }); |
142 | 152 |
|
143 | 153 | if (views.length === 0) { |
@@ -202,12 +212,47 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
202 | 212 | return element.parent; |
203 | 213 | } |
204 | 214 |
|
205 | | - reveal(environment?: PythonEnvironment) { |
206 | | - const view = environment ? this.revealMap.get(environment.envId.id) : undefined; |
| 215 | + /** |
| 216 | + * Reveals and focuses on the given environment in the Environment Managers view. |
| 217 | + * |
| 218 | + * @param environment - The Python environment to reveal |
| 219 | + */ |
| 220 | + async reveal(environment?: PythonEnvironment): Promise<void> { |
| 221 | + if (!environment) { |
| 222 | + return; |
| 223 | + } |
| 224 | + |
| 225 | + const manager = this.providers.getEnvironmentManager(environment); |
| 226 | + if (!manager) { |
| 227 | + return; |
| 228 | + } |
| 229 | + |
| 230 | + if (!this.managerViews.has(manager.id)) { |
| 231 | + await this.getChildren(undefined); |
| 232 | + } |
| 233 | + |
| 234 | + const managerView = this.managerViews.get(manager.id); |
| 235 | + if (!managerView) { |
| 236 | + return; |
| 237 | + } |
| 238 | + |
| 239 | + const groupName = typeof environment.group === 'string' ? environment.group : environment.group?.name; |
| 240 | + if (groupName) { |
| 241 | + if (!this.groupViews.has(`${manager.id}:${groupName}`)) { |
| 242 | + await this.getChildren(managerView); |
| 243 | + } |
| 244 | + |
| 245 | + const groupView = this.groupViews.get(`${manager.id}:${groupName}`); |
| 246 | + if (groupView) { |
| 247 | + await this.getChildren(groupView); |
| 248 | + } |
| 249 | + } else { |
| 250 | + await this.getChildren(managerView); |
| 251 | + } |
| 252 | + |
| 253 | + const view = this.revealMap.get(environment.envId.id); |
207 | 254 | if (view && this.treeView.visible) { |
208 | | - setImmediate(async () => { |
209 | | - await this.treeView.reveal(view); |
210 | | - }); |
| 255 | + await this.treeView.reveal(view, { expand: false, focus: true, select: true }); |
211 | 256 | } |
212 | 257 | } |
213 | 258 |
|
|
0 commit comments