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; /// /// 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); }