diff --git a/Business/Menus.cs b/Business/Menus.cs index ec63164..32fbcf1 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -455,7 +455,7 @@ namespace SystemTrayMenu.Business timerShowProcessStartedAsLoadingIcon.Tick += Tick; timerShowProcessStartedAsLoadingIcon.Interval = TimeSpan.FromMilliseconds(5); timerShowProcessStartedAsLoadingIcon.Start(); - void Tick(object sender, EventArgs e) + void Tick(object? sender, EventArgs e) { timerShowProcessStartedAsLoadingIcon.Tick -= Tick; timerShowProcessStartedAsLoadingIcon.Interval = TimeSpan.FromMilliseconds(Properties.Settings.Default.TimeUntilClosesAfterEnterPressed); @@ -488,12 +488,17 @@ namespace SystemTrayMenu.Business private static void LoadMenu(object senderDoWork, DoWorkEventArgs eDoWork) { - string path; + string? path; int level = 0; - RowData rowData = eDoWork.Argument as RowData; + RowData? rowData = eDoWork.Argument as RowData; if (rowData != null) { path = rowData.ResolvedPath; + if (path == null) + { + return; + } + level = rowData.Level + 1; } else @@ -521,32 +526,35 @@ namespace SystemTrayMenu.Business foldersCount = 0; filesCount = 0; - List items = new(); - ListView lv = menu.GetDataGridView(); - - foreach (RowData rowData in data) + ListView? lv = menu.GetDataGridView(); + if (lv != null) { - if (!(rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult)) + List items = new(); + + foreach (RowData rowData in data) { - if (rowData.ContainsMenu) + if (!(rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult)) { - foldersCount++; - } - else - { - filesCount++; + 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 && Properties.Settings.Default.ShowOnlyAsSearchResult ? 99 : 0)); } - 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 && Properties.Settings.Default.ShowOnlyAsSearchResult ? 99 : 0)); + lv.ItemsSource = items; } - - lv.ItemsSource = items; } private bool IsActive() @@ -1135,7 +1143,7 @@ namespace SystemTrayMenu.Business } Menu menu; - Menu menuPredecessor = null; + Menu? menuPredecessor = null; for (int i = 0; i < list.Count; i++) { menu = list[i]; @@ -1219,16 +1227,15 @@ namespace SystemTrayMenu.Business { menus[0].Dispatcher.Invoke(() => RenameItem(renamedEventArgs)); } - else + else if (e is FileSystemEventArgs fileSystemEventArgs) { - FileSystemEventArgs fileSystemEventArgs = (FileSystemEventArgs)e; if (fileSystemEventArgs.ChangeType == WatcherChangeTypes.Deleted) { - menus[0].Dispatcher.Invoke(() => DeleteItem(e as FileSystemEventArgs)); + menus[0].Dispatcher.Invoke(() => DeleteItem(fileSystemEventArgs)); } else if (fileSystemEventArgs.ChangeType == WatcherChangeTypes.Created) { - menus[0].Dispatcher.Invoke(() => CreateItem(e as FileSystemEventArgs)); + menus[0].Dispatcher.Invoke(() => CreateItem(fileSystemEventArgs)); } } } @@ -1238,33 +1245,36 @@ namespace SystemTrayMenu.Business try { List rowDatas = new(); - ListView dgv = menus[0].GetDataGridView(); - foreach (ListViewItemData item in dgv.Items) + ListView? dgv = menus[0].GetDataGridView(); + if (dgv != null) { - RowData rowData = item.data; - if (rowData.Path.StartsWith($"{e.OldFullPath}")) + foreach (ListViewItemData item in dgv.Items) { - string path = rowData.Path.Replace(e.OldFullPath, e.FullPath); - FileAttributes attr = File.GetAttributes(path); - bool isFolder = (attr & FileAttributes.Directory) == FileAttributes.Directory; - if (isFolder) + RowData rowData = item.data; + if (rowData.Path.StartsWith($"{e.OldFullPath}")) { - path = Path.GetDirectoryName(path); - } + string path = rowData.Path.Replace(e.OldFullPath, e.FullPath); + FileAttributes attr = File.GetAttributes(path); + bool isFolder = (attr & FileAttributes.Directory) == FileAttributes.Directory; + if (isFolder) + { + path = Path.GetDirectoryName(path); + } - RowData rowDataRenamed = new(isFolder, rowData.IsAddionalItem, false, 0, path); - if (FolderOptions.IsHidden(rowDataRenamed)) + RowData rowDataRenamed = new(isFolder, rowData.IsAddionalItem, false, 0, path); + if (FolderOptions.IsHidden(rowDataRenamed)) + { + continue; + } + + IconReader.RemoveIconFromCache(rowData.Path); + rowDataRenamed.ReadIcon(true); + rowDatas.Add(rowDataRenamed); + } + else { - continue; + rowDatas.Add(rowData); } - - IconReader.RemoveIconFromCache(rowData.Path); - rowDataRenamed.ReadIcon(true); - rowDatas.Add(rowDataRenamed); - } - else - { - rowDatas.Add(rowData); } } @@ -1288,22 +1298,26 @@ namespace SystemTrayMenu.Business { try { - List rowsToRemove = new(); - ListView dgv = menus[0].GetDataGridView(); - foreach (ListViewItemData item in dgv.Items) + ListView? dgv = menus[0].GetDataGridView(); + if (dgv != null) { - RowData rowData = item.data; - if (rowData.Path == e.FullPath || - rowData.Path.StartsWith($"{e.FullPath}\\")) - { - IconReader.RemoveIconFromCache(rowData.Path); - rowsToRemove.Add(item); - } - } + List rowsToRemove = new(); - foreach (ListViewItemData rowToRemove in rowsToRemove) - { - dgv.Items.Remove(rowToRemove); + foreach (ListViewItemData item in dgv.Items) + { + RowData rowData = item.data; + if (rowData.Path == e.FullPath || + rowData.Path.StartsWith($"{e.FullPath}\\")) + { + IconReader.RemoveIconFromCache(rowData.Path); + rowsToRemove.Add(item); + } + } + + foreach (ListViewItemData rowToRemove in rowsToRemove) + { + dgv.Items.Remove(rowToRemove); + } } keyboardInput.ClearIsSelectedByKey(); @@ -1339,10 +1353,13 @@ namespace SystemTrayMenu.Business rowData, }; - ListView dgv = menus[0].GetDataGridView(); - foreach (ListViewItemData item in dgv.Items) + ListView? dgv = menus[0].GetDataGridView(); + if (dgv != null) { - rowDatas.Add(item.data); + foreach (ListViewItemData item in dgv.Items) + { + rowDatas.Add(item.data); + } } rowDatas = MenusHelpers.SortItems(rowDatas); diff --git a/DataClasses/MenuData.cs b/DataClasses/MenuData.cs index 0e00a13..5c71f42 100644 --- a/DataClasses/MenuData.cs +++ b/DataClasses/MenuData.cs @@ -1,12 +1,12 @@ -// -// Copyright (c) PlaceholderCompany. All rights reserved. -// - -namespace SystemTrayMenu.DataClasses -{ - using System.Collections.Generic; - - internal enum MenuDataDirectoryState +// +// Copyright (c) PlaceholderCompany. All rights reserved. +// + +namespace SystemTrayMenu.DataClasses +{ + using System.Collections.Generic; + + internal enum MenuDataDirectoryState { /// /// State not defined or data still loading @@ -15,39 +15,35 @@ namespace SystemTrayMenu.DataClasses /// /// Data is available - /// + /// Valid, /// /// Loading finished but no data available - /// + /// Empty, /// /// Loading failed, so no data available - /// - NoAccess, - } - - internal struct MenuData - { - public MenuData(int level) - { - RowDatas = new List(); - DirectoryState = MenuDataDirectoryState.Undefined; - Level = level; - RowDataParent = null; - IsNetworkRoot = false; - } - - internal List RowDatas { get; set; } - - internal MenuDataDirectoryState DirectoryState { get; set; } - - internal int Level { get; } - - internal RowData RowDataParent { get; set; } - - internal bool IsNetworkRoot { get; set; } - } + /// + NoAccess, + } + + internal struct MenuData + { + public MenuData(int level) + { + Level = level; + } + + internal List RowDatas { get; set; } = new (); + + internal MenuDataDirectoryState DirectoryState { get; set; } = MenuDataDirectoryState.Undefined; + + internal int Level { get; } + + internal RowData? RowDataParent { get; set; } = null; + + internal bool IsNetworkRoot { get; set; } = false; + } } \ No newline at end of file diff --git a/DataClasses/RowData.cs b/DataClasses/RowData.cs index 4853def..bf8e937 100644 --- a/DataClasses/RowData.cs +++ b/DataClasses/RowData.cs @@ -5,7 +5,6 @@ namespace SystemTrayMenu.DataClasses { using System; - using System.Data; using System.Drawing; using System.IO; using System.Windows; @@ -99,11 +98,11 @@ namespace SystemTrayMenu.DataClasses } } - internal Icon Icon { get; private set; } + internal Icon? Icon { get; private set; } - internal FileInfo FileInfo { get; } + internal FileInfo? FileInfo { get; } - internal string Path { get; } + internal string? Path { get; } internal bool IsFolder { get; } @@ -113,23 +112,23 @@ namespace SystemTrayMenu.DataClasses internal int Level { get; set; } - internal string FileExtension { get; } + internal string? FileExtension { get; } internal bool IsLink { get; } - internal string ResolvedPath { get; } + internal string? ResolvedPath { get; } internal bool IsLinkToFolder { get; } internal bool ShowOverlay { get; } - internal string Text { get; } + internal string? Text { get; } internal bool ContainsMenu { get; } internal bool IsMainMenu { get; } - internal Menu SubMenu { get; set; } + internal Menu? SubMenu { get; set; } internal bool IsMenuOpen { get; set; } @@ -147,7 +146,7 @@ namespace SystemTrayMenu.DataClasses internal bool ProcessStarted { get; set; } - internal Icon ReadIcon(bool updateIconInBackground) + internal void ReadIcon(bool updateIconInBackground) { if (IsFolder || IsLinkToFolder) { @@ -171,8 +170,6 @@ namespace SystemTrayMenu.DataClasses Icon = AddIconOverlay(Icon, Properties.Resources.White50Percentage); } } - - return Icon; } internal void MouseDown(ListView dgv, MouseButtonEventArgs e) @@ -217,8 +214,10 @@ namespace SystemTrayMenu.DataClasses { try { - string parentFolder = System.IO.Path.GetDirectoryName(Path); - Directory.GetFiles(parentFolder); + string? parentFolder = System.IO.Path.GetDirectoryName(Path); + + // Assume folder is not null as failure will be catched any ways + Directory.GetFiles(parentFolder!); } catch (Exception ex) { @@ -273,7 +272,7 @@ namespace SystemTrayMenu.DataClasses (e == null || e.LeftButton == MouseButtonState.Pressed)) { ProcessStarted = true; - string workingDirectory = System.IO.Path.GetDirectoryName(ResolvedPath); + string? workingDirectory = System.IO.Path.GetDirectoryName(ResolvedPath); Log.ProcessStart(Path, string.Empty, false, workingDirectory, true, ResolvedPath); if (!Properties.Settings.Default.StaysOpenWhenItemClicked) { diff --git a/Helpers/JoystickHelper.cs b/Helpers/JoystickHelper.cs index 649deea..6a5c356 100644 --- a/Helpers/JoystickHelper.cs +++ b/Helpers/JoystickHelper.cs @@ -6,8 +6,6 @@ namespace SystemTrayMenu.Helpers { using System; using System.Diagnostics; - using System.Diagnostics.Metrics; - using System.Reflection.Metadata; using System.Threading; using System.Windows.Input; using SharpDX.DirectInput; @@ -17,7 +15,7 @@ namespace SystemTrayMenu.Helpers { private readonly System.Timers.Timer timerReadJoystick = new(); private readonly object lockRead = new(); - private Joystick joystick; + private Joystick? joystick; private Key pressingKey; private int pressingKeyCounter; private bool joystickHelperEnabled; @@ -38,7 +36,7 @@ namespace SystemTrayMenu.Helpers Dispose(false); } - public event Action KeyPressed; + public event Action? KeyPressed; public void Enable() { @@ -105,7 +103,7 @@ namespace SystemTrayMenu.Helpers return keys; } - private void ReadJoystickLoop(object sender, System.Timers.ElapsedEventArgs e) + private void ReadJoystickLoop(object? sender, System.Timers.ElapsedEventArgs e) { if (joystickHelperEnabled) { @@ -129,45 +127,48 @@ namespace SystemTrayMenu.Helpers private void ReadJoystick() { - try + if (joystick != null) { - joystick.Poll(); - JoystickUpdate[] datas = joystick.GetBufferedData(); - foreach (JoystickUpdate state in datas) + try { - if (state.Value < 0) + joystick.Poll(); + JoystickUpdate[] datas = joystick.GetBufferedData(); + foreach (JoystickUpdate state in datas) { - pressingKey = Key.None; - pressingKeyCounter = 0; - continue; + if (state.Value < 0) + { + pressingKey = Key.None; + pressingKeyCounter = 0; + continue; + } + + Key key = ReadKeyFromState(state); + if (key != Key.None) + { + KeyPressed?.Invoke(key, ModifierKeys.None); + if (state.Offset == JoystickOffset.PointOfViewControllers0) + { + pressingKeyCounter = 0; + pressingKey = key; + } + } } - Key key = ReadKeyFromState(state); - if (key != Key.None) + if (pressingKey != Key.None) { - KeyPressed?.Invoke(key, ModifierKeys.None); - if (state.Offset == JoystickOffset.PointOfViewControllers0) + pressingKeyCounter += 1; + if (pressingKeyCounter > 1) { - pressingKeyCounter = 0; - pressingKey = key; + KeyPressed?.Invoke(pressingKey, ModifierKeys.None); } } } - - if (pressingKey != Key.None) + catch { - pressingKeyCounter += 1; - if (pressingKeyCounter > 1) - { - KeyPressed?.Invoke(pressingKey, ModifierKeys.None); - } + joystick?.Dispose(); + joystick = null; } } - catch - { - joystick?.Dispose(); - joystick = null; - } } private void InitializeJoystick() diff --git a/Properties/CustomSettingsProvider.cs b/Properties/CustomSettingsProvider.cs index 9aa21ce..6027d17 100644 --- a/Properties/CustomSettingsProvider.cs +++ b/Properties/CustomSettingsProvider.cs @@ -6,7 +6,7 @@ namespace SystemTrayMenu.Properties { using System; using System.Collections.Generic; - using System.Configuration; + using System.Configuration; using System.Globalization; using System.IO; using System.Linq; @@ -43,9 +43,23 @@ namespace SystemTrayMenu.Properties $"SystemTrayMenu"), $"user-{Environment.MachineName}.config"); - public static string ConfigPathAssembly => Path.Combine( - Directory.GetParent(Assembly.GetEntryAssembly().Location).FullName, - $"user.config"); + public static string? ConfigPathAssembly + { + get + { + Assembly? assembly = Assembly.GetEntryAssembly(); + if (assembly != null) + { + string? location = Directory.GetParent(assembly.Location)?.FullName; + if (location != null) + { + return Path.Combine(location, $"user.config"); + } + } + + return null; + } + } /// /// Gets or sets override. @@ -81,7 +95,7 @@ namespace SystemTrayMenu.Properties { try { - File.Delete(ConfigPathAssembly); + File.Delete(ConfigPathAssembly!); } catch (Exception ex) { @@ -126,22 +140,28 @@ namespace SystemTrayMenu.Properties IsDirty = false, }; - // need the type of the value for the strong typing - Type t = Type.GetType(setting.PropertyType.FullName); - - if (SettingsDictionary.ContainsKey(setting.Name)) - { - value.SerializedValue = SettingsDictionary[setting.Name].Value; - value.PropertyValue = Convert.ChangeType(SettingsDictionary[setting.Name].Value, t, CultureInfo.InvariantCulture); + // need the type of the value for the strong typing + string? typename = setting.PropertyType.FullName; + if (typename != null) + { + Type? t = Type.GetType(typename); + if (t != null) + { + if (SettingsDictionary.ContainsKey(setting.Name)) + { + value.SerializedValue = SettingsDictionary[setting.Name].Value; + value.PropertyValue = Convert.ChangeType(SettingsDictionary[setting.Name].Value, t, CultureInfo.InvariantCulture); + } + else + { + // use defaults in the case where there are no settings yet + value.SerializedValue = setting.DefaultValue; + value.PropertyValue = Convert.ChangeType(setting.DefaultValue, t, CultureInfo.InvariantCulture); + } + + values.Add(value); + } } - else - { - // use defaults in the case where there are no settings yet - value.SerializedValue = setting.DefaultValue; - value.PropertyValue = Convert.ChangeType(setting.DefaultValue, t, CultureInfo.InvariantCulture); - } - - values.Add(value); } return values; @@ -159,7 +179,7 @@ namespace SystemTrayMenu.Properties { SettingStruct setting = new() { - Value = value.PropertyValue == null ? string.Empty : value.PropertyValue.ToString(), + Value = value.PropertyValue == null ? string.Empty : value.PropertyValue.ToString() ?? string.Empty, Name = value.Name, SerializeAs = value.Property.SerializeAs.ToString(), }; @@ -182,7 +202,7 @@ namespace SystemTrayMenu.Properties /// Creates an empty user.config file...looks like the one MS creates. /// This could be overkill a simple key/value pairing would probably do. /// - private static void CreateEmptyConfigIfNotExists(string path) + private static void CreateEmptyConfigIfNotExists(string? path) { if (!File.Exists(path)) { @@ -205,7 +225,7 @@ namespace SystemTrayMenu.Properties Log.Warn($"Failed to store config at assembly location {path}", ex); } } - } + } private static bool IsConfigPathAssembly() { @@ -222,9 +242,9 @@ namespace SystemTrayMenu.Properties return isconfigPathAssembly; } - private static XDocument LoadOrGetNew(string path) + private static XDocument? LoadOrGetNew(string path) { - XDocument xDocument = null; + XDocument? xDocument = null; try { xDocument = XDocument.Load(path); @@ -255,10 +275,10 @@ namespace SystemTrayMenu.Properties CreateEmptyConfigIfNotExists(UserConfigPath); // load the xml - XDocument configXml; + XDocument? configXml; if (IsConfigPathAssembly()) { - configXml = LoadOrGetNew(ConfigPathAssembly); + configXml = LoadOrGetNew(ConfigPathAssembly!); } else { @@ -268,19 +288,27 @@ namespace SystemTrayMenu.Properties if (configXml != null) { // get all of the elements. - IEnumerable settingElements = configXml.Element(Config).Element(UserSettings).Element(typeof(Settings).FullName).Elements(Setting); + IEnumerable? settingElements = configXml.Element(Config)?.Element(UserSettings)?.Element(typeof(Settings).FullName)?.Elements(Setting); // iterate through, adding them to the dictionary, (checking for nulls, xml no likey nulls) - // using "String" as default serializeAs...just in case, no real good reason. - foreach (XElement element in settingElements) - { - SettingStruct newSetting = new() - { - Name = element.Attribute(NameOf) == null ? string.Empty : element.Attribute(NameOf).Value, - SerializeAs = element.Attribute(SerializeAs) == null ? "String" : element.Attribute(SerializeAs).Value, - Value = element.Value ?? string.Empty, - }; - SettingsDictionary.Add(element.Attribute(NameOf).Value, newSetting); + // using "String" as default serializeAs...just in case, no real good reason. + if (settingElements != null) + { + foreach (XElement element in settingElements) + { + string? name = element.Attribute(NameOf)?.Value; + if (name != null) + { + string? serializeAs = element.Attribute(SerializeAs)?.Value; + SettingStruct newSetting = new() + { + Name = element.Attribute(NameOf) == null ? string.Empty : name, + SerializeAs = serializeAs == null ? "String" : serializeAs, + Value = element.Value ?? string.Empty, + }; + SettingsDictionary.Add(name, newSetting); + } + } } } } @@ -291,10 +319,10 @@ namespace SystemTrayMenu.Properties private void SaveValuesToFile() { // load the current xml from the file. - XDocument configXml; + XDocument? configXml; if (IsConfigPathAssembly()) { - configXml = LoadOrGetNew(ConfigPathAssembly); + configXml = LoadOrGetNew(ConfigPathAssembly!); } else { @@ -304,12 +332,12 @@ namespace SystemTrayMenu.Properties if (configXml != null) { // get the settings group (e.g. ) - XElement settingsSection = configXml.Element(Config).Element(UserSettings).Element(typeof(Settings).FullName); + XElement? settingsSection = configXml.Element(Config)?.Element(UserSettings)?.Element(typeof(Settings).FullName); // iterate though the dictionary, either updating the value or adding the new setting. foreach (KeyValuePair entry in SettingsDictionary) { - XElement setting = settingsSection.Elements().FirstOrDefault(e => e.Attribute(NameOf).Value == entry.Key); + XElement? setting = settingsSection?.Elements().FirstOrDefault(e => e.Attribute(NameOf)?.Value == entry.Key); if (setting == null) { // this can happen if a new setting is added via the .settings designer. @@ -317,7 +345,7 @@ namespace SystemTrayMenu.Properties newSetting.Add(new XAttribute(NameOf, entry.Value.Name)); newSetting.Add(new XAttribute(SerializeAs, entry.Value.SerializeAs)); newSetting.Value = entry.Value.Value ?? string.Empty; - settingsSection.Add(newSetting); + settingsSection?.Add(newSetting); } else { @@ -328,7 +356,7 @@ namespace SystemTrayMenu.Properties if (IsConfigPathAssembly()) { - configXml.Save(ConfigPathAssembly); + configXml.Save(ConfigPathAssembly!); } configXml.Save(UserConfigPath); diff --git a/UserInterface/AppNotifyIcon.cs b/UserInterface/AppNotifyIcon.cs index 9aa898c..09e269c 100644 --- a/UserInterface/AppNotifyIcon.cs +++ b/UserInterface/AppNotifyIcon.cs @@ -6,7 +6,6 @@ namespace SystemTrayMenu.UserInterface { using System; using System.Windows; - using System.Windows.Input; using Hardcodet.Wpf.TaskbarNotification; using SystemTrayMenu.Helper; using SystemTrayMenu.Utilities; @@ -23,20 +22,16 @@ namespace SystemTrayMenu.UserInterface AppContextMenu contextMenus = new(); - contextMenus.ClickedOpenLog += ClickedOpenLog; - void ClickedOpenLog() - { - OpenLog?.Invoke(); - } + contextMenus.ClickedOpenLog += () => OpenLog?.Invoke(); notifyIcon.ContextMenu = contextMenus.Create(); notifyIcon.LeftClickCommand = new ActionCommand((_) => Click?.Invoke()); notifyIcon.DoubleClickCommand = new ActionCommand((_) => Click?.Invoke()); } - public event Action Click; + public event Action? Click; - public event Action OpenLog; + public event Action? OpenLog; public void Dispose() { diff --git a/UserInterface/Menu.xaml.cs b/UserInterface/Menu.xaml.cs index 27cd926..474af8e 100644 --- a/UserInterface/Menu.xaml.cs +++ b/UserInterface/Menu.xaml.cs @@ -166,8 +166,8 @@ namespace SystemTrayMenu.UserInterface #endif #if TODO // TOUCH bool isTouchEnabled = NativeMethods.IsTouchEnabled(); - if ((isTouchEnabled && Properties.Settings.Default.DragDropItemsEnabledTouch) || - (!isTouchEnabled && Properties.Settings.Default.DragDropItemsEnabled)) + if ((isTouchEnabled && Settings.Default.DragDropItemsEnabledTouch) || + (!isTouchEnabled && Settings.Default.DragDropItemsEnabled)) { AllowDrop = true; DragEnter += DragDropHelper.DragEnter; @@ -492,7 +492,7 @@ namespace SystemTrayMenu.UserInterface /// isCustomLocationOutsideOfScreen. internal void AdjustSizeAndLocation( Rect bounds, - Menu menuPredecessor, + Menu? menuPredecessor, StartLocation startLocation, bool isCustomLocationOutsideOfScreen) { @@ -500,7 +500,7 @@ namespace SystemTrayMenu.UserInterface AdjustDataGridViewHeight(menuPredecessor, bounds.Height); AdjustDataGridViewWidth(); - bool useCustomLocation = Properties.Settings.Default.UseCustomLocation || lastLocation.X > 0; + bool useCustomLocation = Settings.Default.UseCustomLocation || lastLocation.X > 0; bool changeDirectionWhenOutOfBounds = true; if (menuPredecessor != null) @@ -519,13 +519,13 @@ namespace SystemTrayMenu.UserInterface // Use this menu as predecessor and overwrite location with CustomLocation menuPredecessor = this; Tag = new RowData(); - Left = Properties.Settings.Default.CustomLocationX; - Top = Properties.Settings.Default.CustomLocationY; + Left = Settings.Default.CustomLocationX; + Top = Settings.Default.CustomLocationY; directionToRight = true; startLocation = StartLocation.Predecessor; changeDirectionWhenOutOfBounds = false; } - else if (Properties.Settings.Default.AppearAtMouseLocation) + else if (Settings.Default.AppearAtMouseLocation) { // Do not adjust location again because Cursor.Postion changed if (Tag != null) @@ -635,16 +635,16 @@ namespace SystemTrayMenu.UserInterface } if (Level != 0 && - !Properties.Settings.Default.AppearNextToPreviousMenu && - menuPredecessor != null && menuPredecessor.Width > Properties.Settings.Default.OverlappingOffsetPixels) + !Settings.Default.AppearNextToPreviousMenu && + menuPredecessor != null && menuPredecessor.Width > Settings.Default.OverlappingOffsetPixels) { if (directionToRight) { - x = x - menuPredecessor.Width + Properties.Settings.Default.OverlappingOffsetPixels; + x = x - menuPredecessor.Width + Settings.Default.OverlappingOffsetPixels; } else { - x = x + menuPredecessor.Width - Properties.Settings.Default.OverlappingOffsetPixels; + x = x + menuPredecessor.Width - Settings.Default.OverlappingOffsetPixels; } } @@ -749,7 +749,7 @@ namespace SystemTrayMenu.UserInterface Left = x; Top = y; - if (Properties.Settings.Default.RoundCorners) + if (Settings.Default.RoundCorners) { windowFrame.CornerRadius = new CornerRadius(CornerRadius); } @@ -842,12 +842,12 @@ namespace SystemTrayMenu.UserInterface e.Handled = true; } - private void AdjustDataGridViewHeight(Menu menuPredecessor, double screenHeightMax) + private void AdjustDataGridViewHeight(Menu? menuPredecessor, double screenHeightMax) { - double factor = Properties.Settings.Default.RowHeighteInPercentage / 100f; + double factor = Settings.Default.RowHeighteInPercentage / 100f; if (NativeMethods.IsTouchEnabled()) { - factor = Properties.Settings.Default.RowHeighteInPercentageTouch / 100f; + factor = Settings.Default.RowHeighteInPercentageTouch / 100f; } if (menuPredecessor == null) @@ -876,7 +876,7 @@ namespace SystemTrayMenu.UserInterface { #endif double heightMaxByOptions = Scaling.Factor * Scaling.FactorByDpi * - 450f * (Properties.Settings.Default.HeightMaxInPercent / 100f); + 450f * (Settings.Default.HeightMaxInPercent / 100f); MaxHeight = Math.Min(screenHeightMax, heightMaxByOptions); #if TODO // SEARCH dgvHeightSet = true; @@ -901,7 +901,7 @@ namespace SystemTrayMenu.UserInterface return; } - double factorIconSizeInPercent = Properties.Settings.Default.IconSizeInPercent / 100f; + double factorIconSizeInPercent = Settings.Default.IconSizeInPercent / 100f; // IcoWidth 100% = 21px, 175% is 33, +3+2 is padding from ColumnIcon double icoWidth = (16 * Scaling.FactorByDpi) + 5; @@ -926,7 +926,7 @@ namespace SystemTrayMenu.UserInterface Resources["ColumnTextWidth"] = Math.Min( renderedMaxWidth, - (double)(Scaling.Factor * Scaling.FactorByDpi * 400f * (Properties.Settings.Default.WidthMaxInPercent / 100f))); + (double)(Scaling.Factor * Scaling.FactorByDpi * 400f * (Settings.Default.WidthMaxInPercent / 100f))); } private void HandleScrollChanged(object sender, ScrollChangedEventArgs e) @@ -981,7 +981,7 @@ namespace SystemTrayMenu.UserInterface foreach (DataRow row in data.Rows) { RowData rowData = (RowData)row[2]; - if (rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult) + if (rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult) { row[columnSortIndex] = 99; } @@ -1022,7 +1022,7 @@ namespace SystemTrayMenu.UserInterface RowData rowData = (RowData)row.Cells[2].Value; if (!string.IsNullOrEmpty(userPattern) || - !(rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult)) + !(rowData.IsAddionalItem && Settings.Default.ShowOnlyAsSearchResult)) { rowData.RowIndex = row.Index; @@ -1146,7 +1146,11 @@ namespace SystemTrayMenu.UserInterface if (rowData.IconLoading) { iconsToUpdate++; - row.ColumnIcon = rowData.ReadIcon(false).ToImageSource(); + rowData.ReadIcon(false); + if (rowData.Icon != null) + { + row.ColumnIcon = rowData.Icon.ToImageSource(); + } } } @@ -1179,19 +1183,19 @@ namespace SystemTrayMenu.UserInterface Top = Top + mousePos.Y - lastLocation.Y; lastLocation = mousePos; - Properties.Settings.Default.CustomLocationX = (int)Left; - Properties.Settings.Default.CustomLocationY = (int)Top; + Settings.Default.CustomLocationX = (int)Left; + Settings.Default.CustomLocationY = (int)Top; } } private void Menu_MouseUp(object sender, MouseButtonEventArgs e) { mouseDown = false; - if (Properties.Settings.Default.UseCustomLocation) + if (Settings.Default.UseCustomLocation) { if (!SettingsWindow.IsOpen()) { - Properties.Settings.Default.Save(); + Settings.Default.Save(); } } } diff --git a/Utilities/File/IconReader.cs b/Utilities/File/IconReader.cs index 07461fc..f85ff08 100644 --- a/Utilities/File/IconReader.cs +++ b/Utilities/File/IconReader.cs @@ -69,7 +69,7 @@ namespace SystemTrayMenu.Utilities public static void RemoveIconFromCache(string path) { - if (DictIconCacheMainMenu.Remove(path, out Icon iconToRemove)) + if (DictIconCacheMainMenu.Remove(path, out Icon? iconToRemove)) { iconToRemove?.Dispose(); } @@ -105,7 +105,7 @@ namespace SystemTrayMenu.Utilities key = extension + linkOverlay; } - if (!DictIconCache(isMainMenu).TryGetValue(key, out Icon icon) && + if (!DictIconCache(isMainMenu).TryGetValue(key, out Icon? icon) && !DictIconCache(!isMainMenu).TryGetValue(key, out icon)) { icon = Resources.StaticResources.LoadingIcon; @@ -143,7 +143,7 @@ namespace SystemTrayMenu.Utilities string key = path; - if (!DictIconCache(isMainMenu).TryGetValue(key, out Icon icon) && + if (!DictIconCache(isMainMenu).TryGetValue(key, out Icon? icon) && !DictIconCache(!isMainMenu).TryGetValue(key, out icon)) { icon = Resources.StaticResources.LoadingIcon; @@ -174,9 +174,9 @@ namespace SystemTrayMenu.Utilities return icon; } - public static Icon GetIconSTA(string path, string resolvedPath, bool linkOverlay, IconSize size, bool isFolder) + public static Icon? GetIconSTA(string path, string resolvedPath, bool linkOverlay, IconSize size, bool isFolder) { - Icon icon = null; + Icon? icon = null; if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) { icon = GetIcon(path, resolvedPath, linkOverlay, size, isFolder); @@ -184,7 +184,7 @@ namespace SystemTrayMenu.Utilities else { Thread staThread = new(new ParameterizedThreadStart(StaThreadMethod)); - void StaThreadMethod(object obj) + void StaThreadMethod(object? obj) { icon = GetIcon(path, resolvedPath, linkOverlay, size, isFolder); } @@ -197,9 +197,9 @@ namespace SystemTrayMenu.Utilities return icon; } - public static Icon AddIconOverlay(Icon originalIcon, Icon overlay) + public static Icon? AddIconOverlay(Icon? originalIcon, Icon overlay) { - Icon icon = null; + Icon? icon = originalIcon; if (originalIcon != null) { using Bitmap target = new(originalIcon.Width, originalIcon.Height, PixelFormat.Format32bppArgb); @@ -239,9 +239,9 @@ namespace SystemTrayMenu.Utilities return isExtensionWithSameIcon; } - private static Icon GetIcon(string path, string resolvedPath, bool linkOverlay, IconSize size, bool isFolder) + private static Icon? GetIcon(string path, string resolvedPath, bool linkOverlay, IconSize size, bool isFolder) { - Icon icon; + Icon? icon; if (Path.GetExtension(path).Equals(".ico", StringComparison.InvariantCultureIgnoreCase)) { icon = Icon.ExtractAssociatedIcon(path); @@ -288,10 +288,10 @@ namespace SystemTrayMenu.Utilities return flags; } - private static Icon GetIcon( + private static Icon? GetIcon( string path, bool linkOverlay, NativeMethods.SHFILEINFO shFileInfo, IntPtr imageList) { - Icon icon = null; + Icon? icon = null; if (imageList != IntPtr.Zero) { IntPtr hIcon; diff --git a/Utilities/Log.cs b/Utilities/Log.cs index 1c3ec15..c52c63b 100644 --- a/Utilities/Log.cs +++ b/Utilities/Log.cs @@ -149,7 +149,7 @@ namespace SystemTrayMenu.Utilities string fileName, string arguments = "", bool doubleQuoteArg = false, - string workingDirectory = "", + string? workingDirectory = null, bool createNoWindow = false, string resolvedPath = "") { @@ -166,7 +166,7 @@ namespace SystemTrayMenu.Utilities { FileName = fileName, Arguments = arguments, - WorkingDirectory = workingDirectory, + WorkingDirectory = workingDirectory ?? string.Empty, CreateNoWindow = createNoWindow, UseShellExecute = true, },