Simplified menu initialization based on directory state

This commit is contained in:
Peter Kirmeier 2023-04-16 15:45:47 +02:00
parent 0158499a2c
commit 61e10bea00
3 changed files with 109 additions and 144 deletions

View file

@ -182,7 +182,7 @@ namespace SystemTrayMenu.Business
MenuData menuData = (MenuData)e.Result;
Menu? menu = menus[menuData.Level];
if (menu == null || !menu.IsLoadingMenu)
if (menu == null)
{
return;
}
@ -192,8 +192,8 @@ namespace SystemTrayMenu.Business
if (menuData.DirectoryState != MenuDataDirectoryState.Undefined)
{
// Sub Menu (completed)
UpdateMenuContent(menu, menuData);
menu.SetBehavior(menuData.DirectoryState);
menu.AddItemsToMenu(menuData.RowDatas);
menu.SetSubMenuState(menuData.DirectoryState);
AdjustMenusSizeAndLocation();
}
else
@ -481,42 +481,6 @@ namespace SystemTrayMenu.Business
#endif
}
private static void AddItemsToMenu(List<RowData> data, Menu menu, out int foldersCount, out int filesCount)
{
foldersCount = 0;
filesCount = 0;
ListView? lv = menu.GetDataGridView();
if (lv != null)
{
List<Menu.ListViewItemData> items = new();
foreach (RowData rowData in data)
{
if (!(rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult))
{
if (rowData.ContainsMenu)
{
foldersCount++;
}
else
{
filesCount++;
}
}
rowData.RowIndex = items.Count; // Index
items.Add(new(
(rowData.HiddenEntry ? IconReader.AddIconOverlay(rowData.Icon, Properties.Resources.White50Percentage) : rowData.Icon)?.ToImageSource(),
rowData.Text ?? "?",
rowData,
rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult ? 99 : 0));
}
lv.ItemsSource = items;
}
}
private bool IsActive()
{
bool IsShellContextMenuOpen()
@ -608,7 +572,7 @@ namespace SystemTrayMenu.Business
menu.IsVisibleChanged += (sender, _) => MenuVisibleChanged((Menu)sender);
UpdateMenuContent(menu, menuData);
menu.AddItemsToMenu(menuData.RowDatas);
menu.CellMouseEnter += dgvMouseRow.CellMouseEnter;
menu.CellMouseLeave += dgvMouseRow.CellMouseLeave;
@ -654,12 +618,6 @@ namespace SystemTrayMenu.Business
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)
@ -668,7 +626,6 @@ namespace SystemTrayMenu.Business
if (menu.Level == 0)
{
menu.SetBehavior(MenuDataDirectoryState.Valid);
menu.ResetSearchText();
}
}
@ -1190,17 +1147,17 @@ namespace SystemTrayMenu.Business
private void WatcherProcessItem(object sender, EventArgs e)
{
bool UseHistory = false;
bool useHistory = false;
if (menus[0] == null)
{
UseHistory = true;
useHistory = true;
}
else
{
menus[0].Dispatcher.Invoke(() => UseHistory = !menus[0].IsLoaded);
menus[0].Dispatcher.Invoke(() => useHistory = !menus[0].IsLoaded);
}
if (UseHistory)
if (useHistory)
{
watcherHistory.Add(e);
return;
@ -1263,7 +1220,7 @@ namespace SystemTrayMenu.Business
rowDatas = DirectoryHelpers.SortItems(rowDatas);
keyboardInput.ClearIsSelectedByKey();
AddItemsToMenu(rowDatas, menus[0], out _, out _);
menus[0].AddItemsToMenu(rowDatas);
hideSubmenuDuringRefreshSearch = false;
menus[0].RefreshSearchText();
@ -1346,7 +1303,7 @@ namespace SystemTrayMenu.Business
rowDatas = DirectoryHelpers.SortItems(rowDatas);
keyboardInput.ClearIsSelectedByKey();
AddItemsToMenu(rowDatas, menus[0], out _, out _);
menus[0].AddItemsToMenu(rowDatas);
hideSubmenuDuringRefreshSearch = false;
menus[0].RefreshSearchText();

View file

@ -97,7 +97,7 @@
<DockPanel x:Name="searchPanel" DockPanel.Dock="Top" Margin="6,0">
<Separator x:Name="panelLine" Height="1" Margin="0,1" DockPanel.Dock="Bottom"/>
<Image x:Name="pictureBoxSearch" Width="16" Height="16" Margin="1" DockPanel.Dock="Left" Source="{StaticResource ic_fluent_search_48_regularDrawingImage}"/>
<TextBox x:Name="textBoxSearch" BorderBrush="{x:Null}" TextInput="textBoxSearch_TextInput" Background="{x:Null}" SelectionTextBrush="Red" SelectionBrush="#FFDAFF00" />
<TextBox x:Name="textBoxSearch" BorderBrush="{x:Null}" TextInput="TextBoxSearch_TextInput" Background="{x:Null}" SelectionTextBrush="Red" SelectionBrush="#FFDAFF00" />
</DockPanel>
<DockPanel x:Name="tableLayoutPanelBottom" DockPanel.Dock="Bottom" Margin="12,4">

View file

@ -59,6 +59,36 @@ namespace SystemTrayMenu.UserInterface
InitializeComponent();
if (!Config.ShowDirectoryTitleAtTop)
{
txtTitle.Visibility = Visibility.Hidden;
}
if (!Config.ShowSearchBar)
{
searchPanel.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyOpenFolder)
{
buttonOpenFolder.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyPinMenu)
{
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeySettings)
{
buttonSettings.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyRestart)
{
buttonRestart.Visibility = Visibility.Collapsed;
}
folderPath = path;
RowDataParent = menuData.RowDataParent;
Level = menuData.Level;
@ -74,6 +104,16 @@ namespace SystemTrayMenu.UserInterface
{
RowDataParent.SubMenu = this;
}
buttonOpenFolder.Visibility = Visibility.Collapsed;
buttonSettings.Visibility = Visibility.Collapsed;
buttonRestart.Visibility = Visibility.Collapsed;
labelStatus.Content = Translator.GetText("loading");
// Todo: use embedded resources that we can assign image in XAML already
pictureBoxLoading.Source = SystemTrayMenu.Resources.StaticResources.LoadingIcon.ToImageSource();
pictureBoxLoading.Visibility = Visibility.Visible;
}
string title = new DirectoryInfo(path).Name;
@ -112,7 +152,7 @@ namespace SystemTrayMenu.UserInterface
MouseUp += Menu_MouseUp;
MouseMove += Menu_MouseMove;
textBoxSearch.TextChanged += (_, _) => TextBoxSearch_TextChanged();
textBoxSearch.ContextMenu = new()
{
Background = SystemColors.ControlBrush,
@ -238,12 +278,6 @@ namespace SystemTrayMenu.UserInterface
item.data.SubMenu?.Close();
}
};
// This will be a submenu..
if (Level > 0)
{
SetBehavior(menuData.DirectoryState);
}
}
internal event Action? MenuScrolled;
@ -298,8 +332,6 @@ namespace SystemTrayMenu.UserInterface
TopRight,
}
public bool IsLoadingMenu { get; internal set; } // TODO State out of window
public bool IsDisposed => isClosed; // TODO WPF Replace Forms wrapper
public bool Disposing => isClosed; // TODO WPF Replace Forms wrapper
@ -355,93 +387,35 @@ namespace SystemTrayMenu.UserInterface
#endif
}
internal void SetBehavior(MenuDataDirectoryState state)
internal void SetSubMenuState(MenuDataDirectoryState state)
{
if (!Config.ShowDirectoryTitleAtTop)
if (Config.ShowFunctionKeyOpenFolder)
{
txtTitle.Visibility = Visibility.Hidden;
buttonOpenFolder.Visibility = Visibility.Visible;
}
if (!Config.ShowSearchBar)
{
searchPanel.Visibility = Visibility.Collapsed;
}
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
pictureBoxLoading.Visibility = Visibility.Collapsed;
if (!(Config.ShowCountOfElementsBelow || state != MenuDataDirectoryState.Valid))
switch (state)
{
// Hide status when neither config is set nor an error message must be shown
labelStatus.Visibility = Visibility.Collapsed;
}
case MenuDataDirectoryState.Valid:
if (!Config.ShowCountOfElementsBelow)
{
labelStatus.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyOpenFolder)
{
buttonOpenFolder.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyPinMenu)
{
buttonMenuAlwaysOpen.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeySettings)
{
buttonSettings.Visibility = Visibility.Collapsed;
}
if (!Config.ShowFunctionKeyRestart)
{
buttonRestart.Visibility = Visibility.Collapsed;
}
if (Level == 0)
{
// Main Menu
textBoxSearch.TextChanged += (_, _) => TextBoxSearch_TextChanged();
}
else
{
// SubMenu
buttonSettings.Visibility = Visibility.Collapsed;
buttonRestart.Visibility = Visibility.Collapsed;
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;
labelStatus.Content = Translator.GetText("loading");
buttonMenuAlwaysOpen.Visibility = Visibility.Visible;
buttonOpenFolder.Visibility = Visibility.Collapsed;
// Todo: use embedded resources that we can assign image in XAML already
pictureBoxLoading.Source = SystemTrayMenu.Resources.StaticResources.LoadingIcon.ToImageSource();
pictureBoxLoading.Visibility = Visibility.Visible;
break;
default:
break;
}
break;
case MenuDataDirectoryState.Empty:
searchPanel.Visibility = Visibility.Collapsed;
labelStatus.Content = Translator.GetText("Directory empty");
break;
case MenuDataDirectoryState.NoAccess:
searchPanel.Visibility = Visibility.Collapsed;
labelStatus.Content = Translator.GetText("Directory inaccessible");
break;
default:
break;
}
}
@ -464,6 +438,40 @@ namespace SystemTrayMenu.UserInterface
((CollectionView)CollectionViewSource.GetDefaultView(dgv.ItemsSource)).Refresh();
}
internal void AddItemsToMenu(List<RowData> data)
{
int foldersCount = 0;
int filesCount = 0;
List<ListViewItemData> items = new();
foreach (RowData rowData in data)
{
if (!(rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult))
{
if (rowData.ContainsMenu)
{
foldersCount++;
}
else
{
filesCount++;
}
}
rowData.RowIndex = items.Count; // Index
items.Add(new(
(rowData.HiddenEntry ? IconReader.AddIconOverlay(rowData.Icon, Properties.Resources.White50Percentage) : rowData.Icon)?.ToImageSource(),
rowData.Text ?? "?",
rowData,
rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult ? 99 : 0));
}
dgv.ItemsSource = items;
SetCounts(foldersCount, filesCount);
}
internal void ShowWithFadeOrTransparent(bool formActiveFormIsMenu)
{
if (formActiveFormIsMenu)
@ -1269,7 +1277,7 @@ namespace SystemTrayMenu.UserInterface
public int SortIndex { get; set; }
}
private void textBoxSearch_TextInput(object sender, TextCompositionEventArgs e)
private void TextBoxSearch_TextInput(object sender, TextCompositionEventArgs e)
{
// TODO WPF
}