mirror of
https://github.com/2dust/v2rayN.git
synced 2026-05-18 08:04:37 +03:00
7995bdd4df
* Revert "Temporary addition to support proper use of sing-box v1.12"
This reverts commit 508eb24fc3.
* Migrating to singbox 1.11 support
* Removes unnecessary sniffer
* Migrating to singbox 1.12 support
* Adds Google cn dns rules
* Improves geoip rule handling in singbox
* add anytls support
* Simplifies local DNS address handling
* Enables dhcp interface configuration
* Fetches DNS strategy for domain resolution
* support Wireguard endpoint
Refactors Singbox config classes for dial fields
* Utils.GetFreePort() default port to be zero
* Adds Sing-box legacy DNS config support
* Adds IPv4 preference to DNS configurations
对应原dns.servers[].strategy = prefer_ipv4
* Refactors DNS address parsing
* Fixes config generation
* fix singbox endpoints proxy chain not work
* Fixes wrong field
* Removes direct clash_mode domain strategy
* Improves DNS address parsing in Singbox
DNS type, host, port, and path
* Adds properties to Rule4Sbox class
* Removes Wireguard listen port
* Support sing-box hosts
* Adds tag resolver supports
* Adds sing-box DomainStrategy support
* Deletes Duplicate Rules
* Adds anytls reality support
* Fixes
* Updates sing-box documentation link
* Updates translations
140 lines
5.2 KiB
C#
140 lines
5.2 KiB
C#
using System.Reactive.Disposables;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using Avalonia.Interactivity;
|
|
using MsBox.Avalonia.Enums;
|
|
using ReactiveUI;
|
|
using v2rayN.Desktop.Base;
|
|
using v2rayN.Desktop.Common;
|
|
|
|
namespace v2rayN.Desktop.Views;
|
|
|
|
public partial class RoutingSettingWindow : WindowBase<RoutingSettingViewModel>
|
|
{
|
|
private bool _manualClose = false;
|
|
|
|
public RoutingSettingWindow()
|
|
{
|
|
InitializeComponent();
|
|
|
|
this.Closing += RoutingSettingWindow_Closing;
|
|
btnCancel.Click += (s, e) => this.Close();
|
|
this.KeyDown += RoutingSettingWindow_KeyDown;
|
|
lstRoutings.SelectionChanged += lstRoutings_SelectionChanged;
|
|
lstRoutings.DoubleTapped += LstRoutings_DoubleTapped;
|
|
menuRoutingAdvancedSelectAll.Click += menuRoutingAdvancedSelectAll_Click;
|
|
|
|
ViewModel = new RoutingSettingViewModel(UpdateViewHandler);
|
|
|
|
cmbdomainStrategy.ItemsSource = Global.DomainStrategies;
|
|
cmbdomainMatcher.ItemsSource = Global.DomainMatchers;
|
|
cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Singbox;
|
|
|
|
this.WhenActivated(disposables =>
|
|
{
|
|
this.OneWayBind(ViewModel, vm => vm.RoutingItems, v => v.lstRoutings.ItemsSource).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstRoutings.SelectedItem).DisposeWith(disposables);
|
|
|
|
this.Bind(ViewModel, vm => vm.DomainStrategy, v => v.cmbdomainStrategy.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DomainMatcher, v => v.cmbdomainMatcher.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DomainStrategy4Singbox, v => v.cmbdomainStrategy4Singbox.SelectedValue).DisposeWith(disposables);
|
|
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedAddCmd, v => v.menuRoutingAdvancedAdd).DisposeWith(disposables);
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedAddCmd, v => v.menuRoutingAdvancedAdd2).DisposeWith(disposables);
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedRemoveCmd, v => v.menuRoutingAdvancedRemove).DisposeWith(disposables);
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedSetDefaultCmd, v => v.menuRoutingAdvancedSetDefault).DisposeWith(disposables);
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedImportRulesCmd, v => v.menuRoutingAdvancedImportRules).DisposeWith(disposables);
|
|
this.BindCommand(ViewModel, vm => vm.RoutingAdvancedImportRulesCmd, v => v.menuRoutingAdvancedImportRules2).DisposeWith(disposables);
|
|
|
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
|
});
|
|
}
|
|
|
|
private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
|
|
{
|
|
switch (action)
|
|
{
|
|
case EViewAction.CloseWindow:
|
|
this.Close(true);
|
|
break;
|
|
|
|
case EViewAction.ShowYesNo:
|
|
if (await UI.ShowYesNo(this, ResUI.RemoveRules) != ButtonResult.Yes)
|
|
{
|
|
return false;
|
|
}
|
|
break;
|
|
|
|
case EViewAction.RoutingRuleSettingWindow:
|
|
if (obj is null)
|
|
return false;
|
|
return await new RoutingRuleSettingWindow((RoutingItem)obj).ShowDialog<bool>(this);
|
|
}
|
|
return await Task.FromResult(true);
|
|
}
|
|
|
|
private void RoutingSettingWindow_KeyDown(object? sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyModifiers is KeyModifiers.Control or KeyModifiers.Meta)
|
|
{
|
|
if (e.Key == Key.A)
|
|
{
|
|
lstRoutings.SelectAll();
|
|
}
|
|
}
|
|
else if (e.Key is Key.Enter or Key.Return)
|
|
{
|
|
ViewModel?.RoutingAdvancedSetDefault();
|
|
}
|
|
else if (e.Key == Key.Delete)
|
|
{
|
|
ViewModel?.RoutingAdvancedRemoveAsync();
|
|
}
|
|
}
|
|
|
|
private void menuRoutingAdvancedSelectAll_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
lstRoutings.SelectAll();
|
|
}
|
|
|
|
private void lstRoutings_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (ViewModel != null)
|
|
{
|
|
ViewModel.SelectedSources = lstRoutings.SelectedItems.Cast<RoutingItemModel>().ToList();
|
|
}
|
|
}
|
|
|
|
private void LstRoutings_DoubleTapped(object? sender, TappedEventArgs e)
|
|
{
|
|
ViewModel?.RoutingAdvancedEditAsync(false);
|
|
}
|
|
|
|
private void linkdomainStrategy_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
ProcUtils.ProcessStart("https://xtls.github.io/config/routing.html");
|
|
}
|
|
|
|
private void linkdomainStrategy4Singbox_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
ProcUtils.ProcessStart("https://sing-box.sagernet.org/zh/configuration/route/rule_action/#strategy");
|
|
}
|
|
|
|
private void btnCancel_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
_manualClose = true;
|
|
this.Close(ViewModel?.IsModified);
|
|
}
|
|
|
|
private void RoutingSettingWindow_Closing(object? sender, WindowClosingEventArgs e)
|
|
{
|
|
if (ViewModel?.IsModified == true)
|
|
{
|
|
if (!_manualClose)
|
|
{
|
|
btnCancel_Click(null, null);
|
|
}
|
|
}
|
|
}
|
|
}
|