settings_re8

This commit is contained in:
lincube
2026-03-14 22:45:09 +08:00
parent 91f9f3d6fb
commit 689be7b585
54 changed files with 5356 additions and 30 deletions

View File

@@ -0,0 +1,97 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent"
x:Class="LanMountainDesktop.Views.SettingsPages.LauncherSettingsPage"
x:DataType="vm:LauncherSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container">
<Border Classes="settings-section-card">
<Grid ColumnDefinitions="Auto,*,Auto"
ColumnSpacing="18">
<Border Classes="settings-section-card-icon-host"
Width="72"
Height="72"
Padding="10">
<fi:SymbolIcon Symbol="Apps"
FontSize="34"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<StackPanel Grid.Column="1"
Spacing="4"
VerticalAlignment="Center">
<TextBlock Classes="settings-card-header"
Text="{Binding LauncherHeader}" />
<TextBlock Classes="settings-card-description"
Text="{Binding LauncherSubtitle}" />
<TextBlock Classes="settings-item-description"
Margin="0,10,0,0"
Text="{Binding HiddenHint}"
TextWrapping="Wrap" />
</StackPanel>
<StackPanel Grid.Column="2"
Spacing="4"
HorizontalAlignment="Right"
VerticalAlignment="Center">
<TextBlock Classes="settings-section-title"
FontSize="28"
HorizontalAlignment="Right"
Margin="0"
Text="{Binding HiddenCountText}" />
<TextBlock Classes="settings-item-description"
HorizontalAlignment="Right"
Text="{Binding HiddenSummary}" />
</StackPanel>
</Grid>
</Border>
<controls:IconText Icon="Apps"
Text="{Binding HiddenHeader}"
Margin="0,0,0,4" />
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding HiddenHeader}"
Description="{Binding HiddenDescription}"
IsExpanded="True">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Apps" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpanderItem>
<StackPanel Spacing="8">
<TextBlock Classes="settings-item-description"
IsVisible="{Binding IsHiddenItemsEmpty}"
Margin="0,0,0,4"
Text="{Binding HiddenEmptyText}"
TextWrapping="Wrap" />
<ItemsControl ItemsSource="{Binding HiddenItems}"
IsVisible="{Binding HasHiddenItems}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:LauncherHiddenItemViewModel">
<ui:SettingsExpanderItem Content="{Binding DisplayName}"
Description="{Binding TypeLabel}"
IsClickEnabled="False">
<ui:SettingsExpanderItem.IconSource>
<fi:SymbolIconSource Symbol="{Binding IconSymbol}" />
</ui:SettingsExpanderItem.IconSource>
<ui:SettingsExpanderItem.Footer>
<Button Command="{Binding RestoreCommand}"
Content="{Binding RestoreButtonText}"
VerticalAlignment="Center" />
</ui:SettingsExpanderItem.Footer>
</ui:SettingsExpanderItem>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
</StackPanel>
</ScrollViewer>
</UserControl>

View File

@@ -0,0 +1,31 @@
using LanMountainDesktop.PluginSdk;
using LanMountainDesktop.Services.Settings;
using LanMountainDesktop.ViewModels;
namespace LanMountainDesktop.Views.SettingsPages;
[SettingsPageInfo(
"launcher",
"App Launcher",
SettingsPageCategory.Components,
IconKey = "Apps",
SortOrder = 10,
Scope = SettingsScope.Launcher,
TitleLocalizationKey = "settings.launcher.title",
DescriptionLocalizationKey = "settings.launcher.description")]
public partial class LauncherSettingsPage : SettingsPageBase
{
public LauncherSettingsPage()
: this(new LauncherSettingsPageViewModel(HostSettingsFacadeProvider.GetOrCreate()))
{
}
public LauncherSettingsPage(LauncherSettingsPageViewModel viewModel)
{
ViewModel = viewModel;
DataContext = ViewModel;
InitializeComponent();
}
public LauncherSettingsPageViewModel ViewModel { get; }
}

View File

