From 80158ce9479c39b75f79a2072a0b2b39bfb058f3 Mon Sep 17 00:00:00 2001 From: Peter Kirmeier Date: Mon, 11 Sep 2023 19:25:38 +0200 Subject: [PATCH] Support for clicked state color of list items Minor improvement of color updates --- DataClasses/RowData.cs | 37 ++++++++++++++++++++++++++++++++++--- UserInterface/Menu.xaml.cs | 29 +++++++++++++++++------------ 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/DataClasses/RowData.cs b/DataClasses/RowData.cs index ce45d37..c8db3e1 100644 --- a/DataClasses/RowData.cs +++ b/DataClasses/RowData.cs @@ -23,7 +23,9 @@ namespace SystemTrayMenu.DataClasses private Brush? borderBrush; private ImageSource? columnIcon; private string? columnText; + private bool isClicked; private bool isSelected; + private Menu? subMenu; /// /// Initializes a new instance of the class. @@ -138,6 +140,19 @@ namespace SystemTrayMenu.DataClasses internal bool IsPendingOpenItem { get; set; } + internal bool IsClicked + { + get => isClicked; + set + { + if (value != isClicked) + { + isClicked = value; + UpdateColors(); + } + } + } + internal bool IsSelected { get => isSelected; @@ -146,7 +161,7 @@ namespace SystemTrayMenu.DataClasses if (value != isSelected) { isSelected = value; - CallPropertyChanged(); + UpdateColors(); } } } @@ -187,7 +202,18 @@ namespace SystemTrayMenu.DataClasses internal Menu? Owner { get; set; } - internal Menu? SubMenu { get; set; } + internal Menu? SubMenu + { + get => subMenu; + set + { + if (value != subMenu) + { + subMenu = value; + UpdateColors(); + } + } + } internal bool HiddenEntry { get; set; } @@ -335,7 +361,12 @@ namespace SystemTrayMenu.DataClasses internal void UpdateColors() { - if (SubMenu != null) + if (IsClicked) + { + BorderBrush = MenuDefines.ColorIcons; + BackgroundBrush = MenuDefines.ColorSelectedItem; + } + else if (SubMenu != null) { BorderBrush = MenuDefines.ColorOpenFolderBorder; BackgroundBrush = MenuDefines.ColorOpenFolder; diff --git a/UserInterface/Menu.xaml.cs b/UserInterface/Menu.xaml.cs index dbde2af..9e04adb 100644 --- a/UserInterface/Menu.xaml.cs +++ b/UserInterface/Menu.xaml.cs @@ -38,7 +38,7 @@ namespace SystemTrayMenu.UserInterface private readonly string folderPath; - private Tuple detectLeftMouseButtonClicked = new(null, 0); + private int countLeftMouseButtonClicked; private bool isShellContextMenuOpen; private bool directionToRight; private Point lastLocation; @@ -1099,13 +1099,11 @@ namespace SystemTrayMenu.UserInterface foreach (RowData itemData in e.AddedItems) { itemData.IsSelected = true; - itemData.UpdateColors(); } foreach (RowData itemData in e.RemovedItems) { itemData.IsSelected = false; - itemData.UpdateColors(); } } else @@ -1115,7 +1113,6 @@ namespace SystemTrayMenu.UserInterface foreach (RowData itemData in lv.Items.SourceCollection) { itemData.IsSelected = lv.SelectedItem == itemData; - itemData.UpdateColors(); } } } @@ -1155,7 +1152,10 @@ namespace SystemTrayMenu.UserInterface private void ListViewItem_MouseLeave(object sender, MouseEventArgs e) { - detectLeftMouseButtonClicked = new (null, 0); + RowData rowData = (RowData)((ListViewItem)sender).Content; + rowData.IsClicked = false; + + countLeftMouseButtonClicked = 0; if (!isShellContextMenuOpen) { @@ -1163,7 +1163,7 @@ namespace SystemTrayMenu.UserInterface if (e.LeftButton == MouseButtonState.Pressed) { - string[] files = new string[] { ((RowData)((ListViewItem)sender).Content).Path }; + string[] files = new string[] { rowData.Path }; DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy); } } @@ -1172,20 +1172,25 @@ namespace SystemTrayMenu.UserInterface private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) => CellMouseDown?.Invoke((RowData)((ListViewItem)sender).Content); - private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) => - detectLeftMouseButtonClicked = new((ListViewItem)sender, e.ClickCount); + private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + RowData rowData = (RowData)((ListViewItem)sender).Content; + rowData.IsClicked = true; + countLeftMouseButtonClicked = e.ClickCount; + } private void ListViewItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { - ListViewItem lvi = (ListViewItem)sender; - if (detectLeftMouseButtonClicked.Item1 == lvi) + RowData rowData = (RowData)((ListViewItem)sender).Content; + if (rowData.IsClicked) { // Same row has been called with PreviewMouseLeftButtonDown without leaving the item, so we can call it a "click". // The click count is also taken from Down event as it seems not being correct in Up event. - ((RowData)lvi.Content).OpenItem(detectLeftMouseButtonClicked.Item2); + rowData.OpenItem(countLeftMouseButtonClicked); } - detectLeftMouseButtonClicked = new(null, 0); + countLeftMouseButtonClicked = 0; + rowData.IsClicked = false; } private void ListViewItem_MouseRightButtonUp(object sender, MouseButtonEventArgs e)