[BUG] Fix rare issue when mouse moves between icon and text (#118), version 1.0.9.1

This commit is contained in:
Markus Hofknecht 2020-07-12 14:21:29 +02:00
parent b595ecbe8a
commit b0cdfe1ab2
4 changed files with 123 additions and 22 deletions

View file

@ -32,6 +32,7 @@ namespace SystemTrayMenu.Business
private readonly int screenRight = Screen.PrimaryScreen.Bounds.Right;
private readonly int taskbarHeight = new WindowsTaskbar().Size.Height;
private readonly DgvMouseRow dgvMouseRow = new DgvMouseRow();
private readonly WaitToLoadMenu waitToOpenMenu = new WaitToLoadMenu();
private readonly KeyboardInput keyboardInput = null;
private readonly Timer timerStillActiveCheck = new Timer();
@ -185,6 +186,24 @@ namespace SystemTrayMenu.Business
}
}
waitToOpenMenu.MouseEnterOk += MouseEnterOk;
void MouseEnterOk(DataGridView dgv, int rowIndex)
{
if (menus[0].IsUsable)
{
if (keyboardInput.InUse)
{
keyboardInput.ClearIsSelectedByKey();
keyboardInput.InUse = false;
}
keyboardInput.Select(dgv, rowIndex, false);
}
}
dgvMouseRow.RowMouseEnter += waitToOpenMenu.MouseEnter;
dgvMouseRow.RowMouseLeave += waitToOpenMenu.MouseLeave;
keyboardInput = new KeyboardInput(menus);
keyboardInput.RegisterHotKey();
keyboardInput.HotKeyPressed += KeyboardInput_HotKeyPressed;
@ -246,6 +265,7 @@ namespace SystemTrayMenu.Business
IconReader.Dispose();
DisposeMenu(menus[0]);
loadingRowData?.Dispose();
dgvMouseRow.Dispose();
}
internal static MenuData GetData(BackgroundWorker worker, string path, int level)
@ -467,8 +487,9 @@ namespace SystemTrayMenu.Business
menuToDispose.SearchTextChanging -= keyboardInput.SearchTextChanging;
menuToDispose.SearchTextChanged -= Menu_SearchTextChanged;
DataGridView dgv = menuToDispose.GetDataGridView();
dgv.CellMouseEnter -= waitToOpenMenu.MouseEnter;
dgv.CellMouseLeave -= waitToOpenMenu.MouseLeave;
dgv.CellMouseEnter -= dgvMouseRow.CellMouseEnter;
dgv.CellMouseLeave -= dgvMouseRow.CellMouseLeave;
dgv.MouseLeave -= dgvMouseRow.MouseLeave;
dgv.MouseMove -= waitToOpenMenu.MouseMove;
dgv.MouseDown -= Dgv_MouseDown;
dgv.MouseDoubleClick -= Dgv_MouseDoubleClick;
@ -636,23 +657,9 @@ namespace SystemTrayMenu.Business
}
DataGridView dgv = menu.GetDataGridView();
dgv.CellMouseEnter += waitToOpenMenu.MouseEnter;
waitToOpenMenu.MouseEnterOk += Dgv_CellMouseEnter;
void Dgv_CellMouseEnter(DataGridView dgv, int rowIndex)
{
if (menus[0].IsUsable)
{
if (keyboardInput.InUse)
{
keyboardInput.ClearIsSelectedByKey();
keyboardInput.InUse = false;
}
keyboardInput.Select(dgv, rowIndex, false);
}
}
dgv.CellMouseLeave += waitToOpenMenu.MouseLeave;
dgv.CellMouseEnter += dgvMouseRow.CellMouseEnter;
dgv.CellMouseLeave += dgvMouseRow.CellMouseLeave;
dgv.MouseLeave += dgvMouseRow.MouseLeave;
dgv.MouseMove += waitToOpenMenu.MouseMove;
dgv.MouseDown += Dgv_MouseDown;
dgv.MouseDoubleClick += Dgv_MouseDoubleClick;

View file

@ -192,7 +192,7 @@ namespace SystemTrayMenu.Handler
private void ResetData(DataGridView dgv, int rowIndex)
{
if (dgv != null)
if (dgv != null && dgv.Rows.Count > rowIndex)
{
RowData rowData = (RowData)dgv.Rows[rowIndex].Cells[2].Value;
rowData.IsSelected = false;

94
Helpers/DgvMouseRow.cs Normal file
View file

@ -0,0 +1,94 @@
// <copyright file="DgvMouseRow.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace SystemTrayMenu.Helper
{
using System;
using System.Windows.Forms;
public class DgvMouseRow : IDisposable
{
private readonly Timer timerRaiseRowMouseLeave = new Timer();
private DataGridView dgv = null;
private DataGridViewCellEventArgs eventArgs = null;
internal DgvMouseRow()
{
timerRaiseRowMouseLeave.Interval = 200;
timerRaiseRowMouseLeave.Tick += Elapsed;
void Elapsed(object sender, EventArgs e)
{
timerRaiseRowMouseLeave.Stop();
TriggerRowMouseLeave();
}
}
internal event Action<object, DataGridViewCellEventArgs> RowMouseEnter;
internal event Action<object, DataGridViewCellEventArgs> RowMouseLeave;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
internal void CellMouseEnter(object sender, DataGridViewCellEventArgs newEventArgs)
{
DataGridView newDgv = (DataGridView)sender;
if (dgv != newDgv || newEventArgs.RowIndex != eventArgs.RowIndex)
{
if (timerRaiseRowMouseLeave.Enabled)
{
timerRaiseRowMouseLeave.Stop();
TriggerRowMouseLeave();
}
TriggerRowMouseEnter(newDgv, newEventArgs);
}
else
{
timerRaiseRowMouseLeave.Stop();
}
dgv = newDgv;
eventArgs = newEventArgs;
}
internal void CellMouseLeave(object sender, DataGridViewCellEventArgs e)
{
timerRaiseRowMouseLeave.Start();
}
internal void MouseLeave(object sender, EventArgs e)
{
if (timerRaiseRowMouseLeave.Enabled)
{
timerRaiseRowMouseLeave.Stop();
TriggerRowMouseLeave();
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
timerRaiseRowMouseLeave.Dispose();
}
}
private void TriggerRowMouseLeave()
{
RowMouseLeave?.Invoke(dgv, eventArgs);
dgv = null;
eventArgs = null;
}
private void TriggerRowMouseEnter(DataGridView dgv, DataGridViewCellEventArgs e)
{
RowMouseEnter?.Invoke(dgv, e);
}
}
}

View file

@ -39,5 +39,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.9.0")]
[assembly: AssemblyFileVersion("1.0.9.0")]
[assembly: AssemblyVersion("1.0.9.1")]
[assembly: AssemblyFileVersion("1.0.9.1")]