@@ -0,0 +1,263 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:models="using:LanMountainDesktop.Models"
xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent"
x:Class="LanMountainDesktop.Views.SettingsPages.WeatherSettingsPage"
x:DataType="vm:WeatherSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container">
<Border Classes="settings-section-card">
<Grid ColumnDefinitions="Auto,*,Auto" ColumnSpacing="18">
<Border Classes="settings-section-card-icon-host"
Width="72"
Height="72"
Padding="10">
<Image Source="{Binding PreviewIcon}"
Stretch="Uniform" />
</Border>
<StackPanel Grid.Column="1"
Spacing="4"
VerticalAlignment="Center">
<TextBlock Classes="settings-card-header"
Text="{Binding PreviewHeader}" />
<TextBlock Classes="settings-card-description"
Text="{Binding PreviewDescription}" />
<TextBlock Classes="settings-section-title"
FontSize="24"
Margin="0,10,0,0"
Text="{Binding PreviewTemperature}" />
<TextBlock Classes="settings-item-label"
Text="{Binding PreviewLocation}" />
<TextBlock Classes="settings-item-description"
Text="{Binding PreviewCondition}" />
<TextBlock Classes="settings-item-description"
Text="{Binding PreviewUpdated}" />
<TextBlock Classes="settings-item-description"
Text="{Binding PreviewStatus}" />
</StackPanel>
<StackPanel Grid.Column="2"
Spacing="12"
VerticalAlignment="Center">
<Button Classes="settings-accent-button"
Command="{Binding RefreshPreviewCommand}"
Content="{Binding RefreshButtonText}" />
<ui:ProgressRing IsIndeterminate="True"
IsVisible="{Binding IsRefreshingPreview}"
Width="28"
Height="28"
HorizontalAlignment="Center" />
</StackPanel>
</Grid>
</Border>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding LocationSourceHeader}"
Description="{Binding LocationSourceDescription}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="WeatherMoon" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<ComboBox Width="220"
ItemsSource="{Binding LocationModes}"
SelectedItem="{Binding SelectedLocationMode}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:SelectionOption">
<TextBlock Text="{Binding Label}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem>
<TextBlock Classes="settings-item-description"
Text="{Binding CurrentLocationSummary}"
TextWrapping="Wrap" />
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding CitySearchHeader}"
Description="{Binding CitySearchDescription}"
IsVisible="{Binding IsCitySearchMode}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Search" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<Button Classes="settings-accent-button"
Command="{Binding ApplyCitySelectionCommand}"
Content="{Binding ApplyCityButtonText}" />
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem>
<StackPanel Spacing="14">
<Grid ColumnDefinitions="*,Auto"
ColumnSpacing="12">
<TextBox Text="{Binding SearchKeyword}"
Watermark="{Binding SearchPlaceholder}" />
<Button Grid.Column="1"
Command="{Binding SearchCommand}"
Content="{Binding SearchButtonText}" />
</Grid>
<ui:ProgressRing IsIndeterminate="True"
IsVisible="{Binding IsSearching}"
Width="24"
Height="24"
HorizontalAlignment="Left" />
<TextBlock Classes="settings-item-description"
Text="{Binding SearchStatus}"
TextWrapping="Wrap" />
<ListBox Classes="weather-settings-search-results"
ItemsSource="{Binding SearchResults}"
SelectedItem="{Binding SelectedSearchResult}">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="models:WeatherLocation">
<Grid ColumnDefinitions="Auto,*"
ColumnSpacing="12">
<fi:SymbolIcon Classes="icon-s"
Margin="0,2,0,0"
Symbol="City" />
<StackPanel Grid.Column="1"
Spacing="4">
<TextBlock Classes="settings-item-label"
Text="{Binding Name}" />
<TextBlock Classes="settings-item-description"
Text="{Binding Affiliation}" />
<TextBlock Classes="settings-item-description"
Text="{Binding LocationKey}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding CoordinatesHeader}"
Description="{Binding CoordinatesDescription}"
IsVisible="{Binding IsCoordinatesMode}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Location" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<Button Classes="settings-accent-button"
Command="{Binding ApplyCoordinatesCommand}"
Content="{Binding ApplyCoordinatesButtonText}" />
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem>
<Grid ColumnDefinitions="*,*"
Classes="settings-inline-pair">
<StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label"
Text="{Binding LatitudeLabel}" />
<NumericUpDown Minimum="-90"
Maximum="90"
Increment="0.0001"
FormatString="F4"
Value="{Binding Latitude}" />
</StackPanel>
<StackPanel Grid.Column="1"
Classes="settings-item">
<TextBlock Classes="settings-item-label"
Text="{Binding LongitudeLabel}" />
<NumericUpDown Minimum="-180"
Maximum="180"
Increment="0.0001"
FormatString="F4"
Value="{Binding Longitude}" />
</StackPanel>
</Grid>
</ui:SettingsExpanderItem>
<ui:SettingsExpanderItem>
<TextBox Text="{Binding LocationKey}"
Watermark="{Binding LocationKeyPlaceholder}" />
</ui:SettingsExpanderItem>
<ui:SettingsExpanderItem>
<TextBox Text="{Binding LocationName}"
Watermark="{Binding LocationNamePlaceholder}" />
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding LocationServicesHeader}"
Description="{Binding LocationServicesDescription}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Location" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<Button Classes="settings-accent-button"
Command="{Binding UseCurrentLocationCommand}"
Content="{Binding UseCurrentLocationButtonText}"
IsVisible="{Binding IsLocationSupported}" />
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16">
<StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label"
Text="{Binding AutoRefreshLabel}" />
<TextBlock Classes="settings-item-description"
Text="{Binding LocationActionStatus}"
TextWrapping="Wrap" />
</StackPanel>
<ToggleSwitch Grid.Column="1"
IsChecked="{Binding AutoRefreshLocation}"
IsEnabled="{Binding IsLocationSupported}" />
</Grid>
</ui:SettingsExpanderItem>
<ui:SettingsExpanderItem IsVisible="{Binding IsRefreshingLocation}">
<ui:ProgressRing IsIndeterminate="True"
IsVisible="{Binding IsRefreshingLocation}"
Width="28"
Height="28"
HorizontalAlignment="Left" />
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding AlertFilterHeader}"
Description="{Binding AlertFilterDescription}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Warning" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<TextBox Width="360"
MinHeight="120"
AcceptsReturn="True"
TextWrapping="Wrap"
Text="{Binding ExcludedAlerts}" />
</ui:SettingsExpander.Footer>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"
Header="{Binding RequestHeader}"
Description="{Binding RequestDescription}">
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ShieldDismiss" />
</ui:SettingsExpander.IconSource>
<ui:SettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding NoTlsRequests}" />
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem>
<TextBlock Classes="settings-item-description"
Text="{Binding NoTlsToggleText}"
TextWrapping="Wrap" />
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<TextBlock Classes="settings-item-description"
Margin="0,8,0,0"
Text="{Binding FooterHint}"
TextWrapping="Wrap" />
</StackPanel>
</ScrollViewer>
</UserControl>

