From d0de7847f4810a0caefc2c0bfb506aa7b6de5618 Mon Sep 17 00:00:00 2001 From: uwx Date: Sun, 9 Feb 2025 12:19:48 -0300 Subject: [PATCH 1/2] Janky shift-select implementation --- Alpha/Gui/Windows/FilesystemWindow.cs | 38 ++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/Alpha/Gui/Windows/FilesystemWindow.cs b/Alpha/Gui/Windows/FilesystemWindow.cs index 01ded0d..dd7b6c9 100644 --- a/Alpha/Gui/Windows/FilesystemWindow.cs +++ b/Alpha/Gui/Windows/FilesystemWindow.cs @@ -19,6 +19,7 @@ public class FilesystemWindow : Window, IDisposable { private readonly List filteredDirectories = []; private readonly List visibleRootCategories = [..PathService.RootCategories.Keys]; private readonly List selectedFiles = new(); + private PathService.File? shiftStartFile; private float sidebarWidth = 300f; private readonly GameDataService gameDataService; @@ -209,7 +210,8 @@ private void DrawFolder(string path, PathService.Folder folder) { .Where(x => !filterExists || this.GetPath(x).Contains(this.filter, StringComparison.OrdinalIgnoreCase)) .Select(x => (File: x, Filename: x.FileName ?? Util.PrintFileHash(x.FileHash))) .OrderBy(x => x.File.FileName is null) - .ThenBy(x => x.Filename); + .ThenBy(x => x.Filename) + .ToArray(); foreach (var childFolder in folders) { if (ImGui.TreeNode(childFolder.Name + "/")) { @@ -218,17 +220,47 @@ private void DrawFolder(string path, PathService.Folder folder) { } } - foreach (var (file, filename) in files) { + foreach (var (index, (file, filename)) in files.Index()) { var selected = this.SelectedFile?.Item2 == file || this.selectedFiles.Contains(file); if (ImGui.Selectable(filename, selected)) { - if (Util.IsKeyDown(ImGuiKey.LeftCtrl)) { + if (Util.IsKeyDown(ImGuiKey.LeftShift)) { + var isDeselect = this.selectedFiles.Contains(file); + + if (this.shiftStartFile != null) { + var lastSelectedFileIndex = files + .Index() + .FirstOrDefault(x => x.Item.File == this.shiftStartFile, (-1, default)) + .Index; + + if (lastSelectedFileIndex < index) { + for (var i = lastSelectedFileIndex; i <= index; i++) { + if (isDeselect) { + this.selectedFiles.Remove(files[i].File); + } else if (!this.selectedFiles.Contains(files[i].File)) { + this.selectedFiles.Add(files[i].File); + } + } + } else if (lastSelectedFileIndex > index) { + for (var i = lastSelectedFileIndex; i >= index; i--) { + if (isDeselect) { + this.selectedFiles.Remove(files[i].File); + } else if (!this.selectedFiles.Contains(files[i].File)) { + this.selectedFiles.Add(files[i].File); + } + } + } + } + + } else if (Util.IsKeyDown(ImGuiKey.LeftCtrl)) { if (this.selectedFiles.Contains(file)) { this.selectedFiles.Remove(file); } else { this.selectedFiles.Add(file); } + this.shiftStartFile = file; } else { this.Open(file); + this.shiftStartFile = file; } } } From 4e8caf70d14ce57a6a98e4fb08c8704f82daa22e Mon Sep 17 00:00:00 2001 From: uwx Date: Sun, 9 Feb 2025 12:26:01 -0300 Subject: [PATCH 2/2] Sanity check: ensure index is not -1 --- Alpha/Gui/Windows/FilesystemWindow.cs | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Alpha/Gui/Windows/FilesystemWindow.cs b/Alpha/Gui/Windows/FilesystemWindow.cs index dd7b6c9..c80438c 100644 --- a/Alpha/Gui/Windows/FilesystemWindow.cs +++ b/Alpha/Gui/Windows/FilesystemWindow.cs @@ -232,20 +232,22 @@ private void DrawFolder(string path, PathService.Folder folder) { .FirstOrDefault(x => x.Item.File == this.shiftStartFile, (-1, default)) .Index; - if (lastSelectedFileIndex < index) { - for (var i = lastSelectedFileIndex; i <= index; i++) { - if (isDeselect) { - this.selectedFiles.Remove(files[i].File); - } else if (!this.selectedFiles.Contains(files[i].File)) { - this.selectedFiles.Add(files[i].File); + if (lastSelectedFileIndex != -1) { + if (lastSelectedFileIndex < index) { + for (var i = lastSelectedFileIndex; i <= index; i++) { + if (isDeselect) { + this.selectedFiles.Remove(files[i].File); + } else if (!this.selectedFiles.Contains(files[i].File)) { + this.selectedFiles.Add(files[i].File); + } } - } - } else if (lastSelectedFileIndex > index) { - for (var i = lastSelectedFileIndex; i >= index; i--) { - if (isDeselect) { - this.selectedFiles.Remove(files[i].File); - } else if (!this.selectedFiles.Contains(files[i].File)) { - this.selectedFiles.Add(files[i].File); + } else if (lastSelectedFileIndex > index) { + for (var i = lastSelectedFileIndex; i >= index; i--) { + if (isDeselect) { + this.selectedFiles.Remove(files[i].File); + } else if (!this.selectedFiles.Contains(files[i].File)) { + this.selectedFiles.Add(files[i].File); + } } } }