From 7211e4dff1d0e8d574e9109b69c1552c1b5575b7 Mon Sep 17 00:00:00 2001 From: Markus Hofknecht Date: Mon, 20 Jun 2022 17:39:39 +0200 Subject: [PATCH] [Feature] Refresh root folder on change of contents (#330), version 1.2.9.23 --- Business/Menus.cs | 108 ++++++++++++++---- NativeDllImport/CreateRoundRectRgn.cs | 2 +- Properties/AssemblyInfo.cs | 4 +- .../HotkeyTextboxControl/HotkeyControl.cs | 6 +- UserInterface/Menu.cs | 5 +- Utilities/DataGridViewExtensions.cs | 2 - 6 files changed, 92 insertions(+), 35 deletions(-) diff --git a/Business/Menus.cs b/Business/Menus.cs index 1dcc4ec..209af0f 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -31,7 +31,7 @@ namespace SystemTrayMenu.Business private readonly WaitToLoadMenu waitToOpenMenu = new(); private readonly KeyboardInput keyboardInput; private readonly List watchers = new(); - private readonly List watcherHistory = new(); + private readonly List watcherHistory = new(); private readonly Timer timerShowProcessStartedAsLoadingIcon = new(); private readonly Timer timerStillActiveCheck = new(); private readonly WaitLeave waitLeave = new(Properties.Settings.Default.TimeUntilCloses); @@ -313,7 +313,7 @@ namespace SystemTrayMenu.Business { try { - FileSystemWatcher watcher = new FileSystemWatcher(); + FileSystemWatcher watcher = new(); watcher.Path = path; watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.DirectoryName | @@ -322,8 +322,8 @@ namespace SystemTrayMenu.Business watcher.Filter = "*.*"; watcher.Created += WatcherProcessItem; watcher.Deleted += WatcherProcessItem; - watcher.Renamed += WatcherRenamed; - watcher.Changed += WatcherChanged; + watcher.Renamed += WatcherProcessItem; + watcher.Changed += WatcherProcessItem; watcher.IncludeSubdirectories = recursiv; watcher.EnableRaisingEvents = true; watchers.Add(watcher); @@ -370,8 +370,8 @@ namespace SystemTrayMenu.Business { watcher.Created -= WatcherProcessItem; watcher.Deleted -= WatcherProcessItem; - watcher.Renamed -= WatcherRenamed; - watcher.Changed -= WatcherChanged; + watcher.Renamed -= WatcherProcessItem; + watcher.Changed -= WatcherProcessItem; watcher.Dispose(); } } @@ -1300,19 +1300,7 @@ namespace SystemTrayMenu.Business watcherHistory.Clear(); } - private void WatcherRenamed(object sender, RenamedEventArgs e) - { - WatcherProcessItem(sender, new FileSystemEventArgs(WatcherChangeTypes.Deleted, Path.GetDirectoryName(e.OldFullPath), e.OldName)); - WatcherProcessItem(sender, new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(e.FullPath), e.Name)); - } - - private void WatcherChanged(object sender, FileSystemEventArgs e) - { - WatcherProcessItem(sender, new FileSystemEventArgs(WatcherChangeTypes.Deleted, Path.GetDirectoryName(e.FullPath), e.Name)); - WatcherProcessItem(sender, new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(e.FullPath), e.Name)); - } - - private void WatcherProcessItem(object sender, FileSystemEventArgs e) + private void WatcherProcessItem(object sender, EventArgs e) { if (menus[0] == null || !menus[0].IsHandleCreated) { @@ -1320,13 +1308,85 @@ namespace SystemTrayMenu.Business return; } - if (e.ChangeType == WatcherChangeTypes.Deleted) + if (e is RenamedEventArgs renamedEventArgs) { - menus[0].Invoke(() => DeleteItem(e)); + menus[0].Invoke(() => RenameItem(renamedEventArgs)); } - else if (e.ChangeType == WatcherChangeTypes.Created) + else { - menus[0].Invoke(() => CreateItem(e)); + FileSystemEventArgs fileSystemEventArgs = (FileSystemEventArgs)e; + if (fileSystemEventArgs.ChangeType == WatcherChangeTypes.Deleted) + { + menus[0].Invoke(() => DeleteItem(e as FileSystemEventArgs)); + } + else if (fileSystemEventArgs.ChangeType == WatcherChangeTypes.Created) + { + menus[0].Invoke(() => CreateItem(e as FileSystemEventArgs)); + } + } + } + + private void RenameItem(RenamedEventArgs e) + { + try + { + List rowDatas = new(); + DataTable dataTable = (DataTable)menus[0].GetDataGridView().DataSource; + foreach (DataRow row in dataTable.Rows) + { + RowData rowData = (RowData)row[2]; + if (rowData.Path.StartsWith($"{e.OldFullPath}")) + { + bool isAddionalPathRenamed = false; + string oldPath = rowData.Path; + string path = rowData.Path.Replace(e.OldFullPath, e.FullPath); + foreach (var pathAndFlags in MenusHelpers.GetAddionalPathsForMainMenu()) + { + if (oldPath.StartsWith($"{pathAndFlags.Path}\\") && + !path.StartsWith($"{pathAndFlags.Path}\\")) + { + isAddionalPathRenamed = true; + break; + } + } + + if (isAddionalPathRenamed) + { + continue; + } + + FileAttributes attr = File.GetAttributes(path); + bool isFolder = (attr & FileAttributes.Directory) == FileAttributes.Directory; + bool isAddionalItem = Path.GetDirectoryName(path) != Config.Path; + RowData rowDataRenamed = new(isFolder, isAddionalItem, false, 0, path); + if (FolderOptions.IsHidden(rowDataRenamed)) + { + continue; + } + + IconReader.RemoveIconFromCache(rowData.Path); + rowDataRenamed.ReadIcon(true); + rowDatas.Add(rowDataRenamed); + } + else + { + rowDatas.Add(rowData); + } + } + + rowDatas = MenusHelpers.SortItems(rowDatas); + keyboardInput.ClearIsSelectedByKey(); + AddItemsToMenu(rowDatas, menus[0], out _, out _); + + hideSubmenuDuringRefreshSearch = false; + menus[0].RefreshSearchText(); + hideSubmenuDuringRefreshSearch = true; + + menus[0].TimerUpdateIconsStart(); + } + catch (Exception ex) + { + Log.Warn($"Failed to {nameof(RenameItem)}: {e.OldFullPath} {e.FullPath}", ex); } } @@ -1334,7 +1394,7 @@ namespace SystemTrayMenu.Business { try { - List rowsToRemove = new List(); + List rowsToRemove = new(); DataGridView dgv = menus[0].GetDataGridView(); DataTable dataTable = (DataTable)dgv.DataSource; foreach (DataRow row in dataTable.Rows) diff --git a/NativeDllImport/CreateRoundRectRgn.cs b/NativeDllImport/CreateRoundRectRgn.cs index c7d7d13..a817e14 100644 --- a/NativeDllImport/CreateRoundRectRgn.cs +++ b/NativeDllImport/CreateRoundRectRgn.cs @@ -21,7 +21,7 @@ namespace SystemTrayMenu.DllImports if (handle != IntPtr.Zero) { region = System.Drawing.Region.FromHrgn(handle); - DeleteObject(handle); + _ = DeleteObject(handle); success = true; } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 090b757..bfeb530 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -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.2.9.22")] -[assembly: AssemblyFileVersion("1.2.9.22")] +[assembly: AssemblyVersion("1.2.9.23")] +[assembly: AssemblyFileVersion("1.2.9.23")] diff --git a/UserInterface/HotkeyTextboxControl/HotkeyControl.cs b/UserInterface/HotkeyTextboxControl/HotkeyControl.cs index 96cb3e6..23439be 100644 --- a/UserInterface/HotkeyTextboxControl/HotkeyControl.cs +++ b/UserInterface/HotkeyTextboxControl/HotkeyControl.cs @@ -392,7 +392,7 @@ namespace SystemTrayMenu.UserInterface.HotkeyTextboxControl return "* " + keyString; } - keyString = keyString.Substring(0, 1).ToUpperInvariant() + keyString[1..].ToLowerInvariant(); + keyString = keyString[..1].ToUpperInvariant() + keyString[1..].ToLowerInvariant(); } return keyString + " *"; @@ -405,7 +405,7 @@ namespace SystemTrayMenu.UserInterface.HotkeyTextboxControl return "/ " + keyString; } - keyString = keyString.Substring(0, 1).ToUpperInvariant() + keyString[1..].ToLowerInvariant(); + keyString = keyString[..1].ToUpperInvariant() + keyString[1..].ToLowerInvariant(); } return keyString + " /"; @@ -443,7 +443,7 @@ namespace SystemTrayMenu.UserInterface.HotkeyTextboxControl string visibleName = keyName.ToString(); if (visibleName.Length > 1) { - visibleName = visibleName.Substring(0, 1) + visibleName[1..].ToLowerInvariant(); + visibleName = visibleName[..1] + visibleName[1..].ToLowerInvariant(); } return visibleName; diff --git a/UserInterface/Menu.cs b/UserInterface/Menu.cs index 4567fec..9a01b3b 100644 --- a/UserInterface/Menu.cs +++ b/UserInterface/Menu.cs @@ -747,9 +747,8 @@ namespace SystemTrayMenu.UserInterface row.Height = dgv.RowTemplate.Height; } - DataTable data = (DataTable)dgv.DataSource; - int dgvHeightNew = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None); // Height of all rows - int dgvHeightMax = screenHeightMax - (Height - dgv.Height); // except dgv + int dgvHeightNew = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None); + int dgvHeightMax = screenHeightMax - (Height - dgv.Height); if (dgvHeightMax > Properties.Settings.Default.MaximumMenuHeight) { diff --git a/Utilities/DataGridViewExtensions.cs b/Utilities/DataGridViewExtensions.cs index b08a8df..c358ef9 100644 --- a/Utilities/DataGridViewExtensions.cs +++ b/Utilities/DataGridViewExtensions.cs @@ -20,8 +20,6 @@ namespace SystemTrayMenu.Utilities /// datagridview. internal static void FastAutoSizeColumns(this DataGridView dgv) { - System.Collections.Generic.IEnumerable rows = - dgv.Rows.Cast(); using Graphics gfx = dgv.CreateGraphics(); gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; float widthMax = WidthMin;