View File

@@ -0,0 +1,47 @@
using LanMountainDesktop.PluginSdk;
using LanMountainDesktop.Services;
using LanMountainDesktop.Services.Settings;
using LanMountainDesktop.ViewModels;
namespace LanMountainDesktop.Views.SettingsPages;
[SettingsPageInfo(
"weather",
"Weather",
SettingsPageCategory.Appearance,
IconKey = "WeatherMoon",
SortOrder = 18,
TitleLocalizationKey = "settings.weather.title",
DescriptionLocalizationKey = "settings.weather.description")]
public partial class WeatherSettingsPage : SettingsPageBase
{
public WeatherSettingsPage()
: this(CreateDefaultViewModel())
{
}
public WeatherSettingsPage(WeatherSettingsPageViewModel viewModel)
{
ViewModel = viewModel;
DataContext = ViewModel;
InitializeComponent();
}
public WeatherSettingsPageViewModel ViewModel { get; }
private static WeatherSettingsPageViewModel CreateDefaultViewModel()
{
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
var localizationService = new LocalizationService();
var locationService = HostLocationServiceProvider.GetOrCreate();
var weatherLocationRefreshService = new WeatherLocationRefreshService(
settingsFacade,
locationService,
localizationService);
return new WeatherSettingsPageViewModel(
settingsFacade,
localizationService,
locationService,
weatherLocationRefreshService);
}
}