Reuse a loading sub menu for showing completed sub menu

Further simplification of sub menu creation
This commit is contained in:
Peter Kirmeier 2023-04-16 12:42:42 +02:00
parent 3698d7e891
commit 3c7a7a2aaf
2 changed files with 60 additions and 100 deletions

View file

@ -176,33 +176,40 @@ namespace SystemTrayMenu.Business
void LoadSubMenuCompleted(object? senderCompleted, RunWorkerCompletedEventArgs e)
{
if (e.Result == null)
{
return;
}
MenuData menuData = (MenuData)e.Result;
Menu menuLoading = menus[menuData.Level];
string userSearchText = string.Empty;
bool closedLoadingMenu = false;
if (menuLoading != null && menuLoading.IsLoadingMenu)
Menu? menu = menus[menuData.Level];
if (menu == null || !menu.IsLoadingMenu)
{
menuLoading.HideWithFade();
userSearchText = menuLoading.GetSearchText();
menus[menuLoading.Level] = null;
closedLoadingMenu = true;
return;
}
if (menuData.DirectoryState != MenuDataDirectoryState.Undefined &&
menus[0].IsUsable)
if (menus[0].IsUsable)
{
Create(menuData, menuData.RowDataParent.ResolvedPath, userSearchText); // Level 1+ Sub Menu (completed)
}
else if (closedLoadingMenu && menus[0].IsUsable)
{
menuData.RowDataParent.IsMenuOpen = false;
menuData.RowDataParent.IsClicking = false;
menuData.RowDataParent.IsSelected = false;
Menu menuPrevious = menus[menuData.Level - 1];
if (menuPrevious != null)
if (menuData.DirectoryState != MenuDataDirectoryState.Undefined)
{
RefreshSelection(menuPrevious.GetDataGridView());
// Sub Menu (completed)
UpdateMenuContent(menu, menuData);
menu.SetBehavior(menuData.DirectoryState);
AdjustMenusSizeAndLocation();
}
else
{
menu.HideWithFade();
menus[menu.Level] = null;
menuData.RowDataParent.IsMenuOpen = false;
menuData.RowDataParent.IsClicking = false;
menuData.RowDataParent.IsSelected = false;
Menu menuPrevious = menus[menuData.Level - 1];
if (menuPrevious != null)
{
RefreshSelection(menuPrevious.GetDataGridView());
}
}
}
}
@ -573,7 +580,7 @@ namespace SystemTrayMenu.Business
return (App.TaskbarLogo != null && App.TaskbarLogo.IsActive) || IsShellContextMenuOpen();
}
private Menu Create(MenuData menuData, string path, string? userSearchText = null)
private Menu Create(MenuData menuData, string path)
{
Menu menu = new(menuData, path);
@ -633,7 +640,7 @@ namespace SystemTrayMenu.Business
menu.IsVisibleChanged += (sender, _) => MenuVisibleChanged((Menu)sender);
AddItemsToMenu(menuData.RowDatas, menu, out int foldersCount, out int filesCount);
UpdateMenuContent(menu, menuData);
menu.CellMouseEnter += dgvMouseRow.CellMouseEnter;
menu.CellMouseLeave += dgvMouseRow.CellMouseLeave;
@ -658,33 +665,33 @@ namespace SystemTrayMenu.Business
#endif
}
menu.SetCounts(foldersCount, filesCount);
if (menuData.Level == 0)
{
// Main Menu
menus[0] = menu;
menus[menuData.Level] = menu;
menu.Loaded += (s, e) => ExecuteWatcherHistory();
}
else if (menuData.DirectoryState != MenuDataDirectoryState.Undefined)
{
// Sub Menu (completed)
if (menus[0].IsUsable)
{
ShowSubMenu(menu);
menu.SetSearchText(userSearchText);
}
}
else
{
// Sub Menu (loading)
menus[menuData.Level] = menu;
ShowSubMenu(menu);
if (menus[0].IsUsable)
{
HideOldMenu(menu, true);
menus[menu.Level] = menu;
AdjustMenusSizeAndLocation();
menus[menu.Level]?.ShowWithFadeOrTransparent(IsActive());
}
}
return menu;
}
private void UpdateMenuContent(Menu menu, MenuData menuData)
{
AddItemsToMenu(menuData.RowDatas, menu, out int foldersCount, out int filesCount);
menu.SetCounts(foldersCount, filesCount);
}
private void MenuVisibleChanged(Menu menu)
{
if (menu.IsUsable)
@ -695,7 +702,6 @@ namespace SystemTrayMenu.Business
{
menu.SetBehavior(MenuDataDirectoryState.Valid);
menu.ResetSearchText();
menu.ResetHeight();
}
}
@ -1001,14 +1007,6 @@ namespace SystemTrayMenu.Business
});
}
private void ShowSubMenu(Menu menuToShow)
{
HideOldMenu(menuToShow, true);
menus[menuToShow.Level] = menuToShow;
AdjustMenusSizeAndLocation();
menus[menuToShow.Level]?.ShowWithFadeOrTransparent(IsActive());
}
private void HideOldMenu(Menu menuToShow, bool keepOrSetIsMenuOpen = false)
{
Menu menuPrevious = menus[menuToShow.Level - 1];
@ -1340,7 +1338,6 @@ namespace SystemTrayMenu.Business
keyboardInput.ClearIsSelectedByKey();
hideSubmenuDuringRefreshSearch = false;
menus[0].ResetHeight();
menus[0].RefreshSearchText();
hideSubmenuDuringRefreshSearch = true;
}
@ -1384,7 +1381,6 @@ namespace SystemTrayMenu.Business
AddItemsToMenu(rowDatas, menus[0], out _, out _);
hideSubmenuDuringRefreshSearch = false;
menus[0].ResetHeight();
menus[0].RefreshSearchText();
hideSubmenuDuringRefreshSearch = true;

