mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-14 14:24:10 +02:00
Add support for workspace folders
This commit is contained in:
parent
15e1986a1c
commit
c5061009ac
2 changed files with 450 additions and 14 deletions
|
@ -12,6 +12,40 @@ using System.IO;
|
||||||
|
|
||||||
namespace IDE
|
namespace IDE
|
||||||
{
|
{
|
||||||
|
public class WorkspaceFolder
|
||||||
|
{
|
||||||
|
public String mName ~ delete _;
|
||||||
|
public IDE.ui.ProjectListViewItem mListView;
|
||||||
|
public List<Project> mProjects = new List<Project>() ~ delete _;
|
||||||
|
public Self mParent;
|
||||||
|
|
||||||
|
public void GetFullPath(String buffer)
|
||||||
|
{
|
||||||
|
if (mParent != null)
|
||||||
|
{
|
||||||
|
mParent.GetFullPath(buffer);
|
||||||
|
buffer.Append('/');
|
||||||
|
}
|
||||||
|
buffer.Append(mName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsNameValid(String name)
|
||||||
|
{
|
||||||
|
if ((name == ".") || (name == ".."))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (let c in name.DecodedChars)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '/', '\\', '<', '>', '"', '\'', ':', '&', '*', '#', '|', '?':
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Reflect(.StaticFields | .NonStaticFields | .ApplyToInnerTypes)]
|
[Reflect(.StaticFields | .NonStaticFields | .ApplyToInnerTypes)]
|
||||||
public class Workspace
|
public class Workspace
|
||||||
{
|
{
|
||||||
|
@ -410,6 +444,7 @@ namespace IDE
|
||||||
public String mName ~ delete _;
|
public String mName ~ delete _;
|
||||||
public String mDir ~ delete _;
|
public String mDir ~ delete _;
|
||||||
public CompositeFile mCompositeFile ~ delete _;
|
public CompositeFile mCompositeFile ~ delete _;
|
||||||
|
public List<WorkspaceFolder> mWorkspaceFolders = new List<WorkspaceFolder>() ~ DeleteContainerAndItems!(_);
|
||||||
public List<Project> mProjects = new List<Project>() ~ DeleteContainerAndItems!(_);
|
public List<Project> mProjects = new List<Project>() ~ DeleteContainerAndItems!(_);
|
||||||
public List<ProjectSpec> mProjectSpecs = new .() ~ DeleteContainerAndItems!(_);
|
public List<ProjectSpec> mProjectSpecs = new .() ~ DeleteContainerAndItems!(_);
|
||||||
public Dictionary<String, Project> mProjectNameMap = new .() ~ DeleteDictionaryAndKeys!(_);
|
public Dictionary<String, Project> mProjectNameMap = new .() ~ DeleteDictionaryAndKeys!(_);
|
||||||
|
@ -633,6 +668,29 @@ namespace IDE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mWorkspaceFolders.IsEmpty)
|
||||||
|
{
|
||||||
|
using (data.CreateObject("WorkspaceFolders", true))
|
||||||
|
{
|
||||||
|
String fullPathBuffer = scope .();
|
||||||
|
for (let folder in mWorkspaceFolders)
|
||||||
|
{
|
||||||
|
fullPathBuffer.Clear();
|
||||||
|
folder.GetFullPath(fullPathBuffer);
|
||||||
|
using (data.CreateArray(fullPathBuffer, true))
|
||||||
|
{
|
||||||
|
if (folder.mProjects != null)
|
||||||
|
{
|
||||||
|
for (let project in folder.mProjects)
|
||||||
|
{
|
||||||
|
data.Add(project.mProjectName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HashSet<String> seenPlatforms = scope .();
|
HashSet<String> seenPlatforms = scope .();
|
||||||
HashSet<String> writtenPlatforms = scope .();
|
HashSet<String> writtenPlatforms = scope .();
|
||||||
writtenPlatforms.Add(IDEApp.sPlatform32Name);
|
writtenPlatforms.Add(IDEApp.sPlatform32Name);
|
||||||
|
@ -1088,6 +1146,45 @@ namespace IDE
|
||||||
if (project != null)
|
if (project != null)
|
||||||
project.mLocked = false;
|
project.mLocked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.Contains("WorkspaceFolders"))
|
||||||
|
{
|
||||||
|
String projName = scope .(64);
|
||||||
|
using (data.Open("WorkspaceFolders"))
|
||||||
|
{
|
||||||
|
for (var filterName in data.Enumerate())
|
||||||
|
{
|
||||||
|
WorkspaceFolder folder;
|
||||||
|
WorkspaceFolder parentFolder = null;
|
||||||
|
for (let part in filterName.Split('/'))
|
||||||
|
{
|
||||||
|
let index = mWorkspaceFolders.FindIndex(scope (folder) => part.CompareTo(folder.mName, true) == 0);
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
folder = new WorkspaceFolder();
|
||||||
|
folder.mName = new .(part);
|
||||||
|
folder.mParent = parentFolder;
|
||||||
|
mWorkspaceFolders.Add(folder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
folder = mWorkspaceFolders[index];
|
||||||
|
}
|
||||||
|
parentFolder = folder;
|
||||||
|
}
|
||||||
|
for (var value in data.Enumerate())
|
||||||
|
{
|
||||||
|
projName.Clear();
|
||||||
|
data.GetCurString(projName);
|
||||||
|
if (projName.Length > 0)
|
||||||
|
{
|
||||||
|
if (let project = FindProject(projName))
|
||||||
|
folder.mProjects.Add(project);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FixOptions()
|
public void FixOptions()
|
||||||
|
|
|
@ -137,7 +137,9 @@ namespace IDE.ui
|
||||||
bool mImportInstalledDeferred;
|
bool mImportInstalledDeferred;
|
||||||
public Dictionary<ListViewItem, ProjectItem> mListViewToProjectMap = new .() ~ delete _;
|
public Dictionary<ListViewItem, ProjectItem> mListViewToProjectMap = new .() ~ delete _;
|
||||||
public Dictionary<ProjectItem, ProjectListViewItem> mProjectToListViewMap = new .() ~ delete _;
|
public Dictionary<ProjectItem, ProjectListViewItem> mProjectToListViewMap = new .() ~ delete _;
|
||||||
|
public Dictionary<ListViewItem, WorkspaceFolder> mListViewToWorkspaceFolderMap = new .() ~ delete _;
|
||||||
|
public Dictionary<ProjectItem, WorkspaceFolder> mProjectToWorkspaceFolderMap = new .() ~ delete _;
|
||||||
|
ListViewItem mWorkspaceListViewItem;
|
||||||
public DarkListViewItem mSelectedParentItem;
|
public DarkListViewItem mSelectedParentItem;
|
||||||
public MenuWidget mMenuWidget;
|
public MenuWidget mMenuWidget;
|
||||||
|
|
||||||
|
@ -234,7 +236,22 @@ namespace IDE.ui
|
||||||
int invalidCount = 0;
|
int invalidCount = 0;
|
||||||
if (source.mListView == target.mListView)
|
if (source.mListView == target.mListView)
|
||||||
{
|
{
|
||||||
if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
|
if (mListViewToWorkspaceFolderMap.ContainsKey(target) || target == mWorkspaceListViewItem)
|
||||||
|
{
|
||||||
|
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
|
||||||
|
{
|
||||||
|
if (mListViewToProjectMap.GetValue(selectedItem) case .Ok(var sourceProjectItem))
|
||||||
|
{
|
||||||
|
if (sourceProjectItem.mParentFolder == null)
|
||||||
|
validCount++;
|
||||||
|
}
|
||||||
|
else if (mListViewToWorkspaceFolderMap.GetValue(selectedItem) case .Ok(let sourceFolderItem))
|
||||||
|
{
|
||||||
|
validCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
|
||||||
{
|
{
|
||||||
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
|
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
|
||||||
{
|
{
|
||||||
|
@ -267,7 +284,88 @@ namespace IDE.ui
|
||||||
|
|
||||||
if (source.mListView == target.mListView)
|
if (source.mListView == target.mListView)
|
||||||
{
|
{
|
||||||
if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
|
ListViewItem folderListView;
|
||||||
|
WorkspaceFolder targetFolder;
|
||||||
|
if (mListViewToWorkspaceFolderMap.GetValue(target) case .Ok(out targetFolder))
|
||||||
|
folderListView = targetFolder.mListView;
|
||||||
|
else if (target == mWorkspaceListViewItem)
|
||||||
|
folderListView = mListView.GetRoot();
|
||||||
|
else
|
||||||
|
folderListView = null;
|
||||||
|
|
||||||
|
if (folderListView != null)
|
||||||
|
{
|
||||||
|
List<ListViewItem> selectedItems = scope .();
|
||||||
|
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
|
||||||
|
{
|
||||||
|
selectedItems.Add(selectedItem);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
Loop: for (let item in selectedItems)
|
||||||
|
{
|
||||||
|
let parent = item.mParentItem;
|
||||||
|
|
||||||
|
IsValid: do
|
||||||
|
{
|
||||||
|
if ((mListViewToWorkspaceFolderMap.GetValue(item) case .Ok(let folder)) && (item != folderListView))
|
||||||
|
{
|
||||||
|
// Check if target folder is not child of moved directory
|
||||||
|
bool IsMoveValid()
|
||||||
|
{
|
||||||
|
ListViewItem parent = folderListView;
|
||||||
|
repeat
|
||||||
|
{
|
||||||
|
parent = parent.mParentItem;
|
||||||
|
if (parent == item)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while(parent != null);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ((target.mDepth <= item.mDepth) || (IsMoveValid()))
|
||||||
|
{
|
||||||
|
folder.mParent = targetFolder;
|
||||||
|
break IsValid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((mListViewToProjectMap.GetValue(item) case .Ok(let projectItem)) && (projectItem.mParentFolder == null))
|
||||||
|
{
|
||||||
|
if (targetFolder != null)
|
||||||
|
{
|
||||||
|
if (mProjectToWorkspaceFolderMap.TryAdd(projectItem, var keyPtr, var valPtr))
|
||||||
|
{
|
||||||
|
(*valPtr) = targetFolder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*valPtr).mProjects.Remove(projectItem.mProject);
|
||||||
|
(*valPtr) = targetFolder;
|
||||||
|
}
|
||||||
|
targetFolder.mProjects.Add(projectItem.mProject);
|
||||||
|
}
|
||||||
|
break IsValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue Loop;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent.RemoveChildItem(item, false);
|
||||||
|
folderListView.MakeParent();
|
||||||
|
folderListView.AddChild(item);
|
||||||
|
parent.TryUnmakeParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedItems.Count > 0)
|
||||||
|
{
|
||||||
|
target.mOpenButton?.Open(true, false);
|
||||||
|
QueueSortItem((ProjectListViewItem)folderListView);
|
||||||
|
gApp.mWorkspace.SetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
|
||||||
{
|
{
|
||||||
if (targetProjectItem == null)
|
if (targetProjectItem == null)
|
||||||
return;
|
return;
|
||||||
|
@ -445,6 +543,8 @@ namespace IDE.ui
|
||||||
{
|
{
|
||||||
mListViewToProjectMap.Clear();
|
mListViewToProjectMap.Clear();
|
||||||
mProjectToListViewMap.Clear();
|
mProjectToListViewMap.Clear();
|
||||||
|
mListViewToWorkspaceFolderMap.Clear();
|
||||||
|
mProjectToWorkspaceFolderMap.Clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,14 +556,67 @@ namespace IDE.ui
|
||||||
workspaceItem.mLabelOffset = GS!(-16);
|
workspaceItem.mLabelOffset = GS!(-16);
|
||||||
workspaceItem.mRefObject = IDEApp.sApp.mWorkspace;
|
workspaceItem.mRefObject = IDEApp.sApp.mWorkspace;
|
||||||
SetupItem(workspaceItem, true);
|
SetupItem(workspaceItem, true);
|
||||||
|
mWorkspaceListViewItem = workspaceItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
mListViewToProjectMap.Clear();
|
mListViewToProjectMap.Clear();
|
||||||
mProjectToListViewMap.Clear();
|
mProjectToListViewMap.Clear();
|
||||||
|
mListViewToWorkspaceFolderMap.Clear();
|
||||||
|
mProjectToWorkspaceFolderMap.Clear();
|
||||||
|
|
||||||
for (var project in IDEApp.sApp.mWorkspace.mProjects)
|
for (var project in IDEApp.sApp.mWorkspace.mProjects)
|
||||||
InitProject(project);
|
InitProject(project);
|
||||||
|
|
||||||
|
let root = mListView.GetRoot();
|
||||||
|
|
||||||
|
HashSet<String> folderMap = scope .();
|
||||||
|
for (var workspaceFolder in IDEApp.sApp.mWorkspace.mWorkspaceFolders)
|
||||||
|
{
|
||||||
|
void AddFolder(WorkspaceFolder folder)
|
||||||
|
{
|
||||||
|
if (folder.mListView == null && folderMap.Add(folder.mName))
|
||||||
|
{
|
||||||
|
ProjectListViewItem parentListViewItem;
|
||||||
|
if (folder.mParent == null)
|
||||||
|
parentListViewItem = (ProjectListViewItem)mListView.GetRoot();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (folder.mParent.mListView == null)
|
||||||
|
AddFolder(folder.mParent);
|
||||||
|
|
||||||
|
parentListViewItem = folder.mParent.mListView;
|
||||||
|
if (parentListViewItem == null)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProjectListViewItem listViewItem;
|
||||||
|
listViewItem = (ProjectListViewItem)parentListViewItem.CreateChildItem();
|
||||||
|
|
||||||
|
folder.mListView = listViewItem;
|
||||||
|
listViewItem.mIconImage = DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.ProjectFolder);
|
||||||
|
listViewItem.Label = folder.mName;
|
||||||
|
listViewItem.mRefObject = folder;
|
||||||
|
SetupItem(listViewItem, true);
|
||||||
|
mListViewToWorkspaceFolderMap.Add(listViewItem, folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AddFolder(workspaceFolder);
|
||||||
|
if (workspaceFolder.mProjects == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (let project in workspaceFolder.mProjects)
|
||||||
|
{
|
||||||
|
if (mProjectToListViewMap.TryGetValue(project.mRootFolder, let viewItem))
|
||||||
|
{
|
||||||
|
root.RemoveChildItem(viewItem, false);
|
||||||
|
workspaceFolder.mListView.MakeParent();
|
||||||
|
workspaceFolder.mListView.AddChild(viewItem);
|
||||||
|
mProjectToWorkspaceFolderMap[project.mRootFolder] = workspaceFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QueueSortItem(workspaceFolder.mListView);
|
||||||
|
}
|
||||||
|
|
||||||
RehupProjects();
|
RehupProjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -979,15 +1132,26 @@ namespace IDE.ui
|
||||||
|
|
||||||
int CompareListViewItem(ListViewItem left, ListViewItem right)
|
int CompareListViewItem(ListViewItem left, ListViewItem right)
|
||||||
{
|
{
|
||||||
ProjectItem leftProjectItem;
|
WorkspaceFolder leftFolder;
|
||||||
mListViewToProjectMap.TryGetValue(left, out leftProjectItem);
|
mListViewToWorkspaceFolderMap.TryGetValue(left, out leftFolder);
|
||||||
ProjectItem rightProjectItem;
|
WorkspaceFolder rightFolder;
|
||||||
mListViewToProjectMap.TryGetValue(right, out rightProjectItem);
|
mListViewToWorkspaceFolderMap.TryGetValue(right, out rightFolder);
|
||||||
|
if ((leftFolder != null) && (rightFolder != null))
|
||||||
|
return String.Compare(leftFolder.mName, rightFolder.mName, true);
|
||||||
|
|
||||||
if (leftProjectItem == null)
|
ProjectItem leftProjectItem;
|
||||||
return -1;
|
mListViewToProjectMap.TryGetValue(left, out leftProjectItem);
|
||||||
if (rightProjectItem == null)
|
ProjectItem rightProjectItem;
|
||||||
return 1;
|
mListViewToProjectMap.TryGetValue(right, out rightProjectItem);
|
||||||
|
|
||||||
|
if (leftProjectItem == null && leftFolder == null)
|
||||||
|
return -1;
|
||||||
|
else if (rightFolder != null)
|
||||||
|
return 1;
|
||||||
|
if (rightProjectItem == null && rightFolder == null)
|
||||||
|
return 1;
|
||||||
|
else if (leftFolder != null)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if ((leftProjectItem.mParentFolder == null) && (rightProjectItem.mParentFolder == null))
|
if ((leftProjectItem.mParentFolder == null) && (rightProjectItem.mParentFolder == null))
|
||||||
{
|
{
|
||||||
|
@ -1562,6 +1726,83 @@ namespace IDE.ui
|
||||||
//delete projectItem;
|
//delete projectItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoveSelectedWorkspaceFolder()
|
||||||
|
{
|
||||||
|
uint32 selectedCount = 0;
|
||||||
|
WorkspaceFolder selectedFolder = null;
|
||||||
|
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) => {
|
||||||
|
if (mListViewToWorkspaceFolderMap.GetValue(selectedItem) case .Ok(let folder))
|
||||||
|
{
|
||||||
|
selectedCount++;
|
||||||
|
selectedFolder = folder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (selectedCount == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
String title;
|
||||||
|
String text;
|
||||||
|
if (selectedCount > 1)
|
||||||
|
{
|
||||||
|
title = "Delete Folders";
|
||||||
|
text = "Delete selected folders from workspace?";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title = "Delete Folder";
|
||||||
|
text = scope:: $"Delete '{selectedFolder.mName}' from workspace?";
|
||||||
|
}
|
||||||
|
|
||||||
|
Dialog aDialog = ThemeFactory.mDefault.CreateDialog(title, text);
|
||||||
|
|
||||||
|
aDialog.mDefaultButton = aDialog.AddButton("Yes", new (evt) =>
|
||||||
|
{
|
||||||
|
aDialog.Close();
|
||||||
|
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);
|
||||||
|
selectedItem.WithItems(scope [&] (item) => {
|
||||||
|
if (mListViewToProjectMap.GetValue(item) case .Ok(let project))
|
||||||
|
{
|
||||||
|
if (project.mParentFolder == null)
|
||||||
|
itemsToMove.Add(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let projectListViewItem in itemsToMove)
|
||||||
|
{
|
||||||
|
projectListViewItem.mParentItem.RemoveChildItem(projectListViewItem, false);
|
||||||
|
root.AddChildAtIndex(1, projectListViewItem);
|
||||||
|
if (mListViewToProjectMap.TryGetValue(projectListViewItem, let projectItem))
|
||||||
|
mProjectToWorkspaceFolderMap.Remove(projectItem);
|
||||||
|
}
|
||||||
|
for (let folder in foldersToDelete)
|
||||||
|
{
|
||||||
|
let folderItem = folder.mListView;
|
||||||
|
mListViewToWorkspaceFolderMap.Remove(folderItem);
|
||||||
|
folderItem.mParentItem.RemoveChildItem(folderItem);
|
||||||
|
gApp.mWorkspace.mWorkspaceFolders.Remove(folder);
|
||||||
|
delete folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((itemsToMove.Count > 0) || (foldersToDelete.Count > 0))
|
||||||
|
{
|
||||||
|
QueueSortItem((ProjectListViewItem)root);
|
||||||
|
gApp.mWorkspace.SetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
aDialog.mEscButton = aDialog.AddButton("No");
|
||||||
|
aDialog.PopupWindow(gApp.GetActiveWindow());
|
||||||
|
}
|
||||||
|
|
||||||
void RemoveSelectedItems(bool deleteFiles)
|
void RemoveSelectedItems(bool deleteFiles)
|
||||||
{
|
{
|
||||||
List<ListViewItem> selectedItems = scope List<ListViewItem>();
|
List<ListViewItem> selectedItems = scope List<ListViewItem>();
|
||||||
|
@ -1643,6 +1884,7 @@ namespace IDE.ui
|
||||||
int32 fileCount = 0;
|
int32 fileCount = 0;
|
||||||
int32 folderCount = 0;
|
int32 folderCount = 0;
|
||||||
bool hadProjectItemsSelected = false;
|
bool hadProjectItemsSelected = false;
|
||||||
|
int32 workspaceFolderCount = 0;
|
||||||
|
|
||||||
HashSet<Project> projectsReferenced = scope HashSet<Project>();
|
HashSet<Project> projectsReferenced = scope HashSet<Project>();
|
||||||
|
|
||||||
|
@ -1669,6 +1911,10 @@ namespace IDE.ui
|
||||||
fileCount++;
|
fileCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (mListViewToWorkspaceFolderMap.ContainsKey(selectedItem))
|
||||||
|
{
|
||||||
|
workspaceFolderCount++;
|
||||||
|
}
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
if (selectedProjectItem != null)
|
if (selectedProjectItem != null)
|
||||||
|
@ -1746,7 +1992,11 @@ namespace IDE.ui
|
||||||
aDialog.mEscButton = aDialog.AddButton("Cancel");
|
aDialog.mEscButton = aDialog.AddButton("Cancel");
|
||||||
aDialog.PopupWindow(gApp.GetActiveWindow());
|
aDialog.PopupWindow(gApp.GetActiveWindow());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (workspaceFolderCount > 0)
|
||||||
|
{
|
||||||
|
RemoveSelectedWorkspaceFolder();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void KeyDown(KeyCode keyCode, bool isRepeat)
|
public override void KeyDown(KeyCode keyCode, bool isRepeat)
|
||||||
|
@ -1875,7 +2125,35 @@ namespace IDE.ui
|
||||||
|
|
||||||
ListViewItem listViewItem = mListView.mEditingItem;
|
ListViewItem listViewItem = mListView.mEditingItem;
|
||||||
int32 column = listViewItem.mColumnIdx;
|
int32 column = listViewItem.mColumnIdx;
|
||||||
|
|
||||||
|
if (mListViewToWorkspaceFolderMap.GetValue(listViewItem.GetMainItem()) case .Ok(let folder))
|
||||||
|
{
|
||||||
|
if ((!mListView.mCancelingEdit) && (listViewItem.mLabel != newValue))
|
||||||
|
{
|
||||||
|
if (WorkspaceFolder.IsNameValid(newValue))
|
||||||
|
{
|
||||||
|
if (IsWorkspaceFolderNameUnique(newValue, listViewItem.GetMainItem()))
|
||||||
|
{
|
||||||
|
listViewItem.Label = newValue;
|
||||||
|
folder.mName.Set(newValue);
|
||||||
|
QueueSortItem((ProjectListViewItem)listViewItem.mParentItem);
|
||||||
|
gApp.mWorkspace.SetChanged();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IDEApp.sApp.Fail(scope $"Workspace already contains folder named '{newValue}'");
|
||||||
|
IDEApp.Beep(IDEApp.MessageBeepType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IDEApp.sApp.Fail(scope $"Folder name contains invalid characters!");
|
||||||
|
IDEApp.Beep(IDEApp.MessageBeepType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ProjectItem projectItem = mListViewToProjectMap[listViewItem.GetMainItem()];
|
ProjectItem projectItem = mListViewToProjectMap[listViewItem.GetMainItem()];
|
||||||
if (projectItem == null)
|
if (projectItem == null)
|
||||||
return;
|
return;
|
||||||
|
@ -2080,6 +2358,53 @@ namespace IDE.ui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsWorkspaceFolderNameUnique(String name, ListViewItem currentItem = null)
|
||||||
|
{
|
||||||
|
for (let (k,v) in mListViewToWorkspaceFolderMap)
|
||||||
|
{
|
||||||
|
if (v.mListView != currentItem && String.Compare(v.mName, name, true) == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddWorkspaceFolder(ProjectListViewItem parentListViewItem)
|
||||||
|
{
|
||||||
|
ProjectListViewItem listViewItem;
|
||||||
|
listViewItem = (ProjectListViewItem)parentListViewItem.CreateChildItem();
|
||||||
|
parentListViewItem.mOpenButton?.Open(true, false);
|
||||||
|
|
||||||
|
String name = new .(16);
|
||||||
|
int32 checkIdx = 1;
|
||||||
|
repeat
|
||||||
|
{
|
||||||
|
name..Clear().AppendF($"New Folder {checkIdx}");
|
||||||
|
checkIdx++;
|
||||||
|
}
|
||||||
|
while(!IsWorkspaceFolderNameUnique(name));
|
||||||
|
|
||||||
|
let folder = new WorkspaceFolder();
|
||||||
|
folder.mName = name;
|
||||||
|
folder.mListView = listViewItem;
|
||||||
|
gApp.mWorkspace.mWorkspaceFolders.Add(folder);
|
||||||
|
|
||||||
|
listViewItem.mIconImage = DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.ProjectFolder);
|
||||||
|
listViewItem.Label = folder.mName;
|
||||||
|
listViewItem.mRefObject = folder;
|
||||||
|
SetupItem(listViewItem, true);
|
||||||
|
mListViewToWorkspaceFolderMap.Add(listViewItem, folder);
|
||||||
|
SortItem(parentListViewItem);
|
||||||
|
mListView.UpdateAll();
|
||||||
|
mListView.GetRoot().SelectItemExclusively(listViewItem);
|
||||||
|
EditListViewItem(listViewItem);
|
||||||
|
gApp.mWorkspace.SetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Project ImportProject(String filePath, VerSpec verSpec = .None)
|
public Project ImportProject(String filePath, VerSpec verSpec = .None)
|
||||||
{
|
{
|
||||||
if (!File.Exists(filePath))
|
if (!File.Exists(filePath))
|
||||||
|
@ -2268,7 +2593,18 @@ namespace IDE.ui
|
||||||
{
|
{
|
||||||
Menu anItem;
|
Menu anItem;
|
||||||
|
|
||||||
if (gApp.mWorkspace.IsInitialized)
|
if (mListViewToWorkspaceFolderMap.TryGetValue(focusedItem, let folder))
|
||||||
|
{
|
||||||
|
anItem = menu.AddItem("Remove");
|
||||||
|
anItem.mOnMenuItemSelected.Add(new (item) => { RemoveSelectedWorkspaceFolder(); });
|
||||||
|
anItem = menu.AddItem("Rename");
|
||||||
|
anItem.mOnMenuItemSelected.Add(new (item) => { EditListViewItem(focusedItem); });
|
||||||
|
menu.AddItem();
|
||||||
|
anItem = menu.AddItem("Add Workspace Folder");
|
||||||
|
anItem.mOnMenuItemSelected.Add(new (item) => { AddWorkspaceFolder(folder.mListView); });
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
else if (gApp.mWorkspace.IsInitialized)
|
||||||
{
|
{
|
||||||
AddOpenContainingFolder();
|
AddOpenContainingFolder();
|
||||||
menu.AddItem();
|
menu.AddItem();
|
||||||
|
@ -2283,6 +2619,9 @@ namespace IDE.ui
|
||||||
anItem.mOnMenuItemSelected.Add(new (item) => { mImportInstalledDeferred = true; });
|
anItem.mOnMenuItemSelected.Add(new (item) => { mImportInstalledDeferred = true; });
|
||||||
|
|
||||||
menu.AddItem();
|
menu.AddItem();
|
||||||
|
anItem = menu.AddItem("Add Workspace Folder");
|
||||||
|
anItem.mOnMenuItemSelected.Add(new (item) => { AddWorkspaceFolder((ProjectListViewItem)mListView.GetRoot()); });
|
||||||
|
menu.AddItem();
|
||||||
anItem = menu.AddItem("Properties...");
|
anItem = menu.AddItem("Properties...");
|
||||||
anItem.mOnMenuItemSelected.Add(new (item) => { ShowWorkspaceProperties(); });
|
anItem.mOnMenuItemSelected.Add(new (item) => { ShowWorkspaceProperties(); });
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue