diff --git a/QuickLook/App.xaml b/QuickLook/App.xaml index a0ff839..1ed865e 100644 --- a/QuickLook/App.xaml +++ b/QuickLook/App.xaml @@ -1,14 +1,20 @@ - - + + + + + ./Fonts/#Segoe MDL2 Assets diff --git a/QuickLook/App.xaml.cs b/QuickLook/App.xaml.cs index d46ea04..fb1acfe 100644 --- a/QuickLook/App.xaml.cs +++ b/QuickLook/App.xaml.cs @@ -1,4 +1,4 @@ -// Copyright © 2017 Paddy Xu +// Copyright © 2017 Paddy Xu // // This file is part of QuickLook program. // @@ -24,6 +24,7 @@ using System.Threading.Tasks; using System.Windows; using QuickLook.Common.Helpers; using QuickLook.Helpers; +using Wpf.Ui.Violeta.Appearance; namespace QuickLook { @@ -50,9 +51,16 @@ namespace QuickLook { AppDomain.CurrentDomain.UnhandledException += (sender, args) => { - ProcessHelper.WriteLog(((Exception) args.ExceptionObject).ToString()); + ProcessHelper.WriteLog(((Exception)args.ExceptionObject).ToString()); }; + bool modernMessageBox = SettingHelper.Get("ModernMessageBox", true, "QuickLook"); + // Initialize MessageBox patching + if (modernMessageBox) MessageBoxPatcher.Initialize(); + + // Set initial theme based on system settings + ThemeManager.Apply(ThemeManager.GetSystemTheme()); + base.OnStartup(e); } diff --git a/QuickLook/Helpers/MessageBoxPatcher.cs b/QuickLook/Helpers/MessageBoxPatcher.cs new file mode 100644 index 0000000..690f737 --- /dev/null +++ b/QuickLook/Helpers/MessageBoxPatcher.cs @@ -0,0 +1,122 @@ +using System; +using System.Diagnostics; +using System.Windows; +using HarmonyLib; +using WindowsMessageBox = System.Windows.MessageBox; +using VioletaMessageBox = Wpf.Ui.Violeta.Controls.MessageBox; + +namespace QuickLook.Helpers +{ + /// + /// Provides a helper class for patching MessageBox.Show method calls. + /// + public static class MessageBoxPatcher + { + private static readonly Harmony Harmony = new("com.quicklook.messagebox.patch"); + private static readonly Type OriginalType = typeof(WindowsMessageBox); + + /// + /// Defines all MessageBox.Show method overloads to be patched: + /// 1. Show(string messageBoxText) + /// 2. Show(string messageBoxText, string caption) + /// 3. Show(string messageBoxText, string caption, MessageBoxButton button) + /// 4. Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) + /// 5. Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) + /// + private static readonly (string Name, Type[] Parameters)[] ShowMethods = + { + ("Show", [typeof(string)]), + ("Show", [typeof(string), typeof(string)]), + ("Show", [typeof(string), typeof(string), typeof(MessageBoxButton)]), + ("Show", [typeof(string), typeof(string), typeof(MessageBoxButton), typeof(MessageBoxImage)]), + ("Show", [typeof(Window), typeof(string), typeof(string), typeof(MessageBoxButton), typeof(MessageBoxImage)]) + }; + + /// + /// Initializes the MessageBox patch by applying Harmony patches to the MessageBox.Show method overloads. + /// + public static void Initialize() + { + try + { + // Iterate over each MessageBox.Show method overload and apply the patch + foreach (var (name, parameters) in ShowMethods) + { + var method = OriginalType.GetMethod(name, parameters); + if (method != null) + { + Harmony.Patch(method, new HarmonyMethod(typeof(MessageBoxPatches), nameof(MessageBoxPatches.Prefix))); + } + } + } + catch (Exception ex) + { + // Log any errors that occur during patch initialization + Debug.WriteLine($"Failed to patch MessageBox: {ex}"); + } + } + } + + /// + /// Provides a patch for the MessageBox.Show method overloads. + /// + public static class MessageBoxPatches + { + /// + /// Prefix patch for the MessageBox.Show method overloads. + /// + /// The result of the MessageBox.Show method call. + /// The arguments passed to the MessageBox.Show method call. + /// True to skip the original method call, false to run the original method call. + public static bool Prefix(ref MessageBoxResult __result, object[] __args) + { + try + { + // Map each Windows MessageBox.Show overload to its Violeta equivalent + __result = __args.Length switch + { + // Show(string messageBoxText) + 1 => VioletaMessageBox.Show( + (string)__args[0]), + + // Show(string messageBoxText, string caption) + 2 => VioletaMessageBox.Show( + (string)__args[0], + (string)__args[1]), + + // Show(string messageBoxText, string caption, MessageBoxButton button) + 3 => VioletaMessageBox.Show( + (string)__args[0], + (string)__args[1], + (MessageBoxButton)__args[2]), + + // Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) + 4 => VioletaMessageBox.Show( + (string)__args[0], + (string)__args[1], + (MessageBoxButton)__args[2], + (MessageBoxImage)__args[3]), + + // Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon) + 5 => VioletaMessageBox.Show( + (string)__args[1], // Skip Window parameter + (string)__args[2], + (MessageBoxButton)__args[3], + (MessageBoxImage)__args[4]), + + _ => throw new ArgumentException($"Unexpected number of arguments: {__args.Length}") + }; + + // Skip the original method call + return false; + } + catch (Exception ex) + { + // Log any errors that occur during patch execution + Debug.WriteLine($"Error in MessageBox patch: {ex}"); + // Run the original method call on error + return true; + } + } + } +} diff --git a/QuickLook/QuickLook.csproj b/QuickLook/QuickLook.csproj index 080cb32..af1e6df 100644 --- a/QuickLook/QuickLook.csproj +++ b/QuickLook/QuickLook.csproj @@ -1,4 +1,4 @@ - + WinExe @@ -96,6 +96,8 @@ + +