using System.Collections.Generic; using System.Threading.Tasks; using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; using Flow.Launcher.Avalonia.Helper; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; namespace Flow.Launcher.Avalonia.ViewModel; /// /// ViewModel for a single result item. /// public partial class ResultViewModel : ObservableObject { [ObservableProperty] private string _title = string.Empty; [ObservableProperty] private string _subTitle = string.Empty; [ObservableProperty] private string _iconPath = string.Empty; [ObservableProperty] private bool _isSelected; [ObservableProperty] private Settings? _settings; [ObservableProperty] private int _score; [ObservableProperty] private IList? _titleHighlightData; [ObservableProperty] private IList? _subTitleHighlightData; /// /// The underlying plugin result. Used for executing actions and accessing additional properties. /// public Result? PluginResult { get; set; } // Computed properties for display public bool ShowIcon => !string.IsNullOrEmpty(IconPath); public bool ShowSubTitle => !string.IsNullOrEmpty(SubTitle); /// /// Gets the query suggestion text for autocomplete, if available. /// public string? QuerySuggestionText => PluginResult?.AutoCompleteText; // Cached task for the image - created once per IconPath private Task? _imageTask; /// /// The icon image task. Use with Avalonia's ^ stream binding operator. /// Returns a cached task to avoid re-loading on every property access. /// public Task Image => _imageTask ??= ImageLoader.LoadAsync(IconPath); // Glyph support private GlyphInfo? _glyph; public GlyphInfo? Glyph { get => _glyph; set { if (SetProperty(ref _glyph, value)) { OnPropertyChanged(nameof(GlyphAvailable)); OnPropertyChanged(nameof(ShowGlyph)); OnPropertyChanged(nameof(GlyphFontFamily)); } } } public bool GlyphAvailable => Glyph != null; public bool ShowGlyph => Settings?.UseGlyphIcons == true && GlyphAvailable; /// /// Gets the FontFamily for the glyph icon, handling file paths and resource paths. /// public FontFamily? GlyphFontFamily => Glyph != null ? FontLoader.GetFontFamily(Glyph) : null; }