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