using System.Reactive.Disposables; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.ReactiveUI; using DialogHostAvalonia; using DynamicData; using MsBox.Avalonia.Enums; using ReactiveUI; using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views; public partial class SubSettingWindow : ReactiveWindow { private bool _manualClose = false; public SubSettingWindow() { InitializeComponent(); menuClose.Click += menuClose_Click; this.Closing += SubSettingWindow_Closing; ViewModel = new SubSettingViewModel(UpdateViewHandler); lstSubscription.DoubleTapped += LstSubscription_DoubleTapped; lstSubscription.SelectionChanged += LstSubscription_SelectionChanged; this.WhenActivated(disposables => { this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstSubscription.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstSubscription.SelectedItem).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SubAddCmd, v => v.menuSubAdd).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SubDeleteCmd, v => v.menuSubDelete).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SubEditCmd, v => v.menuSubEdit).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SubShareCmd, v => v.menuSubShare).DisposeWith(disposables); }); } private async Task UpdateViewHandler(EViewAction action, object? obj) { switch (action) { case EViewAction.CloseWindow: this.Close(); break; case EViewAction.ShowYesNo: if (await UI.ShowYesNo(this, ResUI.RemoveServer) != ButtonResult.Yes) { return false; } break; case EViewAction.SubEditWindow: if (obj is null) return false; var window = new SubEditWindow((SubItem)obj); await window.ShowDialog(this); break; case EViewAction.ShareSub: if (obj is null) return false; await ShareSub((string)obj); break; } return await Task.FromResult(true); } private async Task ShareSub(string url) { if (url.IsNullOrEmpty()) { return; } var dialog = new QrcodeView(url); await DialogHost.Show(dialog, "dialogHostSub"); } private void LstSubscription_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) { ViewModel?.EditSubAsync(false); } private void LstSubscription_SelectionChanged(object? sender, SelectionChangedEventArgs e) { if (ViewModel != null) { ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast().ToList(); } } private void menuClose_Click(object? sender, RoutedEventArgs e) { _manualClose = true; this.Close(ViewModel?.IsModified); } private void SubSettingWindow_Closing(object? sender, WindowClosingEventArgs e) { if (ViewModel?.IsModified == true) { if (!_manualClose) { menuClose_Click(null, null); } } } }