mirror of
https://github.com/Hofknecht/SystemTrayMenu.git
synced 2024-05-21 04:42:27 +12:00
[BUG] Fix rare issue when mouse moves between icon and text (#118), version 1.0.9.1
This commit is contained in:
parent
b595ecbe8a
commit
b0cdfe1ab2
|
@ -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;
|
||||
|
|
|
@ -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
94
Helpers/DgvMouseRow.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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")]
|
||||
|
|
Loading…
Reference in a new issue