更新功能优化、插件市场优化,反正就是优化了很多东西
This commit is contained in:
lincube
2026-03-25 11:27:30 +08:00
parent 74703582e7
commit 372b5b7adc
28 changed files with 1360 additions and 572 deletions

View File

@@ -4,8 +4,8 @@
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia"
xmlns:helpers="using:LanMountainDesktop.Helpers"
xmlns:fi="using:FluentIcons.Avalonia.Fluent"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginMarketDetailDrawer"
x:DataType="vm:PluginMarketDetailViewModel">
x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogDetailDrawer"
x:DataType="vm:PluginCatalogDetailViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container"
Margin="0,0,0,8">
@@ -41,7 +41,7 @@
</StackPanel>
<Button Grid.Column="2"
Classes="plugin-market-icon-button"
Classes="plugin-catalog-icon-button"
VerticalAlignment="Center"
Command="{Binding PerformPrimaryActionCommand}"
IsEnabled="{Binding Item.IsActionEnabled}"
@@ -103,7 +103,7 @@
TextWrapping="Wrap" />
<mdxaml:MarkdownScrollViewer IsVisible="{Binding HasReadmeContent}"
Markdown="{Binding ReadmeMarkdown}"
Engine="{x:Static helpers:PluginMarketMarkdownHelper.Engine}" />
Engine="{x:Static helpers:PluginCatalogMarkdownHelper.Engine}" />
</StackPanel>
</Border>

View File

