diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 0dd174ef..27e4727a 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -134,6 +134,7 @@ namespace IDE.ui bool mImportFolderDeferred; bool mImportProjectDeferred; bool mImportInstalledDeferred; + WorkspaceFolder mAddProjectTargetFolder; public Dictionary mListViewToProjectMap = new .() ~ delete _; public Dictionary mProjectToListViewMap = new .() ~ delete _; public Dictionary mListViewToWorkspaceFolderMap = new .() ~ delete _; @@ -522,6 +523,18 @@ namespace IDE.ui { var projectListViewItem = InitProjectItem(project.mRootFolder); projectListViewItem.mRefObject = project; + if (mAddProjectTargetFolder != null) + { + let root = mListView.GetRoot(); + root.RemoveChildItem(projectListViewItem, false); + mAddProjectTargetFolder.mListView.MakeParent(); + mAddProjectTargetFolder.mListView.AddChild(projectListViewItem); + mAddProjectTargetFolder.mListView.Open(true); + mProjectToWorkspaceFolderMap[project.mRootFolder] = mAddProjectTargetFolder; + + mAddProjectTargetFolder.mProjects.Add(project); + mAddProjectTargetFolder = null; + } } public void RebuildUI() @@ -1764,33 +1777,59 @@ namespace IDE.ui let root = mListView.GetRoot(); List itemsToMove = scope .(); List foldersToDelete = scope .(); + root.WithSelectedItems(scope [&] (selectedItem) => { if (mListViewToWorkspaceFolderMap.GetValue(selectedItem) case .Ok(let folder)) { foldersToDelete.Add(folder); + mListViewToWorkspaceFolderMap.Remove(folder.mListView); selectedItem.WithItems(scope [&] (item) => { if (mListViewToProjectMap.GetValue(item) case .Ok(let project)) { if (project.mParentFolder == null) itemsToMove.Add(item); } + else if (mListViewToWorkspaceFolderMap.GetValue(item) case .Ok(let itemFolder)) + { + foldersToDelete.Add(itemFolder); + mListViewToWorkspaceFolderMap.Remove(itemFolder.mListView); + } }); } }); - - for (let projectListViewItem in itemsToMove) + + for (let listViewItem in itemsToMove) { - projectListViewItem.mParentItem.RemoveChildItem(projectListViewItem, false); - root.AddChildAtIndex(1, projectListViewItem); - if (mListViewToProjectMap.TryGetValue(projectListViewItem, let projectItem)) + listViewItem.mParentItem.RemoveChildItem(listViewItem, false); + root.AddChildAtIndex(1, listViewItem); + if (mListViewToProjectMap.TryGetValue(listViewItem, let projectItem)) mProjectToWorkspaceFolderMap.Remove(projectItem); } - for (let folder in foldersToDelete) + + bool HasDeletedParent(WorkspaceFolder folder) + { + WorkspaceFolder parent = folder; + repeat + { + parent = parent.mParent; + + if (foldersToDelete.Contains(parent)) + return true; + } + while (parent != null); + + return false; + } + + for (let folder in foldersToDelete) { - let folderItem = folder.mListView; - mListViewToWorkspaceFolderMap.Remove(folderItem); - folderItem.mParentItem.RemoveChildItem(folderItem); - gApp.mWorkspace.mWorkspaceFolders.Remove(folder); + if (!HasDeletedParent(folder)) + { + let folderItem = folder.mListView; + folderItem.mParentItem.RemoveChildItem(folderItem); + } + + gApp.mWorkspace.mWorkspaceFolders.Remove(folder); delete folder; } @@ -2374,7 +2413,7 @@ namespace IDE.ui return true; } - public void AddWorkspaceFolder(ProjectListViewItem parentListViewItem) + public WorkspaceFolder AddWorkspaceFolder(ProjectListViewItem parentListViewItem) { ProjectListViewItem listViewItem; listViewItem = (ProjectListViewItem)parentListViewItem.CreateChildItem(); @@ -2406,6 +2445,7 @@ namespace IDE.ui mListView.GetRoot().SelectItemExclusively(listViewItem); EditListViewItem(listViewItem); gApp.mWorkspace.SetChanged(); + return folder; } @@ -2623,8 +2663,34 @@ namespace IDE.ui anItem = menu.AddItem("Rename"); anItem.mOnMenuItemSelected.Add(new (item) => { EditListViewItem(focusedItem); }); menu.AddItem(); + anItem = menu.AddItem("Add New Project..."); + anItem.mOnMenuItemSelected.Add(new (item) => { + mAddProjectTargetFolder = folder; + AddNewProject(); + }); + if (gApp.IsCompiling) + anItem.SetDisabled(true); + + anItem = menu.AddItem("Add Existing Project..."); + anItem.mOnMenuItemSelected.Add(new (item) => { + mImportProjectDeferred = true; + mAddProjectTargetFolder = folder; + }); + if (gApp.IsCompiling) + anItem.SetDisabled(true); + + anItem = menu.AddItem("Add From Installed..."); + anItem.mOnMenuItemSelected.Add(new (item) => { + mImportInstalledDeferred = true; + mAddProjectTargetFolder = folder; + }); + if (gApp.IsCompiling) + anItem.SetDisabled(true); anItem = menu.AddItem("New Folder"); - anItem.mOnMenuItemSelected.Add(new (item) => { AddWorkspaceFolder(folder.mListView); }); + anItem.mOnMenuItemSelected.Add(new (item) => { + let newfolder = AddWorkspaceFolder(folder.mListView); + newfolder.mParent = folder; + }); handled = true; } else if (gApp.mWorkspace.IsInitialized) @@ -2633,12 +2699,18 @@ namespace IDE.ui menu.AddItem(); anItem = menu.AddItem("Add New Project..."); - anItem.mOnMenuItemSelected.Add(new (item) => { AddNewProject(); }); + anItem.mOnMenuItemSelected.Add(new (item) => { + mAddProjectTargetFolder = null; + AddNewProject(); + }); if (gApp.IsCompiling) anItem.SetDisabled(true); anItem = menu.AddItem("Add Existing Project..."); - anItem.mOnMenuItemSelected.Add(new (item) => { mImportProjectDeferred = true; }); + anItem.mOnMenuItemSelected.Add(new (item) => { + mAddProjectTargetFolder = null; + mImportProjectDeferred = true; + }); if (gApp.IsCompiling) anItem.SetDisabled(true);