Files
LanMountainDesktop/LanMountainDesktop/Views/Components/DailyArtworkSettingsWindow.axaml.cs
lincube 854deae801 0.4.12
模块化解耦
2026-03-08 04:22:19 +08:00

118 lines
4.3 KiB
C#

using System;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Interactivity;
using LanMountainDesktop.ComponentSystem;
using LanMountainDesktop.Models;
using LanMountainDesktop.Services;
namespace LanMountainDesktop.Views.Components;
public partial class DailyArtworkSettingsWindow : UserControl, IComponentPlacementContextAware, IComponentSettingsStoreAware
{
private readonly AppSettingsService _appSettingsService = new();
private IComponentInstanceSettingsStore _componentSettingsStore = new ComponentSettingsService();
private readonly LocalizationService _localizationService = new();
private string _languageCode = "zh-CN";
private bool _suppressEvents;
private string _componentId = BuiltInComponentIds.DesktopDailyArtwork;
private string _placementId = string.Empty;
public event EventHandler? SettingsChanged;
public DailyArtworkSettingsWindow()
{
InitializeComponent();
LoadState();
ApplyLocalization();
}
public void SetComponentPlacementContext(string componentId, string? placementId)
{
_componentId = string.IsNullOrWhiteSpace(componentId)
? BuiltInComponentIds.DesktopDailyArtwork
: componentId.Trim();
_placementId = placementId?.Trim() ?? string.Empty;
LoadState();
ApplyLocalization();
}
public void SetComponentSettingsStore(IComponentInstanceSettingsStore settingsStore)
{
_componentSettingsStore = settingsStore ?? new ComponentSettingsService();
LoadState();
ApplyLocalization();
}
private void LoadState()
{
var appSnapshot = _appSettingsService.Load();
var componentSnapshot = _componentSettingsStore.LoadForComponent(_componentId, _placementId);
_languageCode = _localizationService.NormalizeLanguageCode(appSnapshot.LanguageCode);
var source = DailyArtworkMirrorSources.Normalize(componentSnapshot.DailyArtworkMirrorSource);
_suppressEvents = true;
MirrorSourceComboBox.SelectedIndex = string.Equals(source, DailyArtworkMirrorSources.Domestic, StringComparison.OrdinalIgnoreCase)
? 0
: 1;
_suppressEvents = false;
UpdateSourceStatus(source);
}
private void ApplyLocalization()
{
TitleTextBlock.Text = L("artwork.settings.title", "每日图片设置");
DescriptionTextBlock.Text = L("artwork.settings.desc", "切换每日图片的数据源。");
MirrorSourceLabelTextBlock.Text = L("artwork.settings.source_label", "镜像源");
MirrorSourceDomesticItem.Content = L("artwork.settings.source_domestic", "国内镜像");
MirrorSourceOverseasItem.Content = L("artwork.settings.source_overseas", "国外镜像");
UpdateSourceStatus(GetSelectedSource());
}
private void OnMirrorSourceSelectionChanged(object? sender, SelectionChangedEventArgs e)
{
_ = sender;
_ = e;
if (_suppressEvents)
{
return;
}
var source = GetSelectedSource();
var snapshot = _componentSettingsStore.LoadForComponent(_componentId, _placementId);
snapshot.DailyArtworkMirrorSource = source;
_componentSettingsStore.SaveForComponent(_componentId, _placementId, snapshot);
UpdateSourceStatus(source);
SettingsChanged?.Invoke(this, EventArgs.Empty);
}
private string GetSelectedSource()
{
if (MirrorSourceComboBox.SelectedItem is ComboBoxItem comboBoxItem &&
comboBoxItem.Tag is string tagValue)
{
return DailyArtworkMirrorSources.Normalize(tagValue);
}
return DailyArtworkMirrorSources.Overseas;
}
private void UpdateSourceStatus(string source)
{
if (StatusTextBlock is null)
{
return;
}
StatusTextBlock.Text = string.Equals(source, DailyArtworkMirrorSources.Domestic, StringComparison.OrdinalIgnoreCase)
? L("artwork.settings.source_status_domestic", "当前源:国内镜像(优先中国网络)")
: L("artwork.settings.source_status_overseas", "当前源:国外镜像(艺术馆推荐)");
}
private string L(string key, string fallback)
{
return _localizationService.GetString(_languageCode, key, fallback);
}
}