From f7bed518f39091f9e76bc55a4085ac48678e0a4b Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 14 Jul 2022 20:53:32 +0200 Subject: [PATCH 1/4] Allow adding projects directly to workspace folders --- IDE/src/ui/ProjectPanel.bf | 47 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 0dd174ef..43fccca1 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,19 @@ 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() @@ -2623,6 +2637,29 @@ 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); }); handled = true; @@ -2633,12 +2670,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); From 9d2cdadc7a8da8a7fdb7bedd75ac26c244e1c13f Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 14 Jul 2022 21:03:32 +0200 Subject: [PATCH 2/4] Properly set parent for workspace subfolders --- IDE/src/ui/ProjectPanel.bf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 43fccca1..ec17bf88 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -533,7 +533,6 @@ namespace IDE.ui mProjectToWorkspaceFolderMap[project.mRootFolder] = mAddProjectTargetFolder; mAddProjectTargetFolder.mProjects.Add(project); - mAddProjectTargetFolder = null; } } @@ -2388,7 +2387,7 @@ namespace IDE.ui return true; } - public void AddWorkspaceFolder(ProjectListViewItem parentListViewItem) + public WorkspaceFolder AddWorkspaceFolder(ProjectListViewItem parentListViewItem) { ProjectListViewItem listViewItem; listViewItem = (ProjectListViewItem)parentListViewItem.CreateChildItem(); @@ -2420,6 +2419,7 @@ namespace IDE.ui mListView.GetRoot().SelectItemExclusively(listViewItem); EditListViewItem(listViewItem); gApp.mWorkspace.SetChanged(); + return folder; } @@ -2661,7 +2661,10 @@ namespace IDE.ui 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) From 1eb2b97db74f21ef8f8a85802b376463fe2f6c0d Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 14 Jul 2022 21:29:24 +0200 Subject: [PATCH 3/4] Fix access after delete of workspace folders when deleting parent and child --- IDE/src/ui/ProjectPanel.bf | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index ec17bf88..0f1ee302 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -1798,12 +1798,34 @@ namespace IDE.ui if (mListViewToProjectMap.TryGetValue(projectListViewItem, let projectItem)) mProjectToWorkspaceFolderMap.Remove(projectItem); } + + HashSet deletedFolders = scope .(); + bool HasDeletedParent(WorkspaceFolder folder) + { + WorkspaceFolder parent = folder; + repeat + { + parent = parent.mParent; + + if (deletedFolders.Contains(Internal.UnsafeCastToPtr(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; + mListViewToWorkspaceFolderMap.Remove(folderItem); + folderItem.mParentItem.RemoveChildItem(folderItem); + } + + gApp.mWorkspace.mWorkspaceFolders.Remove(folder); + deletedFolders.Add(Internal.UnsafeCastToPtr(folder)); delete folder; } From ea39dc6f2bd408180d49451a747c06e503958ba3 Mon Sep 17 00:00:00 2001 From: Fusion Date: Sat, 16 Jul 2022 03:13:03 +0200 Subject: [PATCH 4/4] Propertly remove nested workspace folders. --- IDE/src/ui/ProjectPanel.bf | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 0f1ee302..27e4727a 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -1777,29 +1777,35 @@ 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); } - HashSet deletedFolders = scope .(); bool HasDeletedParent(WorkspaceFolder folder) { WorkspaceFolder parent = folder; @@ -1807,7 +1813,7 @@ namespace IDE.ui { parent = parent.mParent; - if (deletedFolders.Contains(Internal.UnsafeCastToPtr(parent))) + if (foldersToDelete.Contains(parent)) return true; } while (parent != null); @@ -1815,17 +1821,15 @@ namespace IDE.ui return false; } - for (let folder in foldersToDelete) + for (let folder in foldersToDelete) { if (!HasDeletedParent(folder)) { let folderItem = folder.mListView; - mListViewToWorkspaceFolderMap.Remove(folderItem); folderItem.mParentItem.RemoveChildItem(folderItem); } gApp.mWorkspace.mWorkspaceFolders.Remove(folder); - deletedFolders.Add(Internal.UnsafeCastToPtr(folder)); delete folder; }