Added MessageBoxAlertAdmin
This commit is contained in:
parent
82d8d954ef
commit
1578be2520
@ -102,7 +102,7 @@ namespace LibationWinForms.AvaloniaUI
|
||||
|
||||
if (Design.IsDesignMode)
|
||||
return;
|
||||
#if WINDOWS7_0
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
var handle = form.PlatformImpl.Handle.Handle;
|
||||
var currentStyle = GetWindowLong(handle, GWL_STYLE);
|
||||
|
||||
@ -110,7 +110,7 @@ namespace LibationWinForms.AvaloniaUI
|
||||
#endif
|
||||
}
|
||||
|
||||
#if WINDOWS7_0
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
const long WS_MINIMIZEBOX = 0x00020000L;
|
||||
const long WS_MAXIMIZEBOX = 0x10000L;
|
||||
const int GWL_STYLE = -16;
|
||||
|
||||
@ -224,6 +224,31 @@ namespace LibationWinForms.AvaloniaUI
|
||||
defaultButton);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs error. Displays a message box dialog with specified text and caption.
|
||||
/// </summary>
|
||||
/// <param name="synchronizeInvoke">Form calling this method.</param>
|
||||
/// <param name="text">The text to display in the message box.</param>
|
||||
/// <param name="caption">The text to display in the title bar of the message box.</param>
|
||||
/// <param name="exception">Exception to log.</param>
|
||||
public static async Task ShowAdminAlert(Window owner, string text, string caption, Exception exception)
|
||||
{
|
||||
// for development and debugging, show me what broke!
|
||||
if (System.Diagnostics.Debugger.IsAttached)
|
||||
throw exception;
|
||||
|
||||
try
|
||||
{
|
||||
Serilog.Log.Logger.Error(exception, "Alert admin error: {@DebugText}", new { text, caption });
|
||||
}
|
||||
catch { }
|
||||
|
||||
var form = new MessageBoxAlertAdminDialog(text, caption, exception);
|
||||
|
||||
await DisplayWindow(form, owner);
|
||||
}
|
||||
|
||||
|
||||
private static async Task<DialogResult> ShowCore(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
|
||||
{
|
||||
if (Avalonia.Threading.Dispatcher.UIThread.CheckAccess())
|
||||
@ -264,11 +289,15 @@ namespace LibationWinForms.AvaloniaUI
|
||||
dialog.Height = dialog.MinHeight;
|
||||
dialog.Width = dialog.MinWidth;
|
||||
|
||||
return await DisplayWindow(dialog, owner);
|
||||
}
|
||||
private static async Task<DialogResult> DisplayWindow(Window toDisplay, Window owner)
|
||||
{
|
||||
if (owner is null)
|
||||
{
|
||||
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
{
|
||||
return await dialog.ShowDialog<DialogResult>(desktop.MainWindow);
|
||||
return await toDisplay.ShowDialog<DialogResult>(desktop.MainWindow);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -282,7 +311,7 @@ namespace LibationWinForms.AvaloniaUI
|
||||
};
|
||||
|
||||
window.Show();
|
||||
var result = await dialog.ShowDialog<DialogResult>(window);
|
||||
var result = await toDisplay.ShowDialog<DialogResult>(window);
|
||||
window.Close();
|
||||
return result;
|
||||
}
|
||||
@ -290,7 +319,7 @@ namespace LibationWinForms.AvaloniaUI
|
||||
}
|
||||
else
|
||||
{
|
||||
return await dialog.ShowDialog<DialogResult>(owner);
|
||||
return await toDisplay.ShowDialog<DialogResult>(owner);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -316,7 +316,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(
|
||||
await MessageBox.ShowAdminAlert(
|
||||
null,
|
||||
"Error scanning library. You may still manually select books to remove from Libation's library.",
|
||||
"Error scanning library",
|
||||
|
||||
@ -101,8 +101,8 @@ namespace LibationWinForms.AvaloniaUI.Views.Dialogs
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(
|
||||
null,
|
||||
await MessageBox.ShowAdminAlert(
|
||||
this,
|
||||
$"An error occurred while importing an account from:\r\n{filePath[0]}\r\n\r\nIs the file encrypted?",
|
||||
"Error Importing Account",
|
||||
ex);
|
||||
@ -149,7 +149,7 @@ namespace LibationWinForms.AvaloniaUI.Views.Dialogs
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(null, "Error attempting to save accounts", "Error saving accounts", ex);
|
||||
await MessageBox.ShowAdminAlert(this, "Error attempting to save accounts", "Error saving accounts", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -259,8 +259,8 @@ namespace LibationWinForms.AvaloniaUI.Views.Dialogs
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(
|
||||
null,
|
||||
await MessageBox.ShowAdminAlert(
|
||||
this,
|
||||
$"An error occurred while exporting account:\r\n{account.AccountName}",
|
||||
"Error Exporting Account",
|
||||
ex);
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="450"
|
||||
MinWidth="600" MinHeight="450"
|
||||
MaxWidth="600" MaxHeight="450"
|
||||
x:Class="LibationWinForms.AvaloniaUI.Views.Dialogs.MessageBoxAlertAdminDialog"
|
||||
Title="MessageBoxAlertAdminDialog"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
Icon="/AvaloniaUI/Assets/libation.ico">
|
||||
|
||||
<Grid RowDefinitions="Auto,*,Auto,Auto">
|
||||
|
||||
<Grid
|
||||
Grid.Column="0"
|
||||
Margin="10,10,10,0"
|
||||
ColumnDefinitions="Auto,*">
|
||||
|
||||
<Image Grid.Column="0" Width="64" Height="64" Source="/AvaloniaUI/Assets/MBIcons/error.png" />
|
||||
<TextBlock
|
||||
Grid.Column="1"
|
||||
Margin="10"
|
||||
TextWrapping="Wrap"
|
||||
Text="{Binding ErrorDescription}" />
|
||||
</Grid>
|
||||
|
||||
<TextBox
|
||||
Grid.Row="1"
|
||||
Margin="10,10,10,0"
|
||||
IsReadOnly="True"
|
||||
Text="{Binding ExceptionMessage}" />
|
||||
|
||||
<Grid
|
||||
Grid.Row="2"
|
||||
Margin="10,10,10,0"
|
||||
ColumnDefinitions="Auto,*">
|
||||
|
||||
<TextBlock
|
||||
Grid.Column="0"
|
||||
Text="If you'd like to report this error to an advinistrator:

Step 1: Go to Libation's "issues" page on github
Step 2: Find your log files
Setp 3: Click "New issue" button
Step 4: Drag/drop your log files" />
|
||||
|
||||
<StackPanel
|
||||
Margin="50,0,0,0"
|
||||
Grid.Column="1"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Vertical">
|
||||
|
||||
<StackPanel.Styles>
|
||||
<Style Selector="TextBlock">
|
||||
<Setter Property="Foreground" Value="Blue"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="TextDecorations" Value="Underline"/>
|
||||
</Style>
|
||||
</StackPanel.Styles>
|
||||
|
||||
<TextBlock
|
||||
Margin="10"
|
||||
Tapped="GoToGithub_Tapped"
|
||||
Text="Click to go to github" />
|
||||
|
||||
<TextBlock
|
||||
Margin="10"
|
||||
Tapped="GoToLogs_Tapped"
|
||||
Text="Click to open log files folder" />
|
||||
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<Button
|
||||
Grid.Row="3"
|
||||
Height="30"
|
||||
HorizontalAlignment="Center"
|
||||
Margin="10,10,10,10"
|
||||
Padding="30,3,30,3"
|
||||
Name="OkButton"
|
||||
Content="Ok"
|
||||
Click="OkButton_Clicked" />
|
||||
</Grid>
|
||||
</Window>
|
||||
@ -0,0 +1,74 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Dinah.Core;
|
||||
using FileManager;
|
||||
using System;
|
||||
|
||||
namespace LibationWinForms.AvaloniaUI.Views.Dialogs
|
||||
{
|
||||
public partial class MessageBoxAlertAdminDialog : DialogWindow
|
||||
{
|
||||
public string ErrorDescription { get; set; } = "[Error message]\n[Error message]\n[Error message]";
|
||||
public string ExceptionMessage { get; set; } = "EXCEPTION MESSAGE!";
|
||||
|
||||
public MessageBoxAlertAdminDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
ControlToFocusOnShow = this.FindControl<Button>(nameof(OkButton));
|
||||
|
||||
if (Design.IsDesignMode)
|
||||
DataContext = this;
|
||||
}
|
||||
|
||||
public MessageBoxAlertAdminDialog(string text, string caption, Exception exception) : this()
|
||||
{
|
||||
ErrorDescription = text;
|
||||
this.Title = caption;
|
||||
ExceptionMessage = $"{exception.Message}\r\n\r\n{exception.StackTrace}";
|
||||
DataContext = this;
|
||||
}
|
||||
|
||||
private async void GoToGithub_Tapped(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
var url = "https://github.com/rmcrackan/Libation/issues";
|
||||
try
|
||||
{
|
||||
Go.To.Url(url);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await MessageBox.Show($"Error opening url\r\n{url}", "Error opening url", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private async void GoToLogs_Tapped(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
LongPath dir = "";
|
||||
try
|
||||
{
|
||||
dir = LibationFileManager.Configuration.Instance.LibationFiles;
|
||||
}
|
||||
catch { }
|
||||
|
||||
try
|
||||
{
|
||||
Go.To.Folder(dir.ShortPathName);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await MessageBox.Show($"Error opening folder\r\n{dir}", "Error opening folder", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public void OkButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
SaveAndClose();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -41,7 +41,7 @@ namespace LibationWinForms.AvaloniaUI.Views
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(null, "Error attempting to export your library.", "Error exporting", ex);
|
||||
await MessageBox.ShowAdminAlert(this, "Error attempting to export your library.", "Error exporting", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -71,8 +71,8 @@ namespace LibationWinForms.AvaloniaUI.Views
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(
|
||||
null,
|
||||
await MessageBox.ShowAdminAlert(
|
||||
this,
|
||||
"Error importing library. Please try again. If this still happens after 2 or 3 tries, stop and contact administrator",
|
||||
"Error importing library",
|
||||
ex);
|
||||
|
||||
@ -26,6 +26,9 @@ namespace LibationWinForms
|
||||
|
||||
if (config is null) return;
|
||||
|
||||
|
||||
var bmp = System.Drawing.SystemIcons.Error.ToBitmap();
|
||||
|
||||
/*
|
||||
Results below compare startup times when parallelizing startup tasks vs when
|
||||
running everything sequentially, from the entry point until after the call to
|
||||
@ -174,7 +177,9 @@ namespace LibationWinForms
|
||||
AppScaffolding.LibationScaffolding.RunPostMigrationScaffolding(config);
|
||||
|
||||
// global exception handling (ShowAdminAlert) attempts to use logging. only call it after logging has been init'd
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
postLoggingGlobalExceptionHandling();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -190,6 +195,7 @@ namespace LibationWinForms
|
||||
{
|
||||
var title = "Fatal error, pre-logging";
|
||||
var body = "An unrecoverable error occurred. Since this error happened before logging could be initialized, this error can not be written to the log file.";
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
try
|
||||
{
|
||||
MessageBoxLib.ShowAdminAlert(null, body, title, ex);
|
||||
@ -198,6 +204,7 @@ namespace LibationWinForms
|
||||
{
|
||||
MessageBox.Show($"{body}\r\n\r\n{ex.Message}\r\n\r\n{ex.StackTrace}", title, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private static void RunInstaller(Configuration config)
|
||||
@ -300,13 +307,17 @@ namespace LibationWinForms
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
MessageBoxLib.ShowAdminAlert(null, "Error checking for update", "Error checking for update", ex);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
if (upgradeProperties.ZipUrl is null)
|
||||
{
|
||||
#if WINDOWS7_0_OR_GREATER
|
||||
MessageBox.Show(upgradeProperties.HtmlUrl, "New version available");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user