using System.Windows.Media;
using System.Windows.Media.Imaging;
using CommunityToolkit.Mvvm.ComponentModel;
using XFEToolBox.Client.Models;
using XFEToolBox.Client.Utilities;
namespace XFEToolBox.Client.ViewModel.Pages;
public partial class LauncherItemViewModel : ObservableObject
{
public LauncherItemViewModel(LauncherItem item)
{
Item = item;
iconSource = CreateFallbackIcon(item);
IconLoadingTask = LoadIconAsync();
}
public LauncherItem Item { get; }
internal Task IconLoadingTask { get; }
public string Title => Item.Title;
public string Subtitle => Item.Subtitle;
public string Detail => Item.Detail;
public string KindText => Item.KindText;
public bool IsPinned => PinnedItemService.IsPinned(Item.Kind, Item.TargetId);
public string PinText => IsPinned ? "取消固定" : "固定";
public string PinGlyph => IsPinned ? "★" : "☆";
[ObservableProperty] private ImageSource iconSource;
[ObservableProperty] private bool isEnabled = true;
public async Task ExecuteAsync()
{
IsEnabled = false;
try { await Item.ExecuteAsync(); }
finally { IsEnabled = true; }
}
public bool TogglePinned()
{
var success = IsPinned
? PinnedItemService.Unpin(Item.Kind, Item.TargetId)
: PinnedItemService.TryPin(Item.Kind, Item.TargetId);
OnPropertyChanged(nameof(IsPinned));
OnPropertyChanged(nameof(PinText));
OnPropertyChanged(nameof(PinGlyph));
return success;
}
private async Task LoadIconAsync()
{
var reference = Item.IconReference;
if (string.IsNullOrWhiteSpace(reference) || reference.StartsWith('/')) return;
try
{
var loaded = await WebImageSourceLoader.LoadAsync(reference);
if (loaded is not null) IconSource = loaded;
}
catch
{
// 保留对应入口类型的内置图标。
}
}
private static ImageSource CreateFallbackIcon(LauncherItem item)
{
var reference = item.IconReference.StartsWith('/')
? item.IconReference
: item.Kind switch
{
LauncherItemKind.Tool => "/Resources/Image/default_tool_icon.png",
LauncherItemKind.Software => "/Resources/Image/download.png",
LauncherItemKind.Project or LauncherItemKind.Command => "/Resources/Image/wrench.png",
_ => "/Resources/Image/grid.png"
};
var image = new BitmapImage(new Uri(
$"/XFEToolBox;component{reference}",
UriKind.Relative));
image.Freeze();
return image;
}
}
using System.Windows.Media;
using System.Windows.Media.Imaging;
using CommunityToolkit.Mvvm.ComponentModel;
using XFEToolBox.Client.Models;
using XFEToolBox.Client.Utilities;
namespace XFEToolBox.Client.ViewModel.Pages;
public partial class LauncherItemViewModel : ObservableObject
{
public LauncherItemViewModel(LauncherItem item)
{
Item = item;
iconSource = CreateFallbackIcon(item);
IconLoadingTask = LoadIconAsync();
}
public LauncherItem Item { get; }
internal Task IconLoadingTask { get; }
public string Title => Item.Title;
public string Subtitle => Item.Subtitle;
public string Detail => Item.Detail;
public string KindText => Item.KindText;
public bool IsPinned => PinnedItemService.IsPinned(Item.Kind, Item.TargetId);
public string PinText => IsPinned ? "取消固定" : "固定";
public string PinGlyph => IsPinned ? "★" : "☆";
[ObservableProperty] private ImageSource iconSource;
[ObservableProperty] private bool isEnabled = true;
public async Task ExecuteAsync()
{
IsEnabled = false;
try { await Item.ExecuteAsync(); }
finally { IsEnabled = true; }
}
public bool TogglePinned()
{
var success = IsPinned
? PinnedItemService.Unpin(Item.Kind, Item.TargetId)
: PinnedItemService.TryPin(Item.Kind, Item.TargetId);
OnPropertyChanged(nameof(IsPinned));
OnPropertyChanged(nameof(PinText));
OnPropertyChanged(nameof(PinGlyph));
return success;
}
private async Task LoadIconAsync()
{
var reference = Item.IconReference;
if (string.IsNullOrWhiteSpace(reference) || reference.StartsWith('/')) return;
try
{
var loaded = await WebImageSourceLoader.LoadAsync(reference);
if (loaded is not null) IconSource = loaded;
}
catch
{
// 保留对应入口类型的内置图标。
}
}
private static ImageSource CreateFallbackIcon(LauncherItem item)
{
var reference = item.IconReference.StartsWith('/')
? item.IconReference
: item.Kind switch
{
LauncherItemKind.Tool => "/Resources/Image/default_tool_icon.png",
LauncherItemKind.Software => "/Resources/Image/download.png",
LauncherItemKind.Project or LauncherItemKind.Command => "/Resources/Image/wrench.png",
_ => "/Resources/Image/grid.png"
};
var image = new BitmapImage(new Uri(
$"/XFEToolBox;component{reference}",
UriKind.Relative));
image.Freeze();
return image;
}
}