1 module dlangide.ui.wspanel; 2 3 import dlangui.all; 4 import dlangide.workspace.workspace; 5 import dlangide.workspace.project; 6 7 enum ProjectItemType : int { 8 None, 9 SourceFile, 10 SourceFolder, 11 Project, 12 Workspace 13 } 14 15 interface SourceFileSelectionHandler { 16 bool onSourceFileSelected(ProjectSourceFile file, bool activate); 17 } 18 19 class WorkspacePanel : DockWindow { 20 protected Workspace _workspace; 21 protected TreeWidget _tree; 22 23 /// handle source file selection change 24 Signal!SourceFileSelectionHandler sourceFileSelectionListener; 25 26 this(string id) { 27 super(id); 28 workspace = null; 29 //layoutWidth = 200; 30 _caption.text = "Workspace Explorer"d; 31 } 32 33 bool selectItem(ProjectItem projectItem) { 34 if (projectItem) { 35 TreeItem item = _tree.findItemById(projectItem.filename); 36 if (item) { 37 _tree.selectItem(item); 38 return true; 39 } 40 } else { 41 _tree.clearSelection(); 42 return true; 43 } 44 return false; 45 } 46 47 void onTreeItemSelected(TreeItems source, TreeItem selectedItem, bool activated) { 48 if (!selectedItem) 49 return; 50 if (selectedItem.intParam == ProjectItemType.SourceFile) { 51 // file selected 52 if (sourceFileSelectionListener.assigned) { 53 ProjectSourceFile sourceFile = cast(ProjectSourceFile)selectedItem.objectParam; 54 if (sourceFile) { 55 sourceFileSelectionListener(sourceFile, activated); 56 } 57 } 58 } else if (selectedItem.intParam == ProjectItemType.SourceFolder) { 59 // folder selected 60 } 61 } 62 63 override protected Widget createBodyWidget() { 64 _tree = new TreeWidget("wstree"); 65 _tree.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT); 66 _tree.selectionListener = &onTreeItemSelected; 67 _tree.fontSize = 16; 68 return _tree; 69 } 70 71 @property Workspace workspace() { 72 return _workspace; 73 } 74 75 ProjectSourceFile findSourceFileItem(string filename) { 76 if (_workspace) 77 return _workspace.findSourceFileItem(filename); 78 return null; 79 } 80 81 void addProjectItems(TreeItem root, ProjectItem items) { 82 for (int i = 0; i < items.childCount; i++) { 83 ProjectItem child = items.child(i); 84 if (child.isFolder) { 85 TreeItem p = root.newChild(child.filename, child.name, "folder"); 86 p.intParam = ProjectItemType.SourceFolder; 87 p.objectParam = child; 88 addProjectItems(p, child); 89 } else { 90 TreeItem p = root.newChild(child.filename, child.name, "text-plain"); 91 p.intParam = ProjectItemType.SourceFile; 92 p.objectParam = child; 93 } 94 } 95 } 96 97 @property void workspace(Workspace w) { 98 _workspace = w; 99 _tree.requestLayout(); 100 _tree.items.clear(); 101 if (w) { 102 TreeItem root = _tree.items.newChild(w.filename, w.name, "project-development"); 103 root.intParam = ProjectItemType.Workspace; 104 foreach(project; w.projects) { 105 TreeItem p = root.newChild(project.filename, project.name, "project-open"); 106 p.intParam = ProjectItemType.Project; 107 addProjectItems(p, project.items); 108 } 109 } else { 110 _tree.items.newChild("none", "New workspace"d, "project-development"); 111 } 112 _tree.onTreeContentChange(null); 113 } 114 }