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 TreeItem item = _tree.findItemById(projectItem.filename); 35 if (item) { 36 _tree.selectItem(item); 37 return true; 38 } 39 return false; 40 } 41 42 void onTreeItemSelected(TreeItems source, TreeItem selectedItem, bool activated) { 43 if (selectedItem.intParam == ProjectItemType.SourceFile) { 44 // file selected 45 if (sourceFileSelectionListener.assigned) { 46 ProjectSourceFile sourceFile = cast(ProjectSourceFile)selectedItem.objectParam; 47 if (sourceFile) { 48 sourceFileSelectionListener(sourceFile, activated); 49 } 50 } 51 } else if (selectedItem.intParam == ProjectItemType.SourceFolder) { 52 // folder selected 53 } 54 } 55 56 override protected Widget createBodyWidget() { 57 _tree = new TreeWidget("wstree"); 58 _tree.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT); 59 _tree.selectionListener = &onTreeItemSelected; 60 _tree.fontSize = 12; 61 return _tree; 62 } 63 64 @property Workspace workspace() { 65 return _workspace; 66 } 67 68 void addProjectItems(TreeItem root, ProjectItem items) { 69 for (int i = 0; i < items.childCount; i++) { 70 ProjectItem child = items.child(i); 71 if (child.isFolder) { 72 TreeItem p = root.newChild(child.filename, child.name, "folder"); 73 p.intParam = ProjectItemType.SourceFolder; 74 p.objectParam = child; 75 addProjectItems(p, child); 76 } else { 77 TreeItem p = root.newChild(child.filename, child.name, "text-plain"); 78 p.intParam = ProjectItemType.SourceFile; 79 p.objectParam = child; 80 } 81 } 82 } 83 84 @property void workspace(Workspace w) { 85 _workspace = w; 86 _tree.requestLayout(); 87 _tree.items.clear(); 88 if (w) { 89 TreeItem root = _tree.items.newChild(w.filename, w.name, "project-development"); 90 root.intParam = ProjectItemType.Workspace; 91 foreach(project; w.projects) { 92 TreeItem p = root.newChild(project.filename, project.name, "project-open"); 93 p.intParam = ProjectItemType.Project; 94 addProjectItems(p, project.items); 95 } 96 } else { 97 _tree.items.newChild("none", "New workspace"d, "project-development"); 98 } 99 _tree.onTreeContentChange(null); 100 } 101 }