11using System . Globalization ;
2- using System . IO ;
2+ using System . Windows . Controls ;
3+ using Hardcodet . Wpf . TaskbarNotification ;
34using Microsoft . Extensions . Localization ;
4- using Microsoft . Extensions . Logging ;
5- using NotificationIcon . NET ;
65using Sidekick . Common . Blazor . Home ;
76using Sidekick . Common . Browser ;
87using Sidekick . Common . Localization ;
@@ -14,7 +13,6 @@ namespace Sidekick.Wpf.Services;
1413public class WpfApplicationService
1514(
1615 IViewLocator viewLocator ,
17- ILogger < WpfApplicationService > logger ,
1816 IStringLocalizer < HomeResources > resources ,
1917 IUiLanguageProvider uiLanguageProvider ,
2018 IBrowserProvider browserProvider
@@ -24,7 +22,7 @@ IBrowserProvider browserProvider
2422
2523 private bool Initialized { get ; set ; }
2624
27- private NotifyIcon ? Icon { get ; set ; }
25+ private TaskbarIcon ? Icon { get ; set ; }
2826
2927 public int Priority => 9000 ;
3028
@@ -45,53 +43,60 @@ public Task Initialize()
4543
4644 private void OnLanguageChanged ( CultureInfo cultureInfo )
4745 {
48- if ( Icon is null )
46+ InitializeTray ( ) ;
47+ }
48+
49+ private void InitializeTray ( )
50+ {
51+ Icon ? . Dispose ( ) ;
52+
53+ Icon = new TaskbarIcon ( ) ;
54+ Icon . Icon = new System . Drawing . Icon ( System . IO . Path . Combine ( AppContext . BaseDirectory , "wwwroot/favicon.ico" ) ) ;
55+ Icon . ToolTipText = "Sidekick" ;
56+ Icon . ContextMenu = new ContextMenu ( ) ;
57+ Icon . DoubleClickCommand = new SimpleCommand ( ( ) => viewLocator . Open ( SidekickViewType . Standard , "/home" ) ) ;
58+
59+ AddTrayItem ( "Sidekick - " + ( ( IApplicationService ) this ) . GetVersion ( ) , null , true ) ;
60+ AddTrayItem ( resources [ "Home" ] , ( ) =>
4961 {
50- return ;
51- }
62+ viewLocator . Open ( SidekickViewType . Standard , "/home" ) ;
63+ return Task . CompletedTask ;
64+ } ) ;
65+ AddTrayItem ( resources [ "Open_Website" ] ,
66+ ( ) =>
67+ {
68+ browserProvider . OpenUri ( browserProvider . SidekickWebsite ) ;
69+ return Task . CompletedTask ;
70+ } ) ;
71+ AddTrayItem ( resources [ "Exit" ] ,
72+ ( ) =>
73+ {
74+ Shutdown ( ) ;
75+ return Task . CompletedTask ;
76+ } ) ;
5277
53- Icon . MenuItems [ 0 ] . Text = resources [ "Sidekick" ] + " - " + ( ( IApplicationService ) this ) . GetVersion ( ) ;
54- Icon . MenuItems [ 1 ] . Text = resources [ "Home" ] ;
55- Icon . MenuItems [ 2 ] . Text = resources [ "Open_Website" ] ;
56- Icon . MenuItems [ 3 ] . Text = resources [ "Exit" ] ;
78+ Initialized = true ;
5779 }
5880
59- private void InitializeTray ( )
81+ private void AddTrayItem ( string label , Func < Task > ? onClick , bool disabled = false )
6082 {
61- var iconImage = Path . Combine ( AppContext . BaseDirectory , "wwwroot/favicon.ico" ) ;
83+ if ( Icon ? . ContextMenu == null ) return ;
6284
63- Icon = NotifyIcon . Create ( iconImage ,
64- [
65- new ( "Sidekick - " + ( ( IApplicationService ) this ) . GetVersion ( ) )
66- {
67- IsDisabled = true
68- } ,
69- new ( resources [ "Home" ] )
70- {
71- Click = ( s , e ) => viewLocator . Open ( SidekickViewType . Standard , "/home" )
72- } ,
73- new ( resources [ "Open_Website" ] )
74- {
75- Click = ( s , e ) => browserProvider . OpenUri ( browserProvider . SidekickWebsite )
76- } ,
77- new ( resources [ "Exit" ] )
78- {
79- Click = ( s , e ) => Shutdown ( )
80- } ,
81- ] ) ;
85+ var menuItem = new MenuItem
86+ {
87+ Header = label ,
88+ IsEnabled = ! disabled ,
89+ } ;
8290
83- // Runs its own message loop.
84- _ = Task . Run ( ( ) =>
91+ if ( onClick != null )
8592 {
86- try
87- {
88- Icon . Show ( ) ;
89- }
90- catch ( Exception e )
93+ menuItem . Click += async ( _ , _ ) =>
9194 {
92- logger . LogError ( e , "[ApplicationService] Error while trying to create the notification icon in the taskbar." ) ;
93- }
94- } ) ;
95+ await onClick ( ) ;
96+ } ;
97+ }
98+
99+ Icon . ContextMenu . Items . Add ( menuItem ) ;
95100 }
96101
97102 public void Shutdown ( )
0 commit comments