@@ -3,14 +3,14 @@ using LanMountainDesktop.ViewModels;
namespace LanMountainDesktop.Views.SettingsPages;
public partial class PluginMarketDetailDrawer : UserControl
public partial class PluginCatalogDetailDrawer : UserControl
{
public PluginMarketDetailDrawer()
public PluginCatalogDetailDrawer()
{
InitializeComponent();
}
public PluginMarketDetailDrawer(PluginMarketDetailViewModel viewModel)
public PluginCatalogDetailDrawer(PluginCatalogDetailViewModel viewModel)
{
DataContext = viewModel;
InitializeComponent();

View File

@@ -3,9 +3,9 @@
xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginMarketSettingsPage"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogSettingsPage"
x:Name="Root"
x:DataType="vm:PluginMarketSettingsPageViewModel">
x:DataType="vm:PluginCatalogSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated">
<ui:SettingsExpander Header="{Binding RefreshButtonText}"
@@ -47,7 +47,7 @@
</Style>
</ListBox.Styles>
<ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:PluginMarketItemViewModel">
<DataTemplate x:DataType="vm:PluginCatalogItemViewModel">
<Border Classes="settings-list-item">
<Grid ColumnDefinitions="Auto,*,Auto"
ColumnSpacing="14">
@@ -70,7 +70,7 @@
</Border>
<Button Grid.Column="1"
Classes="plugin-market-row-button"
Classes="plugin-catalog-row-button"
Command="{Binding #Root.DataContext.OpenDetailsCommand}"
CommandParameter="{Binding}">
<StackPanel Spacing="4"
@@ -83,7 +83,7 @@
</Button>
<Button Grid.Column="2"
Classes="plugin-market-icon-button"
Classes="plugin-catalog-icon-button"
VerticalAlignment="Center"
Command="{Binding #Root.DataContext.ExecutePrimaryActionCommand}"
CommandParameter="{Binding}"

View File

@@ -9,21 +9,21 @@ using LanMountainDesktop.ViewModels;
namespace LanMountainDesktop.Views.SettingsPages;
[SettingsPageInfo(
"plugin-market",
"Plugin Market",
SettingsPageCategory.PluginMarket,
"plugin-catalog",
"Plugin Catalog",
SettingsPageCategory.PluginCatalog,
IconKey = "ShoppingBag",
SortOrder = 35,
TitleLocalizationKey = "settings.plugin_market.title",
DescriptionLocalizationKey = "settings.plugin_market.subtitle")]
public partial class PluginMarketSettingsPage : SettingsPageBase
TitleLocalizationKey = "settings.plugin_catalog.title",
DescriptionLocalizationKey = "settings.plugin_catalog.subtitle")]
public partial class PluginCatalogSettingsPage : SettingsPageBase
{
public PluginMarketSettingsPage()
public PluginCatalogSettingsPage()
: this(Design.IsDesignMode ? CreateDesignTimeViewModel() : CreateDefaultViewModel())
{
}
public PluginMarketSettingsPage(PluginMarketSettingsPageViewModel viewModel)
public PluginCatalogSettingsPage(PluginCatalogSettingsPageViewModel viewModel)
{
ViewModel = viewModel;
ViewModel.RestartRequested += OnRestartRequested;
@@ -32,7 +32,7 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
InitializeComponent();
}
public PluginMarketSettingsPageViewModel ViewModel { get; }
public PluginCatalogSettingsPageViewModel ViewModel { get; }
public override async void OnNavigatedTo(object? parameter)
{
@@ -44,22 +44,22 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
await ViewModel.InitializeAsync();
}
private static PluginMarketSettingsPageViewModel CreateDefaultViewModel()
private static PluginCatalogSettingsPageViewModel CreateDefaultViewModel()
{
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
var localizationService = new LocalizationService();
return new PluginMarketSettingsPageViewModel(
return new PluginCatalogSettingsPageViewModel(
settingsFacade,
localizationService,
new AirAppMarketIconService(),
new AirAppMarketReadmeService());
}
private static PluginMarketSettingsPageViewModel CreateDesignTimeViewModel()
private static PluginCatalogSettingsPageViewModel CreateDesignTimeViewModel()
{
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
var localizationService = new LocalizationService();
var viewModel = new PluginMarketSettingsPageViewModel(
var viewModel = new PluginCatalogSettingsPageViewModel(
settingsFacade,
localizationService,
new AirAppMarketIconService(),
@@ -68,8 +68,8 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
var previewHostVersion = new Version(1, 2, 0);
var items = new[]
{
CreateMarketItem(
new PluginMarketPluginInfo(
CreateCatalogItemViewModel(
CreateCatalogItem(
"news-tiles",
"News Tiles",
"Brings editorial news cards and ticker rows to the desktop.",
@@ -91,8 +91,8 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
localizationService,
installedPlugin: null,
previewHostVersion),
CreateMarketItem(
new PluginMarketPluginInfo(
CreateCatalogItemViewModel(
CreateCatalogItem(
"workspace-pulse",
"Workspace Pulse",
"Tracks active projects and shows a compact productivity summary.",
@@ -125,8 +125,8 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
true,
null),
previewHostVersion),
CreateMarketItem(
new PluginMarketPluginInfo(
CreateCatalogItemViewModel(
CreateCatalogItem(
"glass-panels",
"Glass Panels",
"Adds experimental acrylic surfaces for plugin-powered widgets.",
@@ -152,7 +152,7 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
foreach (var item in items)
{
viewModel.MarketPlugins.Add(item);
viewModel.CatalogPlugins.Add(item);
viewModel.FilteredPlugins.Add(item);
}
@@ -167,24 +167,87 @@ public partial class PluginMarketSettingsPage : SettingsPageBase
RequestRestart(reason ?? ViewModel.RestartRequiredMessage);
}
private async void OnDetailsRequested(PluginMarketItemViewModel item)
private async void OnDetailsRequested(PluginCatalogItemViewModel item)
{
var detailViewModel = ViewModel.CreateDetailViewModel(item);
var drawer = new PluginMarketDetailDrawer(detailViewModel);
var drawer = new PluginCatalogDetailDrawer(detailViewModel);
OpenDrawer(drawer, detailViewModel.DrawerTitle);
await detailViewModel.InitializeAsync();
}
private static PluginMarketItemViewModel CreateMarketItem(
PluginMarketPluginInfo plugin,
private static PluginCatalogItemViewModel CreateCatalogItemViewModel(
PluginCatalogItemInfo plugin,
LocalizationService localizationService,
InstalledPluginInfo? installedPlugin,
Version hostVersion)
{
var languageCode = localizationService.NormalizeLanguageCode(
HostSettingsFacadeProvider.GetOrCreate().Region.Get().LanguageCode);
var item = new PluginMarketItemViewModel(plugin, localizationService, languageCode);
var item = new PluginCatalogItemViewModel(plugin, localizationService, languageCode);
item.ApplyInstallState(installedPlugin, hostVersion);
return item;
}
private static PluginCatalogItemInfo CreateCatalogItem(
string id,
string name,
string description,
string author,
string version,
string apiVersion,
string minHostVersion,
string downloadUrl,
string releaseTag,
string releaseAssetName,
string iconUrl,
string readmeUrl,
string homepageUrl,
string repositoryUrl,
string[] tags,
PluginCatalogSharedContractInfo[] sharedContracts,
DateTimeOffset publishedAt,
DateTimeOffset updatedAt)
{
return new PluginCatalogItemInfo(
new PluginCatalogManifestInfo(
id,
name,
description,
author,
version,
apiVersion,
string.Empty,
sharedContracts),
new PluginCatalogCompatibilityInfo(
minHostVersion,
apiVersion),
new PluginCatalogRepositoryInfo(
iconUrl,
homepageUrl,
readmeUrl,
homepageUrl,
repositoryUrl,
tags,
string.Empty),
new PluginCatalogPublicationInfo(
releaseTag,
releaseAssetName,
publishedAt,
updatedAt,
0,
string.Empty,
null),
string.IsNullOrWhiteSpace(downloadUrl)
? []
: [
new PluginPackageSourceInfo(
string.IsNullOrWhiteSpace(releaseTag)
? LanMountainDesktop.Services.Settings.PluginPackageSourceKind.RawFallback
: LanMountainDesktop.Services.Settings.PluginPackageSourceKind.ReleaseAsset,
downloadUrl,
string.Empty,
0)
],
[]);
}
}

View File

@@ -47,7 +47,7 @@
<mdxaml:MarkdownScrollViewer IsVisible="{Binding HasContent}"
Markdown="{Binding MarkdownContent}"
Engine="{x:Static helpers:PluginMarketMarkdownHelper.Engine}" />
Engine="{x:Static helpers:PluginCatalogMarkdownHelper.Engine}" />
</StackPanel>
</Border>
</StackPanel>

View File

@@ -141,6 +141,9 @@
<Button Command="{Binding DownloadLatestReleaseCommand}"
Content="{Binding DownloadButtonText}"
IsVisible="{Binding IsDownloadButtonVisible}" />
<Button Command="{Binding RedownloadUpdateCommand}"
Content="{Binding RedownloadButtonText}"
IsVisible="{Binding IsRedownloadButtonVisible}" />
<Button Classes="settings-accent-button"
Command="{Binding InstallPendingUpdateCommand}"
Content="{Binding InstallNowButtonText}"
@@ -172,6 +175,14 @@
</ComboBox.ItemTemplate>
</ComboBox>
</ui:SettingsExpander.Footer>
<ui:SettingsExpanderItem Content="{Binding ForceCheckUpdateLabel}"
Description="{Binding ForceCheckUpdateDescription}"
IsClickEnabled="True"
Command="{Binding ForceCheckUpdateCommand}">
<ui:SettingsExpanderItem.IconSource>
<fi:SymbolIconSource Symbol="ArrowSync" />
</ui:SettingsExpanderItem.IconSource>
</ui:SettingsExpanderItem>
</ui:SettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card"