diff --git a/Flow.Launcher.Avalonia/ViewModel/SettingPages/DropdownDataGeneric.cs b/Flow.Launcher.Avalonia/ViewModel/SettingPages/DropdownDataGeneric.cs new file mode 100644 index 000000000..02bb2fabd --- /dev/null +++ b/Flow.Launcher.Avalonia/ViewModel/SettingPages/DropdownDataGeneric.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Flow.Launcher.Avalonia.ViewModel.SettingPages; + +public partial class DropdownDataGeneric : ObservableObject where T : struct, Enum +{ + private readonly string _keyPrefix; + private readonly Func _getData; + + [ObservableProperty] + private string _display = string.Empty; + + public T Value { get; } + + public DropdownDataGeneric(T value, string keyPrefix, Func getData) + { + Value = value; + _keyPrefix = keyPrefix; + _getData = getData; + UpdateLabels(); + } + + public void UpdateLabels() + { + var key = _keyPrefix + _getData(Value); + Display = App.API?.GetTranslation(key) ?? key; + } + + public static List> GetEnumData(string keyPrefix, Func? getData = null) + { + getData ??= (v => v.ToString()); + return Enum.GetValues() + .Select(v => new DropdownDataGeneric(v, keyPrefix, getData)) + .ToList(); + } +} + +public static class DropdownDataGeneric +{ + public static List> GetEnumData(string keyPrefix, Func? getData = null) where T : struct, Enum + { + return DropdownDataGeneric.GetEnumData(keyPrefix, getData); + } +} + diff --git a/Flow.Launcher.Avalonia/ViewModel/SettingPages/GeneralSettingsViewModel.cs b/Flow.Launcher.Avalonia/ViewModel/SettingPages/GeneralSettingsViewModel.cs index 9a0b94b31..0d02daab3 100644 --- a/Flow.Launcher.Avalonia/ViewModel/SettingPages/GeneralSettingsViewModel.cs +++ b/Flow.Launcher.Avalonia/ViewModel/SettingPages/GeneralSettingsViewModel.cs @@ -47,10 +47,20 @@ public partial class GeneralSettingsViewModel : ObservableObject _settings.Language = value.LanguageCode; _i18n.ChangeLanguage(value.LanguageCode); OnPropertyChanged(); + UpdateLabels(); } } } + private void UpdateLabels() + { + SearchWindowScreens.ForEach(x => x.UpdateLabels()); + SearchWindowAligns.ForEach(x => x.UpdateLabels()); + SearchPrecisionScores.ForEach(x => x.UpdateLabels()); + LastQueryModes.ForEach(x => x.UpdateLabels()); + } + + #endregion #region Startup Settings @@ -168,7 +178,7 @@ public partial class GeneralSettingsViewModel : ObservableObject #region Search Window Position [ObservableProperty] - private ObservableCollection> _searchWindowScreens = new(); + private List> _searchWindowScreens = new(); public SearchWindowScreens SelectedSearchWindowScreen { @@ -181,7 +191,7 @@ public partial class GeneralSettingsViewModel : ObservableObject } [ObservableProperty] - private ObservableCollection> _searchWindowAligns = new(); + private List> _searchWindowAligns = new(); public SearchWindowAligns SelectedSearchWindowAlign { @@ -198,7 +208,7 @@ public partial class GeneralSettingsViewModel : ObservableObject #region Query Settings [ObservableProperty] - private ObservableCollection> _searchPrecisionScores = new(); + private List> _searchPrecisionScores = new(); public SearchPrecisionScore SelectedSearchPrecision { @@ -211,7 +221,8 @@ public partial class GeneralSettingsViewModel : ObservableObject } [ObservableProperty] - private ObservableCollection> _lastQueryModes = new(); + private List> _lastQueryModes = new(); + public LastQueryMode SelectedLastQueryMode { @@ -361,39 +372,20 @@ public partial class GeneralSettingsViewModel : ObservableObject private void LoadSearchWindowOptions() { - SearchWindowScreens = new ObservableCollection>( - Enum.GetValues().Select(v => new EnumDisplayItem(v, v.ToString()))); - - SearchWindowAligns = new ObservableCollection>( - Enum.GetValues().Select(v => new EnumDisplayItem(v, v.ToString()))); + SearchWindowScreens = DropdownDataGeneric.GetEnumData("SearchWindowScreen"); + SearchWindowAligns = DropdownDataGeneric.GetEnumData("SearchWindowAlign"); } private void LoadSearchPrecisionOptions() { - SearchPrecisionScores = new ObservableCollection>( - Enum.GetValues().Select(v => new EnumDisplayItem(v, v.ToString()))); + SearchPrecisionScores = DropdownDataGeneric.GetEnumData("SearchPrecision"); } private void LoadLastQueryModeOptions() { - LastQueryModes = new ObservableCollection>( - Enum.GetValues().Select(v => new EnumDisplayItem(v, v.ToString()))); + LastQueryModes = DropdownDataGeneric.GetEnumData("LastQuery"); } #endregion } -/// -/// Helper class for displaying enum values in ComboBoxes -/// -public class EnumDisplayItem where T : Enum -{ - public T Value { get; } - public string Display { get; } - - public EnumDisplayItem(T value, string display) - { - Value = value; - Display = display; - } -} diff --git a/Flow.Launcher.Avalonia/ViewModel/SettingPages/PluginsSettingsViewModel.cs b/Flow.Launcher.Avalonia/ViewModel/SettingPages/PluginsSettingsViewModel.cs index 1225dd0d4..5de3fd8cb 100644 --- a/Flow.Launcher.Avalonia/ViewModel/SettingPages/PluginsSettingsViewModel.cs +++ b/Flow.Launcher.Avalonia/ViewModel/SettingPages/PluginsSettingsViewModel.cs @@ -31,11 +31,23 @@ public partial class PluginsSettingsViewModel : ObservableObject LoadDisplayModes(); LoadPlugins(); + + _settings.PropertyChanged += (s, e) => + { + if (e.PropertyName == nameof(Settings.Language)) + { + foreach (var item in DisplayModes) + { + item.UpdateLabels(); + } + } + }; } [ObservableProperty] private ObservableCollection _plugins = new(); + [ObservableProperty] private string _searchText = string.Empty; @@ -69,18 +81,35 @@ public partial class PluginsSettingsViewModel : ObservableObject HomeOnOff } - public class DisplayModeItem + public partial class DisplayModeItem : ObservableObject { + private readonly Internationalization _i18n; public DisplayMode Value { get; } - public string Display { get; } - public DisplayModeItem(DisplayMode value, string display) + [ObservableProperty] + private string _display; + + public DisplayModeItem(DisplayMode value, Internationalization i18n) { Value = value; - Display = display; + _i18n = i18n; + UpdateLabels(); + } + + public void UpdateLabels() + { + Display = Value switch + { + DisplayMode.OnOff => _i18n.GetTranslation("DisplayModeOnOff"), + DisplayMode.Priority => _i18n.GetTranslation("DisplayModePriority"), + DisplayMode.SearchDelay => _i18n.GetTranslation("DisplayModeSearchDelay"), + DisplayMode.HomeOnOff => _i18n.GetTranslation("DisplayModeHomeOnOff"), + _ => Value.ToString() + }; } } + [ObservableProperty] private List _displayModes = new(); @@ -109,16 +138,17 @@ public partial class PluginsSettingsViewModel : ObservableObject { DisplayModes = new List { - new(DisplayMode.OnOff, _i18n.GetTranslation("pluginDisplayOnOff")), - new(DisplayMode.Priority, _i18n.GetTranslation("pluginDisplayPriority")), - new(DisplayMode.SearchDelay, _i18n.GetTranslation("pluginDisplaySearchDelay")), - new(DisplayMode.HomeOnOff, _i18n.GetTranslation("pluginDisplayHomeOnOff")) + new(DisplayMode.OnOff, _i18n), + new(DisplayMode.Priority, _i18n), + new(DisplayMode.SearchDelay, _i18n), + new(DisplayMode.HomeOnOff, _i18n) }; // Set default SelectedDisplayModeItem = DisplayModes[0]; } + private void UpdateDisplayModeFlags(DisplayMode mode) { IsOnOffSelected = mode == DisplayMode.OnOff; diff --git a/Flow.Launcher.Avalonia/ViewModel/SettingPages/ThemeSettingsViewModel.cs b/Flow.Launcher.Avalonia/ViewModel/SettingPages/ThemeSettingsViewModel.cs index f27ec70f6..749638365 100644 --- a/Flow.Launcher.Avalonia/ViewModel/SettingPages/ThemeSettingsViewModel.cs +++ b/Flow.Launcher.Avalonia/ViewModel/SettingPages/ThemeSettingsViewModel.cs @@ -2,45 +2,59 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Avalonia.Resource; -using FluentAvalonia.Styling; using Avalonia; using Avalonia.Styling; using System.Collections.Generic; using System.Linq; +using System; +using AvaloniaI18n = Flow.Launcher.Avalonia.Resource.Internationalization; namespace Flow.Launcher.Avalonia.ViewModel.SettingPages; public partial class ThemeSettingsViewModel : ObservableObject { private readonly Settings _settings; + private readonly AvaloniaI18n _i18n; public ThemeSettingsViewModel() { _settings = Ioc.Default.GetRequiredService(); + _i18n = Ioc.Default.GetRequiredService(); + ColorSchemeOptions = DropdownDataGeneric.GetEnumData("ColorScheme"); + + _settings.PropertyChanged += (s, e) => + { + if (e.PropertyName == nameof(Settings.Language)) + { + UpdateLabels(); + } + }; } - public List ThemeVariants => new() { "System", "Light", "Dark" }; + public List> ColorSchemeOptions { get; } - public string SelectedThemeVariant + public ColorSchemes SelectedColorScheme { - get => _settings.Theme switch - { - "Light" => "Light", - "Dark" => "Dark", - _ => "System" - }; + get => Enum.TryParse(_settings.Theme, out var result) ? result : ColorSchemes.System; set { - if (value != SelectedThemeVariant) + if (SelectedColorScheme != value) { - _settings.Theme = value; - ApplyTheme(value); + var themeString = value.ToString(); + _settings.Theme = themeString; + ApplyTheme(themeString); OnPropertyChanged(); } } } + private void UpdateLabels() + { + ColorSchemeOptions.ForEach(x => x.UpdateLabels()); + } + private void ApplyTheme(string variant) + { if (Application.Current == null) return; diff --git a/Flow.Launcher.Avalonia/Views/SettingPages/GeneralSettingsPage.axaml b/Flow.Launcher.Avalonia/Views/SettingPages/GeneralSettingsPage.axaml index 6bb41bd41..6919f9c1f 100644 --- a/Flow.Launcher.Avalonia/Views/SettingPages/GeneralSettingsPage.axaml +++ b/Flow.Launcher.Avalonia/Views/SettingPages/GeneralSettingsPage.axaml @@ -72,26 +72,20 @@ IsExpanded="False"> - - - - - - + SelectedValue="{Binding SelectedSearchWindowScreen, Mode=TwoWay}" + SelectedValueBinding="{Binding Value}" + DisplayMemberBinding="{Binding Display}" + MinWidth="200" /> + - - - - - - + SelectedValue="{Binding SelectedSearchWindowAlign, Mode=TwoWay}" + SelectedValueBinding="{Binding Value}" + DisplayMemberBinding="{Binding Display}" + MinWidth="160" /> + @@ -138,27 +132,21 @@ IsExpanded="False"> - - - - - - + SelectedValue="{Binding SelectedSearchPrecision, Mode=TwoWay}" + SelectedValueBinding="{Binding Value}" + DisplayMemberBinding="{Binding Display}" + MinWidth="150" /> + - - - - - - + SelectedValue="{Binding SelectedLastQueryMode, Mode=TwoWay}" + SelectedValueBinding="{Binding Value}" + DisplayMemberBinding="{Binding Display}" + MinWidth="180" /> + diff --git a/Flow.Launcher.Avalonia/Views/SettingPages/PluginStoreSettingsPage.axaml b/Flow.Launcher.Avalonia/Views/SettingPages/PluginStoreSettingsPage.axaml index ac84950bb..19ae27032 100644 --- a/Flow.Launcher.Avalonia/Views/SettingPages/PluginStoreSettingsPage.axaml +++ b/Flow.Launcher.Avalonia/Views/SettingPages/PluginStoreSettingsPage.axaml @@ -33,12 +33,13 @@ - - - - + + + + + - + Recently Updated Plugins Installed + C# / .Net + Python + Node.js + Executable + Refresh Install Uninstall