diff --git a/src/DesktopMagic/MainWindow.xaml b/src/DesktopMagic/MainWindow.xaml index 8ce0e5e..1c1b7be 100644 --- a/src/DesktopMagic/MainWindow.xaml +++ b/src/DesktopMagic/MainWindow.xaml @@ -77,13 +77,13 @@ - + - + diff --git a/src/DesktopMagic/MainWindow.xaml.cs b/src/DesktopMagic/MainWindow.xaml.cs index f820ded..4cc4f42 100644 --- a/src/DesktopMagic/MainWindow.xaml.cs +++ b/src/DesktopMagic/MainWindow.xaml.cs @@ -299,6 +299,39 @@ namespace DesktopMagic #region Options + private void AddThemeButton_Click(object sender, RoutedEventArgs e) + { + InputDialog inputDialog = new((string)FindResource("enterThemeName")) + { + Owner = this + }; + + if (inputDialog.ShowDialog() == true) + { + if (Settings.Themes.Any(l => l.Name.Trim() == inputDialog.ResponseText.Trim())) + { + _ = MessageBox.Show((string)FindResource("themeAlreadyExists"), App.AppName, MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + Settings.Themes.Add(new Theme(inputDialog.ResponseText.Trim())); + Settings.CurrentLayout.CurrentThemeName = inputDialog.ResponseText.Trim(); + SaveSettings(); + } + } + + private void DeleteThemeButton_Click(object sender, RoutedEventArgs e) + { + if (Settings.Themes.Count <= 1) + { + _ = MessageBox.Show((string)FindResource("cannotDeleteLastTheme"), App.AppName, MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + Settings.Themes.Remove((Theme)themesListBox.SelectedItem); + SaveSettings(); + } + private void ChangeThemeButton_Click(object sender, RoutedEventArgs e) { Theme theme = themesListBox.SelectedItem as Theme ?? Settings.CurrentLayout.Theme; @@ -428,6 +461,12 @@ namespace DesktopMagic private void RemoveLayoutButton_Click(object sender, RoutedEventArgs e) { + if (Settings.Layouts.Count <= 1) + { + _ = MessageBox.Show((string)FindResource("cannotDeleteLastLayout"), App.AppName, MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + Settings.Layouts.Remove(Settings.CurrentLayout); SaveSettings(); } @@ -447,30 +486,27 @@ namespace DesktopMagic { if (!File.Exists(Path.Combine(App.ApplicationDataPath, "settings.json"))) { - Settings = new DesktopMagicSettings() - { - Layouts = [ - new Layout((string)FindResource("default")) - ], - Themes = [ - new Theme((string)FindResource("default")) - ] - }; + Settings = new DesktopMagicSettings(); + + Settings.Layouts.Add(new Layout((string)FindResource("default"))); + Settings.Themes.Add(new Theme((string)FindResource("default"))); return; } string json = File.ReadAllText(Path.Combine(App.ApplicationDataPath, "settings.json")); - Settings = JsonSerializer.Deserialize(json, jsonSettingsOptions) ?? new DesktopMagicSettings() + Settings = JsonSerializer.Deserialize(json, jsonSettingsOptions) ?? new DesktopMagicSettings(); + + if(Settings.Layouts.Count == 0) { - Layouts = [ - new Layout((string)FindResource("default")) - ], - Themes = [ - new Theme((string)FindResource("default")) - ] - }; + Settings.Layouts.Add(new Layout((string)FindResource("default"))); + } + + if (Settings.Themes.Count == 0) + { + Settings.Themes.Add(new Theme((string)FindResource("default"))); + } } private void LoadLayout(bool minimize = true) diff --git a/src/DesktopMagic/Plugins/PluginWindow.xaml.cs b/src/DesktopMagic/Plugins/PluginWindow.xaml.cs index 86a097e..2db73c5 100644 --- a/src/DesktopMagic/Plugins/PluginWindow.xaml.cs +++ b/src/DesktopMagic/Plugins/PluginWindow.xaml.cs @@ -56,7 +56,17 @@ public partial class PluginWindow : Window Owner = w; - settings.Theme.PropertyChanged += (e, s) => ThemeChanged(); + settings.PropertyChanged += (e, s) => + { + if (s.PropertyName == nameof(PluginSettings.CurrentThemeName)) + { + settings.Theme.PropertyChanged += (se, ev) => + { + ThemeChanged(); + }; + ThemeChanged(); + } + }; PluginMetadata = pluginMetadata; this.settings = settings; diff --git a/src/DesktopMagic/Resources/Strings/StringResources.de.xaml b/src/DesktopMagic/Resources/Strings/StringResources.de.xaml index 49aa23d..910d844 100644 --- a/src/DesktopMagic/Resources/Strings/StringResources.de.xaml +++ b/src/DesktopMagic/Resources/Strings/StringResources.de.xaml @@ -41,6 +41,8 @@ Abbrechen Layoutnamen eingeben: Layout existiert bereits! + Themenamen eingeben: + Theme existiert bereits! Installieren Deinstallieren Entfernen diff --git a/src/DesktopMagic/Resources/Strings/StringResources.en.xaml b/src/DesktopMagic/Resources/Strings/StringResources.en.xaml index d173ff9..d19026b 100644 --- a/src/DesktopMagic/Resources/Strings/StringResources.en.xaml +++ b/src/DesktopMagic/Resources/Strings/StringResources.en.xaml @@ -41,6 +41,10 @@ Cancel Enter layout name Layout already exists! + Can't delete last layout! + Enter theme name + Theme already exists! + Can't delete last theme! Install Uninstall Remove diff --git a/src/DesktopMagic/Settings/DesktopMagicSettings.cs b/src/DesktopMagic/Settings/DesktopMagicSettings.cs index 3e14dea..62409e8 100644 --- a/src/DesktopMagic/Settings/DesktopMagicSettings.cs +++ b/src/DesktopMagic/Settings/DesktopMagicSettings.cs @@ -19,9 +19,10 @@ internal class DesktopMagicSettings : INotifyPropertyChanged public ObservableCollection Themes { get => themes; - set + init { themes = value; + themes.CollectionChanged += (s, e) => CurrentLayout.UpdateTheme(); OnPropertyChanged(); } } @@ -32,6 +33,8 @@ internal class DesktopMagicSettings : INotifyPropertyChanged set { layouts = value; + layouts.CollectionChanged += (s, e) => OnPropertyChanged(nameof(CurrentLayout)); + layouts.CollectionChanged += (s, e) => OnPropertyChanged(nameof(CurrentLayoutName)); OnPropertyChanged(); } } @@ -52,6 +55,14 @@ internal class DesktopMagicSettings : INotifyPropertyChanged public string? ModIoAccessToken { get; set; } + public DesktopMagicSettings() + { + themes.CollectionChanged += (s, e) => CurrentLayout.UpdateTheme(); + + layouts.CollectionChanged += (s, e) => OnPropertyChanged(nameof(CurrentLayout)); + layouts.CollectionChanged += (s, e) => OnPropertyChanged(nameof(CurrentLayoutName)); + } + protected void OnPropertyChanged([CallerMemberName] string? name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); diff --git a/src/DesktopMagic/Settings/Layout.cs b/src/DesktopMagic/Settings/Layout.cs index 8015c83..420f746 100644 --- a/src/DesktopMagic/Settings/Layout.cs +++ b/src/DesktopMagic/Settings/Layout.cs @@ -29,14 +29,13 @@ internal class Layout(string name) : INotifyPropertyChanged public string? CurrentThemeName { - get => currentThemeName; + get => Theme.Name; set { if (currentThemeName != value) { currentThemeName = value; - OnPropertyChanged(); - OnPropertyChanged(nameof(Theme)); + UpdateTheme(); } } } @@ -67,6 +66,17 @@ internal class Layout(string name) : INotifyPropertyChanged OnPropertyChanged(nameof(Plugins)); } + public void UpdateTheme() + { + OnPropertyChanged(nameof(Theme)); + OnPropertyChanged(nameof(CurrentThemeName)); + + foreach (PluginSettings pluginSettings in plugins.Values) + { + pluginSettings.UpdateTheme(); + } + } + protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); diff --git a/src/DesktopMagic/Settings/PluginSettings.cs b/src/DesktopMagic/Settings/PluginSettings.cs index df6a30e..8261f7b 100644 --- a/src/DesktopMagic/Settings/PluginSettings.cs +++ b/src/DesktopMagic/Settings/PluginSettings.cs @@ -100,6 +100,12 @@ public class PluginSettings : INotifyPropertyChanged } } + public void UpdateTheme() + { + OnPropertyChanged(nameof(Theme)); + OnPropertyChanged(nameof(CurrentThemeName)); + } + protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));