diff --git a/FreeTubeSyncer/App.axaml.cs b/FreeTubeSyncer/App.axaml.cs index 4f96b59..bbfd8ac 100644 --- a/FreeTubeSyncer/App.axaml.cs +++ b/FreeTubeSyncer/App.axaml.cs @@ -8,8 +8,11 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; +using Avalonia.Platform; +using Avalonia.Threading; using FreeTubeSyncer.Library; using FreeTubeSyncer.Models; using FreeTubeSyncer.Models.DatabaseModels; @@ -39,13 +42,23 @@ public partial class App : Application private TimeSpan _checkInterval; private DateTime _lastUpdated; + private WindowIcon? _normalTrayIcon; + private WindowIcon? _waitingTrayIcon; + private WindowIcon? _completeTrayIcon; + public event EventHandler? SettingsChanged; public static App GetApp() => (App)App.Current!; public static ClassicDesktopStyleApplicationLifetime GetDesktop() => (ClassicDesktopStyleApplicationLifetime)App.Current!.ApplicationLifetime!; public override void Initialize() { + _normalTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/freetubesyncer.64.png"))); + _waitingTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/awaiting_sync.png"))); + _completeTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/sync_complete.png"))); + var vm = new AppViewModel(); + vm.AppIcon = _normalTrayIcon; AvaloniaXamlLoader.Load(this); + DataContext = vm; } public override void OnFrameworkInitializationCompleted() @@ -159,6 +172,18 @@ public partial class App : Application Log.Information("Log Started."); } + private async Task UpdateSTIconHint(WindowIcon icon, string? hint = null) + { + await Dispatcher.UIThread.InvokeAsync(async () => + { + await _semaphoreSlim.WaitAsync(); + ((AppViewModel)DataContext!).AppIcon = icon; + if (hint != null) ((AppViewModel)DataContext).HintTooltip = hint; + _semaphoreSlim.Release(); + + }); + } + private async Task SyncMonitor() { Log.Information("Sync Monitor Starting Up."); @@ -191,6 +216,11 @@ public partial class App : Application while (_isRunning) { await Task.Delay(100); + + if (_syncers.Any(x => x.IsDirty())) + { + await UpdateSTIconHint(_waitingTrayIcon!, "FreeTube Syncer - Changes waiting to be written..."); + } var sinceLastCheck = DateTime.Now - lastCheck; if (sinceLastCheck.TotalSeconds > _checkInterval.TotalSeconds) @@ -219,6 +249,7 @@ public partial class App : Application if (procs.Length > 0) continue; Log.Information("FreeTube instance closed, and we have writes to make..."); await Task.Delay(1500); + await UpdateSTIconHint(_waitingTrayIcon, "FreeTube Syncer - Syncing data..."); await _semaphoreSlim.WaitAsync(); var syncStart = DateTime.Now; @@ -227,6 +258,12 @@ public partial class App : Application var syncEnd = DateTime.Now - syncStart; _semaphoreSlim.Release(); Log.Information("Sync Completed. Total Time: {EndTime}", syncEnd); + await UpdateSTIconHint(_completeTrayIcon, "FreeTube Syncer - Sync completed."); + Task.Run(async () => + { + await Task.Delay(3000); + await UpdateSTIconHint(_normalTrayIcon, "FreeTube Syncer - Watching files..."); + }); } Log.Information("Filesystem Sync Monitor shutdown.");