mirror of https://github.com/2dust/v2rayN
Add subscription conversion
https://github.com/tindy2013/subconverter/blob/master/README-cn.mdpull/3756/head
parent
88e7cd09d7
commit
f3804fce40
|
@ -91,6 +91,39 @@
|
||||||
""
|
""
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static readonly List<string> SubConvertUrls = new List<string> {
|
||||||
|
@"https://sub.xeton.dev/sub?url={0}",
|
||||||
|
@"https://api.dler.io/sub?url={0}",
|
||||||
|
@"http://127.0.0.1:25500/sub?url={0}",
|
||||||
|
""
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly List<string> SubConvertConfig = new List<string> {
|
||||||
|
@"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/config/ACL4SSR_Online.ini"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly List<string> SubConvertTargets = new List<string> {
|
||||||
|
"",
|
||||||
|
"mixed",
|
||||||
|
"v2ray",
|
||||||
|
"clash",
|
||||||
|
"ss",
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly List<string> SpeedTestUrls = new() {
|
||||||
|
@"http://cachefly.cachefly.net/100mb.test",
|
||||||
|
@"http://cachefly.cachefly.net/10mb.test"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly Dictionary<string, string> userAgentTxt = new()
|
||||||
|
{
|
||||||
|
{"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" },
|
||||||
|
{"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" },
|
||||||
|
{"safari","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" },
|
||||||
|
{"edge","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70" },
|
||||||
|
{"none",""}
|
||||||
|
};
|
||||||
|
|
||||||
public static readonly List<string> vmessSecuritys = new() { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" };
|
public static readonly List<string> vmessSecuritys = new() { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" };
|
||||||
public static readonly List<string> ssSecuritys = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" };
|
public static readonly List<string> ssSecuritys = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" };
|
||||||
public static readonly List<string> ssSecuritysInSagerNet = new() { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" };
|
public static readonly List<string> ssSecuritysInSagerNet = new() { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" };
|
||||||
|
@ -104,15 +137,6 @@
|
||||||
public static readonly List<string> fingerprints = new() { "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized", "" };
|
public static readonly List<string> fingerprints = new() { "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized", "" };
|
||||||
public static readonly List<string> userAgent = new() { "chrome", "firefox", "safari", "edge", "none" };
|
public static readonly List<string> userAgent = new() { "chrome", "firefox", "safari", "edge", "none" };
|
||||||
|
|
||||||
public static readonly Dictionary<string, string> userAgentTxt = new()
|
|
||||||
{
|
|
||||||
{"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" },
|
|
||||||
{"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" },
|
|
||||||
{"safari","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" },
|
|
||||||
{"edge","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70" },
|
|
||||||
{"none",""}
|
|
||||||
};
|
|
||||||
|
|
||||||
public static readonly List<string> allowInsecures = new() { "true", "false", "" };
|
public static readonly List<string> allowInsecures = new() { "true", "false", "" };
|
||||||
public static readonly List<string> domainStrategy4Freedoms = new() { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
public static readonly List<string> domainStrategy4Freedoms = new() { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
||||||
public static readonly List<string> Languages = new() { "zh-Hans", "en", "fa-Ir", "ru" };
|
public static readonly List<string> Languages = new() { "zh-Hans", "en", "fa-Ir", "ru" };
|
||||||
|
@ -123,7 +147,6 @@
|
||||||
public static readonly List<string> TunMtus = new() { "9000", "1500" };
|
public static readonly List<string> TunMtus = new() { "9000", "1500" };
|
||||||
public static readonly List<string> TunStacks = new() { "gvisor", "system" };
|
public static readonly List<string> TunStacks = new() { "gvisor", "system" };
|
||||||
public static readonly List<string> PresetMsgFilters = new() { "proxy", "direct", "block", "" };
|
public static readonly List<string> PresetMsgFilters = new() { "proxy", "direct", "block", "" };
|
||||||
public static readonly List<string> SpeedTestUrls = new() { @"http://cachefly.cachefly.net/100mb.test", @"http://cachefly.cachefly.net/10mb.test" };
|
|
||||||
|
|
||||||
#endregion const
|
#endregion const
|
||||||
|
|
||||||
|
|
|
@ -190,6 +190,20 @@ namespace v2rayN.Handler
|
||||||
|
|
||||||
//one url
|
//one url
|
||||||
url = Utils.GetPunycode(url);
|
url = Utils.GetPunycode(url);
|
||||||
|
//convert
|
||||||
|
if (!Utils.IsNullOrEmpty(item.convertTarget))
|
||||||
|
{
|
||||||
|
var subConvertUrl = string.IsNullOrEmpty(config.constItem.subConvertUrl) ? Global.SubConvertUrls.FirstOrDefault() : config.constItem.subConvertUrl;
|
||||||
|
url = string.Format(subConvertUrl!, Utils.UrlEncode(url));
|
||||||
|
if (!url.Contains("target="))
|
||||||
|
{
|
||||||
|
url += string.Format("&target={0}", item.convertTarget);
|
||||||
|
}
|
||||||
|
if (!url.Contains("config="))
|
||||||
|
{
|
||||||
|
url += string.Format("&config={0}", Global.SubConvertConfig.FirstOrDefault());
|
||||||
|
}
|
||||||
|
}
|
||||||
var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent);
|
var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent);
|
||||||
if (blProxy && Utils.IsNullOrEmpty(result))
|
if (blProxy && Utils.IsNullOrEmpty(result))
|
||||||
{
|
{
|
||||||
|
@ -197,7 +211,7 @@ namespace v2rayN.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
//more url
|
//more url
|
||||||
if (!Utils.IsNullOrEmpty(item.moreUrl.TrimEx()))
|
if (Utils.IsNullOrEmpty(item.convertTarget) && !Utils.IsNullOrEmpty(item.moreUrl.TrimEx()))
|
||||||
{
|
{
|
||||||
if (!Utils.IsNullOrEmpty(result) && Utils.IsBase64String(result))
|
if (!Utils.IsNullOrEmpty(result) && Utils.IsBase64String(result))
|
||||||
{
|
{
|
||||||
|
|
|
@ -132,6 +132,7 @@ namespace v2rayN.Mode
|
||||||
public class ConstItem
|
public class ConstItem
|
||||||
{
|
{
|
||||||
public string defIEProxyExceptions { get; set; }
|
public string defIEProxyExceptions { get; set; }
|
||||||
|
public string subConvertUrl { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
|
|
|
@ -20,10 +20,12 @@ namespace v2rayN.Mode
|
||||||
|
|
||||||
public int sort { get; set; }
|
public int sort { get; set; }
|
||||||
|
|
||||||
public string filter { get; set; }
|
public string? filter { get; set; }
|
||||||
|
|
||||||
public int autoUpdateInterval { get; set; }
|
public int autoUpdateInterval { get; set; }
|
||||||
|
|
||||||
public long updateTime { get; set; }
|
public long updateTime { get; set; }
|
||||||
|
|
||||||
|
public string? convertTarget { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -375,6 +375,24 @@ namespace v2rayN.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Convert target type 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string LvConvertTarget {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LvConvertTarget", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Please leave blank if no conversion is required 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string LvConvertTargetTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LvConvertTargetTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Count 的本地化字符串。
|
/// 查找类似 Count 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -421,7 +439,7 @@ namespace v2rayN.Resx {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 More urls, separated by commas 的本地化字符串。
|
/// 查找类似 More urls, separated by commas;Subscription conversion will be invalid 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string LvMoreUrl {
|
public static string LvMoreUrl {
|
||||||
get {
|
get {
|
||||||
|
|
|
@ -1103,7 +1103,7 @@
|
||||||
<value>Reboot as administrator</value>
|
<value>Reboot as administrator</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvMoreUrl" xml:space="preserve">
|
<data name="LvMoreUrl" xml:space="preserve">
|
||||||
<value>More urls, separated by commas</value>
|
<value>More urls, separated by commas;Subscription conversion will be invalid</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SpeedDisplayText" xml:space="preserve">
|
<data name="SpeedDisplayText" xml:space="preserve">
|
||||||
<value>{0}:{1}/s↑ | {2}/s↓</value>
|
<value>{0}:{1}/s↑ | {2}/s↓</value>
|
||||||
|
@ -1114,4 +1114,10 @@
|
||||||
<data name="TbSettingsLogEnabledToFile" xml:space="preserve">
|
<data name="TbSettingsLogEnabledToFile" xml:space="preserve">
|
||||||
<value>Enable logging to file</value>
|
<value>Enable logging to file</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="LvConvertTarget" xml:space="preserve">
|
||||||
|
<value>Convert target type</value>
|
||||||
|
</data>
|
||||||
|
<data name="LvConvertTargetTip" xml:space="preserve">
|
||||||
|
<value>Please leave blank if no conversion is required</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1103,7 +1103,7 @@
|
||||||
<value>以管理员身份重启</value>
|
<value>以管理员身份重启</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvMoreUrl" xml:space="preserve">
|
<data name="LvMoreUrl" xml:space="preserve">
|
||||||
<value>更多地址(url),用逗号(,)分隔</value>
|
<value>更多地址(url),用逗号(,)分隔;订阅转换将失效</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvAutoUpdateInterval" xml:space="preserve">
|
<data name="LvAutoUpdateInterval" xml:space="preserve">
|
||||||
<value>自动更新间隔(分钟)</value>
|
<value>自动更新间隔(分钟)</value>
|
||||||
|
@ -1111,4 +1111,10 @@
|
||||||
<data name="TbSettingsLogEnabledToFile" xml:space="preserve">
|
<data name="TbSettingsLogEnabledToFile" xml:space="preserve">
|
||||||
<value>启用日志存到文件</value>
|
<value>启用日志存到文件</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="LvConvertTarget" xml:space="preserve">
|
||||||
|
<value>订阅转换目标类型</value>
|
||||||
|
</data>
|
||||||
|
<data name="LvConvertTargetTip" xml:space="preserve">
|
||||||
|
<value>不需要转换时请留空</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -72,6 +72,7 @@ namespace v2rayN.ViewModels
|
||||||
[Reactive] public int SpeedTestTimeout { get; set; }
|
[Reactive] public int SpeedTestTimeout { get; set; }
|
||||||
[Reactive] public string SpeedTestUrl { get; set; }
|
[Reactive] public string SpeedTestUrl { get; set; }
|
||||||
[Reactive] public bool EnableHWA { get; set; }
|
[Reactive] public bool EnableHWA { get; set; }
|
||||||
|
[Reactive] public string SubConvertUrl { get; set; }
|
||||||
|
|
||||||
#endregion UI
|
#endregion UI
|
||||||
|
|
||||||
|
@ -178,6 +179,7 @@ namespace v2rayN.ViewModels
|
||||||
SpeedTestTimeout = _config.speedTestItem.speedTestTimeout;
|
SpeedTestTimeout = _config.speedTestItem.speedTestTimeout;
|
||||||
SpeedTestUrl = _config.speedTestItem.speedTestUrl;
|
SpeedTestUrl = _config.speedTestItem.speedTestUrl;
|
||||||
EnableHWA = _config.guiItem.enableHWA;
|
EnableHWA = _config.guiItem.enableHWA;
|
||||||
|
SubConvertUrl = _config.constItem.subConvertUrl;
|
||||||
|
|
||||||
#endregion UI
|
#endregion UI
|
||||||
|
|
||||||
|
@ -360,6 +362,7 @@ namespace v2rayN.ViewModels
|
||||||
_config.speedTestItem.speedTestTimeout = SpeedTestTimeout;
|
_config.speedTestItem.speedTestTimeout = SpeedTestTimeout;
|
||||||
_config.speedTestItem.speedTestUrl = SpeedTestUrl;
|
_config.speedTestItem.speedTestUrl = SpeedTestUrl;
|
||||||
_config.guiItem.enableHWA = EnableHWA;
|
_config.guiItem.enableHWA = EnableHWA;
|
||||||
|
_config.constItem.subConvertUrl = SubConvertUrl;
|
||||||
|
|
||||||
//systemProxy
|
//systemProxy
|
||||||
_config.systemProxyExceptions = systemProxyExceptions;
|
_config.systemProxyExceptions = systemProxyExceptions;
|
||||||
|
|
|
@ -68,6 +68,7 @@ namespace v2rayN.ViewModels
|
||||||
item.userAgent = SelectedSource.userAgent;
|
item.userAgent = SelectedSource.userAgent;
|
||||||
item.sort = SelectedSource.sort;
|
item.sort = SelectedSource.sort;
|
||||||
item.filter = SelectedSource.filter;
|
item.filter = SelectedSource.filter;
|
||||||
|
item.convertTarget = SelectedSource.convertTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConfigHandler.AddSubItem(ref _config, item) == 0)
|
if (ConfigHandler.AddSubItem(ref _config, item) == 0)
|
||||||
|
|
|
@ -480,6 +480,7 @@
|
||||||
<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" />
|
||||||
|
@ -749,6 +750,23 @@
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="19"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsSubConvert}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbSubConvertUrl"
|
||||||
|
Grid.Row="19"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="300"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
materialDesign:HintAssist.Hint="Convert Url"
|
||||||
|
IsEditable="True"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
|
@ -72,6 +72,10 @@ namespace v2rayN.Views
|
||||||
Global.SpeedTestUrls.ForEach(it =>
|
Global.SpeedTestUrls.ForEach(it =>
|
||||||
{
|
{
|
||||||
cmbSpeedTestUrl.Items.Add(it);
|
cmbSpeedTestUrl.Items.Add(it);
|
||||||
|
});
|
||||||
|
Global.SubConvertUrls.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbSubConvertUrl.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
|
||||||
//fill fonts
|
//fill fonts
|
||||||
|
@ -162,6 +166,7 @@ namespace v2rayN.Views
|
||||||
this.Bind(ViewModel, vm => vm.SpeedTestTimeout, v => v.cmbSpeedTestTimeout.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SpeedTestTimeout, v => v.cmbSpeedTestTimeout.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SpeedTestUrl, v => v.cmbSpeedTestUrl.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SpeedTestUrl, v => v.cmbSpeedTestUrl.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableHWA, v => v.togEnableHWA.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableHWA, v => v.togEnableHWA.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SubConvertUrl, v => v.cmbSubConvertUrl.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.systemProxyExceptions, v => v.txtsystemProxyExceptions.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.systemProxyExceptions, v => v.txtsystemProxyExceptions.Text).DisposeWith(disposables);
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
<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" />
|
||||||
|
@ -195,16 +196,35 @@
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
Style="{StaticResource MyOutlinedTextBox}" />
|
Style="{StaticResource MyOutlinedTextBox}" />
|
||||||
|
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.LvConvertTarget}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbConvertTarget"
|
||||||
|
Grid.Row="7"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="4"
|
||||||
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.LvConvertTargetTip}"
|
||||||
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
|
MaxDropDownHeight="1000"
|
||||||
|
Style="{StaticResource MaterialDesignOutlinedComboBox}" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="8"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="4"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.LvSort}" />
|
Text="{x:Static resx:ResUI.LvSort}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtSort"
|
x:Name="txtSort"
|
||||||
Grid.Row="7"
|
Grid.Row="8"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="400"
|
Width="400"
|
||||||
Margin="4"
|
Margin="4"
|
||||||
|
|
|
@ -16,6 +16,11 @@ namespace v2rayN.Views
|
||||||
|
|
||||||
ViewModel = new SubEditViewModel(subItem, this);
|
ViewModel = new SubEditViewModel(subItem, this);
|
||||||
|
|
||||||
|
Global.SubConvertTargets.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbConvertTarget.Items.Add(it);
|
||||||
|
});
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
this.Bind(ViewModel, vm => vm.SelectedSource.remarks, v => v.txtRemarks.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedSource.remarks, v => v.txtRemarks.Text).DisposeWith(disposables);
|
||||||
|
@ -26,6 +31,7 @@ namespace v2rayN.Views
|
||||||
this.Bind(ViewModel, vm => vm.SelectedSource.userAgent, v => v.txtUserAgent.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedSource.userAgent, v => v.txtUserAgent.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SelectedSource.sort, v => v.txtSort.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedSource.sort, v => v.txtSort.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SelectedSource.filter, v => v.txtFilter.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SelectedSource.filter, v => v.txtFilter.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.SelectedSource.convertTarget, v => v.cmbConvertTarget.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);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue