diff --git a/Business/App.xaml.cs b/Business/App.xaml.cs index 2d564fb..763a6c1 100644 --- a/Business/App.xaml.cs +++ b/Business/App.xaml.cs @@ -28,7 +28,6 @@ namespace SystemTrayMenu public App() { AppRestart.BeforeRestarting += Dispose; - SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; menus.LoadStarted += menuNotifyIcon.LoadingStart; menus.LoadStopped += menuNotifyIcon.LoadingStop; menuNotifyIcon.Click += () => menus.SwitchOpenClose(true); @@ -65,17 +64,11 @@ namespace SystemTrayMenu TaskbarLogo?.Close(); TaskbarLogo = null; - SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged; menus.Dispose(); menuNotifyIcon.Dispose(); isDisposed = true; } } - - private void SystemEvents_DisplaySettingsChanged(object? sender, EventArgs e) - { - menus.ReAdjustSizeAndLocation(); - } } } diff --git a/Business/KeyboardInput.cs b/Business/KeyboardInput.cs index d22ba21..81cc18d 100644 --- a/Business/KeyboardInput.cs +++ b/Business/KeyboardInput.cs @@ -14,6 +14,7 @@ namespace SystemTrayMenu.Handler using SystemTrayMenu.DataClasses; using SystemTrayMenu.Helper; using SystemTrayMenu.Utilities; + using static System.Net.Mime.MediaTypeNames; using ListView = System.Windows.Controls.ListView; using Menu = SystemTrayMenu.UserInterface.Menu; @@ -214,9 +215,8 @@ namespace SystemTrayMenu.Handler if (dgv.Items.Count > index) { -#if TODO - DataGridViewRow row = dgv.Items[i]; - RowData rowData = (RowData)row.Cells[2].Value; + Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[index]; + RowData rowData = itemData.data; if (rowData != null) { rowData.IsSelected = true; @@ -224,10 +224,13 @@ namespace SystemTrayMenu.Handler if (refreshview) { - row.Selected = false; - row.Selected = true; + if (dgv.SelectedItems.Contains(itemData)) + { + dgv.SelectedItems.Remove(itemData); + } + + dgv.SelectedItems.Add(itemData); } -#endif } } @@ -244,17 +247,14 @@ namespace SystemTrayMenu.Handler dgv = menu.GetDataGridView(); if (dgv.Items.Count > iRowKey) { -#if TODO - RowData rowData = (RowData)dgv. - Items[iRowKey].Cells[2].Value; + Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[iRowKey]; + RowData rowData = itemData.data; if (rowData.IsSelected) { isStillSelected = true; menuFromSelected = rowData.SubMenu; - textselected = dgv.Rows[iRowKey]. - Cells[1].Value.ToString(); + textselected = itemData.ColumnText; } -#endif } } @@ -554,31 +554,22 @@ namespace SystemTrayMenu.Handler i != iRowKey && dgv.Items.Count > i) { -#if TODO - DataGridViewRow row = dgv.Items[i]; - RowData rowData = (RowData)row.Cells[2].Value; - string text = row.Cells[1].Value.ToString(); - if (text.StartsWith(keyInput, true, CultureInfo.InvariantCulture)) + Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[i]; + RowData rowData = itemData.data; + if (itemData.ColumnText.StartsWith(keyInput, true, CultureInfo.InvariantCulture)) { iRowKey = rowData.RowIndex; rowData.IsSelected = true; - row.Selected = false; - row.Selected = true; - if (row.Index < dgv.FirstDisplayedScrollingRowIndex) + if (dgv.SelectedItems.Contains(itemData)) { - dgv.FirstDisplayedScrollingRowIndex = row.Index; - } - else if (row.Index >= - dgv.FirstDisplayedScrollingRowIndex + - dgv.DisplayedRowCount(false)) - { - dgv.FirstDisplayedScrollingRowIndex = row.Index - - dgv.DisplayedRowCount(false) + 1; + dgv.SelectedItems.Remove(itemData); } + dgv.SelectedItems.Add(itemData); + dgv.ScrollIntoView(itemData); + found = true; } -#endif } return found; @@ -592,16 +583,18 @@ namespace SystemTrayMenu.Handler ListView dgv = menu.GetDataGridView(); if (dgv.Items.Count > rowIndex) { -#if TODO - DataGridViewRow row = dgv.Rows[rowIndex]; - row.Selected = false; - RowData rowData = (RowData)row.Cells[2].Value; + Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[rowIndex]; + RowData rowData = itemData.data; + if (dgv.SelectedItems.Contains(itemData)) + { + dgv.SelectedItems.Remove(itemData); + } + if (rowData != null) { rowData.IsSelected = false; rowData.IsClicking = false; } -#endif } } } diff --git a/Business/Menus.cs b/Business/Menus.cs index 384e8a7..5f73c48 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -14,6 +14,7 @@ namespace SystemTrayMenu.Business using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; + using Microsoft.Win32; using SystemTrayMenu.DataClasses; using SystemTrayMenu.DllImports; using SystemTrayMenu.Handler; @@ -319,6 +320,8 @@ namespace SystemTrayMenu.Business Log.Warn($"Failed to {nameof(CreateWatcher)}: {path}", ex); } } + + SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; } internal event Action LoadStarted; @@ -338,6 +341,7 @@ namespace SystemTrayMenu.Business public void Dispose() { + SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged; workerMainMenu.Dispose(); foreach (BackgroundWorker worker in workersSubMenu) { @@ -351,7 +355,7 @@ namespace SystemTrayMenu.Business timerStillActiveCheck.Stop(); waitLeave.Dispose(); IconReader.Dispose(); - DisposeMenu(menus[0]); + menus[0]?.Close(); dgvMouseRow.Dispose(); foreach (FileSystemWatcher watcher in watchers) @@ -447,54 +451,6 @@ namespace SystemTrayMenu.Business deactivatedTime = DateTime.MinValue; } - internal void DisposeMenu(Menu menuToDispose) - { - if (menuToDispose != null) - { - menuToDispose.CellMouseEnter -= dgvMouseRow.CellMouseEnter; - menuToDispose.CellMouseLeave -= dgvMouseRow.CellMouseLeave; - menuToDispose.CellMouseDown -= Dgv_MouseDown; - menuToDispose.CellMouseUp -= Dgv_MouseUp; - menuToDispose.CellMouseClick -= Dgv_MouseClick; - menuToDispose.CellMouseDoubleClick -= Dgv_MouseDoubleClick; -#if TODO - menuToDispose.MouseWheel -= AdjustMenusSizeAndLocation; - menuToDispose.MouseLeave -= waitLeave.Start; - menuToDispose.MouseEnter -= waitLeave.Stop; - menuToDispose.CmdKeyProcessed -= keyboardInput.CmdKeyProcessed; - menuToDispose.SearchTextChanging -= keyboardInput.SearchTextChanging; - menuToDispose.KeyPressCheck -= Menu_KeyPressCheck; - menuToDispose.SearchTextChanged -= Menu_SearchTextChanged; - ListView dgv = menuToDispose.GetDataGridView(); - if (dgv != null) - { - dgv.MouseLeave -= dgvMouseRow.MouseLeave; - dgv.MouseLeave -= Dgv_MouseLeave; - dgv.MouseMove -= waitToOpenMenu.MouseMove; - dgv.MouseMove -= Dgv_MouseMove; - dgv.SelectionChanged -= Dgv_SelectionChanged; - dgv.RowPostPaint -= Dgv_RowPostPaint; - dgv.ClearSelection(); - - foreach (DataGridViewRow row in dgv.Rows) - { - RowData rowData = (RowData)row.Cells[2].Value; - DisposeMenu(rowData.SubMenu); - } - } - menuToDispose.Dispose(); -#endif - } - } - - internal void ReAdjustSizeAndLocation() - { - if (menus[0].IsUsable) - { - menus[0].Tag = null; - } - } - internal void MainPreload() { IconReader.MainPreload = true; @@ -748,7 +704,7 @@ namespace SystemTrayMenu.Business if (menu.Visibility != Visibility.Visible && menu.Level != 0) { - DisposeMenu(menu); + menu.Close(); } if (!AsEnumerable.Any(m => m.Visibility == Visibility.Visible)) @@ -817,7 +773,7 @@ namespace SystemTrayMenu.Business MouseEnterOk(dgv, index, true); - // TODO WPF: Move directly into ListViewItem_MouseDown ? + // TODO WPF: Move directly into ListViewItem_PreviewMouseDown ? ((Menu.ListViewItemData)dgv.Items[index]).data.MouseDown(dgv, e); if (e.LeftButton == MouseButtonState.Pressed) @@ -991,9 +947,7 @@ namespace SystemTrayMenu.Business if (!searchTextChanging) { -#if TODO - dgv.Invalidate(); -#endif + dgv.InvalidateVisual(); } } @@ -1049,6 +1003,14 @@ namespace SystemTrayMenu.Business } #endif + private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) + { + if (menus[0].IsUsable) + { + menus[0].Tag = null; + } + } + private void ShowSubMenu(Menu menuToShow) { HideOldMenu(menuToShow, true); @@ -1201,7 +1163,7 @@ namespace SystemTrayMenu.Business menu = list[i]; menu.AdjustSizeAndLocation(screenBounds, menuPredecessor, startLocation, isCustomLocationOutsideOfScreen); -#if TODO // What is this, doesn't seem to have any effect ? + if (!Properties.Settings.Default.AppearAtTheBottomLeft && !Properties.Settings.Default.AppearAtMouseLocation && !Properties.Settings.Default.UseCustomLocation && @@ -1217,7 +1179,7 @@ namespace SystemTrayMenu.Business screenBounds.Width -= (int)menu.Width - overlapTolerance; } -#endif + menuPredecessor = menu; } } diff --git a/UserInterface/Menu.xaml b/UserInterface/Menu.xaml index ea2c557..cdc7d9c 100644 --- a/UserInterface/Menu.xaml +++ b/UserInterface/Menu.xaml @@ -158,7 +158,7 @@ - + diff --git a/UserInterface/Menu.xaml.cs b/UserInterface/Menu.xaml.cs index d121ea3..39160c4 100644 --- a/UserInterface/Menu.xaml.cs +++ b/UserInterface/Menu.xaml.cs @@ -212,6 +212,14 @@ namespace SystemTrayMenu.UserInterface IsHandleCreated = true; HandleCreated?.Invoke(sender, e); }; + + Closed += (sender, e) => + { + foreach (ListViewItemData item in dgv.Items) + { + item.data.SubMenu?.Close(); + } + }; } #if TODO @@ -886,32 +894,7 @@ namespace SystemTrayMenu.UserInterface (double)(Scaling.Factor * Scaling.FactorByDpi * 400f * (Properties.Settings.Default.WidthMaxInPercent / 100f))); #endif -#if TODO - int widthIcon = dgv.Columns[0].Width; - int widthText = dgv.Columns[1].Width; - - using Graphics gfx = labelTitle.CreateGraphics(); - gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; - int withTitle = (int)(gfx.MeasureString( - txtTitle.Text + "___", - dgv.RowTemplate.DefaultCellStyle.Font).Width + 0.5); - - if (withTitle > (widthIcon + widthText)) - { - tableLayoutPanelDgvAndScrollbar.MinimumSize = new Size(withTitle, 0); - dgv.Width = withTitle; - dgv.Columns[1].Width = dgv.Width - widthIcon; - } - else - { - tableLayoutPanelDgvAndScrollbar.MinimumSize = new Size(widthIcon + widthText, 0); - dgv.Width = widthIcon + widthText; - dgv.Columns[1].Width = dgv.Width - widthIcon; - } - - DataTable dataTable = (DataTable)dgv.DataSource; - dataTable.DefaultView.RowFilter = RowFilterShowAll; -#endif + ((CollectionView)CollectionViewSource.GetDefaultView(dgv.ItemsSource)).Filter = null; } #if TODO @@ -1280,9 +1263,11 @@ namespace SystemTrayMenu.UserInterface CellMouseLeave?.Invoke(dgv, dgv.Items.IndexOf(((ListViewItem)sender).Content)); } - private void ListViewItem_MouseDown(object sender, MouseButtonEventArgs e) + private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) { +#if TODO // Why sender is a disconnected item, needed at all? CellMouseDown?.Invoke(dgv, dgv.Items.IndexOf(((ListViewItem)sender).Content), e); +#endif } private void ListViewItem_MouseUp(object sender, MouseButtonEventArgs e)