mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-14 12:29:13 +00:00
Config and GUI
This commit is contained in:
parent
b460b0ff91
commit
c899d534af
12 changed files with 561 additions and 122 deletions
|
@ -278,6 +278,30 @@ public class Global
|
||||||
"sing_box"
|
"sing_box"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static readonly List<string> Hysteria2CoreTypes =
|
||||||
|
[
|
||||||
|
"sing_box",
|
||||||
|
"Hysteria2"
|
||||||
|
];
|
||||||
|
|
||||||
|
public static readonly List<string> TuicCoreTypes =
|
||||||
|
[
|
||||||
|
"sing_box",
|
||||||
|
"TUIC"
|
||||||
|
];
|
||||||
|
|
||||||
|
public static readonly List<EConfigType> SupportSplitConfigTypes =
|
||||||
|
[
|
||||||
|
EConfigType.VMess,
|
||||||
|
EConfigType.VLESS,
|
||||||
|
EConfigType.Shadowsocks,
|
||||||
|
EConfigType.Trojan,
|
||||||
|
EConfigType.Hysteria2,
|
||||||
|
EConfigType.TUIC,
|
||||||
|
EConfigType.WireGuard,
|
||||||
|
EConfigType.SOCKS,
|
||||||
|
];
|
||||||
|
|
||||||
public static readonly List<string> DomainStrategies =
|
public static readonly List<string> DomainStrategies =
|
||||||
[
|
[
|
||||||
"AsIs",
|
"AsIs",
|
||||||
|
|
|
@ -235,5 +235,16 @@ public sealed class AppHandler
|
||||||
return item?.CoreType ?? ECoreType.Xray;
|
return item?.CoreType ?? ECoreType.Xray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ECoreType GetSplitCoreType(ProfileItem profileItem, EConfigType eConfigType)
|
||||||
|
{
|
||||||
|
if (profileItem?.CoreType != null)
|
||||||
|
{
|
||||||
|
return (ECoreType)profileItem.CoreType;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = _config.SplitCoreItem.SplitCoreTypes?.FirstOrDefault(it => it.ConfigType == eConfigType);
|
||||||
|
return item?.CoreType ?? ECoreType.Xray;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion Core Type
|
#endregion Core Type
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,6 +165,13 @@ public class ConfigHandler
|
||||||
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
|
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.SplitCoreItem ??= new()
|
||||||
|
{
|
||||||
|
EnableSplitCore = false,
|
||||||
|
SplitCoreTypes = new List<CoreTypeItem>(),
|
||||||
|
RouteCoreType = ECoreType.Xray
|
||||||
|
};
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using ServiceLib.Services.CoreConfig.Minimal;
|
||||||
|
|
||||||
namespace ServiceLib.Handler;
|
namespace ServiceLib.Handler;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -41,6 +43,37 @@ public class CoreConfigHandler
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task<RetResult> GeneratePureEndpointConfig(ProfileItem node, string? fileName)
|
||||||
|
{
|
||||||
|
var config = AppHandler.Instance.Config;
|
||||||
|
var result = new RetResult();
|
||||||
|
|
||||||
|
var coreType = AppHandler.Instance.GetSplitCoreType(node, node.ConfigType);
|
||||||
|
|
||||||
|
result = coreType switch
|
||||||
|
{
|
||||||
|
ECoreType.sing_box => await new CoreConfigSingboxService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.Xray => await new CoreConfigV2rayService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.hysteria2 => await new CoreConfigHy2Service(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.naiveproxy => await new CoreConfigNaiveService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.tuic => await new CoreConfigTuicService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.juicity => await new CoreConfigJuicityService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.brook => await new CoreConfigBrookService(config).GeneratePureEndpointConfig(node),
|
||||||
|
ECoreType.shadowquic => await new CoreConfigShadowquicService(config).GeneratePureEndpointConfig(node),
|
||||||
|
_ => throw new NotImplementedException(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (result.Success != true)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (fileName.IsNotEmpty() && result.Data != null)
|
||||||
|
{
|
||||||
|
await File.WriteAllTextAsync(fileName, result.Data.ToString());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task<RetResult> GenerateClientCustomConfig(ProfileItem node, string? fileName)
|
private static async Task<RetResult> GenerateClientCustomConfig(ProfileItem node, string? fileName)
|
||||||
{
|
{
|
||||||
var ret = new RetResult();
|
var ret = new RetResult();
|
||||||
|
|
|
@ -48,6 +48,7 @@ public class Config
|
||||||
public List<InItem> Inbound { get; set; }
|
public List<InItem> Inbound { get; set; }
|
||||||
public List<KeyEventItem> GlobalHotkeys { get; set; }
|
public List<KeyEventItem> GlobalHotkeys { get; set; }
|
||||||
public List<CoreTypeItem> CoreTypeItem { get; set; }
|
public List<CoreTypeItem> CoreTypeItem { get; set; }
|
||||||
|
public SplitCoreItem SplitCoreItem { get; set; }
|
||||||
|
|
||||||
#endregion other entities
|
#endregion other entities
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,6 +138,14 @@ public class CoreTypeItem
|
||||||
public ECoreType CoreType { get; set; }
|
public ECoreType CoreType { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class SplitCoreItem
|
||||||
|
{
|
||||||
|
public bool EnableSplitCore { get; set; }
|
||||||
|
public List<CoreTypeItem> SplitCoreTypes { get; set; }
|
||||||
|
public ECoreType RouteCoreType { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class TunModeItem
|
public class TunModeItem
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,11 +21,11 @@ public class CoreConfigBrookService
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (node.ConfigType != EConfigType.Brook)
|
if (node.ConfigType != EConfigType.Brook)
|
||||||
//{
|
{
|
||||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||||
// return ret;
|
return ret;
|
||||||
//}
|
}
|
||||||
|
|
||||||
var processArgs = "client";
|
var processArgs = "client";
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,11 @@ public class CoreConfigJuicityService
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (node.ConfigType != EConfigType.Juicity)
|
if (node.ConfigType != EConfigType.Juicity)
|
||||||
//{
|
{
|
||||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||||
// return ret;
|
return ret;
|
||||||
//}
|
}
|
||||||
|
|
||||||
var configJsonNode = new JsonObject();
|
var configJsonNode = new JsonObject();
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,11 @@ public class CoreConfigShadowquicService
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (node.ConfigType != EConfigType.Shadowquic)
|
if (node.ConfigType != EConfigType.Shadowquic)
|
||||||
//{
|
{
|
||||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||||
// return ret;
|
return ret;
|
||||||
//}
|
}
|
||||||
|
|
||||||
var configYamlNode = new Dictionary<string, object>();
|
var configYamlNode = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System.Reactive;
|
using System.Reactive;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ReactiveUI.Fody.Helpers;
|
using ReactiveUI.Fody.Helpers;
|
||||||
|
using ServiceLib.Models;
|
||||||
|
|
||||||
namespace ServiceLib.ViewModels;
|
namespace ServiceLib.ViewModels;
|
||||||
|
|
||||||
|
@ -104,6 +105,21 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
|
|
||||||
#endregion CoreType
|
#endregion CoreType
|
||||||
|
|
||||||
|
#region SplitCoreType
|
||||||
|
|
||||||
|
[Reactive] public bool EnableSplitCore { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType1 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType3 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType4 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType5 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType6 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType7 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType8 { get; set; }
|
||||||
|
[Reactive] public string SplitCoreType9 { get; set; }
|
||||||
|
[Reactive] public string RouteSplitCoreType { get; set; }
|
||||||
|
|
||||||
|
#endregion SplitCoreType
|
||||||
|
|
||||||
public ReactiveCommand<Unit, Unit> SaveCmd { get; }
|
public ReactiveCommand<Unit, Unit> SaveCmd { get; }
|
||||||
|
|
||||||
public OptionSettingViewModel(Func<EViewAction, object?, Task<bool>>? updateView)
|
public OptionSettingViewModel(Func<EViewAction, object?, Task<bool>>? updateView)
|
||||||
|
@ -210,14 +226,13 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
#endregion Tun mode
|
#endregion Tun mode
|
||||||
|
|
||||||
await InitCoreType();
|
await InitCoreType();
|
||||||
|
|
||||||
|
await InitSplitCoreItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task InitCoreType()
|
private async Task InitCoreType()
|
||||||
{
|
{
|
||||||
if (_config.CoreTypeItem == null)
|
_config.CoreTypeItem ??= new List<CoreTypeItem>();
|
||||||
{
|
|
||||||
_config.CoreTypeItem = new List<CoreTypeItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (EConfigType it in Enum.GetValues(typeof(EConfigType)))
|
foreach (EConfigType it in Enum.GetValues(typeof(EConfigType)))
|
||||||
{
|
{
|
||||||
|
@ -232,6 +247,7 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
CoreType = ECoreType.Xray
|
CoreType = ECoreType.Xray
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_config.CoreTypeItem.ForEach(it =>
|
_config.CoreTypeItem.ForEach(it =>
|
||||||
{
|
{
|
||||||
var type = it.CoreType.ToString();
|
var type = it.CoreType.ToString();
|
||||||
|
@ -269,6 +285,87 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
await Task.CompletedTask;
|
await Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task InitSplitCoreItem()
|
||||||
|
{
|
||||||
|
_config.SplitCoreItem ??= new()
|
||||||
|
{
|
||||||
|
EnableSplitCore = false,
|
||||||
|
SplitCoreTypes = new List<CoreTypeItem>(),
|
||||||
|
RouteCoreType = ECoreType.Xray
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (EConfigType it in Enum.GetValues(typeof(EConfigType)))
|
||||||
|
{
|
||||||
|
if (_config.SplitCoreItem.SplitCoreTypes.FindIndex(t => t.ConfigType == it) >= 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (it is EConfigType.Hysteria2 or EConfigType.TUIC)
|
||||||
|
{
|
||||||
|
_config.SplitCoreItem.SplitCoreTypes.Add(new CoreTypeItem()
|
||||||
|
{
|
||||||
|
ConfigType = it,
|
||||||
|
CoreType = ECoreType.sing_box
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it is EConfigType.Custom)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_config.SplitCoreItem.SplitCoreTypes.Add(new CoreTypeItem()
|
||||||
|
{
|
||||||
|
ConfigType = it,
|
||||||
|
CoreType = ECoreType.Xray
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
EnableSplitCore = _config.SplitCoreItem.EnableSplitCore;
|
||||||
|
RouteSplitCoreType = _config.SplitCoreItem.RouteCoreType.ToString();
|
||||||
|
|
||||||
|
_config.SplitCoreItem.SplitCoreTypes.ForEach(it =>
|
||||||
|
{
|
||||||
|
var type = it.CoreType.ToString();
|
||||||
|
switch ((int)it.ConfigType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
SplitCoreType1 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
SplitCoreType3 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
SplitCoreType4 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
SplitCoreType5 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
SplitCoreType6 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
SplitCoreType7 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
SplitCoreType8 = type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
SplitCoreType9 = type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task SaveSettingAsync()
|
private async Task SaveSettingAsync()
|
||||||
{
|
{
|
||||||
if (localPort.ToString().IsNullOrEmpty() || !Utils.IsNumeric(localPort.ToString())
|
if (localPort.ToString().IsNullOrEmpty() || !Utils.IsNumeric(localPort.ToString())
|
||||||
|
@ -362,6 +459,7 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
|
|
||||||
//coreType
|
//coreType
|
||||||
await SaveCoreType();
|
await SaveCoreType();
|
||||||
|
await SaveSplitCoreType();
|
||||||
|
|
||||||
if (await ConfigHandler.SaveConfig(_config) == 0)
|
if (await ConfigHandler.SaveConfig(_config) == 0)
|
||||||
{
|
{
|
||||||
|
@ -420,4 +518,46 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||||
}
|
}
|
||||||
await Task.CompletedTask;
|
await Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task SaveSplitCoreType()
|
||||||
|
{
|
||||||
|
for (int k = 1; k <= _config.SplitCoreItem.SplitCoreTypes.Count; k++)
|
||||||
|
{
|
||||||
|
var item = _config.SplitCoreItem.SplitCoreTypes[k - 1];
|
||||||
|
var type = string.Empty;
|
||||||
|
switch ((int)item.ConfigType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
type = SplitCoreType1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
type = SplitCoreType3;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
type = SplitCoreType4;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
type = SplitCoreType5;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
type = SplitCoreType6;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
type = SplitCoreType7;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
type = SplitCoreType8;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
type = SplitCoreType9;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
item.CoreType = (ECoreType)Enum.Parse(typeof(ECoreType), type);
|
||||||
|
}
|
||||||
|
_config.SplitCoreItem.RouteCoreType = (ECoreType)Enum.Parse(typeof(ECoreType), RouteSplitCoreType);
|
||||||
|
_config.SplitCoreItem.EnableSplitCore = EnableSplitCore;
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1108,6 +1108,17 @@
|
||||||
|
|
||||||
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreType}">
|
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreType}">
|
||||||
<Grid Margin="{StaticResource Margin8}">
|
<Grid Margin="{StaticResource Margin8}">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
@ -1227,6 +1238,187 @@
|
||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
Style="{StaticResource DefComboBox}" />
|
Style="{StaticResource DefComboBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<Grid
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource Margin8}">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="出站与路由分离,出站与分流 Core 类型不同时,将启用两个核心" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="出站与路由分离" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togCoreSplit"
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="路由 Core" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitRouteType"
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="VMess" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType1"
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="4"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="Shadowsocks" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType3"
|
||||||
|
Grid.Row="4"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="5"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="Socks" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType4"
|
||||||
|
Grid.Row="5"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="VLESS" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType5"
|
||||||
|
Grid.Row="6"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="7"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="Trojan" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType6"
|
||||||
|
Grid.Row="7"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="8"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="Hysteria2" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType7"
|
||||||
|
Grid.Row="8"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="9"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="TUIC" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType8"
|
||||||
|
Grid.Row="9"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="10"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="Wireguard" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbCoreSplitType9"
|
||||||
|
Grid.Row="10"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
|
|
@ -43,6 +43,17 @@ public partial class OptionSettingWindow
|
||||||
cmbCoreType6.ItemsSource = Global.CoreTypes;
|
cmbCoreType6.ItemsSource = Global.CoreTypes;
|
||||||
cmbCoreType9.ItemsSource = Global.CoreTypes;
|
cmbCoreType9.ItemsSource = Global.CoreTypes;
|
||||||
|
|
||||||
|
cmbCoreSplitRouteType.ItemsSource = Global.CoreTypes;
|
||||||
|
|
||||||
|
cmbCoreSplitType1.ItemsSource = Global.CoreTypes;
|
||||||
|
cmbCoreSplitType3.ItemsSource = Global.CoreTypes;
|
||||||
|
cmbCoreSplitType4.ItemsSource = Global.CoreTypes;
|
||||||
|
cmbCoreSplitType5.ItemsSource = Global.CoreTypes;
|
||||||
|
cmbCoreSplitType6.ItemsSource = Global.CoreTypes;
|
||||||
|
cmbCoreSplitType7.ItemsSource = Global.Hysteria2CoreTypes;
|
||||||
|
cmbCoreSplitType8.ItemsSource = Global.TuicCoreTypes;
|
||||||
|
cmbCoreSplitType9.ItemsSource = Global.CoreTypes;
|
||||||
|
|
||||||
cmbMixedConcurrencyCount.ItemsSource = Enumerable.Range(2, 7).ToList();
|
cmbMixedConcurrencyCount.ItemsSource = Enumerable.Range(2, 7).ToList();
|
||||||
cmbSpeedTestTimeout.ItemsSource = Enumerable.Range(2, 5).Select(i => i * 5).ToList();
|
cmbSpeedTestTimeout.ItemsSource = Enumerable.Range(2, 5).Select(i => i * 5).ToList();
|
||||||
cmbSpeedTestUrl.ItemsSource = Global.SpeedTestUrls;
|
cmbSpeedTestUrl.ItemsSource = Global.SpeedTestUrls;
|
||||||
|
@ -131,6 +142,18 @@ public partial class OptionSettingWindow
|
||||||
this.Bind(ViewModel, vm => vm.CoreType6, v => v.cmbCoreType6.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CoreType6, v => v.cmbCoreType6.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.CoreType9, v => v.cmbCoreType9.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CoreType9, v => v.cmbCoreType9.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
this.Bind(ViewModel, vm => vm.EnableSplitCore, v => v.togCoreSplit.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.RouteSplitCoreType, v => v.cmbCoreSplitRouteType.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType1, v => v.cmbCoreSplitType1.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType3, v => v.cmbCoreSplitType3.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType4, v => v.cmbCoreSplitType4.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType5, v => v.cmbCoreSplitType5.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType6, v => v.cmbCoreSplitType6.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType7, v => v.cmbCoreSplitType7.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType8, v => v.cmbCoreSplitType8.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SplitCoreType9, v => v.cmbCoreSplitType9.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
WindowsUtils.SetDarkBorder(this, AppHandler.Instance.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, AppHandler.Instance.Config.UiItem.CurrentTheme);
|
||||||
|
|
Loading…
Reference in a new issue