mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-13 20:09:12 +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"
|
||||
];
|
||||
|
||||
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 =
|
||||
[
|
||||
"AsIs",
|
||||
|
|
|
@ -235,5 +235,16 @@ public sealed class AppHandler
|
|||
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
|
||||
}
|
||||
|
|
|
@ -165,6 +165,13 @@ public class ConfigHandler
|
|||
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
|
||||
}
|
||||
|
||||
config.SplitCoreItem ??= new()
|
||||
{
|
||||
EnableSplitCore = false,
|
||||
SplitCoreTypes = new List<CoreTypeItem>(),
|
||||
RouteCoreType = ECoreType.Xray
|
||||
};
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
using ServiceLib.Services.CoreConfig.Minimal;
|
||||
|
||||
namespace ServiceLib.Handler;
|
||||
|
||||
/// <summary>
|
||||
|
@ -41,6 +43,37 @@ public class CoreConfigHandler
|
|||
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)
|
||||
{
|
||||
var ret = new RetResult();
|
||||
|
|
|
@ -48,6 +48,7 @@ public class Config
|
|||
public List<InItem> Inbound { get; set; }
|
||||
public List<KeyEventItem> GlobalHotkeys { get; set; }
|
||||
public List<CoreTypeItem> CoreTypeItem { get; set; }
|
||||
public SplitCoreItem SplitCoreItem { get; set; }
|
||||
|
||||
#endregion other entities
|
||||
}
|
||||
|
|
|
@ -138,6 +138,14 @@ public class CoreTypeItem
|
|||
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]
|
||||
public class TunModeItem
|
||||
{
|
||||
|
|
|
@ -21,11 +21,11 @@ public class CoreConfigBrookService
|
|||
return ret;
|
||||
}
|
||||
|
||||
//if (node.ConfigType != EConfigType.Brook)
|
||||
//{
|
||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
// return ret;
|
||||
//}
|
||||
if (node.ConfigType != EConfigType.Brook)
|
||||
{
|
||||
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
return ret;
|
||||
}
|
||||
|
||||
var processArgs = "client";
|
||||
|
||||
|
|
|
@ -23,11 +23,11 @@ public class CoreConfigJuicityService
|
|||
return ret;
|
||||
}
|
||||
|
||||
//if (node.ConfigType != EConfigType.Juicity)
|
||||
//{
|
||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
// return ret;
|
||||
//}
|
||||
if (node.ConfigType != EConfigType.Juicity)
|
||||
{
|
||||
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
return ret;
|
||||
}
|
||||
|
||||
var configJsonNode = new JsonObject();
|
||||
|
||||
|
|
|
@ -21,11 +21,11 @@ public class CoreConfigShadowquicService
|
|||
return ret;
|
||||
}
|
||||
|
||||
//if (node.ConfigType != EConfigType.Shadowquic)
|
||||
//{
|
||||
// ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
// return ret;
|
||||
//}
|
||||
if (node.ConfigType != EConfigType.Shadowquic)
|
||||
{
|
||||
ret.Msg = ResUI.Incorrectconfiguration + $" - {node.ConfigType}";
|
||||
return ret;
|
||||
}
|
||||
|
||||
var configYamlNode = new Dictionary<string, object>();
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System.Reactive;
|
||||
using ReactiveUI;
|
||||
using ReactiveUI.Fody.Helpers;
|
||||
using ServiceLib.Models;
|
||||
|
||||
namespace ServiceLib.ViewModels;
|
||||
|
||||
|
@ -104,6 +105,21 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
|
||||
#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 OptionSettingViewModel(Func<EViewAction, object?, Task<bool>>? updateView)
|
||||
|
@ -210,14 +226,13 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
#endregion Tun mode
|
||||
|
||||
await InitCoreType();
|
||||
|
||||
await InitSplitCoreItem();
|
||||
}
|
||||
|
||||
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)))
|
||||
{
|
||||
|
@ -232,6 +247,7 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
CoreType = ECoreType.Xray
|
||||
});
|
||||
}
|
||||
|
||||
_config.CoreTypeItem.ForEach(it =>
|
||||
{
|
||||
var type = it.CoreType.ToString();
|
||||
|
@ -269,6 +285,87 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
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()
|
||||
{
|
||||
if (localPort.ToString().IsNullOrEmpty() || !Utils.IsNumeric(localPort.ToString())
|
||||
|
@ -362,6 +459,7 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
|
||||
//coreType
|
||||
await SaveCoreType();
|
||||
await SaveSplitCoreType();
|
||||
|
||||
if (await ConfigHandler.SaveConfig(_config) == 0)
|
||||
{
|
||||
|
@ -420,4 +518,46 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1110,122 +1110,314 @@
|
|||
<Grid 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" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
<Grid
|
||||
Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="VMess" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType1"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
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" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="VMess" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType1"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="Custom" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType2"
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="Custom" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType2"
|
||||
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="Shadowsocks" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType3"
|
||||
Grid.Row="3"
|
||||
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="Shadowsocks" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType3"
|
||||
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="Socks" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType4"
|
||||
Grid.Row="4"
|
||||
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="Socks" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType4"
|
||||
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="VLESS" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType5"
|
||||
Grid.Row="5"
|
||||
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="VLESS" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType5"
|
||||
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="Trojan" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType6"
|
||||
Grid.Row="6"
|
||||
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="Trojan" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType6"
|
||||
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="Wireguard" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType9"
|
||||
Grid.Row="7"
|
||||
<TextBlock
|
||||
Grid.Row="7"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="Wireguard" />
|
||||
<ComboBox
|
||||
x:Name="cmbCoreType9"
|
||||
Grid.Row="7"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</Grid>
|
||||
<Grid
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
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>
|
||||
</TabControl>
|
||||
|
|
|
@ -43,6 +43,17 @@ public partial class OptionSettingWindow
|
|||
cmbCoreType6.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();
|
||||
cmbSpeedTestTimeout.ItemsSource = Enumerable.Range(2, 5).Select(i => i * 5).ToList();
|
||||
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.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);
|
||||
});
|
||||
WindowsUtils.SetDarkBorder(this, AppHandler.Instance.Config.UiItem.CurrentTheme);
|
||||
|
|
Loading…
Reference in a new issue