diff --git a/IDE/src/IDEUtils.bf b/IDE/src/IDEUtils.bf index f39761fc..1b2c41e8 100644 --- a/IDE/src/IDEUtils.bf +++ b/IDE/src/IDEUtils.bf @@ -636,6 +636,38 @@ namespace IDE label.Append('\x02'); } } + + static String sHexUpperChars = "0123456789ABCDEF"; + public static void URLEncode(StringView inStr, String outStr) + { + for (var c in inStr) + { + if ((c.IsLetterOrDigit) || (c == '-') || (c == '_') || (c == '.') || (c == '~') || (c == '/')) + { + outStr.Append(c); + } + else + { + outStr.Append('%'); + outStr.Append(sHexUpperChars[(.)c>>4]); + outStr.Append(sHexUpperChars[(.)c&0xF]); + } + } + } + + public static void URLDecode(StringView inStr, String outStr) + { + for (int i < inStr.Length) + { + char8 c = inStr[i]; + if ((c == '%') && (i < inStr.Length-2)) + { + c = (.)int32.Parse(inStr.Substring(i+1, 2), .HexNumber).GetValueOrDefault(); + i += 2; + } + outStr.Append(c); + } + } } } diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 259fa15d..b37c6759 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -2061,8 +2061,42 @@ namespace IDE.ui } base.KeyDown(keyCode, isRepeat); - if (keyCode == KeyCode.Delete) - RemoveSelectedItems(); + + if (mWidgetWindow.GetKeyFlags() == .Ctrl) + { + switch (keyCode) + { + case (.)'C': + + String clipData = scope .(); + mListView.GetRoot().WithSelectedItems(scope (selectedItem) => + { + if (mListViewToProjectMap.GetValue(selectedItem) case .Ok(var sourceProjectItem)) + { + if (var projectSource = sourceProjectItem as ProjectSource) + { + var path = scope String(); + sourceProjectItem.mProject.GetProjectFullPath(projectSource.mPath, path); + path.Replace('\\', '/'); + + if (!clipData.IsEmpty) + clipData.Append("\n"); + clipData.Append("file:///"); + IDEUtils.URLEncode(path, clipData); + } + } + }); + if (!clipData.IsEmpty) + gApp.SetClipboardData("code/file-list", clipData.Ptr, (.)clipData.Length, true); + case (.)'V': + default: + } + } + else if (mWidgetWindow.GetKeyFlags() == .None) + { + if (keyCode == KeyCode.Delete) + RemoveSelectedItems(); + } } void ItemClicked(MouseEvent theEvent) @@ -2909,6 +2943,12 @@ namespace IDE.ui { Regenerate(false); }); + + item = gApp.AddMenuItem(menu, "Duplicate", "Duplicate Item"); + item.mOnMenuItemSelected.Add(new (item) => + { + + }); } else if (let projectFolder = projectItem as ProjectFolder) {