From 189e45099cc4e4ec2eb7757cc5557b4b8b5f98dc Mon Sep 17 00:00:00 2001 From: Peter Kirmeier Date: Fri, 5 May 2023 18:52:05 +0200 Subject: [PATCH] Fix row selection loss when using keys Remove some old drag and drop code (feature might be added later again) Refactored some events to work with Menu s instead of ListView s --- Business/KeyboardInput.cs | 21 ++++++----- Business/Menus.cs | 71 +++----------------------------------- Business/WaitToLoadMenu.cs | 8 ++--- UserInterface/Menu.xaml | 1 - UserInterface/Menu.xaml.cs | 15 +++----- 5 files changed, 25 insertions(+), 91 deletions(-) diff --git a/Business/KeyboardInput.cs b/Business/KeyboardInput.cs index bb1d108..15ff435 100644 --- a/Business/KeyboardInput.cs +++ b/Business/KeyboardInput.cs @@ -198,7 +198,7 @@ namespace SystemTrayMenu.Handler ListView dgv = menu.GetDataGridView(); if (dgv.Items.Count > 0) { - Select(dgv, (ListViewItemData)dgv.Items[0], true); + Select(menu, (ListViewItemData)dgv.Items[0], true); } } } @@ -208,9 +208,8 @@ namespace SystemTrayMenu.Handler ClearIsSelectedByKey(focussedMenu, focussedRow); } - internal void Select(ListView dgv, ListViewItemData itemData, bool refreshview) + internal void Select(Menu menu, ListViewItemData itemData, bool refreshview) { - Menu menu = (Menu)dgv.GetParentWindow(); if (itemData != focussedRow || menu != focussedMenu) { ClearIsSelectedByKey(); @@ -223,6 +222,7 @@ namespace SystemTrayMenu.Handler if (refreshview) { + ListView dgv = menu.GetDataGridView(); if (dgv.SelectedItems.Contains(itemData)) { dgv.SelectedItems.Remove(itemData); @@ -253,21 +253,23 @@ namespace SystemTrayMenu.Handler Menu? menuBefore; ListView? dgvBefore; ListViewItemData? rowBefore = focussedRow; + bool toClear = false; + bool isSelected = focussedRow?.data.IsSelected ?? false; - menuFromSelected = focussedRow?.data.IsSelected ?? false ? focussedRow.data.SubMenu : null; - if (menuFromSelected != null) + if (isSelected) { + menuFromSelected = focussedRow?.data.SubMenu; menuBefore = focussedMenu; dgvBefore = menuBefore?.GetDataGridView(); } else { ResetSelectedByKey(); + menuFromSelected = null; menuBefore = null; dgvBefore = null; } - bool toClear = false; switch (key) { case Key.Enter: @@ -349,9 +351,10 @@ namespace SystemTrayMenu.Handler if (nextMenuInKeyDirection || prevMenuAgainstKeyDirection) { // Next is in key direction or prev is opposite of key direction ==> TrySelect sub/next menu - if (menuFromSelected != null) + if (isSelected) { - if (menuFromSelected == focussedMenu?.SubMenu) + if (menuFromSelected != null && + menuFromSelected == focussedMenu?.SubMenu) { ListView dgv = menuFromSelected.GetDataGridView(); if (dgv != null && dgv.Items.Count > 0) @@ -419,7 +422,7 @@ namespace SystemTrayMenu.Handler break; } - if (menuFromSelected != null && toClear) + if (isSelected && toClear) { ClearIsSelectedByKey(menuBefore, rowBefore); } diff --git a/Business/Menus.cs b/Business/Menus.cs index 353a0bb..bf41006 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -43,9 +43,6 @@ namespace SystemTrayMenu.Business private OpenCloseState openCloseState = OpenCloseState.Default; private TaskbarPosition taskbarPosition = new WindowsTaskbar().Position; private bool searchTextChanging; -#if TODO // Misc MouseEvents - private int lastMouseDownRowIndex = -1; -#endif private bool showMenuAfterMainPreload; public Menus() @@ -100,6 +97,7 @@ namespace SystemTrayMenu.Business } } + waitToOpenMenu.MouseEnterOk += (menu, itemData) => MouseEnterOk(menu, itemData, false); waitToOpenMenu.CloseMenu += CloseMenu; void CloseMenu(int level) { @@ -113,11 +111,6 @@ namespace SystemTrayMenu.Business } } - waitToOpenMenu.MouseEnterOk += MouseEnterOk; -#if TODO // Misc MouseEvents - dgvMouseRow.RowMouseLeave += Dgv_RowMouseLeave; // event moved to Menu.CellMouseLeave() -#endif - if (Settings.Default.SupportGamepad) { joystickHelper = new(); @@ -537,9 +530,8 @@ namespace SystemTrayMenu.Business menu.IsVisibleChanged += (sender, _) => MenuVisibleChanged((Menu)sender); menu.CellMouseEnter += waitToOpenMenu.MouseEnter; menu.CellMouseLeave += waitToOpenMenu.MouseLeave; - menu.CellMouseDown += Dgv_MouseDown; - menu.CellMouseUp += Dgv_MouseUp; - menu.CellOpenOnClick += Dgv_OpenItemOnClick; + menu.CellMouseDown += (menu, itemData) => MouseEnterOk(menu, itemData, true); + menu.CellOpenOnClick += waitToOpenMenu.ClickOpensInstantly; menu.ClosePressed += MenusFadeOut; ListView dgv = menu.GetDataGridView(); @@ -594,31 +586,7 @@ namespace SystemTrayMenu.Business } } - private void Dgv_MouseDown(ListView dgv, ListViewItemData itemData, MouseButtonEventArgs e) - { - MouseEnterOk(dgv, itemData, true); - -#if TODO // Misc MouseEvents - if (e.LeftButton == MouseButtonState.Pressed) - { - lastMouseDownRowIndex = index; - } -#endif - } - - private void Dgv_MouseUp(object sender, ListViewItemData itemData, MouseButtonEventArgs e) - { -#if TODO // Misc MouseEvents - lastMouseDownRowIndex = -1; -#endif - } - - private void MouseEnterOk(ListView dgv, ListViewItemData itemData) - { - MouseEnterOk(dgv, itemData, false); - } - - private void MouseEnterOk(ListView dgv, ListViewItemData itemData, bool refreshView) + private void MouseEnterOk(Menu menu, ListViewItemData itemData, bool refreshView) { if (IsMainUsable) { @@ -628,38 +596,9 @@ namespace SystemTrayMenu.Business keyboardInput.InUse = false; } - keyboardInput.Select(dgv, itemData, refreshView); + keyboardInput.Select(menu, itemData, refreshView); } } -#if TODO // Misc MouseEvents - private void Dgv_RowMouseLeave(object sender, DataGridViewCellEventArgs e) - { - ListView dgv = (ListView)sender; - - if (e.RowIndex == lastMouseDownRowIndex && - e.RowIndex > -1 && - e.RowIndex < dgv.Items.Count) - { - lastMouseDownRowIndex = -1; - - RowData rowData = (RowData)dgv.Items[e.RowIndex].Cells[2].Value; - string[] files = new string[] { rowData.Path }; - - // Update position raises move event which prevent DoDragDrop blocking UI when mouse not moved - Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y); - - dgv.DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy); - } - } -#endif - - private void Dgv_OpenItemOnClick(ListView sender, ListViewItemData itemData) - { -#if TODO // Misc MouseEvents - lastMouseDownRowIndex = -1; -#endif - waitToOpenMenu.ClickOpensInstantly(sender, itemData); - } private void Dgv_SelectionChanged(object sender, EventArgs e) { diff --git a/Business/WaitToLoadMenu.cs b/Business/WaitToLoadMenu.cs index ec97fb4..589fecd 100644 --- a/Business/WaitToLoadMenu.cs +++ b/Business/WaitToLoadMenu.cs @@ -44,7 +44,7 @@ namespace SystemTrayMenu.Handler internal event Action? StopLoadMenu; - internal event Action? MouseEnterOk; + internal event Action? MouseEnterOk; internal bool MouseActive { get; set; } @@ -53,15 +53,15 @@ namespace SystemTrayMenu.Handler timerStartLoad.Stop(); } - internal void MouseEnter(ListView dgv, ListViewItemData itemData) + internal void MouseEnter(Menu menu, ListViewItemData itemData) { if (MouseActive) { - MouseEnterOk?.Invoke(dgv, itemData); + MouseEnterOk?.Invoke(menu, itemData); timerStartLoad.Stop(); StopLoadMenu?.Invoke(); checkForMouseActive = true; - SetData(dgv, itemData); + SetData(menu.GetDataGridView(), itemData); timerStartLoad.Start(); } #if TODO // Misc MouseEvents diff --git a/UserInterface/Menu.xaml b/UserInterface/Menu.xaml index e2bb3ea..c33849a 100644 --- a/UserInterface/Menu.xaml +++ b/UserInterface/Menu.xaml @@ -193,7 +193,6 @@ - diff --git a/UserInterface/Menu.xaml.cs b/UserInterface/Menu.xaml.cs index 88d3f15..85aa2be 100644 --- a/UserInterface/Menu.xaml.cs +++ b/UserInterface/Menu.xaml.cs @@ -277,13 +277,11 @@ namespace SystemTrayMenu.UserInterface internal event Action? UserDragsMenu; - internal event Action? CellMouseEnter; + internal event Action? CellMouseEnter; internal event Action? CellMouseLeave; - internal event Action? CellMouseDown; - - internal event Action? CellMouseUp; + internal event Action? CellMouseDown; internal event Action? CellOpenOnClick; @@ -1192,7 +1190,7 @@ namespace SystemTrayMenu.UserInterface private void ListViewItem_MouseEnter(object sender, MouseEventArgs e) { - CellMouseEnter?.Invoke(dgv, (ListViewItemData)((ListViewItem)sender).Content); + CellMouseEnter?.Invoke(this, (ListViewItemData)((ListViewItem)sender).Content); } private void ListViewItem_MouseLeave(object sender, MouseEventArgs e) @@ -1204,7 +1202,7 @@ namespace SystemTrayMenu.UserInterface { ListViewItemData itemData = (ListViewItemData)((ListViewItem)sender).Content; - CellMouseDown?.Invoke(dgv, itemData, e); + CellMouseDown?.Invoke(this, itemData); if (e.LeftButton == MouseButtonState.Pressed) { @@ -1219,11 +1217,6 @@ namespace SystemTrayMenu.UserInterface } } - private void ListViewItem_MouseUp(object sender, MouseButtonEventArgs e) - { - CellMouseUp?.Invoke(dgv, (ListViewItemData)((ListViewItem)sender).Content, e); - } - private void ListViewxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { ListViewItemData itemData = (ListViewItemData)((ListViewItem)sender).Content;