|
@@ -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);
|
|
|
|