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
This commit is contained in:
Peter Kirmeier 2023-05-05 18:52:05 +02:00
parent c7066e67f7
commit 189e45099c
5 changed files with 25 additions and 91 deletions

View file

@ -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);
}

View file

@ -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)
{

View file

@ -44,7 +44,7 @@ namespace SystemTrayMenu.Handler
internal event Action? StopLoadMenu;
internal event Action<ListView, ListViewItemData>? MouseEnterOk;
internal event Action<Menu, ListViewItemData>? 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

View file

@ -193,7 +193,6 @@
<EventSetter Event="MouseEnter" Handler="ListViewItem_MouseEnter" />
<EventSetter Event="MouseLeave" Handler="ListViewItem_MouseLeave" />
<EventSetter Event="PreviewMouseDown" Handler="ListViewItem_PreviewMouseDown" />
<EventSetter Event="MouseUp" Handler="ListViewItem_MouseUp" />
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewxItem_PreviewMouseLeftButtonDown" />
</Style>
</ListView.ItemContainerStyle>

View file

@ -277,13 +277,11 @@ namespace SystemTrayMenu.UserInterface
internal event Action? UserDragsMenu;
internal event Action<ListView, ListViewItemData>? CellMouseEnter;
internal event Action<Menu, ListViewItemData>? CellMouseEnter;
internal event Action<ListView, ListViewItemData>? CellMouseLeave;
internal event Action<ListView, ListViewItemData, MouseButtonEventArgs>? CellMouseDown;
internal event Action<ListView, ListViewItemData, MouseButtonEventArgs>? CellMouseUp;
internal event Action<Menu, ListViewItemData>? CellMouseDown;
internal event Action<ListView, ListViewItemData>? 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;