From b735ad4b4687a14f95bd08bb6bfe549d76308151 Mon Sep 17 00:00:00 2001 From: Peter Kirmeier Date: Thu, 27 Apr 2023 22:19:02 +0200 Subject: [PATCH] Simplified MenuData and speedup sub menu closing --- Business/Menus.cs | 101 +++++++++++++++--------------------- Business/WaitToLoadMenu.cs | 6 +-- DataClasses/MenuData.cs | 10 ++-- Helpers/DirectoryHelpers.cs | 11 ++-- UserInterface/Menu.xaml.cs | 2 + 5 files changed, 55 insertions(+), 75 deletions(-) diff --git a/Business/Menus.cs b/Business/Menus.cs index b1d894e..6afa28b 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -98,51 +98,6 @@ namespace SystemTrayMenu.Business workerSubMenu.RunWorkerAsync(rowData); } - - void LoadSubMenuCompleted(object? senderCompleted, RunWorkerCompletedEventArgs e) - { - if (e.Result == null) - { - return; - } - - MenuData menuData = (MenuData)e.Result; - Menu? menu = menus[menuData.Level]; - if (menu == null) - { - return; - } - - if (IsMainUsable) - { - if (menuData.DirectoryState != MenuDataDirectoryState.Undefined) - { - // Sub Menu (completed) - menu.AddItemsToMenu(menuData.RowDatas); - menu.SetSubMenuState(menuData.DirectoryState); - AdjustMenusSizeAndLocation(menu.Level); - menu.TimerUpdateIconsStart(); - } - else - { - menu.HideWithFade(); - menus[menu.Level] = null; - - if (menuData.RowDataParent != null) - { - menuData.RowDataParent.IsMenuOpen = false; - menuData.RowDataParent.IsClicking = false; - menuData.RowDataParent.IsSelected = false; - } - - ListView? lv = menus[menuData.Level - 1]?.GetDataGridView(); - if (lv != null) - { - RefreshSelection(lv); - } - } - } - } } waitToOpenMenu.CloseMenu += CloseMenu; @@ -156,11 +111,6 @@ namespace SystemTrayMenu.Business HideOldMenu(menu); } } - - if (level - 1 < menus.Length && menus[level - 1] != null) - { - menus[level - 1]?.FocusTextBox(); - } } waitToOpenMenu.MouseEnterOk += MouseEnterOk; @@ -442,11 +392,7 @@ namespace SystemTrayMenu.Business IconReader.IsPreloading = false; if (showMenuAfterMainPreload) { - Menu? menu = menus[0]; - if (menu != null) - { - menu.ShowWithFade(); - } + menus[0]?.ShowWithFade(); } } else @@ -478,6 +424,44 @@ namespace SystemTrayMenu.Business openCloseState = OpenCloseState.Default; } + private void LoadSubMenuCompleted(object? senderCompleted, RunWorkerCompletedEventArgs e) + { + if (e.Result == null) + { + return; + } + + MenuData menuData = (MenuData)e.Result; + Menu? menu = menus[menuData.Level]; + if (menu == null) + { + return; + } + + if (IsMainUsable) + { + if (menuData.DirectoryState != MenuDataDirectoryState.Undefined) + { + // Sub Menu (completed) + menu.AddItemsToMenu(menuData.RowDatas); + menu.SetSubMenuState(menuData.DirectoryState); + AdjustMenusSizeAndLocation(menu.Level); + menu.TimerUpdateIconsStart(); + } + else + { + menu.HideWithFade(); + menus[menu.Level] = null; + + ListView? lv = menus[menuData.Level - 1]?.GetDataGridView(); + if (lv != null) + { + RefreshSelection(lv); + } + } + } + } + private bool IsActive() { bool IsShellContextMenuOpen() @@ -594,9 +578,6 @@ namespace SystemTrayMenu.Business } menu.IsVisibleChanged += (sender, _) => MenuVisibleChanged((Menu)sender); - - menu.AddItemsToMenu(menuData.RowDatas); - menu.CellMouseEnter += waitToOpenMenu.MouseEnter; menu.CellMouseLeave += waitToOpenMenu.MouseLeave; menu.CellMouseDown += Dgv_MouseDown; @@ -616,10 +597,10 @@ namespace SystemTrayMenu.Business #endif } - if (menuData.Level == 0) + if (menu.Level == 0) { // Main Menu - menus[menuData.Level] = menu; + menus[menu.Level] = menu; menu.Loaded += (s, e) => ExecuteWatcherHistory(); } else diff --git a/Business/WaitToLoadMenu.cs b/Business/WaitToLoadMenu.cs index 653a67e..68c1fa8 100644 --- a/Business/WaitToLoadMenu.cs +++ b/Business/WaitToLoadMenu.cs @@ -171,13 +171,11 @@ namespace SystemTrayMenu.Handler RowData rowData = dgvItemData.data; Menu menu = (Menu)dgv.GetParentWindow(); rowData.Level = menu.Level; - if (rowData.ContainsMenu) - { - CloseMenu?.Invoke(rowData.Level + 2); - } CloseMenu?.Invoke(rowData.Level + 1); + menu?.FocusTextBox(); + if (!rowData.IsContextMenuOpen && rowData.ContainsMenu && rowData.Level + 1 < MenuDefines.MenusMax) diff --git a/DataClasses/MenuData.cs b/DataClasses/MenuData.cs index 716637a..4ecd307 100644 --- a/DataClasses/MenuData.cs +++ b/DataClasses/MenuData.cs @@ -37,14 +37,12 @@ namespace SystemTrayMenu.DataClasses RowDataParent = rowDataParent; } - internal List RowDatas { get; set; } = new (); - - internal MenuDataDirectoryState DirectoryState { get; set; } = MenuDataDirectoryState.Undefined; - internal int Level { get; } internal RowData? RowDataParent { get; set; } - internal bool IsNetworkRoot { get; set; } = false; + internal List RowDatas { get; set; } = new (); + + internal MenuDataDirectoryState DirectoryState { get; set; } = MenuDataDirectoryState.Undefined; } -} \ No newline at end of file +} diff --git a/Helpers/DirectoryHelpers.cs b/Helpers/DirectoryHelpers.cs index 4fb108e..ebc5a38 100644 --- a/Helpers/DirectoryHelpers.cs +++ b/Helpers/DirectoryHelpers.cs @@ -18,10 +18,11 @@ namespace SystemTrayMenu.Helpers { internal static void DiscoverItems(BackgroundWorker? worker, string path, ref MenuData menuData) { + bool isNetworkRoot = false; try { - menuData.IsNetworkRoot = FileLnk.IsNetworkRoot(path); - if (menuData.IsNetworkRoot) + isNetworkRoot = FileLnk.IsNetworkRoot(path); + if (isNetworkRoot) { DiscoverNetworkRootDirectories(path, ref menuData); } @@ -53,7 +54,7 @@ namespace SystemTrayMenu.Helpers } } - RemoveHiddenOrReadIcons(worker, ref menuData); + RemoveHiddenOrReadIcons(worker, isNetworkRoot, ref menuData); if (menuData.RowDatas.Count == 0) { @@ -115,7 +116,7 @@ namespace SystemTrayMenu.Helpers return rowDatas; } - private static void RemoveHiddenOrReadIcons(BackgroundWorker? worker, ref MenuData menuData) + private static void RemoveHiddenOrReadIcons(BackgroundWorker? worker, bool isNetworkRoot, ref MenuData menuData) { List rowDatasToRemove = new(); foreach (RowData rowData in menuData.RowDatas) @@ -125,7 +126,7 @@ namespace SystemTrayMenu.Helpers return; } - if (!menuData.IsNetworkRoot) + if (!isNetworkRoot) { FolderOptions.ReadHiddenAttributes(rowData.Path, out bool hasHiddenFlag, out bool isDirectoryToHide); if (isDirectoryToHide) diff --git a/UserInterface/Menu.xaml.cs b/UserInterface/Menu.xaml.cs index 2c0395a..d5af8cf 100644 --- a/UserInterface/Menu.xaml.cs +++ b/UserInterface/Menu.xaml.cs @@ -280,6 +280,8 @@ namespace SystemTrayMenu.UserInterface item.data.SubMenu?.Close(); } }; + + AddItemsToMenu(menuData.RowDatas); } internal event Action? MenuScrolled;