Support for clicked state color of list items

Minor improvement of color updates
This commit is contained in:
Peter Kirmeier 2023-09-11 19:25:38 +02:00
parent 72c225a912
commit 80158ce947
2 changed files with 51 additions and 15 deletions

View file

@ -23,7 +23,9 @@ namespace SystemTrayMenu.DataClasses
private Brush? borderBrush; private Brush? borderBrush;
private ImageSource? columnIcon; private ImageSource? columnIcon;
private string? columnText; private string? columnText;
private bool isClicked;
private bool isSelected; private bool isSelected;
private Menu? subMenu;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="RowData"/> class. /// Initializes a new instance of the <see cref="RowData"/> class.
@ -138,6 +140,19 @@ namespace SystemTrayMenu.DataClasses
internal bool IsPendingOpenItem { get; set; } internal bool IsPendingOpenItem { get; set; }
internal bool IsClicked
{
get => isClicked;
set
{
if (value != isClicked)
{
isClicked = value;
UpdateColors();
}
}
}
internal bool IsSelected internal bool IsSelected
{ {
get => isSelected; get => isSelected;
@ -146,7 +161,7 @@ namespace SystemTrayMenu.DataClasses
if (value != isSelected) if (value != isSelected)
{ {
isSelected = value; isSelected = value;
CallPropertyChanged(); UpdateColors();
} }
} }
} }
@ -187,7 +202,18 @@ namespace SystemTrayMenu.DataClasses
internal Menu? Owner { get; set; } 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; } internal bool HiddenEntry { get; set; }
@ -335,7 +361,12 @@ namespace SystemTrayMenu.DataClasses
internal void UpdateColors() internal void UpdateColors()
{ {
if (SubMenu != null) if (IsClicked)
{
BorderBrush = MenuDefines.ColorIcons;
BackgroundBrush = MenuDefines.ColorSelectedItem;
}
else if (SubMenu != null)
{ {
BorderBrush = MenuDefines.ColorOpenFolderBorder; BorderBrush = MenuDefines.ColorOpenFolderBorder;
BackgroundBrush = MenuDefines.ColorOpenFolder; BackgroundBrush = MenuDefines.ColorOpenFolder;

View file

@ -38,7 +38,7 @@ namespace SystemTrayMenu.UserInterface
private readonly string folderPath; private readonly string folderPath;
private Tuple<ListViewItem?, int> detectLeftMouseButtonClicked = new(null, 0); private int countLeftMouseButtonClicked;
private bool isShellContextMenuOpen; private bool isShellContextMenuOpen;
private bool directionToRight; private bool directionToRight;
private Point lastLocation; private Point lastLocation;
@ -1099,13 +1099,11 @@ namespace SystemTrayMenu.UserInterface
foreach (RowData itemData in e.AddedItems) foreach (RowData itemData in e.AddedItems)
{ {
itemData.IsSelected = true; itemData.IsSelected = true;
itemData.UpdateColors();
} }
foreach (RowData itemData in e.RemovedItems) foreach (RowData itemData in e.RemovedItems)
{ {
itemData.IsSelected = false; itemData.IsSelected = false;
itemData.UpdateColors();
} }
} }
else else
@ -1115,7 +1113,6 @@ namespace SystemTrayMenu.UserInterface
foreach (RowData itemData in lv.Items.SourceCollection) foreach (RowData itemData in lv.Items.SourceCollection)
{ {
itemData.IsSelected = lv.SelectedItem == itemData; itemData.IsSelected = lv.SelectedItem == itemData;
itemData.UpdateColors();
} }
} }
} }
@ -1155,7 +1152,10 @@ namespace SystemTrayMenu.UserInterface
private void ListViewItem_MouseLeave(object sender, MouseEventArgs e) 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) if (!isShellContextMenuOpen)
{ {
@ -1163,7 +1163,7 @@ namespace SystemTrayMenu.UserInterface
if (e.LeftButton == MouseButtonState.Pressed) 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); 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) => private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) =>
CellMouseDown?.Invoke((RowData)((ListViewItem)sender).Content); CellMouseDown?.Invoke((RowData)((ListViewItem)sender).Content);
private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) => private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
detectLeftMouseButtonClicked = new((ListViewItem)sender, e.ClickCount); {
RowData rowData = (RowData)((ListViewItem)sender).Content;
rowData.IsClicked = true;
countLeftMouseButtonClicked = e.ClickCount;
}
private void ListViewItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) private void ListViewItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{ {
ListViewItem lvi = (ListViewItem)sender; RowData rowData = (RowData)((ListViewItem)sender).Content;
if (detectLeftMouseButtonClicked.Item1 == lvi) if (rowData.IsClicked)
{ {
// Same row has been called with PreviewMouseLeftButtonDown without leaving the item, so we can call it a "click". // 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. // 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) private void ListViewItem_MouseRightButtonUp(object sender, MouseButtonEventArgs e)