Config and GUI

This commit is contained in:
DHR60 2025-07-24 10:56:25 +08:00
parent b460b0ff91
commit c899d534af
12 changed files with 561 additions and 122 deletions

View file

@ -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",

View file

@ -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
} }

View file

@ -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;
} }

View file

@ -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();

View file

@ -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
} }

View file

@ -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
{ {

View file

@ -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";

View file

@ -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();

View file

@ -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>();

View file

@ -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;
}
} }

View file

@ -1110,122 +1110,314 @@
<Grid Margin="{StaticResource Margin8}"> <Grid Margin="{StaticResource Margin8}">
<Grid.RowDefinitions> <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" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock <Grid
Grid.Row="1" Grid.Row="0"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}">
VerticalAlignment="Center" <Grid.RowDefinitions>
Style="{StaticResource ToolbarTextBlock}" <RowDefinition Height="Auto" />
Text="VMess" /> <RowDefinition Height="Auto" />
<ComboBox <RowDefinition Height="Auto" />
x:Name="cmbCoreType1" <RowDefinition Height="Auto" />
Grid.Row="1" <RowDefinition Height="Auto" />
Grid.Column="1" <RowDefinition Height="Auto" />
Width="200" <RowDefinition Height="Auto" />
Margin="{StaticResource Margin8}" <RowDefinition Height="Auto" />
Style="{StaticResource DefComboBox}" /> </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 <TextBlock
Grid.Row="2" Grid.Row="2"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="Custom" /> Text="Custom" />
<ComboBox <ComboBox
x:Name="cmbCoreType2" x:Name="cmbCoreType2"
Grid.Row="2" Grid.Row="2"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="3" Grid.Row="3"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="Shadowsocks" /> Text="Shadowsocks" />
<ComboBox <ComboBox
x:Name="cmbCoreType3" x:Name="cmbCoreType3"
Grid.Row="3" Grid.Row="3"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="4" Grid.Row="4"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="Socks" /> Text="Socks" />
<ComboBox <ComboBox
x:Name="cmbCoreType4" x:Name="cmbCoreType4"
Grid.Row="4" Grid.Row="4"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="5" Grid.Row="5"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="VLESS" /> Text="VLESS" />
<ComboBox <ComboBox
x:Name="cmbCoreType5" x:Name="cmbCoreType5"
Grid.Row="5" Grid.Row="5"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="6" Grid.Row="6"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="Trojan" /> Text="Trojan" />
<ComboBox <ComboBox
x:Name="cmbCoreType6" x:Name="cmbCoreType6"
Grid.Row="6" Grid.Row="6"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="7" Grid.Row="7"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="Wireguard" /> Text="Wireguard" />
<ComboBox <ComboBox
x:Name="cmbCoreType9" x:Name="cmbCoreType9"
Grid.Row="7" Grid.Row="7"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin8}"
Style="{StaticResource DefComboBox}" />
</Grid>
<Grid
Grid.Row="0"
Grid.Column="1" Grid.Column="1"
Width="200" Margin="{StaticResource Margin8}">
Margin="{StaticResource Margin8}" <Grid.RowDefinitions>
Style="{StaticResource DefComboBox}" /> <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> </Grid>
</TabItem> </TabItem>
</TabControl> </TabControl>

View file

@ -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);