22using System . Collections . Generic ;
33using System . Collections . ObjectModel ;
44using System . Diagnostics ;
5- using System . Drawing ;
65using System . IO ;
76using System . Linq ;
87using System . Threading . Tasks ;
98using System . Windows ;
109using System . Windows . Controls ;
1110using System . Windows . Input ;
11+ using System . Windows . Media ;
1212using Home_Assistant_Taskbar_Menu . Connection ;
1313using Home_Assistant_Taskbar_Menu . Entities ;
1414using Home_Assistant_Taskbar_Menu . Utils ;
1515using Home_Assistant_Taskbar_Menu . Views ;
16+ using MaterialDesignThemes . Wpf ;
17+ using Icon = System . Drawing . Icon ;
1618
1719namespace Home_Assistant_Taskbar_Menu
1820{
@@ -26,7 +28,7 @@ public partial class MainWindow : Window
2628 private ViewConfigurationWindow _viewConfigurationWindow ;
2729
2830 private ViewConfiguration _viewConfiguration ;
29- private readonly List < Control > _defaultMenuItems ;
31+ private readonly List < FrameworkElement > _defaultMenuItems ;
3032 private readonly List < Entity > _stateObjects ;
3133
3234 public ObservableCollection < UIElement > Menu { get ; set ; }
@@ -43,14 +45,28 @@ public MainWindow(Configuration configuration, ViewConfiguration viewConfigurati
4345 Task . Run ( ( ) => { InitConnection ( configuration ) . Wait ( ) ; } ) ;
4446 }
4547
46- private List < Control > CreateDefaultMenuItems ( string configurationUrl ,
48+ private List < FrameworkElement > CreateDefaultMenuItems ( string configurationUrl ,
4749 ( string version , string url ) latestVersion )
4850 {
51+ var showUpdate = ! ResourceProvider . IsUpToDate ( latestVersion ) ;
4952 var url = configurationUrl . Replace ( "wss://" , "https://" )
5053 . Replace ( "ws://" , "http://" )
5154 . Replace ( "/api/websocket" , "" ) ;
52- var editView = new MenuItem { Header = "Edit view configuration" } ;
53- editView . Click += ( sender , args ) =>
55+ Grid grid = new Grid ( ) { MinWidth = 220 } ;
56+ grid . ColumnDefinitions . Add ( new ColumnDefinition { Width = GridLength . Auto } ) ;
57+ grid . ColumnDefinitions . Add ( new ColumnDefinition ( ) ) ;
58+ grid . ColumnDefinitions . Add ( new ColumnDefinition { Width = GridLength . Auto } ) ;
59+ grid . ColumnDefinitions . Add ( new ColumnDefinition ( ) ) ;
60+ grid . ColumnDefinitions . Add ( new ColumnDefinition { Width = GridLength . Auto } ) ;
61+ grid . ColumnDefinitions . Add ( new ColumnDefinition ( ) ) ;
62+ grid . ColumnDefinitions . Add ( new ColumnDefinition { Width = GridLength . Auto } ) ;
63+ if ( showUpdate )
64+ {
65+ grid . ColumnDefinitions . Add ( new ColumnDefinition ( ) ) ;
66+ grid . ColumnDefinitions . Add ( new ColumnDefinition { Width = GridLength . Auto } ) ;
67+ }
68+
69+ CreateMenuIcon ( grid , PackIconKind . Settings , "Edit Application Settings" , ( ) =>
5470 {
5571 _viewConfigurationWindow ? . Close ( ) ;
5672 _viewConfigurationWindow = new ViewConfigurationWindow ( _stateObjects , _viewConfiguration ) ;
@@ -60,34 +76,55 @@ private List<Control> CreateDefaultMenuItems(string configurationUrl,
6076 _viewConfiguration = _viewConfigurationWindow . ViewConfiguration ;
6177 UpdateTree ( ) ;
6278 }
63- } ;
64- var haItem = new MenuItem { Header = "Open HA in Browser" } ;
65- haItem . Click += ( sender , args ) => { Process . Start ( url ) ; } ;
66- var aboutItem = new MenuItem { Header = "About HA Taskbar Menu" } ;
67- aboutItem . Click += ( sender , args ) =>
79+ } ) ;
80+ CreateMenuIcon ( grid , PackIconKind . HomeAssistant , "Open Home Assistant in Browser" ,
81+ ( ) => Process . Start ( url ) ) ;
82+ CreateMenuIcon ( grid , PackIconKind . About , "About HA Taskbar Menu" , ( ) =>
6883 {
6984 _aboutWindow ? . Close ( ) ;
7085 _aboutWindow = new AboutWindow ( ) ;
7186 _aboutWindow . ShowDialog ( ) ;
72- } ;
73-
74- var updateItem = new MenuItem { Header = "Update HA Taskbar Menu" } ;
75- updateItem . Click += ( sender , args ) => { Process . Start ( latestVersion . url ) ; } ;
76-
77- var exitItem = new MenuItem { Header = "Exit" } ;
78- exitItem . Click += ( sender , args ) => { Application . Current . Shutdown ( ) ; } ;
79-
80- var list = new List < Control > { new Separator ( ) , editView , haItem , aboutItem } ;
81- if ( ! ResourceProvider . IsUpToDate ( latestVersion ) )
87+ } ) ;
88+ if ( showUpdate )
8289 {
83- list . Add ( updateItem ) ;
84- ShowNotification ( "Home Assistant Taskbar Menu" , "Update is available" ) ;
90+ CreateMenuIcon ( grid , PackIconKind . Update , "Update HA Taskbar Menu" ,
91+ ( ) => Process . Start ( latestVersion . url ) ) ;
8592 }
8693
87- list . Add ( exitItem ) ;
88- return list ;
94+ CreateMenuIcon ( grid , PackIconKind . Close , "Exit" , ( ) => Application . Current . Shutdown ( ) ) ;
95+ return new List < FrameworkElement > { new Separator ( ) , grid } ;
8996 }
9097
98+ private static void CreateMenuIcon ( Grid grid , PackIconKind kind , string tooltip , Action clickAction )
99+ {
100+ var paletteHelper = new PaletteHelper ( ) ;
101+ var theme = paletteHelper . GetTheme ( ) ;
102+ PackIcon icon = new PackIcon
103+ {
104+ Kind = kind ,
105+ HorizontalAlignment = HorizontalAlignment . Center ,
106+ VerticalAlignment = VerticalAlignment . Center ,
107+ Width = double . NaN ,
108+ Height = double . NaN ,
109+ Margin = new Thickness ( 3 ) ,
110+ Foreground = new SolidColorBrush ( theme . ToolTipBackground )
111+ } ;
112+ Button button = new Button ( )
113+ {
114+ Width = double . NaN ,
115+ Height = double . NaN ,
116+ Content = icon ,
117+ ToolTip = tooltip ,
118+ Padding = new Thickness ( 0 ) ,
119+ Background = Brushes . Transparent ,
120+ BorderBrush = Brushes . Transparent
121+ } ;
122+ button . PreviewMouseDown += ( sender , args ) => { clickAction . Invoke ( ) ; } ;
123+ Grid . SetColumn ( button , grid . Children . Count * 2 ) ;
124+ grid . Children . Add ( button ) ;
125+ }
126+
127+
91128 private void HandleNewEntitiesList ( List < Entity > entitiesList )
92129 {
93130 UpdateMyStateObjects ( entitiesList ) ;
0 commit comments