@@ -2,6 +2,7 @@ import path from 'path';
22import * as vscode from 'vscode' ;
33import fs from 'fs' ;
44import { getWorkspaceFolder , getExtensionPath } from '../api' ;
5+ import { DecorationProvider } from './fileDecorationProvider' ;
56
67/*
78 * contexType -> contextValue as following value:
@@ -11,6 +12,12 @@ import { getWorkspaceFolder, getExtensionPath } from '../api';
1112 * project_bsp
1213 */
1314
15+ // 全局变量记录当前选中的project_bsp项目
16+ let currentSelectedBspItem : ProjectTreeItem | null = null ;
17+
18+ // 添加树视图刷新事件发射器
19+ let _onDidChangeTreeData : vscode . EventEmitter < ProjectTreeItem | undefined > | null = null ;
20+
1421export class ProjectTreeItem extends vscode . TreeItem {
1522 children : ProjectTreeItem [ ] ;
1623 fn : string = '' ;
@@ -58,12 +65,16 @@ export class ProjectTreeItem extends vscode.TreeItem {
5865 else if ( contextType == 'project_bsp' ) {
5966 this . command = {
6067 title : this . name ,
61- command : 'extension.switchProject ' ,
68+ command : 'extension.handleTreeItemClick ' ,
6269 tooltip : this . name ,
6370 arguments : [
6471 this
6572 ]
6673 } ;
74+
75+ // with resourceUri, the item will be rendered as a file icon
76+ // then the item can be marked with a decoration
77+ this . resourceUri = vscode . Uri . file ( this . fn ) ;
6778 }
6879 }
6980 }
@@ -333,7 +344,47 @@ export function initProjectTree(context:vscode.ExtensionContext) {
333344 vscode . commands . registerCommand ( 'extension.openTerminalProject' , ( arg ) => {
334345 openTerminalProject ( arg ) ;
335346 } ) ;
336- vscode . commands . registerCommand ( 'extension.switchProject' , ( arg ) => {
337- setCurrentProject ( arg ) ;
347+
348+ // Add double-clicked
349+ let lastClickTime = 0 ;
350+ let lastClickedItem : ProjectTreeItem | null = null ;
351+
352+ vscode . commands . registerCommand ( 'extension.handleTreeItemClick' , ( item : ProjectTreeItem ) => {
353+ const currentTime = Date . now ( ) ;
354+ const doubleClickThreshold = 500 ; // 500ms内的两次点击被认为是双击
355+
356+ if ( item . contextType === 'project_bsp' ) {
357+ if ( lastClickedItem === item && ( currentTime - lastClickTime ) < doubleClickThreshold ) {
358+ if ( currentSelectedBspItem && currentSelectedBspItem . fn === item . fn ) {
359+ return ;
360+ }
361+
362+ // double clicked
363+ if ( currentSelectedBspItem && currentSelectedBspItem . fn != item . fn ) {
364+ DecorationProvider . getInstance ( ) . unmarkFile ( vscode . Uri . file ( currentSelectedBspItem . fn ) ) ;
365+ }
366+
367+ currentSelectedBspItem = item ;
368+ DecorationProvider . getInstance ( ) . markFile ( vscode . Uri . file ( item . fn ) ) ;
369+ setCurrentProject ( item ) ;
370+
371+ if ( _onDidChangeTreeData ) {
372+ _onDidChangeTreeData . fire ( undefined ) ;
373+ }
374+
375+ // reset status
376+ lastClickTime = 0 ;
377+ lastClickedItem = null ;
378+ } else {
379+ // one-clicked, just record it.
380+ lastClickTime = currentTime ;
381+ lastClickedItem = item ;
382+ }
383+ }
338384 } ) ;
339385}
386+
387+ // 导出函数用于设置树视图刷新事件发射器
388+ export function setTreeDataChangeEmitter ( emitter : vscode . EventEmitter < ProjectTreeItem | undefined > ) {
389+ _onDidChangeTreeData = emitter ;
390+ }
0 commit comments