Skip to content

Commit dfad00f

Browse files
committed
Updated Project view to highlight active project
1 parent 1557be2 commit dfad00f

File tree

5 files changed

+100
-37
lines changed

5 files changed

+100
-37
lines changed

package-lock.json

Lines changed: 34 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/panels/project_tree_view/ProjectTreeView.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,15 +220,20 @@ export class ProjectTreeView implements vscode.WebviewViewProvider {
220220
let projectData: any = {};
221221
projectData['icons'] = {
222222
branch: 'folder',
223-
leaf: 'file',
223+
leaf: 'folder',
224224
open: 'folder-opened',
225225
};
226226
projectData['actions'] = this.projectActions;
227227
projectData['label'] = project.name;
228228
projectData['value'] = { project: project.name };
229229
projectData['subItems'] = [];
230230
projectData['open'] = viewOpen !== undefined ? viewOpen : true;
231+
// Mark the active project (selected for highlight)
232+
if (this.wsConfig.activeProject === project.name) {
233+
projectData['selected'] = true;
234+
}
231235

236+
// Always render children so arrows are visible; interaction is restricted in the webview handler
232237
for (let key in project.buildConfigs) {
233238
projectData.subItems.push(this.generateBuildString(project.name, project.buildConfigs[key]));
234239
}
@@ -237,7 +242,6 @@ export class ProjectTreeView implements vscode.WebviewViewProvider {
237242
projectData.subItems.push(this.generateTestString(project.name, project.twisterConfigs[key]));
238243
}
239244

240-
241245
if (projectData.subItems.length === 0) {
242246
projectData.subItems.push({
243247
icons: {
@@ -279,6 +283,7 @@ export class ProjectTreeView implements vscode.WebviewViewProvider {
279283
try {
280284
this.treeData.forEach((element: any) => {
281285
if (element.label in this.wsConfig.projects) {
286+
// Persist open state for all projects so their state is restored when they become active
282287
this.wsConfig.projectStates[element.label].viewOpen = element.open;
283288
element.subItems.forEach((build_element: any) => {
284289
if (build_element.label in this.wsConfig.projects[element.label].buildConfigs) {
@@ -324,7 +329,7 @@ export class ProjectTreeView implements vscode.WebviewViewProvider {
324329
<script nonce="${nonce}" src="${assetUri('src/panels/project_tree_view/ProjectTreeViewHandler.js')}" type="module"></script>
325330
</head>
326331
<body>
327-
<vscode-tree id="project-tree" indent-guides arrows></vscode-tree>
332+
<vscode-tree id="project-tree" indent-guides arrows></vscode-tree>
328333
${body}
329334
</body>
330335
</html>`;

src/panels/project_tree_view/ProjectTreeViewHandler.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,63 @@
11
(function () {
22
const vscode = acquireVsCodeApi();
33
const tree = document.querySelector('#project-tree');
4+
let prevData = [];
45

56
window.addEventListener('message', event => {
67
const message = event.data; // The JSON data our extension sent
78
tree.data = message;
9+
// Keep a deep copy to restore open states when needed
10+
try {
11+
prevData = JSON.parse(JSON.stringify(message));
12+
} catch {
13+
prevData = message;
14+
}
815
});
916

17+
function findProjectItemByName(data, name) {
18+
if (!Array.isArray(data)) {
19+
return undefined;
20+
}
21+
return data.find(item => item && item.value && item.value.project === name);
22+
}
23+
24+
function getActiveProjectName(data) {
25+
if (!Array.isArray(data)) {
26+
return undefined;
27+
}
28+
const active = data.find(item => item && item.selected);
29+
return active && active.value ? active.value.project : undefined;
30+
}
31+
32+
function revertOpenStateIfNeeded(selectedProject) {
33+
const activeProject = getActiveProjectName(prevData);
34+
if (activeProject === selectedProject) {
35+
return false;
36+
}
37+
const currItem = findProjectItemByName(tree.data, selectedProject);
38+
const prevItem = findProjectItemByName(prevData, selectedProject);
39+
if (currItem && prevItem && typeof prevItem.open === 'boolean') {
40+
currItem.open = prevItem.open;
41+
tree.data = [...tree.data];
42+
}
43+
return true;
44+
}
45+
1046
tree.addEventListener('vsc-select', (event) => {
11-
vscode.postMessage({ command: event.detail.value.cmd ? event.detail.value.cmd : "setActive", value: event.detail.value, treeData: tree.data });
47+
const val = event.detail.value;
48+
const isProjectClick = val && val.project && !val.build && !val.runner && !val.test && !val.cmd;
49+
if (isProjectClick) {
50+
const selectedProject = val.project;
51+
if (revertOpenStateIfNeeded(selectedProject)) {
52+
vscode.postMessage({ command: "setActive", value: val, treeData: tree.data });
53+
return;
54+
}
55+
}
56+
vscode.postMessage({ command: val && val.cmd ? val.cmd : "setActive", value: val, treeData: tree.data });
1257
});
1358

59+
// No additional toggle listeners needed; we already revert open-state on project click when switching active.
60+
1461
tree.addEventListener("vsc-run-action", (event) => {
1562
vscode.postMessage({ command: event.detail.actionId, value: event.detail.value, treeData: tree.data });
1663
});

src/panels/view.css

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ vscode-collapsible:hover>vscode-icon {
1010
visibility: visible;
1111
}
1212

13-
/*
13+
/* Keep selection color the same even when unfocused */
1414
vscode-tree {
15-
--vscode-list-inactiveSelectionBackground: var(--vscode-button-background);
16-
--vscode-list-inactiveSelectionForeground: var(--vscode-button-foreground);
17-
--vscode-list-activeSelectionForeground: var(--vscode-button-foreground);
18-
--vscode-list-activeSelectionBackground: var(--vscode-button-background);
15+
--vscode-list-inactiveSelectionBackground: var(--vscode-list-activeSelectionBackground);
16+
--vscode-list-inactiveSelectionForeground: var(--vscode-list-activeSelectionForeground);
17+
}
18+
19+
/* Highlight active project differently */
20+
vscode-tree-item[selected] {
21+
background-color: var(--vscode-list-activeSelectionBackground);
22+
color: var(--vscode-list-activeSelectionForeground);
1923
}
20-
*/
2124

2225
.inlineblock {
2326
display: flex;

src/project_utilities/project.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ export async function createNewProjectFromSample(wsConfig: WorkspaceConfig) {
172172
loadingQuickPick.busy = true;
173173
loadingQuickPick.enabled = false;
174174
loadingQuickPick.placeholder = "Loading sample projects... Please wait.";
175+
loadingQuickPick.ignoreFocusOut = true;
175176
loadingQuickPick.show();
176177

177178
const samplesDir = await getSamples(wsConfig.activeSetupState);

0 commit comments

Comments
 (0)