mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-22 00:54:26 +08:00
Compare commits
2 Commits
76d13ac024
...
v0.8.3.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce5acf5bd7 | ||
|
|
b933f3badf |
@@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
### 新增 (Added)
|
### 新增 (Added)
|
||||||
|
|
||||||
- 无
|
- ✨ **开发者调试工具**: 新增开发者调试工具,优化插件开发体验
|
||||||
|
- 提供便捷的调试功能,帮助开发者快速定位和解决问题
|
||||||
|
- 支持插件运行时状态监控和日志查看
|
||||||
|
- 提升插件开发效率和调试体验
|
||||||
|
|
||||||
### 变更 (Changed)
|
### 变更 (Changed)
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ internal sealed class SettingsWindowService : ISettingsWindowService
|
|||||||
_localizationService = new();
|
_localizationService = new();
|
||||||
_settingsFacade.Settings.Changed += OnSettingsChanged;
|
_settingsFacade.Settings.Changed += OnSettingsChanged;
|
||||||
_appearanceThemeService.Changed += OnAppearanceThemeChanged;
|
_appearanceThemeService.Changed += OnAppearanceThemeChanged;
|
||||||
|
AppSettingsService.SettingsSaved += OnAppSettingsSaved;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string L(string key)
|
private string L(string key)
|
||||||
@@ -279,6 +280,7 @@ internal sealed class SettingsWindowService : ISettingsWindowService
|
|||||||
var changedKeys = e.ChangedKeys?.ToArray();
|
var changedKeys = e.ChangedKeys?.ToArray();
|
||||||
var refreshAll = changedKeys is null || changedKeys.Length == 0;
|
var refreshAll = changedKeys is null || changedKeys.Length == 0;
|
||||||
var languageChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.LanguageCode), StringComparer.OrdinalIgnoreCase);
|
var languageChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.LanguageCode), StringComparer.OrdinalIgnoreCase);
|
||||||
|
var devModeChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.IsDevModeEnabled), StringComparer.OrdinalIgnoreCase);
|
||||||
var liveAppearance = _appearanceThemeService.GetCurrent();
|
var liveAppearance = _appearanceThemeService.GetCurrent();
|
||||||
var themeChanged =
|
var themeChanged =
|
||||||
refreshAll ||
|
refreshAll ||
|
||||||
@@ -291,14 +293,13 @@ internal sealed class SettingsWindowService : ISettingsWindowService
|
|||||||
changedKeys.Contains(nameof(AppSettingsSnapshot.WallpaperColor), StringComparer.OrdinalIgnoreCase))) ||
|
changedKeys.Contains(nameof(AppSettingsSnapshot.WallpaperColor), StringComparer.OrdinalIgnoreCase))) ||
|
||||||
changedKeys.Contains(nameof(AppSettingsSnapshot.UseSystemChrome), StringComparer.OrdinalIgnoreCase);
|
changedKeys.Contains(nameof(AppSettingsSnapshot.UseSystemChrome), StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
if (languageChanged)
|
if (languageChanged || devModeChanged)
|
||||||
{
|
{
|
||||||
var regionState = _settingsFacade.Region.Get();
|
var regionState = _settingsFacade.Region.Get();
|
||||||
// 清除本地化缓存,强制重新加载语言文件
|
|
||||||
_localizationService.ClearCache();
|
_localizationService.ClearCache();
|
||||||
_viewModel.RefreshLanguage(regionState.LanguageCode);
|
_viewModel.RefreshLanguage(regionState.LanguageCode);
|
||||||
_pageRegistry.Rebuild();
|
_pageRegistry.Rebuild();
|
||||||
_window.ReloadPages(_viewModel.CurrentPageId);
|
_window.ReloadPages(devModeChanged ? "dev" : _viewModel.CurrentPageId);
|
||||||
_window.RefreshShellText();
|
_window.RefreshShellText();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,6 +312,31 @@ internal sealed class SettingsWindowService : ISettingsWindowService
|
|||||||
}, DispatcherPriority.Background);
|
}, DispatcherPriority.Background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnAppSettingsSaved(string instanceId)
|
||||||
|
{
|
||||||
|
Dispatcher.UIThread.Post(() =>
|
||||||
|
{
|
||||||
|
if (_window is null || _viewModel is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var snapshot = _settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(SettingsScope.App);
|
||||||
|
var devPageVisible = _pageRegistry.GetPages().Any(p => p.PageId == "dev");
|
||||||
|
|
||||||
|
if (snapshot.IsDevModeEnabled && !devPageVisible)
|
||||||
|
{
|
||||||
|
_pageRegistry.Rebuild();
|
||||||
|
_window.ReloadPages("dev");
|
||||||
|
}
|
||||||
|
else if (!snapshot.IsDevModeEnabled && devPageVisible)
|
||||||
|
{
|
||||||
|
_pageRegistry.Rebuild();
|
||||||
|
_window.ReloadPages(null);
|
||||||
|
}
|
||||||
|
}, DispatcherPriority.Background);
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplyTheme(SettingsWindow window)
|
private void ApplyTheme(SettingsWindow window)
|
||||||
{
|
{
|
||||||
var appearanceSnapshot = _appearanceThemeService.GetCurrent();
|
var appearanceSnapshot = _appearanceThemeService.GetCurrent();
|
||||||
|
|||||||
@@ -8,9 +8,6 @@
|
|||||||
x:Class="LanMountainDesktop.Views.Components.ShortcutWidget">
|
x:Class="LanMountainDesktop.Views.Components.ShortcutWidget">
|
||||||
|
|
||||||
<Border x:Name="RootBorder"
|
<Border x:Name="RootBorder"
|
||||||
Background="{DynamicResource AdaptiveSurfaceRaisedBrush}"
|
|
||||||
BorderBrush="{DynamicResource AdaptiveButtonBorderBrush}"
|
|
||||||
BorderThickness="1"
|
|
||||||
CornerRadius="{DynamicResource DesignCornerRadiusComponent}"
|
CornerRadius="{DynamicResource DesignCornerRadiusComponent}"
|
||||||
ClipToBounds="True">
|
ClipToBounds="True">
|
||||||
<Grid RowDefinitions="*,Auto"
|
<Grid RowDefinitions="*,Auto"
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
|
|||||||
private bool _showBackground = true;
|
private bool _showBackground = true;
|
||||||
private double _currentCellSize = 48;
|
private double _currentCellSize = 48;
|
||||||
private bool _isDisposed;
|
private bool _isDisposed;
|
||||||
|
private bool _chromeApplied;
|
||||||
|
|
||||||
private const double TapMovementThreshold = 10;
|
private const double TapMovementThreshold = 10;
|
||||||
private const long TapTimeThresholdMs = 500;
|
private const long TapTimeThresholdMs = 500;
|
||||||
@@ -40,9 +41,32 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DoubleTapped += OnDoubleTapped;
|
DoubleTapped += OnDoubleTapped;
|
||||||
|
Loaded += OnLoaded;
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnLoaded(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
// ApplyChrome() may have been called before the control was attached to the visual tree,
|
||||||
|
// causing FindResource() to fail. Re-apply now that resources are available.
|
||||||
|
if (!_chromeApplied)
|
||||||
|
{
|
||||||
|
ApplyChrome();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subscribe to theme changes so the background follows theme updates.
|
||||||
|
var themeService = HostAppearanceThemeProvider.GetOrCreate();
|
||||||
|
themeService.Changed += OnAppearanceThemeChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnAppearanceThemeChanged(object? sender, AppearanceThemeSnapshot e)
|
||||||
|
{
|
||||||
|
if (_isDisposed || _showBackground)
|
||||||
|
{
|
||||||
|
ApplyChrome();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetComponentPlacementContext(string componentId, string? placementId)
|
public void SetComponentPlacementContext(string componentId, string? placementId)
|
||||||
{
|
{
|
||||||
_componentId = string.IsNullOrWhiteSpace(componentId)
|
_componentId = string.IsNullOrWhiteSpace(componentId)
|
||||||
@@ -258,13 +282,25 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
|
|||||||
RootBorder.Background = Brushes.Transparent;
|
RootBorder.Background = Brushes.Transparent;
|
||||||
RootBorder.BorderBrush = Brushes.Transparent;
|
RootBorder.BorderBrush = Brushes.Transparent;
|
||||||
RootBorder.BorderThickness = new Thickness(0);
|
RootBorder.BorderThickness = new Thickness(0);
|
||||||
|
_chromeApplied = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 恢复默认的实心背景样式
|
// FindResource requires the control to be attached to the visual tree.
|
||||||
RootBorder.Background = this.FindResource("AdaptiveSurfaceRaisedBrush") as IBrush ?? Brushes.Transparent;
|
// If it returns null, _chromeApplied stays false so OnLoaded will retry.
|
||||||
RootBorder.BorderBrush = this.FindResource("AdaptiveButtonBorderBrush") as IBrush ?? Brushes.Transparent;
|
var background = this.FindResource("AdaptiveSurfaceRaisedBrush") as IBrush;
|
||||||
|
var borderBrush = this.FindResource("AdaptiveButtonBorderBrush") as IBrush;
|
||||||
|
|
||||||
|
if (background is null || borderBrush is null)
|
||||||
|
{
|
||||||
|
_chromeApplied = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RootBorder.Background = background;
|
||||||
|
RootBorder.BorderBrush = borderBrush;
|
||||||
RootBorder.BorderThickness = new Thickness(1);
|
RootBorder.BorderThickness = new Thickness(1);
|
||||||
|
_chromeApplied = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPointerPressed(PointerPressedEventArgs e)
|
protected override void OnPointerPressed(PointerPressedEventArgs e)
|
||||||
@@ -391,6 +427,10 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isDisposed = true;
|
_isDisposed = true;
|
||||||
|
|
||||||
|
var themeService = HostAppearanceThemeProvider.GetOrCreate();
|
||||||
|
themeService.Changed -= OnAppearanceThemeChanged;
|
||||||
|
|
||||||
_gestureStates.Clear();
|
_gestureStates.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ using System.Diagnostics;
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.VisualTree;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using LanMountainDesktop.Models;
|
using LanMountainDesktop.Models;
|
||||||
using LanMountainDesktop.PluginSdk;
|
using LanMountainDesktop.PluginSdk;
|
||||||
using LanMountainDesktop.Services;
|
using LanMountainDesktop.Services;
|
||||||
using LanMountainDesktop.Services.Settings;
|
using LanMountainDesktop.Services.Settings;
|
||||||
using LanMountainDesktop.ViewModels;
|
using LanMountainDesktop.ViewModels;
|
||||||
|
using LanMountainDesktop.Views;
|
||||||
|
|
||||||
namespace LanMountainDesktop.Views.SettingsPages;
|
namespace LanMountainDesktop.Views.SettingsPages;
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ public partial class AboutSettingsPage : SettingsPageBase
|
|||||||
if (_heroCardClickCount >= 3)
|
if (_heroCardClickCount >= 3)
|
||||||
{
|
{
|
||||||
_heroCardClickCount = 0;
|
_heroCardClickCount = 0;
|
||||||
_ = ShowMessageAsync("开发者模式", "开发者模式已启用,无需重复操作。");
|
Debug.WriteLine("[AboutSettingsPage] Developer mode is already enabled.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -142,22 +143,9 @@ public partial class AboutSettingsPage : SettingsPageBase
|
|||||||
|
|
||||||
AppLogger.Info("DevMode", "Developer mode enabled via About page activation.");
|
AppLogger.Info("DevMode", "Developer mode enabled via About page activation.");
|
||||||
|
|
||||||
_ = ShowMessageAsync("开发者模式", "已启用开发者模式。重新打开设置窗口即可看到开发者选项。");
|
if (this.FindAncestorOfType<SettingsWindow>() is { } settingsWindow)
|
||||||
|
|
||||||
if (HostContext is not null)
|
|
||||||
{
|
{
|
||||||
HostContext.RequestRestart("开发者模式已更改");
|
settingsWindow.RebuildAndNavigateToDevPage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task ShowMessageAsync(string title, string message)
|
|
||||||
{
|
|
||||||
var dialog = new ContentDialog
|
|
||||||
{
|
|
||||||
Title = title,
|
|
||||||
Content = message,
|
|
||||||
CloseButtonText = "确定"
|
|
||||||
};
|
|
||||||
await dialog.ShowAsync();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,12 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
|
|||||||
NavigateTo(pageId ?? ViewModel.Pages.FirstOrDefault()?.PageId);
|
NavigateTo(pageId ?? ViewModel.Pages.FirstOrDefault()?.PageId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RebuildAndNavigateToDevPage()
|
||||||
|
{
|
||||||
|
_pageRegistry.Rebuild();
|
||||||
|
ReloadPages("dev");
|
||||||
|
}
|
||||||
|
|
||||||
public void OpenDrawer(Control content, string? title = null)
|
public void OpenDrawer(Control content, string? title = null)
|
||||||
{
|
{
|
||||||
if (DrawerContentHost is null)
|
if (DrawerContentHost is null)
|
||||||
|
|||||||
Reference in New Issue
Block a user