Ver código fonte

Merge pull request #1651 from Fusioon/folders-addproject

Add project import options to workspace folder context menu
Brian Fiete 3 anos atrás
pai
commit
8e34de65ea
1 arquivos alterados com 86 adições e 14 exclusões
  1. 86 14
      IDE/src/ui/ProjectPanel.bf

+ 86 - 14
IDE/src/ui/ProjectPanel.bf

@@ -134,6 +134,7 @@ namespace IDE.ui
         bool mImportFolderDeferred;
         bool mImportProjectDeferred;
 		bool mImportInstalledDeferred;
+		WorkspaceFolder mAddProjectTargetFolder;
         public Dictionary<ListViewItem, ProjectItem> mListViewToProjectMap = new .() ~ delete _;
         public Dictionary<ProjectItem, ProjectListViewItem> mProjectToListViewMap = new .() ~ delete _;
 		public Dictionary<ListViewItem, WorkspaceFolder> 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<ListViewItem> itemsToMove = scope .();
 		            List<WorkspaceFolder> 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);