You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.3 KiB
151 lines
4.3 KiB
using Microsoft.Extensions.Logging;
|
|
using MyAvaloniaApp.ViewModels.Base;
|
|
using ReactiveUI;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Reactive;
|
|
using System.Reactive.Linq;
|
|
using System.Threading.Tasks;
|
|
using HeroIconsAvalonia;
|
|
using HeroIconsAvalonia.Controls;
|
|
using HeroIconsAvalonia.Enums;
|
|
using Avalonia.Controls;
|
|
using Avalonia;
|
|
using Avalonia.Layout;
|
|
|
|
namespace MyAvaloniaApp.ViewModels.Pages;
|
|
|
|
/// <summary>
|
|
/// 图标导航页面的 ViewModel
|
|
/// </summary>
|
|
public class IconsPageViewModel : RoutableViewModel
|
|
{
|
|
private ObservableCollection<HeroIconItem> _heroIcons = new();
|
|
private HeroIconItem? _selectedIcon;
|
|
|
|
private readonly ILogger<IconsPageViewModel>? _logger;
|
|
|
|
public ObservableCollection<HeroIconItem> HeroIcons
|
|
{
|
|
get => _heroIcons;
|
|
set => this.RaiseAndSetIfChanged(ref _heroIcons, value);
|
|
}
|
|
|
|
public HeroIconItem? SelectedIcon
|
|
{
|
|
get => _selectedIcon;
|
|
set => this.RaiseAndSetIfChanged(ref _selectedIcon, value);
|
|
}
|
|
|
|
// 响应式命令
|
|
public ReactiveCommand<HeroIconItem, Unit> CopyIconCommand { get; }
|
|
public ReactiveCommand<HeroIconItem, Unit> SelectIconCommand { get; }
|
|
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
/// <param name="hostScreen">宿主 Screen</param>
|
|
/// <param name="logger">日志记录器</param>
|
|
public IconsPageViewModel(IScreen hostScreen, ILogger<IconsPageViewModel>? logger = null) : base(hostScreen, "Icons")
|
|
{
|
|
_logger = logger;
|
|
|
|
_logger?.LogInformation("IconsPageViewModel 已创建");
|
|
|
|
// 初始化图标数据
|
|
InitializeHeroIcons();
|
|
|
|
// 创建命令
|
|
CopyIconCommand = ReactiveCommand.Create<HeroIconItem>(CopyIconToClipboard);
|
|
SelectIconCommand = ReactiveCommand.Create<HeroIconItem>(SelectIcon);
|
|
|
|
// 监听图标选择变化
|
|
this.WhenAnyValue(x => x.SelectedIcon)
|
|
.Where(icon => icon != null)
|
|
.Subscribe(icon => _logger?.LogInformation("选择图标: {Name}", icon!.DisplayName));
|
|
}
|
|
|
|
|
|
|
|
private void InitializeHeroIcons()
|
|
{
|
|
try
|
|
{
|
|
// 获取所有 IconType 枚举值
|
|
var iconTypes = Enum.GetValues(typeof(IconType)).Cast<IconType>().ToList();
|
|
|
|
_logger?.LogInformation("开始初始化 {Count} 个 HeroIcons 图标", iconTypes.Count);
|
|
|
|
// 添加 Outline 样式的图标
|
|
foreach (var iconType in iconTypes)
|
|
{
|
|
HeroIcons.Add(new HeroIconItem
|
|
{
|
|
IconType = iconType,
|
|
IconKind = IconKind.Outline
|
|
});
|
|
}
|
|
|
|
// 添加 Solid 样式的图标
|
|
foreach (var iconType in iconTypes)
|
|
{
|
|
HeroIcons.Add(new HeroIconItem
|
|
{
|
|
IconType = iconType,
|
|
IconKind = IconKind.Solid
|
|
});
|
|
}
|
|
|
|
_logger?.LogInformation("成功初始化 {Count} 个 HeroIcons 图标", HeroIcons.Count);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger?.LogError(ex, "初始化 HeroIcons 图标时发生错误");
|
|
}
|
|
}
|
|
|
|
private void CopyIconToClipboard(HeroIconItem icon)
|
|
{
|
|
if (icon == null) return;
|
|
|
|
// 这里可以实现复制到剪贴板的逻辑
|
|
_logger?.LogInformation("复制图标到剪贴板: {Name}", icon.DisplayName);
|
|
|
|
// 可以添加通知用户复制成功的逻辑
|
|
}
|
|
|
|
private void SelectIcon(HeroIconItem icon)
|
|
{
|
|
if (icon == null) return;
|
|
|
|
SelectedIcon = icon;
|
|
_logger?.LogInformation("选择图标: {Name}", icon.DisplayName);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// HeroIcons 图标数据模型
|
|
/// </summary>
|
|
public class HeroIconItem : ReactiveObject
|
|
{
|
|
private IconType _iconType;
|
|
private IconKind _iconKind = IconKind.Outline;
|
|
|
|
public IconType IconType
|
|
{
|
|
get => _iconType;
|
|
set => this.RaiseAndSetIfChanged(ref _iconType, value);
|
|
}
|
|
|
|
public IconKind IconKind
|
|
{
|
|
get => _iconKind;
|
|
set => this.RaiseAndSetIfChanged(ref _iconKind, value);
|
|
}
|
|
|
|
public string DisplayName => $"{IconType} ({IconKind})";
|
|
}
|
|
|
|
|