mirror of
https://github.com/2dust/v2rayN.git
synced 2026-09-22 22:38:10 +03:00
230 lines
14 KiB
C#
230 lines
14 KiB
C#
using v2rayN.Desktop.Base;
|
|
using v2rayN.Desktop.Common;
|
|
|
|
namespace v2rayN.Desktop.Views;
|
|
|
|
public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
|
|
{
|
|
private static Config _config;
|
|
|
|
public OptionSettingWindow()
|
|
{
|
|
InitializeComponent();
|
|
|
|
Loaded += Window_Loaded;
|
|
btnCancel.Click += (s, e) => Close();
|
|
_config = AppManager.Instance.Config;
|
|
|
|
clbdestOverride.SelectionChanged += ClbdestOverride_SelectionChanged;
|
|
btnBrowseCustomSystemProxyPacPath.Click += BtnBrowseCustomSystemProxyPacPath_Click;
|
|
btnBrowseCustomSystemProxyScriptPath.Click += BtnBrowseCustomSystemProxyScriptPath_Click;
|
|
|
|
clbdestOverride.ItemsSource = Global.destOverrideProtocols;
|
|
_config.Inbound.First().DestOverride?.ForEach(it =>
|
|
{
|
|
clbdestOverride.SelectedItems.Add(it);
|
|
});
|
|
|
|
cmbsystemProxyAdvancedProtocol.ItemsSource = Global.IEProxyProtocols;
|
|
cmbloglevel.ItemsSource = Global.LogLevels;
|
|
cmbdefFingerprint.ItemsSource = Global.Fingerprints;
|
|
cmbdefUserAgent.ItemsSource = Global.UserAgent;
|
|
cmbmux4SboxProtocol.ItemsSource = Global.SingboxMuxs;
|
|
cmbMtu.ItemsSource = Global.TunMtus;
|
|
cmbStack.ItemsSource = Global.TunStacks;
|
|
cmbIcmpRoutingPolicy.ItemsSource = Global.TunIcmpRoutingPolicies;
|
|
cmbIpv4Address.ItemsSource = Global.TunIpv4Address;
|
|
cmbIpv6Address.ItemsSource = Global.TunIpv6Address;
|
|
cmbFragmentPackets.ItemsSource = Global.FragmentPacketsOptions;
|
|
|
|
cmbCoreType1.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType2.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType3.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType4.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType5.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType6.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType7.ItemsSource = Global.CoreTypes;
|
|
cmbCoreType9.ItemsSource = Global.CoreTypes;
|
|
|
|
cmbMixedConcurrencyCount.ItemsSource = Enumerable.Range(2, 7).ToList();
|
|
cmbSpeedTestTimeout.ItemsSource = Enumerable.Range(2, 5).Select(i => i * 5).ToList();
|
|
cmbSpeedTestUrl.ItemsSource = Global.SpeedTestUrls;
|
|
cmbSpeedPingTestUrl.ItemsSource = Global.SpeedPingTestUrls;
|
|
cmbUdpTestTarget.ItemsSource = Global.UdpTestTargets;
|
|
cmbSubConvertUrl.ItemsSource = Global.SubConvertUrls;
|
|
cmbGetFilesSourceUrl.ItemsSource = Global.GeoFilesSources;
|
|
cmbSrsFilesSourceUrl.ItemsSource = Global.SingboxRulesetSources;
|
|
cmbRoutingRulesSourceUrl.ItemsSource = Global.RoutingRulesSources;
|
|
cmbIPAPIUrl.ItemsSource = Global.IPAPIUrls;
|
|
cmbRootCertificateProvider.ItemsSource = Global.RootCertProviders;
|
|
|
|
cmbMainGirdOrientation.ItemsSource = Utils.GetEnumNames<EGirdOrientation>();
|
|
|
|
_ = InitSettingFont();
|
|
|
|
this.WhenActivated(disposables =>
|
|
{
|
|
this.Bind(ViewModel, vm => vm.LocalPort, v => v.txtlocalPort.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SecondLocalPortEnabled, v => v.togSecondLocalPortEnabled.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.UdpEnabled, v => v.togudpEnabled.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SniffingEnabled, v => v.togsniffingEnabled.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.RouteOnly, v => v.togrouteOnly.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.AllowLANConn, v => v.togAllowLANConn.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.NewPort4LAN, v => v.togNewPort4LAN.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.NewPort4LAN, v => v.txtuser.IsEnabled).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.NewPort4LAN, v => v.txtpass.IsEnabled).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.User, v => v.txtuser.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.Pass, v => v.txtpass.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.LogEnabled, v => v.toglogEnabled.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.Loglevel, v => v.cmbloglevel.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DefFingerprint, v => v.cmbdefFingerprint.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DefUserAgent, v => v.cmbdefUserAgent.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.BindInterface, v => v.txtbindInterface.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SendThrough, v => v.txtsendThrough.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.Mux4SboxProtocol, v => v.cmbmux4SboxProtocol.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.EnableCacheFile4Sbox, v => v.togenableCacheFile4Sbox.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.HyUpMbps, v => v.txtUpMbps.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.HyDownMbps, v => v.txtDownMbps.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.SelectedItem).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.FragmentLengths, v => v.txtFragmentLengths.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.FragmentDelays, v => v.txtFragmentDelays.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
|
|
|
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.EnableStatistics, v => v.togEnableStatistics.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DisplayRealTimeSpeed, v => v.togDisplayRealTimeSpeed.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.KeepOlderDedupl, v => v.togKeepOlderDedupl.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.Hide2TrayWhenClose, v => v.togHide2TrayWhenClose.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.MacOSShowInDock, v => v.togMacOSShowInDock.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CurrentFontFamily, v => v.cmbcurrentFontFamily.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SpeedTestTimeout, v => v.cmbSpeedTestTimeout.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SpeedTestUrl, v => v.cmbSpeedTestUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SpeedPingTestUrl, v => v.cmbSpeedPingTestUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.UdpTestTarget, v => v.cmbUdpTestTarget.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.MixedConcurrencyCount, v => v.cmbMixedConcurrencyCount.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SubConvertUrl, v => v.cmbSubConvertUrl.Text).DisposeWith(disposables);
|
|
this.Bind<OptionSettingViewModel, OptionSettingWindow, int, int>(ViewModel,
|
|
vm => vm.MainGirdOrientation, view => view.cmbMainGirdOrientation.SelectedIndex).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.GeoFileSourceUrl, v => v.cmbGetFilesSourceUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SrsFileSourceUrl, v => v.cmbSrsFilesSourceUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.RoutingRulesSourceUrl, v => v.cmbRoutingRulesSourceUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.IPAPIUrl, v => v.cmbIPAPIUrl.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.RootCertProvider, v => v.cmbRootCertificateProvider.SelectedValue).DisposeWith(disposables);
|
|
|
|
this.Bind(ViewModel, vm => vm.NotProxyLocalAddress, v => v.tognotProxyLocalAddress.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SystemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.SystemProxyExceptions, v => v.txtsystemProxyExceptions.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CustomSystemProxyPacPath, v => v.txtCustomSystemProxyPacPath.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CustomSystemProxyScriptPath, v => v.txtCustomSystemProxyScriptPath.Text).DisposeWith(disposables);
|
|
|
|
this.Bind(ViewModel, vm => vm.TunAutoRoute, v => v.togAutoRoute.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunStrictRoute, v => v.togStrictRoute.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunStack, v => v.cmbStack.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunMtu, v => v.cmbMtu.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunEnableIPv6Address, v => v.togEnableIPv6Address.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunIcmpRouting, v => v.cmbIcmpRoutingPolicy.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunEnableLegacyProtect, v => v.togEnableLegacyProtect.IsChecked).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunRouteExcludeAddress, v => v.txtRouteExcludeAddress.Text).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunIpv4Address, v => v.cmbIpv4Address.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.TunIpv6Address, v => v.cmbIpv6Address.SelectedValue).DisposeWith(disposables);
|
|
|
|
this.Bind(ViewModel, vm => vm.CoreType1, v => v.cmbCoreType1.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType2, v => v.cmbCoreType2.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType3, v => v.cmbCoreType3.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType4, v => v.cmbCoreType4.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType5, v => v.cmbCoreType5.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType6, v => v.cmbCoreType6.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType7, v => v.cmbCoreType7.SelectedValue).DisposeWith(disposables);
|
|
this.Bind(ViewModel, vm => vm.CoreType9, v => v.cmbCoreType9.SelectedValue).DisposeWith(disposables);
|
|
|
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
|
});
|
|
}
|
|
|
|
private async Task InitSettingFont()
|
|
{
|
|
var lstFonts = await GetFonts();
|
|
|
|
lstFonts.Add(string.Empty);
|
|
cmbcurrentFontFamily.ItemsSource = lstFonts;
|
|
}
|
|
|
|
private async Task<List<string>> GetFonts()
|
|
{
|
|
await Task.CompletedTask;
|
|
|
|
var lstFonts = new List<string>();
|
|
try
|
|
{
|
|
var lst = FontManager.Current.SystemFonts
|
|
.Select(t => t.Name)
|
|
.Append(GetDefaultFontFamilyName())
|
|
.Where(IsInstalledFontFamilyName)
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
.OrderBy(t => t)
|
|
.ToList();
|
|
return lst;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog("GetFonts", ex);
|
|
}
|
|
return lstFonts;
|
|
}
|
|
|
|
private static string GetDefaultFontFamilyName() => "Noto Sans SC";
|
|
|
|
private static bool IsInstalledFontFamilyName(string fontFamilyName)
|
|
{
|
|
return fontFamilyName.IsNotEmpty()
|
|
&& !IsCssFontFamilyAlias(fontFamilyName);
|
|
}
|
|
|
|
private static bool IsCssFontFamilyAlias(string fontFamilyName)
|
|
{
|
|
return fontFamilyName.StartsWith("-", StringComparison.Ordinal)
|
|
|| fontFamilyName.Equals("BlinkMacSystemFont", StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
|
|
private void ClbdestOverride_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (ViewModel != null)
|
|
{
|
|
ViewModel.DestOverride = clbdestOverride.SelectedItems.Cast<string>().ToList();
|
|
}
|
|
}
|
|
|
|
private async void BtnBrowseCustomSystemProxyPacPath_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
var fileName = await UI.OpenFileDialog(null);
|
|
if (fileName.IsNullOrEmpty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
txtCustomSystemProxyPacPath.Text = fileName;
|
|
}
|
|
|
|
private async void BtnBrowseCustomSystemProxyScriptPath_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
var fileName = await UI.OpenFileDialog(null);
|
|
if (fileName.IsNullOrEmpty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
txtCustomSystemProxyScriptPath.Text = fileName;
|
|
}
|
|
|
|
private void Window_Loaded(object? sender, RoutedEventArgs e)
|
|
{
|
|
btnCancel.Focus();
|
|
}
|
|
}
|