From eb5929d58c2ba9dcbea5cc94afe1b773a907d6cd Mon Sep 17 00:00:00 2001 From: Nicolas Gnyra Date: Sat, 9 Jan 2021 18:23:10 -0500 Subject: [PATCH] Switch to C# 9 --- WpfKenBurns/Configuration.cs | 8 ++------ WpfKenBurns/ConfigurationWindow.xaml.cs | 22 ++++++++++++++-------- WpfKenBurns/RandomizedEnumerator.cs | 4 ++-- WpfKenBurns/ScreensaverImageFolder.cs | 12 +++++++++--- WpfKenBurns/ScreensaverWindow.xaml.cs | 2 +- WpfKenBurns/WindowSynchronizer.cs | 25 +++++++++++++++++-------- WpfKenBurns/WpfKenBurns.csproj | 3 +++ 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/WpfKenBurns/Configuration.cs b/WpfKenBurns/Configuration.cs index 2c2dbbb..e914d1f 100644 --- a/WpfKenBurns/Configuration.cs +++ b/WpfKenBurns/Configuration.cs @@ -128,7 +128,7 @@ public ObservableCollection ProgramDenylist } } - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; private ObservableCollection folders = new ObservableCollection(); private float duration = 7; @@ -210,11 +210,7 @@ public static Configuration Load() for (int i = 0; i < count; i++) { - configuration.Folders.Add(new ScreensaverImageFolder - { - Path = reader.ReadString(), - Recursive = reader.ReadBoolean() - }); + configuration.Folders.Add(new ScreensaverImageFolder(reader.ReadString(), reader.ReadBoolean())); } count = reader.ReadInt32(); diff --git a/WpfKenBurns/ConfigurationWindow.xaml.cs b/WpfKenBurns/ConfigurationWindow.xaml.cs index 06289e1..8d9f35a 100644 --- a/WpfKenBurns/ConfigurationWindow.xaml.cs +++ b/WpfKenBurns/ConfigurationWindow.xaml.cs @@ -26,7 +26,7 @@ namespace WpfKenBurns /// public partial class ConfigurationWindow : Window { - private Configuration configuration; + private Configuration? configuration; private bool changed; public ConfigurationWindow() @@ -57,17 +57,15 @@ private void Window_Loaded(object sender, RoutedEventArgs e) private void AddFolderButton_Click(object sender, RoutedEventArgs e) { + if (configuration == null) return; + try { VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog(); - if (dialog.ShowDialog() != true) return; + if (dialog.ShowDialog() != true || string.IsNullOrWhiteSpace(dialog.SelectedPath)) return; - configuration.Folders.Add(new ScreensaverImageFolder - { - Path = dialog.SelectedPath, - Recursive = false - }); + configuration.Folders.Add(new ScreensaverImageFolder(dialog.SelectedPath, false)); } catch (Exception ex) { @@ -78,6 +76,8 @@ private void AddFolderButton_Click(object sender, RoutedEventArgs e) private void SaveButton_Click(object sender, RoutedEventArgs e) { + if (configuration == null) return; + try { Configuration.Save(configuration); @@ -115,6 +115,8 @@ private void CloseButton_Click(object sender, RoutedEventArgs e) private void RemoveFolderButton_Click(object sender, RoutedEventArgs e) { + if (configuration == null) return; + if (imageSourcesListView.SelectedIndex >= 0) { configuration.Folders.RemoveAt(imageSourcesListView.SelectedIndex); @@ -128,13 +130,15 @@ private void FoldersListView_SelectionChanged(object sender, System.Windows.Cont private void AddFileButton_Click(object sender, RoutedEventArgs e) { + if (configuration == null) return; + try { VistaOpenFileDialog dialog = new VistaOpenFileDialog(); dialog.Filter = "Executable Files (*.exe)|*.exe"; - if (dialog.ShowDialog() != true) return; + if (dialog.ShowDialog() != true || string.IsNullOrWhiteSpace(dialog.FileName)) return; configuration.ProgramDenylist.Add(dialog.FileName); } @@ -147,6 +151,8 @@ private void AddFileButton_Click(object sender, RoutedEventArgs e) private void RemoveFileButton_Click(object sender, RoutedEventArgs e) { + if (configuration == null) return; + if (programDenylistListView.SelectedIndex >= 0) { configuration.ProgramDenylist.RemoveAt(programDenylistListView.SelectedIndex); diff --git a/WpfKenBurns/RandomizedEnumerator.cs b/WpfKenBurns/RandomizedEnumerator.cs index b42c48a..f1db94b 100644 --- a/WpfKenBurns/RandomizedEnumerator.cs +++ b/WpfKenBurns/RandomizedEnumerator.cs @@ -21,7 +21,7 @@ namespace WpfKenBurns { - class RandomizedEnumerator : IEnumerator + class RandomizedEnumerator : IEnumerator where T : notnull { private T[] items; private int currentIndex = -1; @@ -32,7 +32,7 @@ public RandomizedEnumerator(IEnumerable items) Shuffle(); } - public T Current => currentIndex >= 0 && currentIndex < items.Length ? items[currentIndex] : default; + public T Current => currentIndex >= 0 && currentIndex < items.Length ? items[currentIndex] : throw new InvalidOperationException(); object IEnumerator.Current => Current; diff --git a/WpfKenBurns/ScreensaverImageFolder.cs b/WpfKenBurns/ScreensaverImageFolder.cs index 5c9973b..02b5ba2 100644 --- a/WpfKenBurns/ScreensaverImageFolder.cs +++ b/WpfKenBurns/ScreensaverImageFolder.cs @@ -16,9 +16,15 @@ namespace WpfKenBurns { - public class ScreensaverImageFolder + public readonly struct ScreensaverImageFolder { - public string Path { get; set; } - public bool Recursive { get; set; } + public readonly string Path; + public readonly bool Recursive; + + public ScreensaverImageFolder(string path, bool recursive) + { + Path = path; + Recursive = recursive; + } } } diff --git a/WpfKenBurns/ScreensaverWindow.xaml.cs b/WpfKenBurns/ScreensaverWindow.xaml.cs index e987cd9..9e23fdf 100644 --- a/WpfKenBurns/ScreensaverWindow.xaml.cs +++ b/WpfKenBurns/ScreensaverWindow.xaml.cs @@ -26,7 +26,7 @@ namespace WpfKenBurns { public partial class ScreensaverWindow : Window { - public event Action DisplayChanged; + public event Action? DisplayChanged; private IntPtr windowHandle; private Configuration configuration; diff --git a/WpfKenBurns/WindowSynchronizer.cs b/WpfKenBurns/WindowSynchronizer.cs index b5b708f..0bcbd31 100644 --- a/WpfKenBurns/WindowSynchronizer.cs +++ b/WpfKenBurns/WindowSynchronizer.cs @@ -31,16 +31,17 @@ namespace WpfKenBurns { public class WindowSynchronizer { - private Configuration configuration; - private List windows = new List(); - private Random random = new Random(); + private readonly List windows = new List(); + private readonly Random random = new Random(); + + private Configuration? configuration; private bool running = false; - private CancellationTokenSource cancellationTokenSource; - private Task task; + private CancellationTokenSource? cancellationTokenSource; + private Task? task; private IntPtr handle; private bool resetting = false; - private RandomizedEnumerator fileEnumerator; + private RandomizedEnumerator? fileEnumerator; public WindowSynchronizer() { } @@ -62,6 +63,7 @@ public void Start() Debug.WriteLine(ex.Message + "\r\n" + ex.StackTrace); MessageBox.Show("Failed to load configuration: " + ex.Message); Application.Current.Shutdown(); + return; } foreach (string filePath in configuration.ProgramDenylist) @@ -109,6 +111,7 @@ public void Start() private void EnumerateMonitors() { if (resetting) return; + if (configuration == null) return; resetting = true; @@ -141,8 +144,8 @@ private void OnDisplayChanged() private void RestartTask() { cancellationTokenSource?.Cancel(); + cancellationTokenSource = null; task?.Wait(); - cancellationTokenSource = new CancellationTokenSource(); task = Task.Run(Worker); running = true; } @@ -160,6 +163,8 @@ private void Worker() try { + if (cancellationTokenSource == null) cancellationTokenSource = new CancellationTokenSource(); + while (!cancellationTokenSource.IsCancellationRequested) { var storyboards = new Storyboard[windows.Count]; @@ -206,6 +211,8 @@ private void Worker() private BitmapImage GetImage() { + if (fileEnumerator == null) return new BitmapImage(); + if (!fileEnumerator.MoveNext()) { fileEnumerator.Reset(); @@ -214,7 +221,7 @@ private BitmapImage GetImage() string fileName = fileEnumerator.Current; - if (fileName == default) return null; + if (fileName == default) return new BitmapImage(); FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); @@ -235,6 +242,8 @@ private BitmapImage GetImage() private Storyboard SetupAnimation(Panel container, Image image, Size imageSize, ManualResetEventSlim resetEvent) { + if (configuration == null) return new Storyboard(); + double duration = configuration.Duration; double movementFactor = configuration.MovementFactor + 1; double scaleFactor = configuration.ScaleFactor + 1; diff --git a/WpfKenBurns/WpfKenBurns.csproj b/WpfKenBurns/WpfKenBurns.csproj index 17bc834..2f04013 100644 --- a/WpfKenBurns/WpfKenBurns.csproj +++ b/WpfKenBurns/WpfKenBurns.csproj @@ -4,6 +4,9 @@ net472 true WinExe + enable + nullable + 9