From e4f61e50b8e51f630ca8d6d98f6e21447c75f0d2 Mon Sep 17 00:00:00 2001 From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:23:34 +0300 Subject: [PATCH] Dynamically update tray tooltip to display current color configuration (#283) --- LightBulb/App.axaml.cs | 42 ++++++++++++++++++- .../Components/DashboardViewModel.cs | 4 +- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/LightBulb/App.axaml.cs b/LightBulb/App.axaml.cs index 2b82025..633df2c 100644 --- a/LightBulb/App.axaml.cs +++ b/LightBulb/App.axaml.cs @@ -1,10 +1,14 @@ using System; +using System.Linq; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Media; +using Avalonia.Threading; using LightBulb.Framework; using LightBulb.Services; +using LightBulb.Utils; using LightBulb.Utils.Extensions; using LightBulb.ViewModels; using LightBulb.ViewModels.Components; @@ -18,6 +22,8 @@ namespace LightBulb; public class App : Application, IDisposable { + private readonly DisposableCollector _eventRoot = new(); + private readonly ServiceProvider _services; private readonly MainViewModel _mainViewModel; @@ -52,7 +58,35 @@ public App() _mainViewModel = _services.GetRequiredService().CreateMainViewModel(); } - public override void Initialize() => AvaloniaXamlLoader.Load(this); + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + + // Tray icon does not support binding so we use this hack to update its tooltip + _eventRoot.Add( + _mainViewModel.Dashboard.WatchProperties( + [o => o.IsActive, o => o.CurrentConfiguration], + () => + { + var status = + _mainViewModel.Dashboard.CurrentConfiguration.Temperature.ToString("F0") + + " / " + + _mainViewModel.Dashboard.CurrentConfiguration.Brightness.ToString("P0"); + + var tooltip = + "LightBulb" + + Environment.NewLine + + (_mainViewModel.Dashboard.IsActive ? status : "Disabled"); + + Dispatcher.UIThread.Invoke(() => + { + if (TrayIcon.GetIcons(this)?.FirstOrDefault() is { } trayIcon) + trayIcon.ToolTipText = tooltip; + }); + } + ) + ); + } public override void OnFrameworkInitializationCompleted() { @@ -120,5 +154,9 @@ private void DisableTemporarily1MinuteMenuItem_OnClick(object? sender, EventArgs private void ExitMenuItem_OnClick(object? sender, EventArgs args) => ApplicationLifetime?.TryShutdown(); - public void Dispose() => _services.Dispose(); + public void Dispose() + { + _eventRoot.Dispose(); + _services.Dispose(); + } } diff --git a/LightBulb/ViewModels/Components/DashboardViewModel.cs b/LightBulb/ViewModels/Components/DashboardViewModel.cs index 95db0d5..45d088c 100644 --- a/LightBulb/ViewModels/Components/DashboardViewModel.cs +++ b/LightBulb/ViewModels/Components/DashboardViewModel.cs @@ -352,12 +352,12 @@ protected override void Dispose(bool disposing) { if (disposing) { + _eventRoot.Dispose(); + _updateInstantTimer.Dispose(); _updateConfigurationTimer.Dispose(); _updateIsPausedTimer.Dispose(); - _eventRoot.Dispose(); - _enableAfterDelayRegistration?.Dispose(); }