Flow.Launcher/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/Avalonia/SettingsControl.axaml.cs
Hongtao Zhang c0d17672af feat(avalonia): add Avalonia settings views for 8 plugins
- Add i18n injection to Application.Resources for DynamicResource bindings
- Create Avalonia settings views for plugins:
  - Explorer (ExplorerSettings + QuickAccessLinkSettings dialog)
  - BrowserBookmark (SettingsControl + CustomBrowserSettingWindow)
  - Calculator (CalculatorSettings)
  - ProcessKiller (SettingsControl)
  - PluginsManager (PluginsManagerSettings)
  - WebSearch (SettingsControl)
  - Shell (ShellSetting + converter)
  - Program (ProgramSetting)
- Add IsAvalonia detection pattern for dual-framework dialog support
- Update 11 plugin .csproj files with CopyToAvaloniaOutput targets
- Add System.Threading.Tasks using for async RelayCommand support
2026-01-26 15:30:33 -08:00

130 lines
No EOL
3.6 KiB
C#

using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using System;
using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.BrowserBookmark.Views.Avalonia;
public partial class SettingsControl : UserControl
{
public SettingsControl(Settings settings)
{
InitializeComponent();
DataContext = new SettingsViewModel(settings, EditBrowser);
}
public SettingsControl()
{
InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private async Task EditBrowser(CustomBrowser browser)
{
var window = new CustomBrowserSettingWindow(browser);
if (VisualRoot is Window parentWindow)
{
await window.ShowDialog(parentWindow);
}
}
}
public partial class SettingsViewModel : ObservableObject
{
private readonly Settings _settings;
private readonly Func<CustomBrowser, Task> _editBrowserAction;
public SettingsViewModel(Settings settings, Func<CustomBrowser, Task> editBrowserAction)
{
_settings = settings;
_editBrowserAction = editBrowserAction;
}
public Settings Settings => _settings;
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(EditCustomBrowserCommand))]
[NotifyCanExecuteChangedFor(nameof(DeleteCustomBrowserCommand))]
private CustomBrowser _selectedCustomBrowser;
public bool LoadChromeBookmark
{
get => _settings.LoadChromeBookmark;
set
{
if (_settings.LoadChromeBookmark != value)
{
_settings.LoadChromeBookmark = value;
OnPropertyChanged();
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
}
public bool LoadFirefoxBookmark
{
get => _settings.LoadFirefoxBookmark;
set
{
if (_settings.LoadFirefoxBookmark != value)
{
_settings.LoadFirefoxBookmark = value;
OnPropertyChanged();
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
}
public bool LoadEdgeBookmark
{
get => _settings.LoadEdgeBookmark;
set
{
if (_settings.LoadEdgeBookmark != value)
{
_settings.LoadEdgeBookmark = value;
OnPropertyChanged();
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
}
[RelayCommand]
private async Task NewCustomBrowser()
{
var newBrowser = new CustomBrowser();
await _editBrowserAction(newBrowser);
if (!string.IsNullOrEmpty(newBrowser.Name) && !string.IsNullOrEmpty(newBrowser.DataDirectoryPath))
{
_settings.CustomChromiumBrowsers.Add(newBrowser);
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
[RelayCommand(CanExecute = nameof(CanEditOrDelete))]
private async Task EditCustomBrowser()
{
if (SelectedCustomBrowser is null) return;
await _editBrowserAction(SelectedCustomBrowser);
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
[RelayCommand(CanExecute = nameof(CanEditOrDelete))]
private void DeleteCustomBrowser()
{
if (SelectedCustomBrowser is null) return;
_settings.CustomChromiumBrowsers.Remove(SelectedCustomBrowser);
_ = Task.Run(() => Main.ReloadAllBookmarks());
}
private bool CanEditOrDelete() => SelectedCustomBrowser != null;
}