|
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, |
@@ -82,21 +83,23 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
82 | 83 | >(); |
83 | 84 | private revealMap = new Map<string, PythonEnvTreeItem>(); |
84 | 85 | private managerViews = new Map<string, EnvManagerTreeItem>(); |
| 86 | + private groupViews = new Map<string, PythonGroupEnvTreeItem>(); |
85 | 87 | private selected: Map<string, string> = new Map(); |
86 | 88 | private disposables: Disposable[] = []; |
87 | 89 |
|
88 | 90 | public constructor( |
89 | 91 | public providers: EnvironmentManagers, |
90 | 92 | private stateManager: ITemporaryStateManager, |
91 | 93 | ) { |
92 | | - this.treeView = window.createTreeView<EnvTreeItem>('env-managers', { |
| 94 | + this.treeView = createTreeView<EnvTreeItem>('env-managers', { |
93 | 95 | treeDataProvider: this, |
94 | 96 | }); |
95 | 97 |
|
96 | 98 | this.disposables.push( |
97 | 99 | new Disposable(() => { |
98 | 100 | this.revealMap.clear(); |
99 | 101 | this.managerViews.clear(); |
| 102 | + this.groupViews.clear(); |
100 | 103 | this.selected.clear(); |
101 | 104 | }), |
102 | 105 | this.treeView, |
@@ -158,6 +161,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
158 | 161 | if (!element) { |
159 | 162 | const views: EnvTreeItem[] = []; |
160 | 163 | this.managerViews.clear(); |
| 164 | + this.groupViews.clear(); |
161 | 165 | this.providers.managers.forEach((m) => { |
162 | 166 | const view = new EnvManagerTreeItem(m); |
163 | 167 | views.push(view); |
@@ -196,7 +200,10 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
196 | 200 | }); |
197 | 201 |
|
198 | 202 | groupObjects.forEach((group) => { |
199 | | - views.push(new PythonGroupEnvTreeItem(element as EnvManagerTreeItem, group)); |
| 203 | + const groupView = new PythonGroupEnvTreeItem(element as EnvManagerTreeItem, group); |
| 204 | + const groupName = typeof group === 'string' ? group : group.name; |
| 205 | + this.groupViews.set(`${manager.id}:${groupName}`, groupView); |
| 206 | + views.push(groupView); |
200 | 207 | }); |
201 | 208 |
|
202 | 209 | if (views.length === 0) { |
@@ -263,12 +270,47 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable |
263 | 270 | return element.parent; |
264 | 271 | } |
265 | 272 |
|
266 | | - reveal(environment?: PythonEnvironment) { |
267 | | - const view = environment ? this.revealMap.get(environment.envId.id) : undefined; |
| 273 | + /** |
| 274 | + * Reveals and focuses on the given environment in the Environment Managers view. |
| 275 | + * |
| 276 | + * @param environment - The Python environment to reveal |
| 277 | + */ |
| 278 | + async reveal(environment?: PythonEnvironment): Promise<void> { |
| 279 | + if (!environment) { |
| 280 | + return; |
| 281 | + } |
| 282 | + |
| 283 | + const manager = this.providers.getEnvironmentManager(environment); |
| 284 | + if (!manager) { |
| 285 | + return; |
| 286 | + } |
| 287 | + |
| 288 | + if (!this.managerViews.has(manager.id)) { |
| 289 | + await this.getChildren(undefined); |
| 290 | + } |
| 291 | + |
| 292 | + const managerView = this.managerViews.get(manager.id); |
| 293 | + if (!managerView) { |
| 294 | + return; |
| 295 | + } |
| 296 | + |
| 297 | + const groupName = typeof environment.group === 'string' ? environment.group : environment.group?.name; |
| 298 | + if (groupName) { |
| 299 | + if (!this.groupViews.has(`${manager.id}:${groupName}`)) { |
| 300 | + await this.getChildren(managerView); |
| 301 | + } |
| 302 | + |
| 303 | + const groupView = this.groupViews.get(`${manager.id}:${groupName}`); |
| 304 | + if (groupView) { |
| 305 | + await this.getChildren(groupView); |
| 306 | + } |
| 307 | + } else { |
| 308 | + await this.getChildren(managerView); |
| 309 | + } |
| 310 | + |
| 311 | + const view = this.revealMap.get(environment.envId.id); |
268 | 312 | if (view && this.treeView.visible) { |
269 | | - setImmediate(async () => { |
270 | | - await this.treeView.reveal(view); |
271 | | - }); |
| 313 | + await this.treeView.reveal(view, { expand: false, focus: true, select: true }); |
272 | 314 | } |
273 | 315 | } |
274 | 316 |
|
|
0 commit comments