diff --git a/.idea/.idea.GazpromApp/.idea/avalonia.xml b/.idea/.idea.GazpromApp/.idea/avalonia.xml index b3c12de..122bbc9 100644 --- a/.idea/.idea.GazpromApp/.idea/avalonia.xml +++ b/.idea/.idea.GazpromApp/.idea/avalonia.xml @@ -6,6 +6,7 @@ + diff --git a/Enums/ErrorSeverity.cs b/Enums/ErrorSeverity.cs new file mode 100644 index 0000000..83e2cbc --- /dev/null +++ b/Enums/ErrorSeverity.cs @@ -0,0 +1,8 @@ +namespace GazpromApp.Enums; + +public enum ErrorSeverity +{ + Message = 0, + Warning = 1, + Error = 2 +} diff --git a/Messages/ErrorMessage.cs b/Messages/ErrorMessage.cs new file mode 100644 index 0000000..edf699f --- /dev/null +++ b/Messages/ErrorMessage.cs @@ -0,0 +1,9 @@ +using CommunityToolkit.Mvvm.Messaging.Messages; +using GazpromApp.ViewModels; + +namespace GazpromApp.Messages; + +public class ErrorMessage(ErrorViewModel error) : AsyncRequestMessage +{ + public ErrorViewModel Error { get; } = error; +} \ No newline at end of file diff --git a/Models/Error.cs b/Models/Error.cs new file mode 100644 index 0000000..937a4cc --- /dev/null +++ b/Models/Error.cs @@ -0,0 +1,11 @@ +using GazpromApp.Enums; +using GazpromApp.ViewModels; + +namespace GazpromApp.Models; + +public class Error +{ + public string? Title { get; set; } + public string? Message { get; set; } + public ErrorSeverity Severity { get; set; } +} \ No newline at end of file diff --git a/ViewModels/Basic/ErrorViewModel.cs b/ViewModels/Basic/ErrorViewModel.cs new file mode 100644 index 0000000..2ea9be6 --- /dev/null +++ b/ViewModels/Basic/ErrorViewModel.cs @@ -0,0 +1,69 @@ +using Avalonia.Controls; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using GazpromApp.Enums; +using GazpromApp.Models; + +namespace GazpromApp.ViewModels; + +public partial class ErrorViewModel : ViewModelBase +{ + [ObservableProperty] + private string? _title; + + [ObservableProperty] + private string? _message; + + [RelayCommand] + private static void Ok(Window w) + { + w.Close(); + } + + private ErrorSeverity severity; + + // Visual and other properties + [ObservableProperty] private bool _isErrorVisible; + [ObservableProperty] private bool _isWarnVisible; + [ObservableProperty] private bool _isInfoVisible; + + public ErrorViewModel() + { + IsInfoVisible = true; + Title = "Тест ошибки"; + Message = "Сообщение ошибки"; + } + + public ErrorViewModel(Error error) + { + Title = error.Title; + Message = error.Message; + severity = error.Severity; + switch (error.Severity) + { + case ErrorSeverity.Error: + IsErrorVisible = true; + break; + case ErrorSeverity.Warning: + IsWarnVisible = true; + break; + case ErrorSeverity.Message: + IsInfoVisible = true; + break; + default: + IsInfoVisible = true; + break; + } + } + + public Error GetError() + { + Error error = new Error() + { + Title = Title, + Message = Message, + Severity = severity, + }; + return error; + } +} \ No newline at end of file diff --git a/ViewModels/EditEquipmentDialogViewModel.cs b/ViewModels/EditEquipmentDialogViewModel.cs index b473afc..85a7013 100644 --- a/ViewModels/EditEquipmentDialogViewModel.cs +++ b/ViewModels/EditEquipmentDialogViewModel.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using System.Web; using Avalonia.Controls; @@ -7,6 +8,7 @@ using Avalonia.Platform.Storage; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; +using GazpromApp.Enums; using GazpromApp.Messages; using GazpromApp.Models; @@ -57,7 +59,22 @@ public partial class EditEquipmentDialogViewModel : ViewModelBase IsImageSelected = files.Count > 0; - Image = IsImageSelected ? new ImageViewModel(new Models.Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(files[0].Path.AbsolutePath)) } : null; + try + { + Image = IsImageSelected ? new ImageViewModel(new Models.Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(files[0].Path.AbsolutePath)) } : null; + } + catch (ArgumentException) + { + Error error = new Error() + { + Title = "Ошибка обработки картинки", + Message = "Картинка не была добавлена", + Severity = ErrorSeverity.Error, + }; + _ = await WeakReferenceMessenger.Default.Send(new ErrorMessage(new ErrorViewModel(error))); + + IsImageSelected = false; + } } [RelayCommand] diff --git a/ViewModels/EditPointDialogViewModel.cs b/ViewModels/EditPointDialogViewModel.cs index f4ce40e..07c847a 100644 --- a/ViewModels/EditPointDialogViewModel.cs +++ b/ViewModels/EditPointDialogViewModel.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; @@ -10,6 +11,7 @@ using Avalonia.Platform.Storage; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; +using GazpromApp.Enums; using GazpromApp.Messages; using GazpromApp.Models; using GazpromApp.Views; @@ -59,7 +61,22 @@ public partial class EditPointDialogViewModel : ViewModelBase FileTypeFilter = [FilePickerFileTypes.ImageAll], }); foreach (var file in files) - Images.Add(new ImageViewModel(new Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(file.Path.AbsolutePath) ) }); + { + try + { + Images.Add(new ImageViewModel(new Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(file.Path.AbsolutePath) ) }); + } + catch (ArgumentException) + { + Error error = new Error() + { + Title = "Ошибка обработки картинки", + Message = $"Картинка не была добавлена: \"{HttpUtility.UrlDecode(file.Name)}\"", + Severity = ErrorSeverity.Error, + }; + _ = await WeakReferenceMessenger.Default.Send(new ErrorMessage(new ErrorViewModel(error))); + } + } IsImagesEmpty = Images.Count == 0; } diff --git a/ViewModels/NewEquipmentDialogViewModel.cs b/ViewModels/NewEquipmentDialogViewModel.cs index 260bb9f..638544b 100644 --- a/ViewModels/NewEquipmentDialogViewModel.cs +++ b/ViewModels/NewEquipmentDialogViewModel.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using System.Web; using Avalonia.Controls; @@ -7,6 +8,7 @@ using Avalonia.Platform.Storage; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; +using GazpromApp.Enums; using GazpromApp.Messages; using GazpromApp.Models; @@ -37,7 +39,22 @@ public partial class NewEquipmentDialogViewModel : ViewModelBase IsImageSelected = files.Count > 0; - Image = IsImageSelected ? new ImageViewModel(new Models.Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(files[0].Path.AbsolutePath)) } : null; + try + { + Image = IsImageSelected ? new ImageViewModel(new Models.Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(files[0].Path.AbsolutePath)) } : null; + } + catch (ArgumentException) + { + Error error = new Error() + { + Title = "Ошибка обработки картинки", + Message = "Картинка не была добавлена", + Severity = ErrorSeverity.Error, + }; + _ = await WeakReferenceMessenger.Default.Send(new ErrorMessage(new ErrorViewModel(error))); + + IsImageSelected = false; + } } [RelayCommand] diff --git a/ViewModels/NewPointDialogViewModel.cs b/ViewModels/NewPointDialogViewModel.cs index 7d1f0f4..e801605 100644 --- a/ViewModels/NewPointDialogViewModel.cs +++ b/ViewModels/NewPointDialogViewModel.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Web; @@ -9,7 +11,9 @@ using Avalonia.Platform.Storage; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; +using GazpromApp.Enums; using GazpromApp.Messages; +using GazpromApp.Models; using Image = GazpromApp.Models.Image; using Point = GazpromApp.Models.Point; @@ -37,7 +41,22 @@ public partial class NewPointDialogViewModel : ViewModelBase FileTypeFilter = [FilePickerFileTypes.ImageAll], }); foreach (var file in files) - Images.Add(new ImageViewModel(new Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(file.Path.AbsolutePath)) }); + { + try + { + Images.Add(new ImageViewModel(new Image()) { FileName = new Bitmap(HttpUtility.UrlDecode(file.Path.AbsolutePath)) }); + } + catch (ArgumentException) + { + Error error = new Error() + { + Title = "Ошибка обработки картинки", + Message = $"Картинка не была добавлена: \"{HttpUtility.UrlDecode(file.Name)}\"", + Severity = ErrorSeverity.Error, + }; + _ = await WeakReferenceMessenger.Default.Send(new ErrorMessage(new ErrorViewModel(error))); + } + } IsImagesEmpty = Images.Count == 0; } diff --git a/Views/EditEquipmentDialog.axaml.cs b/Views/EditEquipmentDialog.axaml.cs index 44854a6..c9550cf 100644 --- a/Views/EditEquipmentDialog.axaml.cs +++ b/Views/EditEquipmentDialog.axaml.cs @@ -30,6 +30,16 @@ public partial class EditEquipmentDialog : Window m.Reply(dialog.ShowDialog(w)); }); + // error handling + WeakReferenceMessenger.Default.Register(this, static (w, m) => + { + ErrorView dialog = new ErrorView() + { + DataContext = m.Error + }; + m.Reply(dialog.ShowDialog(w)); + }); + // new property dialog // edit property dialog @@ -50,6 +60,7 @@ public partial class EditEquipmentDialog : Window private void Window_OnClosed(object? sender, EventArgs e) { WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); // // WeakReferenceMessenger.Default.Unregister(this); diff --git a/Views/EditPointDialog.axaml.cs b/Views/EditPointDialog.axaml.cs index 77a2cfa..907c307 100644 --- a/Views/EditPointDialog.axaml.cs +++ b/Views/EditPointDialog.axaml.cs @@ -28,9 +28,20 @@ public partial class EditPointDialog : Window m.Reply(dialog.ShowDialog(w)); }); - // new equipment - WeakReferenceMessenger.Default.Register(this, static (w, m) => + // error + WeakReferenceMessenger.Default.Register(this, static (w, m) => { + ErrorView dialog = new ErrorView() + { + DataContext = m.Error + }; + m.Reply(dialog.ShowDialog(w)); + }); + + // new equipment + WeakReferenceMessenger.Default.Register(this, (w, m) => + { + WeakReferenceMessenger.Default.Unregister(this); NewEquipmentDialog dialog = new NewEquipmentDialog() { DataContext = new NewEquipmentDialogViewModel() @@ -42,6 +53,7 @@ public partial class EditPointDialog : Window WeakReferenceMessenger.Default.Register(this, (w, m) => { WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); EditEquipmentDialog dialog = new EditEquipmentDialog() { DataContext = new EditEquipmentDialogViewModel(m.Equipment) @@ -49,8 +61,21 @@ public partial class EditPointDialog : Window m.Reply(dialog.ShowDialog(w)); }); - // re registering view image - WeakReferenceMessenger.Default.Register(this, (w, m) => + // re registering error when new equipment done + WeakReferenceMessenger.Default.Register(this, (_, _) => + { + WeakReferenceMessenger.Default.Register(this, static (w, m) => + { + ErrorView dialog = new ErrorView() + { + DataContext = m.Error + }; + m.Reply(dialog.ShowDialog(w)); + }); + }); + + // re registering view image and error view + WeakReferenceMessenger.Default.Register(this, (_, _) => { WeakReferenceMessenger.Default.Register(this, static (w, m) => { @@ -60,6 +85,15 @@ public partial class EditPointDialog : Window }; m.Reply(dialog.ShowDialog(w)); }); + + WeakReferenceMessenger.Default.Register(this, static (w, m) => + { + ErrorView dialog = new ErrorView() + { + DataContext = m.Error + }; + m.Reply(dialog.ShowDialog(w)); + }); }); // new property @@ -82,6 +116,7 @@ public partial class EditPointDialog : Window private void Window_OnClosed(object? sender, EventArgs e) { WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); WeakReferenceMessenger.Default.Unregister(this); WeakReferenceMessenger.Default.Unregister(this); // new prop diff --git a/Views/ErrorView.axaml b/Views/ErrorView.axaml new file mode 100644 index 0000000..15d8eab --- /dev/null +++ b/Views/ErrorView.axaml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + +