using Avalonia.Controls; using Remotely.Desktop.Shared.Services; using Remotely.Shared.Models; using System.Collections.ObjectModel; using System.Diagnostics; using System.Windows.Input; using Microsoft.Extensions.Logging; using Remotely.Desktop.Shared.Reactive; using Microsoft.Extensions.DependencyInjection; using Remotely.Desktop.UI.Controls.Dialogs; namespace Remotely.Desktop.UI.ViewModels; public interface IMainViewViewModel : IBrandedViewModelBase { AsyncRelayCommand ChangeServerCommand { get; } AsyncRelayCommand CopyLinkCommand { get; } double CopyMessageOpacity { get; set; } string Host { get; set; } bool IsCopyMessageVisible { get; set; } ICommand OpenOptionsMenu { get; } AsyncRelayCommand RemoveViewersCommand { get; } IList SelectedViewers { get; } string StatusMessage { get; set; } ObservableCollection Viewers { get; } Task ChangeServer(); Task CopyLink(); Task GetSessionID(); Task Init(); Task PromptForHostName(); Task RemoveViewers(); } public class MainViewViewModel : BrandedViewModelBase, IMainViewViewModel { private readonly IAppState _appState; private readonly IDesktopEnvironment _environment; private readonly IDialogProvider _dialogProvider; private readonly IDesktopHubConnection _hubConnection; private readonly IServiceProvider _serviceProvider; private readonly IViewModelFactory _viewModelFactory; private IList _selectedViewers = new List(); public MainViewViewModel( IBrandingProvider brandingProvider, IUiDispatcher dispatcher, IAppState appState, IDesktopHubConnection hubConnection, IServiceProvider serviceProvider, IViewModelFactory viewModelFactory, IDesktopEnvironment environmentHelper, IDialogProvider dialogProvider, ILogger logger) : base(brandingProvider, dispatcher, logger) { _appState = appState; _hubConnection = hubConnection; _serviceProvider = serviceProvider; _viewModelFactory = viewModelFactory; _environment = environmentHelper; _dialogProvider = dialogProvider; _appState.ViewerRemoved += ViewerRemoved; _appState.ViewerAdded += ViewerAdded; _appState.ScreenCastRequested += ScreenCastRequested; Host = appState.Host; ChangeServerCommand = new AsyncRelayCommand(ChangeServer); CopyLinkCommand = new AsyncRelayCommand(CopyLink); RemoveViewersCommand = new AsyncRelayCommand(RemoveViewers, CanRemoveViewers); } public AsyncRelayCommand ChangeServerCommand { get; } public AsyncRelayCommand CopyLinkCommand { get; } public double CopyMessageOpacity { get => Get(); set => Set(value); } public string Host { get => Get() ?? string.Empty; set => Set(value); } public bool IsCopyMessageVisible { get => Get(); set => Set(value); } public ICommand OpenOptionsMenu { get; } = new RelayCommand