diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index 3201b953..9c89e841 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -16,6 +16,8 @@ using Dinah.Core; using LibationAvalonia.Themes; using Avalonia.Data.Core.Plugins; using System.Linq; +using LibationUiBase.Forms; +using Avalonia.Controls; #nullable enable namespace LibationAvalonia @@ -42,6 +44,9 @@ namespace LibationAvalonia if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { + MessageBoxBase.ShowAsyncImpl = (owner, message, caption, buttons, icon, defaultButton, saveAndRestorePosition) => + MessageBox.Show(owner as Window, message, caption, buttons, icon, defaultButton, saveAndRestorePosition); + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins DisableAvaloniaDataAnnotationValidation(); diff --git a/Source/LibationAvalonia/AvaloniaUtils.cs b/Source/LibationAvalonia/AvaloniaUtils.cs index 11508b70..4bfc1aa7 100644 --- a/Source/LibationAvalonia/AvaloniaUtils.cs +++ b/Source/LibationAvalonia/AvaloniaUtils.cs @@ -4,6 +4,7 @@ using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Media.Imaging; using Avalonia.VisualTree; using LibationFileManager; +using LibationUiBase.Forms; using System.Threading.Tasks; #nullable enable diff --git a/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs index 8cb6af48..a7f1d601 100644 --- a/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs +++ b/Source/LibationAvalonia/Controls/Settings/Audio.axaml.cs @@ -4,6 +4,7 @@ using LibationAvalonia.Dialogs; using LibationAvalonia.ViewModels.Settings; using LibationFileManager; using LibationFileManager.Templates; +using LibationUiBase.Forms; using System.Linq; using System.Threading.Tasks; diff --git a/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs index 0a55b0e4..2be2bb5b 100644 --- a/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs +++ b/Source/LibationAvalonia/Controls/Settings/DownloadDecrypt.axaml.cs @@ -3,6 +3,7 @@ using LibationAvalonia.Dialogs; using LibationAvalonia.ViewModels.Settings; using LibationFileManager; using LibationFileManager.Templates; +using LibationUiBase.Forms; using System.Threading.Tasks; namespace LibationAvalonia.Controls.Settings diff --git a/Source/LibationAvalonia/Dialogs/AboutDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/AboutDialog.axaml.cs index cbb6de11..80f87d1b 100644 --- a/Source/LibationAvalonia/Dialogs/AboutDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/AboutDialog.axaml.cs @@ -3,6 +3,7 @@ using LibationAvalonia.Controls; using LibationAvalonia.ViewModels; using LibationFileManager; using LibationUiBase; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Collections.Generic; diff --git a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs index fe74cea9..bb8b3168 100644 --- a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs @@ -3,6 +3,7 @@ using AudibleUtilities; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Platform.Storage; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Collections.Generic; diff --git a/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs index bb04161e..d3860579 100644 --- a/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs @@ -7,6 +7,7 @@ using Avalonia.Platform.Storage; using Avalonia.Threading; using DataLayer; using FileLiberator; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Collections.Generic; diff --git a/Source/LibationAvalonia/Dialogs/DialogWindow.cs b/Source/LibationAvalonia/Dialogs/DialogWindow.cs index bda5e804..016bbd3a 100644 --- a/Source/LibationAvalonia/Dialogs/DialogWindow.cs +++ b/Source/LibationAvalonia/Dialogs/DialogWindow.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Styling; using LibationFileManager; +using LibationUiBase.Forms; using System; using System.Threading.Tasks; diff --git a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs index b7224ae3..2e2c447f 100644 --- a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs @@ -6,6 +6,7 @@ using Avalonia.Styling; using Dinah.Core; using LibationFileManager; using LibationFileManager.Templates; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.IO; diff --git a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs index 051d78e1..86b9933a 100644 --- a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs @@ -1,5 +1,6 @@ using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.ComponentModel; diff --git a/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs index a20a588a..73c8011a 100644 --- a/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs @@ -1,4 +1,5 @@ using LibationFileManager; +using LibationUiBase.Forms; using System.Collections.Generic; namespace LibationAvalonia.Dialogs diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs index e5234d7c..bf4f8b56 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs @@ -1,5 +1,6 @@ using AudibleApi; using AudibleUtilities; +using LibationUiBase.Forms; using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs index b8122f9d..d2872e3f 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs @@ -1,6 +1,7 @@ using AudibleApi; using AudibleUtilities; using LibationFileManager; +using LibationUiBase.Forms; using System; using System.Threading.Tasks; diff --git a/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs index 9cbf1363..90e348dc 100644 --- a/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs @@ -1,6 +1,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Data; +using LibationUiBase.Forms; using ReactiveUI; using System.Collections.Generic; using System.Linq; diff --git a/Source/LibationAvalonia/Dialogs/Login/WebLoginDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/WebLoginDialog.axaml.cs index d6c1c644..b2df7078 100644 --- a/Source/LibationAvalonia/Dialogs/Login/WebLoginDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/WebLoginDialog.axaml.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; using Dinah.Core; +using LibationUiBase.Forms; using System; namespace LibationAvalonia.Dialogs.Login diff --git a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs index 85d04f5c..ddcfecf6 100644 --- a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs @@ -1,6 +1,7 @@ using Avalonia.Controls; using Dinah.Core; using FileManager; +using LibationUiBase.Forms; using System; namespace LibationAvalonia.Dialogs diff --git a/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs b/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs index c1cbb009..1633112f 100644 --- a/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs @@ -1,4 +1,5 @@ using LibationAvalonia.ViewModels.Dialogs; +using LibationUiBase.Forms; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs index 912f2c0d..cdd22318 100644 --- a/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs @@ -1,6 +1,6 @@ using AudibleUtilities; using Avalonia.Controls; -using Avalonia.Interactivity; +using LibationUiBase.Forms; using System.Collections; using System.Collections.Generic; using System.Linq; diff --git a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs index ba1839b9..5155973e 100644 --- a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs @@ -1,6 +1,7 @@ using Avalonia.Controls; using LibationAvalonia.ViewModels.Settings; using LibationFileManager; +using LibationUiBase.Forms; using System.Threading.Tasks; namespace LibationAvalonia.Dialogs diff --git a/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs index bc73eaed..9745b9b0 100644 --- a/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; using LibationFileManager; +using LibationUiBase.Forms; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/ThemePickerDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ThemePickerDialog.axaml.cs index 618f5a44..e3a2d9e3 100644 --- a/Source/LibationAvalonia/Dialogs/ThemePickerDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ThemePickerDialog.axaml.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Collections.Generic; using System.Linq; using Avalonia.Platform.Storage; +using LibationUiBase.Forms; #nullable enable namespace LibationAvalonia.Dialogs; diff --git a/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs index cb298132..712b4ff5 100644 --- a/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs @@ -1,6 +1,7 @@ using AppScaffolding; using Avalonia.Controls; using Dinah.Core; +using LibationUiBase.Forms; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/MessageBox.cs b/Source/LibationAvalonia/MessageBox.cs index 0142bc41..7519606d 100644 --- a/Source/LibationAvalonia/MessageBox.cs +++ b/Source/LibationAvalonia/MessageBox.cs @@ -6,6 +6,7 @@ using DataLayer; using Dinah.Core.Logging; using LibationAvalonia.Dialogs; using LibationAvalonia.ViewModels.Dialogs; +using LibationUiBase.Forms; using System; using System.Collections.Generic; using System.Linq; @@ -13,54 +14,9 @@ using System.Threading.Tasks; namespace LibationAvalonia { - public enum DialogResult - { - None = 0, - OK = 1, - Cancel = 2, - Abort = 3, - Retry = 4, - Ignore = 5, - Yes = 6, - No = 7, - TryAgain = 10, - Continue = 11 - } - - public enum MessageBoxIcon - { - None = 0, - Error = 16, - Hand = 16, - Stop = 16, - Question = 32, - Exclamation = 48, - Warning = 48, - Asterisk = 64, - Information = 64 - } - - public enum MessageBoxButtons - { - OK, - OKCancel, - AbortRetryIgnore, - YesNoCancel, - YesNo, - RetryCancel, - CancelTryContinue - } - - public enum MessageBoxDefaultButton - { - Button1, - Button2 = 256, - Button3 = 512, - } public class MessageBox { - public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) => ShowCoreAsync(null, text, caption, buttons, icon, defaultButton); public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, bool saveAndRestorePosition = true) @@ -71,8 +27,8 @@ namespace LibationAvalonia => ShowCoreAsync(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); public static Task Show(string text) => ShowCoreAsync(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); - public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) - => ShowCoreAsync(owner, text, caption, buttons, icon, defaultButton); + public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true) + => ShowCoreAsync(owner, text, caption, buttons, icon, defaultButton, saveAndRestorePosition); public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) => ShowCoreAsync(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); diff --git a/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs b/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs index 4bef5275..ecf4bc90 100644 --- a/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs @@ -1,4 +1,5 @@ -using System; +using LibationUiBase.Forms; +using System; namespace LibationAvalonia.ViewModels.Dialogs { diff --git a/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs b/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs index b355788d..4f8ac7d2 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.Filters.cs @@ -4,6 +4,7 @@ using Avalonia.Controls; using Avalonia.Data; using Avalonia.Input; using LibationFileManager; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Linq; diff --git a/Source/LibationAvalonia/ViewModels/MainVM.Import.cs b/Source/LibationAvalonia/ViewModels/MainVM.Import.cs index 213a7cf4..952fb045 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.Import.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.Import.cs @@ -7,6 +7,7 @@ using System; using System.Linq; using System.Threading.Tasks; using Avalonia.Input; +using LibationUiBase.Forms; #nullable enable namespace LibationAvalonia.ViewModels diff --git a/Source/LibationAvalonia/ViewModels/MainVM.Liberate.cs b/Source/LibationAvalonia/ViewModels/MainVM.Liberate.cs index b69a8ef2..c5710980 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.Liberate.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.Liberate.cs @@ -4,6 +4,7 @@ using System; using System.Linq; using System.Threading.Tasks; using DataLayer; +using LibationUiBase.Forms; #nullable enable namespace LibationAvalonia.ViewModels diff --git a/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs b/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs index f9a2aeb7..75d59a18 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.VisibleBooks.cs @@ -5,6 +5,7 @@ using DataLayer; using Avalonia.Threading; using LibationAvalonia.Dialogs; using ReactiveUI; +using LibationUiBase.Forms; #nullable enable namespace LibationAvalonia.ViewModels diff --git a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs index 908ee707..8e750812 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs @@ -1,7 +1,6 @@ using ApplicationServices; using AudibleApi; using AudibleApi.Common; -using Avalonia.Media; using Avalonia.Media.Imaging; using Avalonia.Threading; using DataLayer; @@ -10,6 +9,7 @@ using Dinah.Core.ErrorHandling; using FileLiberator; using LibationFileManager; using LibationUiBase; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Collections.Generic; diff --git a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs index 29620384..ed5b6501 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs @@ -5,6 +5,7 @@ using Avalonia.Threading; using DataLayer; using LibationFileManager; using LibationUiBase; +using LibationUiBase.Forms; using ReactiveUI; using System; using System.Collections.Generic; diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs index 13e282f5..e7416e14 100644 --- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs @@ -5,8 +5,8 @@ using Avalonia.Controls; using Avalonia.Threading; using DataLayer; using Dinah.Core.Collections.Generic; -using LibationAvalonia.Dialogs.Login; using LibationFileManager; +using LibationUiBase.Forms; using LibationUiBase.GridView; using ReactiveUI; using System; diff --git a/Source/LibationAvalonia/Views/MainWindow.axaml.cs b/Source/LibationAvalonia/Views/MainWindow.axaml.cs index 22262c5a..7132e6f5 100644 --- a/Source/LibationAvalonia/Views/MainWindow.axaml.cs +++ b/Source/LibationAvalonia/Views/MainWindow.axaml.cs @@ -7,6 +7,7 @@ using FileManager; using LibationAvalonia.Dialogs; using LibationAvalonia.ViewModels; using LibationFileManager; +using LibationUiBase.Forms; using LibationUiBase.GridView; using ReactiveUI; using System; diff --git a/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs b/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs index d94adb16..7cc9b681 100644 --- a/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs +++ b/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs @@ -2,7 +2,6 @@ using ApplicationServices; using Avalonia; using Avalonia.Controls; using Avalonia.Input.Platform; -using Avalonia.Media; using Avalonia.Platform.Storage; using Avalonia.Styling; using DataLayer; @@ -13,6 +12,7 @@ using LibationAvalonia.Dialogs; using LibationAvalonia.ViewModels; using LibationFileManager; using LibationFileManager.Templates; +using LibationUiBase.Forms; using LibationUiBase.GridView; using ReactiveUI; using System; diff --git a/Source/LibationAvalonia/Walkthrough.cs b/Source/LibationAvalonia/Walkthrough.cs index 2c50a505..a170d139 100644 --- a/Source/LibationAvalonia/Walkthrough.cs +++ b/Source/LibationAvalonia/Walkthrough.cs @@ -9,6 +9,7 @@ using Dinah.Core.StepRunner; using LibationAvalonia.Dialogs; using LibationAvalonia.Views; using LibationFileManager; +using LibationUiBase.Forms; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; diff --git a/Source/LibationUiBase/MessageBoxBase.cs b/Source/LibationUiBase/MessageBoxBase.cs new file mode 100644 index 00000000..4ff8c24d --- /dev/null +++ b/Source/LibationUiBase/MessageBoxBase.cs @@ -0,0 +1,133 @@ +using MathNet.Numerics; +using System.IO; +using System.Threading.Tasks; + +#nullable enable +namespace LibationUiBase.Forms; + +public enum DialogResult +{ + /// Nothing is returned from the dialog box. This means that the modal dialog continues running. + None = 0, + /// The dialog box return value is OK (usually sent from a button labeled OK). + OK = 1, //IDOK + /// The dialog box return value is Cancel (usually sent from a button labeled Cancel). + Cancel = 2, //IDCANCEL + /// The dialog box return value is Abort (usually sent from a button labeled Abort). + Abort = 3, //IDABORT + /// The dialog box return value is Retry (usually sent from a button labeled Retry). + Retry = 4, //IDRETRY + /// The dialog box return value is Ignore (usually sent from a button labeled Ignore). + Ignore = 5, //IDIGNORE + /// The dialog box return value is Yes (usually sent from a button labeled Yes). + Yes = 6, //IDYES + /// The dialog box return value is No (usually sent from a button labeled No). + No = 7, //IDNO + /// The dialog box return value is Try Again (usually sent from a button labeled Try Again). + TryAgain = 10, //IDTRYAGAIN + /// The dialog box return value is Continue (usually sent from a button labeled Continue). + Continue = 11 //IDCONTINUE +} + +public enum MessageBoxIcon +{ + /// Specifies that the message box contain no symbols. + None = 0x00000000, + /// Specifies that the message box contains a hand symbol. + Hand = 0x00000010, //MB_ICONHAND + /// Specifies that the message box contains a question mark symbol. + Question = 0x00000020, //MB_ICONQUESTION + /// Specifies that the message box contains an exclamation symbol. + Exclamation = 0x00000030, //MB_ICONEXCLAMATION + /// Specifies that the message box contains an asterisk symbol. + Asterisk = 0x00000040, //MB_ICONASTERISK + /// Specifies that the message box contains a hand icon. This field is constant. + Stop = Hand, + /// Specifies that the message box contains a hand icon. + Error = Hand, + /// Specifies that the message box contains an exclamation icon. + Warning = Exclamation, + /// Specifies that the message box contains an asterisk icon. + Information = Asterisk +} + +public enum MessageBoxButtons +{ + /// Specifies that the message box contains an OK button. + OK = 0x00000000, //MB_OK + /// Specifies that the message box contains OK and Cancel buttons. + OKCancel = 0x00000001, //MB_OKCANCEL + /// Specifies that the message box contains Abort, Retry, and Ignore buttons. + AbortRetryIgnore = 0x00000002, //MB_ABORTRETRYIGNORE + /// Specifies that the message box contains Yes, No, and Cancel buttons. + YesNoCancel = 0x00000003, //MB_YESNOCANCEL + /// Specifies that the message box contains Yes and No buttons. + YesNo = 0x00000004, //MB_YESNO + /// Specifies that the message box contains Retry and Cancel buttons. + RetryCancel = 0x00000005, //MB_RETRYCANCEL + /// Specifies that the message box contains Cancel, Try Again, and Continue buttons. + CancelTryContinue = 0x00000006 //MB_CANCELTRYCONTINUE +} + +public enum MessageBoxDefaultButton +{ + /// Specifies that the first button on the message box should be the default button. + Button1 = 0x00000000, //MB_DEFBUTTON1 + /// Specifies that the second button on the message box should be the default button. + Button2 = 0x00000100, //MB_DEFBUTTON2 + /// Specifies that the third button on the message box should be the default button. + Button3 = 0x00000200, //MB_DEFBUTTON3 + /// Specifies that the Help button on the message box should be the default button. + Button4 = 0x00000300, //MB_DEFBUTTON4 +} + +/// +/// Displays a message box in front of the specified object and with the specified text, caption, buttons, icon, and default button. +/// +/// An implementation of a GUI window that will own the modal dialog box +/// The text to display in the message box +/// The text to display in the title bar of the message box +/// One of the values that specifies which buttons to disply in the message box +/// One of the values that specifies which icon to disply in the message box +/// One of the values that specifies the default button of the message box +/// A value indicating whether the message box's position should be saved and restored the next time it is shown +/// One of the values +public delegate Task ShowAsyncDelegate(object? owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true); + +public static class MessageBoxBase +{ + private static ShowAsyncDelegate? s_ShowAsyncImpl; + public static ShowAsyncDelegate ShowAsyncImpl + { + get => s_ShowAsyncImpl ?? DefaultShowAsyncImpl; + set => s_ShowAsyncImpl = value; + } + + private static Task DefaultShowAsyncImpl(object? owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true) + { + // default to a no-op impl + Serilog.Log.Logger.Error("MessageBoxBase implementation not set. {@DebugInfo}", new { owner, message, caption, buttons, icon, defaultButton }); + return Task.FromResult(DialogResult.None); + } + + public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true) + => ShowAsyncImpl(null, text, caption, buttons, icon, defaultButton); + public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, bool saveAndRestorePosition = true) + => ShowAsyncImpl(null, text, caption, buttons, icon, MessageBoxDefaultButton.Button1, saveAndRestorePosition); + public static Task Show(string text, string caption, MessageBoxButtons buttons) + => ShowAsyncImpl(null, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(string text, string caption) + => ShowAsyncImpl(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(string text) + => ShowAsyncImpl(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(object? owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) + => ShowAsyncImpl(owner, text, caption, buttons, icon, defaultButton); + public static Task Show(object? owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) + => ShowAsyncImpl(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); + public static Task Show(object? owner, string text, string caption, MessageBoxButtons buttons) + => ShowAsyncImpl(owner, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(object? owner, string text, string caption) + => ShowAsyncImpl(owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(object? owner, string text) + => ShowAsyncImpl(owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); +} \ No newline at end of file diff --git a/Source/LibationWinForms/Program.cs b/Source/LibationWinForms/Program.cs index 35aa0224..01af7fa9 100644 --- a/Source/LibationWinForms/Program.cs +++ b/Source/LibationWinForms/Program.cs @@ -22,6 +22,10 @@ namespace LibationWinForms static void Main() { Task> libraryLoadTask; + + LibationUiBase.Forms.MessageBoxBase.ShowAsyncImpl = (owner, message, caption, buttons, icon, defaultButton, saveAndRestorePosition) => + Task.FromResult((LibationUiBase.Forms.DialogResult)MessageBox.Show(owner as IWin32Window, message, caption, (MessageBoxButtons)buttons, (MessageBoxIcon)icon, (MessageBoxDefaultButton)defaultButton)); + try { //// Uncomment to see Console. Must be called before anything writes to Console.