diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/Services/IDialogService.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/Services/IDialogService.cs index f79f07e..bfae052 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/Services/IDialogService.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/Services/IDialogService.cs @@ -7,4 +7,5 @@ public interface IDialogService : IInputInterface { IObservable ReadInput { get; } void ReadInputs(IEnumerable inputs, Action inputHandler, Action? cancelHandler = null); + void ShowToastMessage(string text); } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/ViewModels/IGuiAppState.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/ViewModels/IGuiAppState.cs index c593da0..99259a6 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/ViewModels/IGuiAppState.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/ViewModels/IGuiAppState.cs @@ -1,3 +1,4 @@ +using System.Collections.ObjectModel; using FileTime.App.Core.Models; using FileTime.App.Core.ViewModels; using FileTime.GuiApp.Configuration; @@ -13,4 +14,5 @@ public interface IGuiAppState : IAppState List PossibleCommands { get; set; } BindedCollection RootDriveInfos { get; set; } IReadOnlyList Places { get; set; } + ObservableCollection PopupTexts { get; } } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs index 6156d20..b3811bb 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs @@ -41,6 +41,7 @@ public static class Startup serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); + serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -102,6 +103,6 @@ public static class Startup this LoggerSinkConfiguration loggerConfiguration, IServiceProvider serviceProvider) { - return loggerConfiguration.Sink(serviceProvider.GetService()); + return loggerConfiguration.Sink(serviceProvider.GetRequiredService()); } } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs index 4ed07a6..843abbf 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs @@ -1,3 +1,4 @@ +using System.Collections.ObjectModel; using FileTime.App.Core.Models; using FileTime.App.Core.ViewModels; using FileTime.GuiApp.Configuration; @@ -22,4 +23,5 @@ public partial class GuiAppState : AppStateBase, IGuiAppState [Property] private IReadOnlyList _places; public List PreviousKeys { get; } = new(); + public ObservableCollection PopupTexts { get; } = new(); } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/Logging/ToastMessageSink.cs b/src/GuiApp/Avalonia/FileTime.GuiApp/Logging/ToastMessageSink.cs index a8d7b70..debc025 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/Logging/ToastMessageSink.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/Logging/ToastMessageSink.cs @@ -1,3 +1,4 @@ +using FileTime.GuiApp.Services; using Serilog.Core; using Serilog.Events; @@ -5,19 +6,19 @@ namespace FileTime.GuiApp.Logging; public class ToastMessageSink : ILogEventSink { - //private readonly IDialogService dialogService; + private readonly IDialogService dialogService; - public ToastMessageSink(/*IDialogService dialogService*/) + public ToastMessageSink(IDialogService dialogService) { - //this.dialogService = dialogService; + this.dialogService = dialogService; } public void Emit(LogEvent logEvent) { - /*if (logEvent.Level >= LogEventLevel.Error) + if (logEvent.Level >= LogEventLevel.Error) { var message = logEvent.RenderMessage(); dialogService.ShowToastMessage(message); - }*/ + } } } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/Services/DialogService.cs b/src/GuiApp/Avalonia/FileTime.GuiApp/Services/DialogService.cs index 34e6163..6c1fdd0 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/Services/DialogService.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/Services/DialogService.cs @@ -1,4 +1,5 @@ using System.Reactive.Linq; +using Avalonia.Threading; using DynamicData; using FileTime.App.Core.Services; using FileTime.Core.Interactions; @@ -9,12 +10,14 @@ namespace FileTime.GuiApp.Services; public class DialogService : IDialogService { private readonly IModalService _modalService; + private readonly IGuiAppState _guiAppState; public IObservable ReadInput { get; } - public DialogService(IModalService modalService) + public DialogService(IModalService modalService, IGuiAppState guiAppState) { _modalService = modalService; + _guiAppState = guiAppState; ReadInput = modalService .OpenModals .ToCollection() @@ -37,6 +40,16 @@ public class DialogService : IDialogService _modalService.OpenModal(modalViewModel); } + public void ShowToastMessage(string text) + { + Task.Run(async () => + { + await Dispatcher.UIThread.InvokeAsync(() => _guiAppState.PopupTexts.Add(text)); + await Task.Delay(5000); + await Dispatcher.UIThread.InvokeAsync(() => _guiAppState.PopupTexts.Remove(text)); + }); + } + private void HandleReadInputsSuccess(ReadInputsViewModel readInputsViewModel) { _modalService.CloseModal(readInputsViewModel); diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/Views/MainWindow.axaml b/src/GuiApp/Avalonia/FileTime.GuiApp/Views/MainWindow.axaml index 89849e1..30e857c 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/Views/MainWindow.axaml +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/Views/MainWindow.axaml @@ -443,6 +443,30 @@ + + + + + + + + + + + + +