using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.ReactiveUI; using ReactiveUI; using System.Reactive.Disposables; namespace v2rayN.Desktop.Views { public partial class RoutingRuleDetailsWindow : ReactiveWindow { public RoutingRuleDetailsWindow() { InitializeComponent(); } public RoutingRuleDetailsWindow(RulesItem rulesItem) { InitializeComponent(); this.Loaded += Window_Loaded; btnCancel.Click += (s, e) => this.Close(); clbProtocol.SelectionChanged += ClbProtocol_SelectionChanged; clbInboundTag.SelectionChanged += ClbInboundTag_SelectionChanged; ViewModel = new RoutingRuleDetailsViewModel(rulesItem, UpdateViewHandler); cmbOutboundTag.Items.Add(Global.ProxyTag); cmbOutboundTag.Items.Add(Global.DirectTag); cmbOutboundTag.Items.Add(Global.BlockTag); Global.RuleProtocols.ForEach(it => { clbProtocol.Items.Add(it); }); Global.InboundTags.ForEach(it => { clbInboundTag.Items.Add(it); }); Global.RuleNetworks.ForEach(it => { cmbNetwork.Items.Add(it); }); if (!rulesItem.id.IsNullOrEmpty()) { rulesItem.protocol?.ForEach(it => { clbProtocol.SelectedItems.Add(it); }); rulesItem.inboundTag?.ForEach(it => { clbInboundTag.SelectedItems.Add(it); }); } this.WhenActivated(disposables => { this.Bind(ViewModel, vm => vm.SelectedSource.outboundTag, v => v.cmbOutboundTag.SelectedValue).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.port, v => v.txtPort.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.network, v => v.cmbNetwork.SelectedValue).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.enabled, v => v.togEnabled.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Domain, v => v.txtDomain.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.IP, v => v.txtIP.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Process, v => v.txtProcess.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoSort, v => v.chkAutoSort.IsChecked).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); }); } private async Task UpdateViewHandler(EViewAction action, object? obj) { switch (action) { case EViewAction.CloseWindow: this.Close(true); break; } return await Task.FromResult(true); } private void Window_Loaded(object? sender, RoutedEventArgs e) { cmbOutboundTag.Focus(); } private void ClbProtocol_SelectionChanged(object? sender, SelectionChangedEventArgs e) { ViewModel.ProtocolItems = clbProtocol.SelectedItems.Cast().ToList(); } private void ClbInboundTag_SelectionChanged(object? sender, SelectionChangedEventArgs e) { ViewModel.InboundTagItems = clbInboundTag.SelectedItems.Cast().ToList(); } private void linkRuleobjectDoc_Click(object? sender, RoutedEventArgs e) { Utils.ProcessStart("https://xtls.github.io/config/routing.html#ruleobject"); } } }