View file

@ -44,7 +44,6 @@ namespace SystemTrayMenu.UserInterface
private Point lastLocation;
#if TODO // SEARCH
private bool isSetSearchText;
private bool dgvHeightSet;
#endif
private bool isClosed = false; // TODO WPF Replace Forms wrapper
private DispatcherTimer timerUpdateIcons = new DispatcherTimer(DispatcherPriority.Render, Dispatcher.CurrentDispatcher);
@ -83,7 +82,7 @@ namespace SystemTrayMenu.UserInterface
title = $"{title[..MenuDefines.LengthMax]}...";
}
txtTitle.Text = title;
txtTitle.Text = Title = title;
foreach (FrameworkElement control in
new List<FrameworkElement>()
@ -408,18 +407,27 @@ namespace SystemTrayMenu.UserInterface
switch (state)
{
case MenuDataDirectoryState.Valid:
IsLoadingMenu = false;
textBoxSearch.TextChanged += (_, _) => TextBoxSearch_TextChanged();
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
buttonOpenFolder.Visibility = Visibility.Visible;
pictureBoxLoading.Visibility = Visibility.Collapsed;
break;
case MenuDataDirectoryState.Empty:
IsLoadingMenu = false;
searchPanel.Visibility = Visibility.Collapsed;
labelStatus.Content = Translator.GetText("Directory empty");
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
buttonOpenFolder.Visibility = Visibility.Visible;
pictureBoxLoading.Visibility = Visibility.Collapsed;
break;
case MenuDataDirectoryState.NoAccess:
IsLoadingMenu = false;
searchPanel.Visibility = Visibility.Collapsed;
labelStatus.Content = Translator.GetText("Directory inaccessible");
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
buttonOpenFolder.Visibility = Visibility.Visible;
pictureBoxLoading.Visibility = Visibility.Collapsed;
break;
case MenuDataDirectoryState.Undefined:
IsLoadingMenu = true;
@ -437,22 +445,6 @@ namespace SystemTrayMenu.UserInterface
}
}
internal string GetSearchText()
{
return textBoxSearch.Text;
}
internal void SetSearchText(string? userSearchText)
{
if (!string.IsNullOrEmpty(userSearchText))
{
textBoxSearch.Text = userSearchText + "*";
#if TODO // SEARCH
isSetSearchText = true;
#endif
}
}
internal bool IsMouseOn()
{
Point mousePos = NativeMethods.Screen.CursorPosition;
@ -467,6 +459,11 @@ namespace SystemTrayMenu.UserInterface
return dgv;
}
internal void RefreshDataGridView()
{
((CollectionView)CollectionViewSource.GetDefaultView(dgv.ItemsSource)).Refresh();
}
internal void ShowWithFadeOrTransparent(bool formActiveFormIsMenu)
{
if (formActiveFormIsMenu)
@ -810,22 +807,7 @@ namespace SystemTrayMenu.UserInterface
windowFrame.CornerRadius = new CornerRadius(CornerRadius);
}
// Keep its size when once created.
SizeToContent = SizeToContent.Manual;
}
}
internal void ResetHeight()
{
if (IsLoaded)
{
// TODO: WPF Check if this "reset" works
SizeToContent = SizeToContent.WidthAndHeight;
UpdateLayout();
SizeToContent = SizeToContent.Manual;
#if TODO // SEARCH
dgvHeightSet = false;
#endif
}
}
@ -927,27 +909,9 @@ namespace SystemTrayMenu.UserInterface
dgv.Tag = true;
}
#if TODO // SEARCH
if (!dgvHeightSet && dgvHeightByItems > 0 && dgvHeightMax > 0)
{
#endif
double heightMaxByOptions = Scaling.Factor * Scaling.FactorByDpi *
450f * (Settings.Default.HeightMaxInPercent / 100f);
MaxHeight = Math.Min(screenHeightMax, heightMaxByOptions);
#if TODO // SEARCH
dgvHeightSet = true;
}
#endif
#if TODO // SEARCH and TOUCH
if (dgvHeightByItems > dgvHeightMax)
{
ScrollbarVisible = true;
}
else
{
ScrollbarVisible = false;
}
#endif
}
private void AdjustDataGridViewWidth()
@ -1216,7 +1180,7 @@ namespace SystemTrayMenu.UserInterface
}
else
{
((CollectionView)CollectionViewSource.GetDefaultView(dgv.ItemsSource)).Refresh();
RefreshDataGridView();
}
}