1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-11 21:04:10 +02:00

Support for file dragging in workspace panel

This commit is contained in:
Brian Fiete 2021-01-03 11:51:53 -08:00
parent f928b93644
commit f6174aade2
8 changed files with 385 additions and 95 deletions

View file

@ -145,8 +145,8 @@ namespace IDE.ui
mListView.UpdateScrollbars();
mListView.mOnFocusChanged.Add(new => FocusChangedHandler);
/*mListView.mOnDragEnd.Add(new => HandleDragEnd);
mListView.mOnDragUpdate.Add(new => HandleDragUpdate);*/
mListView.mOnDragEnd.Add(new => HandleDragEnd);
mListView.mOnDragUpdate.Add(new => HandleDragUpdate);
AddWidget(mListView);
@ -217,24 +217,175 @@ namespace IDE.ui
DarkListViewItem source = (DarkListViewItem)theEvent.mSender;
DarkListViewItem target = (DarkListViewItem)theEvent.mDragTarget;
theEvent.mDragKind = .None;
int validCount = 0;
int invalidCount = 0;
if (source.mListView == target.mListView)
{
ProjectItem sourceProjectItem = mListViewToProjectMap[source];
ProjectItem targetProjectItem = mListViewToProjectMap[target];
if (((sourceProjectItem.mParentFolder == null) || (targetProjectItem.mParentFolder == null)) ||
(sourceProjectItem.mProject != targetProjectItem.mProject))
theEvent.mDragAllowed = false;
}
if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
{
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
{
if (mListViewToProjectMap.GetValue(selectedItem) case .Ok(var sourceProjectItem))
{
if ((sourceProjectItem.mParentFolder != null) && (sourceProjectItem.mProject == targetProjectItem.mProject))
validCount++;
else
invalidCount++;
}
});
}
}
if ((validCount > 0) && (invalidCount == 0))
theEvent.mDragKind = .Inside;
}
void HandleDragEnd(DragEvent theEvent)
{
if (!theEvent.mDragAllowed)
if (theEvent.mDragKind == .None)
return;
if (theEvent.mDragTarget is DarkListViewItem)
if (theEvent.mDragTarget is ProjectListViewItem)
{
DarkListViewItem source = (DarkListViewItem)theEvent.mSender;
ProjectListViewItem source = (ProjectListViewItem)theEvent.mSender;
ProjectListViewItem target = (ProjectListViewItem)theEvent.mDragTarget;
theEvent.mDragKind = .None;
if (source.mListView == target.mListView)
{
if (mListViewToProjectMap.GetValue(target) case .Ok(var targetProjectItem))
{
if (targetProjectItem == null)
return;
if (source == target)
return;
var targetProjectFolder = targetProjectItem as ProjectFolder;
if (targetProjectFolder == null)
targetProjectFolder = targetProjectItem.mParentFolder;
var targetListItem = mProjectToListViewMap[targetProjectFolder];
int moveCount = 0;
int selectCount = 0;
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
{
if (mListViewToProjectMap.GetValue(selectedItem) case .Ok(var sourceProjectItem))
{
if (sourceProjectItem.mParentFolder != targetProjectFolder)
moveCount++;
}
selectCount++;
});
if (moveCount == 0)
return;
var targetDisplayName = targetProjectFolder.GetFullDisplayName(.. scope .());
if (targetDisplayName.IsEmpty)
targetDisplayName = "src";
Dialog dialog;
if (selectCount == 1)
{
dialog = ThemeFactory.mDefault.CreateDialog("Move file to a new location?",
scope $"Are you sure you want to move this file to '{targetDisplayName}'?");
}
else
{
dialog = ThemeFactory.mDefault.CreateDialog("Move files to a new location?",
scope $"Are you sure you want to move these files to '{targetDisplayName}'?");
}
dialog.AddButton("Yes", new (evt) =>
{
List<String> fileErrors = scope .();
List<ListViewItem> selectedItems = scope .();
mListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
{
selectedItems.Add(selectedItem);
});
for (var selectedItem in selectedItems)
{
if (mListViewToProjectMap.GetValue(selectedItem) case .Ok(var sourceProjectItem))
{
var sourceProjectFileItem = sourceProjectItem as ProjectFileItem;
if (sourceProjectFileItem == null)
return;
var sourcePath = sourceProjectFileItem.GetFullImportPath(.. scope .());
var destPath = targetProjectFolder.GetFullImportPath(.. scope .());
destPath.AppendF($"{Path.DirectorySeparatorChar}{sourceProjectFileItem.mName}");
if (File.Move(sourcePath, destPath) case .Ok)
{
gApp.FileRenamed(sourceProjectFileItem, sourcePath, destPath);
}
else
fileErrors.Add(scope:: .(destPath));
if (targetProjectFolder != sourceProjectItem.mParentFolder)
{
source.mParentItem.RemoveChildItem(source, false);
sourceProjectItem.mParentFolder.RemoveChild(sourceProjectItem);
targetListItem.AddChildAtIndex(0, source);
targetListItem.mOpenButton.Open(true, false);
targetProjectFolder.AddChildAtIndex(0, sourceProjectItem);
}
}
}
QueueSortItem(targetListItem);
DoSortItem(targetListItem);
if (!fileErrors.IsEmpty)
{
var errorStr = scope String();
if (fileErrors.Count == 1)
errorStr.AppendF("Failed to move file to: {0}", fileErrors[0]);
else
{
errorStr.AppendF("Failed to move {0} files:", fileErrors.Count);
for (var file in fileErrors)
errorStr.Append("\n {}", file);
}
gApp.Fail(errorStr);
}
});
dialog.AddButton("No", new (evt) =>
{
});
dialog.PopupWindow(gApp.GetActiveWindow());
//RehupFolder(targetProjectFolder.mProject.mRootFolder, .FullTraversal);
/*if (theEvent.mDragTargetDir == -1) // Before
{
target.mParentItem.InsertChild(source, target);
targetProjectItem.mParentFolder.InsertChild(sourceProjectItem, targetProjectItem);
}
else if (theEvent.mDragTargetDir == 0) // Inside
{
target.AddChildAtIndex(0, source);
target.mOpenButton.Open(true, false);
((ProjectFolder)targetProjectItem).AddChildAtIndex(0, sourceProjectItem);
}
else if (theEvent.mDragTargetDir == 1) // After
{
target.mParentItem.AddChild(source, target);
targetProjectItem.mParentFolder.AddChild(sourceProjectItem, targetProjectItem);
}*/
}
}
/*DarkListViewItem source = (DarkListViewItem)theEvent.mSender;
DarkListViewItem target = (DarkListViewItem)theEvent.mDragTarget;
if (source.mListView == target.mListView)
@ -242,32 +393,8 @@ namespace IDE.ui
ProjectItem targetProjectItem = mListViewToProjectMap[target];
ProjectItem sourceProjectItem = mListViewToProjectMap[source];
if ((targetProjectItem == null) || (sourceProjectItem == null))
return;
if (source == target)
return;
source.mParentItem.RemoveChildItem(source);
sourceProjectItem.mParentFolder.RemoveChild(sourceProjectItem);
if (theEvent.mDragTargetDir == -1) // Before
{
target.mParentItem.InsertChild(source, target);
targetProjectItem.mParentFolder.InsertChild(sourceProjectItem, targetProjectItem);
}
else if (theEvent.mDragTargetDir == 0) // Inside
{
target.AddChildAtIndex(0, source);
target.mOpenButton.Open(true, false);
((ProjectFolder)targetProjectItem).AddChildAtIndex(0, sourceProjectItem);
}
else if (theEvent.mDragTargetDir == 1) // After
{
target.mParentItem.AddChild(source, target);
targetProjectItem.mParentFolder.AddChild(sourceProjectItem, targetProjectItem);
}
}
}*/
}
}
@ -342,6 +469,7 @@ namespace IDE.ui
item.mOnMouseClick.Add(new => ListViewItemClicked);
UpdateColors();
DarkListViewItem listViewItem = (DarkListViewItem)item;
listViewItem.AllowDragging = true;
listViewItem.mFocusColor = gApp.mSettings.mUISettings.mColors.mWorkspaceDisabledText;
listViewItem.mSelectColor = gApp.mSettings.mUISettings.mColors.mWorkspaceDisabledText;
}
@ -1136,10 +1264,13 @@ namespace IDE.ui
{
if (item.Focused)
{
// Just rehup focus handler - handles case of closing file then clicking on it again
// even though it's already selected. We want that to re-open it.
FocusChangedHandler(item);
return;
if (mListView.GetRoot().GetSelectedItemCount() <= 1)
{
// Just rehup focus handler - handles case of closing file then clicking on it again
// even though it's already selected. We want that to re-open it.
FocusChangedHandler(item);
return;
}
}
mListView.GetRoot().SelectItem(item, checkKeyStates);