From b7a4333e2d39a2362c6d933996bcccd87748d718 Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 17 Apr 2023 20:27:40 -0400 Subject: [PATCH 1/3] Added the ability to load custom assemblies to the shell. --- SrcMod/Shell/Shell.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/SrcMod/Shell/Shell.cs b/SrcMod/Shell/Shell.cs index 3a90b88..8516305 100644 --- a/SrcMod/Shell/Shell.cs +++ b/SrcMod/Shell/Shell.cs @@ -95,6 +95,26 @@ public class Shell ReloadDirectoryInfo(); } + public bool LoadModule(Type moduleType) + { + if (LoadedModules.Any(x => x.Type.FullName == moduleType.FullName)) return false; + + ModuleInfo? module = ModuleInfo.FromType(moduleType); + if (module is null) return false; + + LoadedModules.Add(module); + LoadedCommands.AddRange(module.Commands); + + return true; + } + public bool LoadModule() => LoadModule(typeof(T)); + public int LoadModules(Assembly moduleAssembly) + { + int loaded = 0; + foreach (Type moduleType in moduleAssembly.GetTypes()) if (LoadModule(moduleType)) loaded++; + return loaded; + } + public void AddHistory(HistoryItem item) => History.Add(item); public void UndoItem() { From b869de9be869dabb3ac23bda6254d77c03898923 Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 17 Apr 2023 21:02:39 -0400 Subject: [PATCH 2/3] Directory info is now reloaded after every command. One liner fix. --- SrcMod/Shell/Shell.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SrcMod/Shell/Shell.cs b/SrcMod/Shell/Shell.cs index 8516305..08de616 100644 --- a/SrcMod/Shell/Shell.cs +++ b/SrcMod/Shell/Shell.cs @@ -270,6 +270,8 @@ public class Shell activeCommand.Dispose(); activeCommand = null; } + + ReloadDirectoryInfo(); return; } } From 4d2e98ce427ad24ca104ed8060d6c0ec1db4d303 Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Tue, 18 Apr 2023 08:31:40 -0400 Subject: [PATCH 3/3] Moved the loading bar to its own class. Small fix. --- SrcMod/Shell/LoadingBar.cs | 79 +++++++++++++++++++++ SrcMod/Shell/Modules/BaseModule.cs | 12 ++-- SrcMod/Shell/Modules/CompressionModule.cs | 6 +- SrcMod/Shell/Shell.cs | 4 +- SrcMod/Shell/Tools.cs | 83 ++--------------------- 5 files changed, 94 insertions(+), 90 deletions(-) create mode 100644 SrcMod/Shell/LoadingBar.cs diff --git a/SrcMod/Shell/LoadingBar.cs b/SrcMod/Shell/LoadingBar.cs new file mode 100644 index 0000000..f658c8e --- /dev/null +++ b/SrcMod/Shell/LoadingBar.cs @@ -0,0 +1,79 @@ +namespace SrcMod.Shell; + +internal static class LoadingBar +{ + public static int position = -1; + public static int bufferSize = 0; + public static int lastValue = -1; + public static float value = 0; + public static ConsoleColor color = Console.ForegroundColor; + + public static bool Enabled { get; private set; } + + public static void End(bool clear = true) + { + if (position == -1) throw new("No loading bar is active."); + + if (clear) + { + Int2 oldPos = (Console.CursorLeft, Console.CursorTop); + + Console.CursorLeft = 0; + Console.CursorTop = position; + Console.Write(new string(' ', Console.BufferWidth)); + Console.CursorLeft = 0; + + Console.SetCursorPosition(oldPos.x, oldPos.y); + } + position = -1; + Enabled = false; + } + public static void Set(float value, ConsoleColor? color = null) + { + const string left = " --- [", + right = "] --- "; + int barSize = Console.BufferWidth - left.Length - right.Length, + filled = (int)(barSize * value); + + if (filled == lastValue) return; + lastValue = filled; + + Int2 oldPos = (Console.CursorLeft, Console.CursorTop); + + LoadingBar.value = value; + LoadingBar.color = color ?? Console.ForegroundColor; + + // Erase last bar. + Console.SetCursorPosition(0, position); + Console.Write(new string(' ', bufferSize)); + Console.CursorLeft = 0; + + // Add new bar. + bufferSize = Console.BufferWidth; + + Write(left, newLine: false); + ConsoleColor oldFore = Console.ForegroundColor; + + if (color is not null) Console.ForegroundColor = color.Value; + Write(new string('=', filled), newLine: false); + if (color is not null) Console.ForegroundColor = oldFore; + Write(new string(' ', barSize - filled), newLine: false); + Write(right, newLine: false); + + if (oldPos.y == Console.CursorTop) oldPos.y++; + while (oldPos.y >= Console.BufferHeight) + { + Console.WriteLine(); + oldPos.y--; + position--; + } + Console.SetCursorPosition(oldPos.x, oldPos.y); + } + public static void Start(float value = 0, int? position = null, ConsoleColor? color = null) + { + if (LoadingBar.position != -1) throw new("The loading bar has already been enabled."); + LoadingBar.position = position ?? Console.CursorTop; + Enabled = true; + Set(value, color); + } +} diff --git a/SrcMod/Shell/Modules/BaseModule.cs b/SrcMod/Shell/Modules/BaseModule.cs index 0436cb5..eae1fd6 100644 --- a/SrcMod/Shell/Modules/BaseModule.cs +++ b/SrcMod/Shell/Modules/BaseModule.cs @@ -45,7 +45,7 @@ public static class BaseModule Write($"Copying directory \"{source}\" to \"{destination}\"..."); - LoadingBarStart(); + LoadingBar.Start(); for (int i = 0; i < files.Length; i++) { string file = files[i], @@ -53,7 +53,7 @@ public static class BaseModule destFile = Path.Combine(destination, file); Directory.CreateDirectory(Path.GetDirectoryName(destFile)!); File.Copy(sourceFile, destFile); - LoadingBarSet((i + 1) / (float)files.Length, ConsoleColor.DarkGreen); + LoadingBar.Set((i + 1) / (float)files.Length, ConsoleColor.DarkGreen); Console.CursorLeft = 0; string message = $"{sourceFile}"; int remainder = Console.BufferWidth - message.Length; @@ -63,7 +63,7 @@ public static class BaseModule Write(message, newLine: false); } - LoadingBarEnd(); + LoadingBar.End(); Console.CursorLeft = 0; Write(new string(' ', Console.BufferWidth), newLine: false); @@ -361,13 +361,13 @@ public static class BaseModule Thread.Sleep(rand.Next(500, 1000)); - LoadingBarStart(); + LoadingBar.Start(); for (int i = 0; i < files.Length; i++) { FileInfo file = new(files[i]); Thread.Sleep((int)(rand.Next(50, 100) * (file.Length >> 20))); - LoadingBarSet((i + 1) / (float)files.Length, ConsoleColor.Red); + LoadingBar.Set((i + 1) / (float)files.Length, ConsoleColor.Red); Console.CursorLeft = 0; string message = $"{files[i]}"; int remainder = Console.BufferWidth - message.Length; @@ -377,7 +377,7 @@ public static class BaseModule Write(message, newLine: false); } - LoadingBarEnd(); + LoadingBar.End(); Console.CursorLeft = 0; Write(new string(' ', Console.BufferWidth), newLine: false); diff --git a/SrcMod/Shell/Modules/CompressionModule.cs b/SrcMod/Shell/Modules/CompressionModule.cs index 43d5804..128dcf9 100644 --- a/SrcMod/Shell/Modules/CompressionModule.cs +++ b/SrcMod/Shell/Modules/CompressionModule.cs @@ -168,7 +168,7 @@ public static class CompressionModule int failed = 0; - LoadingBarStart(); + LoadingBar.Start(); for (int i = 0; i < files.Count; i++) { bool failedThisTime = false; @@ -181,7 +181,7 @@ public static class CompressionModule failedThisTime = true; failed++; } - LoadingBarSet((i + 1) / (float)files.Count, failedThisTime ? ConsoleColor.Red : ConsoleColor.DarkGreen); ; + LoadingBar.Set((i + 1) / (float)files.Count, failedThisTime ? ConsoleColor.Red : ConsoleColor.DarkGreen); ; Console.CursorLeft = 0; string message = $"{relative[i]}"; int remainder = Console.BufferWidth - message.Length; @@ -194,7 +194,7 @@ public static class CompressionModule archive.Dispose(); writer.Dispose(); - LoadingBarEnd(); + LoadingBar.End(); Console.CursorLeft = 0; Write(new string(' ', Console.BufferWidth), newLine: false); diff --git a/SrcMod/Shell/Shell.cs b/SrcMod/Shell/Shell.cs index 08de616..58cd52e 100644 --- a/SrcMod/Shell/Shell.cs +++ b/SrcMod/Shell/Shell.cs @@ -247,12 +247,12 @@ public class Shell catch (TargetInvocationException ex) { Write($"[ERROR] {ex.InnerException!.Message}", ConsoleColor.Red); - if (LoadingBarEnabled) LoadingBarEnd(); + if (LoadingBar.Enabled) LoadingBar.End(); } catch (Exception ex) { Write($"[ERROR] {ex.Message}", ConsoleColor.Red); - if (LoadingBarEnabled) LoadingBarEnd(); + if (LoadingBar.Enabled) LoadingBar.End(); } #endif } diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 3fea015..ef6cc12 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -2,16 +2,8 @@ namespace SrcMod.Shell; -public static class Tools +internal static class Tools { - private static int loadingPosition = -1; - private static int lastLoadingBufferSize = 0; - private static int lastLoadingValue = -1; - private static float loadingBarValue = 0; - private static ConsoleColor loadingBarColor = Console.ForegroundColor; - - public static bool LoadingBarEnabled { get; private set; } - public static void DisplayWithPages(IEnumerable lines, ConsoleColor? color = null) { int written = 0; @@ -73,73 +65,6 @@ public static class Tools return allFiles; } - public static void LoadingBarEnd(bool clear = true) - { - if (loadingPosition == -1) throw new("No loading bar is active."); - - if (clear) - { - Int2 oldPos = (Console.CursorLeft, Console.CursorTop); - - Console.CursorLeft = 0; - Console.CursorTop = loadingPosition; - Console.Write(new string(' ', Console.BufferWidth)); - Console.CursorLeft = 0; - - Console.SetCursorPosition(oldPos.x, oldPos.y); - } - loadingPosition = -1; - LoadingBarEnabled = false; - } - public static void LoadingBarSet(float value, ConsoleColor? color = null) - { - const string left = " --- [", - right = "] --- "; - int barSize = Console.BufferWidth - left.Length - right.Length, - filled = (int)(barSize * value); - - if (filled == lastLoadingValue) return; - lastLoadingValue = filled; - - Int2 oldPos = (Console.CursorLeft, Console.CursorTop); - - loadingBarValue = value; - loadingBarColor = color ?? Console.ForegroundColor; - - // Erase last bar. - Console.SetCursorPosition(0, loadingPosition); - Console.Write(new string(' ', lastLoadingBufferSize)); - Console.CursorLeft = 0; - - // Add new bar. - lastLoadingBufferSize = Console.BufferWidth; - - Write(left, newLine: false); - ConsoleColor oldFore = Console.ForegroundColor; - - if (color is not null) Console.ForegroundColor = color.Value; - Write(new string('=', filled), newLine: false); - if (color is not null) Console.ForegroundColor = oldFore; - Write(new string(' ', barSize - filled), newLine: false); - Write(right, newLine: false); - - if (oldPos.y == Console.CursorTop) oldPos.y++; - while (oldPos.y >= Console.BufferHeight) - { - Console.WriteLine(); - oldPos.y--; - loadingPosition--; - } - Console.SetCursorPosition(oldPos.x, oldPos.y); - } - public static void LoadingBarStart(float value = 0, int? position = null, ConsoleColor? color = null) - { - if (loadingPosition != -1) throw new("The loading bar has already been enabled."); - loadingPosition = position ?? Console.CursorTop; - LoadingBarEnabled = true; - LoadingBarSet(value, color); - } - public static void Write(object? message, ConsoleColor? col = null, bool newLine = true) { ConsoleColor prevCol = Console.ForegroundColor; @@ -150,10 +75,10 @@ public static class Tools Console.ForegroundColor = prevCol; - if (newLine && LoadingBarEnabled && Console.CursorTop >= Console.BufferHeight - 1) + if (newLine && LoadingBar.Enabled && Console.CursorTop >= Console.BufferHeight - 1) { - loadingPosition--; - LoadingBarSet(loadingBarValue, loadingBarColor); + LoadingBar.position--; + LoadingBar.Set(LoadingBar.value, LoadingBar.color); } }