Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a704a30242 | ||
|
|
26dd0d0ea5 | ||
|
|
e31a4bcaa9 | ||
|
|
1722dc570b | ||
|
|
3575e69b43 | ||
|
|
373d89874c | ||
|
|
976087ce97 | ||
|
|
69a45788ee | ||
|
|
92e4de12fb | ||
|
|
ea7fdb9b3d | ||
|
|
fe1c043b8e | ||
|
|
146f597a0b | ||
|
|
d2bef312ce | ||
|
|
61f297215d | ||
|
|
639a9fd540 | ||
|
|
3d0428c518 | ||
|
|
f40f926ce1 | ||
|
|
d6db4f0e4c | ||
|
|
fcbc9471aa | ||
|
|
b147e05794 | ||
|
|
47e6eb546d | ||
|
|
8ba05cb4ed | ||
|
|
84b91e9649 | ||
|
|
703e17478d | ||
|
|
8584e15c32 | ||
|
|
46be7aadab | ||
|
|
a5871f6cba | ||
|
|
917dc1803c | ||
|
|
c0c0961b2b | ||
|
|
0995ac6f9a | ||
|
|
b7f40e4cbf | ||
|
|
754cbb9eaa | ||
|
|
7052b56069 | ||
|
|
decdee825b | ||
|
|
5f66afc399 | ||
|
|
5ceb638edf | ||
|
|
688b9ef5ee | ||
|
|
4909a557d5 | ||
|
|
75f63afadc |
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.App"
|
x:Class="v2rayN.App"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:local="clr-namespace:v2rayN"
|
xmlns:local="clr-namespace:v2rayN"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
ShutdownMode="OnExplicitShutdown"
|
ShutdownMode="OnExplicitShutdown"
|
||||||
@@ -91,6 +92,7 @@
|
|||||||
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
||||||
TargetType="{x:Type ContextMenu}">
|
TargetType="{x:Type ContextMenu}">
|
||||||
<Setter Property="FontSize" Value="13" />
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style
|
<Style
|
||||||
@@ -98,6 +100,7 @@
|
|||||||
BasedOn="{StaticResource MaterialDesignMenu}"
|
BasedOn="{StaticResource MaterialDesignMenu}"
|
||||||
TargetType="{x:Type Menu}">
|
TargetType="{x:Type Menu}">
|
||||||
<Setter Property="FontSize" Value="13" />
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style
|
<Style
|
||||||
|
|||||||
31
v2rayN/v2rayN/Converters/MaterialDesignFonts.cs
Normal file
31
v2rayN/v2rayN/Converters/MaterialDesignFonts.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
|
||||||
|
namespace v2rayN.Converters
|
||||||
|
{
|
||||||
|
public class MaterialDesignFonts
|
||||||
|
{
|
||||||
|
public static FontFamily MyFont { get; }
|
||||||
|
|
||||||
|
static MaterialDesignFonts()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var fontFamily = LazyConfig.Instance.GetConfig().uiItem.currentFontFamily;
|
||||||
|
if (!string.IsNullOrEmpty(fontFamily))
|
||||||
|
{
|
||||||
|
var fontPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Resources\Fonts\");
|
||||||
|
MyFont = new FontFamily(new Uri($"file:///{fontPath}"), $"./#{fontFamily}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
if (MyFont is null)
|
||||||
|
{
|
||||||
|
MyFont = new FontFamily("Microsoft YaHei");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
public const string NUrl = @"https://github.com/2dust/v2rayN/releases";
|
public const string NUrl = @"https://github.com/2dust/v2rayN/releases";
|
||||||
public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases";
|
public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases";
|
||||||
public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases";
|
public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases";
|
||||||
public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases";
|
public const string hysteriaCoreUrl = "https://github.com/apernet/hysteria/releases";
|
||||||
public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases";
|
public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases";
|
||||||
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
||||||
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
||||||
@@ -95,7 +95,16 @@
|
|||||||
public static readonly List<string> coreTypes = new List<string> { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
|
public static readonly List<string> coreTypes = new List<string> { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
|
||||||
public static readonly List<string> domainStrategys = new List<string> { "AsIs", "IPIfNonMatch", "IPOnDemand" };
|
public static readonly List<string> domainStrategys = new List<string> { "AsIs", "IPIfNonMatch", "IPOnDemand" };
|
||||||
public static readonly List<string> domainMatchers = new List<string> { "linear", "mph", "" };
|
public static readonly List<string> domainMatchers = new List<string> { "linear", "mph", "" };
|
||||||
public static readonly List<string> fingerprints = new List<string> { "chrome", "firefox", "safari", "randomized", "" };
|
public static readonly List<string> fingerprints = new List<string> { "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized", "" };
|
||||||
|
public static readonly List<string> userAgent = new List<string> { "chrome", "firefox", "safari", "edge", "none" };
|
||||||
|
public static readonly Dictionary<string, string> userAgentTxt = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{"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 List<string> { "true", "false", "" };
|
public static readonly List<string> allowInsecures = new List<string> { "true", "false", "" };
|
||||||
public static readonly List<string> domainStrategy4Freedoms = new List<string> { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
public static readonly List<string> domainStrategy4Freedoms = new List<string> { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
||||||
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en", "fa-Ir" };
|
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en", "fa-Ir" };
|
||||||
@@ -105,6 +114,7 @@
|
|||||||
public static readonly List<string> Protocols = new List<string> { "http", "tls", "bittorrent" };
|
public static readonly List<string> Protocols = new List<string> { "http", "tls", "bittorrent" };
|
||||||
public static readonly List<string> TunMtus = new List<string> { "9000", "1500" };
|
public static readonly List<string> TunMtus = new List<string> { "9000", "1500" };
|
||||||
public static readonly List<string> TunStacks = new List<string> { "gvisor", "system" };
|
public static readonly List<string> TunStacks = new List<string> { "gvisor", "system" };
|
||||||
|
public static readonly List<string> PresetMsgFilters = new List<string> { "^(?!.*proxy).*$", "^(?!.*direct).*$", "" };
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -638,7 +638,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||||
{
|
{
|
||||||
profileItem.allowInsecure = config.defAllowInsecure.ToString();
|
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
||||||
}
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem);
|
AddServerCommon(ref config, profileItem);
|
||||||
@@ -690,6 +690,28 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
lstProfile[i].sort = (i + 1) * 10;
|
lstProfile[i].sort = (i + 1) * 10;
|
||||||
}
|
}
|
||||||
|
if (name == EServerColName.delay)
|
||||||
|
{
|
||||||
|
var maxSort = lstProfile.Max(t => t.sort) + 10;
|
||||||
|
foreach (var item in lstProfile)
|
||||||
|
{
|
||||||
|
if (item.delay <= 0)
|
||||||
|
{
|
||||||
|
item.sort = maxSort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name == EServerColName.speed)
|
||||||
|
{
|
||||||
|
var maxSort = lstProfile.Max(t => t.sort) + 10;
|
||||||
|
foreach (var item in lstProfile)
|
||||||
|
{
|
||||||
|
if (item.speed <= 0)
|
||||||
|
{
|
||||||
|
item.sort = maxSort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SqliteHelper.Instance.UpdateAll(lstProfile);
|
SqliteHelper.Instance.UpdateAll(lstProfile);
|
||||||
|
|
||||||
@@ -750,7 +772,7 @@ namespace v2rayN.Handler
|
|||||||
profileItem.configVersion = 2;
|
profileItem.configVersion = 2;
|
||||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||||
{
|
{
|
||||||
profileItem.allowInsecure = config.defAllowInsecure.ToString();
|
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
||||||
}
|
}
|
||||||
if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
|
if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -546,6 +546,18 @@ namespace v2rayN.Handler
|
|||||||
streamSettings.network = node.GetNetwork();
|
streamSettings.network = node.GetNetwork();
|
||||||
string host = node.requestHost.TrimEx();
|
string host = node.requestHost.TrimEx();
|
||||||
string sni = node.sni;
|
string sni = node.sni;
|
||||||
|
string useragent = "";
|
||||||
|
if (!config.defUserAgent.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
useragent = Global.userAgentTxt[config.defUserAgent];
|
||||||
|
}
|
||||||
|
catch (KeyNotFoundException)
|
||||||
|
{
|
||||||
|
useragent = config.defUserAgent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//if tls
|
//if tls
|
||||||
if (node.streamSecurity == Global.StreamSecurity)
|
if (node.streamSecurity == Global.StreamSecurity)
|
||||||
@@ -554,9 +566,9 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
TlsSettings tlsSettings = new TlsSettings
|
TlsSettings tlsSettings = new TlsSettings
|
||||||
{
|
{
|
||||||
allowInsecure = Utils.ToBool(node.allowInsecure),
|
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||||
alpn = node.GetAlpn(),
|
alpn = node.GetAlpn(),
|
||||||
fingerprint = node.fingerprint
|
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.defFingerprint : node.fingerprint
|
||||||
};
|
};
|
||||||
if (!string.IsNullOrWhiteSpace(sni))
|
if (!string.IsNullOrWhiteSpace(sni))
|
||||||
{
|
{
|
||||||
@@ -576,9 +588,9 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
TlsSettings xtlsSettings = new TlsSettings
|
TlsSettings xtlsSettings = new TlsSettings
|
||||||
{
|
{
|
||||||
allowInsecure = Utils.ToBool(node.allowInsecure),
|
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||||
alpn = node.GetAlpn(),
|
alpn = node.GetAlpn(),
|
||||||
fingerprint = node.fingerprint
|
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.defFingerprint : node.fingerprint
|
||||||
};
|
};
|
||||||
if (!string.IsNullOrWhiteSpace(sni))
|
if (!string.IsNullOrWhiteSpace(sni))
|
||||||
{
|
{
|
||||||
@@ -634,19 +646,22 @@ namespace v2rayN.Handler
|
|||||||
WsSettings wsSettings = new WsSettings
|
WsSettings wsSettings = new WsSettings
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
wsSettings.headers = new Headers
|
||||||
|
{
|
||||||
|
};
|
||||||
string path = node.path;
|
string path = node.path;
|
||||||
if (!string.IsNullOrWhiteSpace(host))
|
if (!string.IsNullOrWhiteSpace(host))
|
||||||
{
|
{
|
||||||
wsSettings.headers = new Headers
|
wsSettings.headers.Host = host;
|
||||||
{
|
|
||||||
Host = host
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrWhiteSpace(path))
|
if (!string.IsNullOrWhiteSpace(path))
|
||||||
{
|
{
|
||||||
wsSettings.path = path;
|
wsSettings.path = path;
|
||||||
}
|
}
|
||||||
|
if (!string.IsNullOrWhiteSpace(useragent))
|
||||||
|
{
|
||||||
|
wsSettings.headers.UserAgent = useragent;
|
||||||
|
}
|
||||||
streamSettings.wsSettings = wsSettings;
|
streamSettings.wsSettings = wsSettings;
|
||||||
|
|
||||||
//TlsSettings tlsSettings = new TlsSettings();
|
//TlsSettings tlsSettings = new TlsSettings();
|
||||||
@@ -730,7 +745,7 @@ namespace v2rayN.Handler
|
|||||||
string host2 = string.Join("\",\"", arrHost);
|
string host2 = string.Join("\",\"", arrHost);
|
||||||
request = request.Replace("$requestHost$", $"\"{host2}\"");
|
request = request.Replace("$requestHost$", $"\"{host2}\"");
|
||||||
//request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost()));
|
//request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost()));
|
||||||
|
request = request.Replace("$requestUserAgent$", $"\"{useragent}\"");
|
||||||
//Path
|
//Path
|
||||||
string pathHttp = @"/";
|
string pathHttp = @"/";
|
||||||
if (!Utils.IsNullOrEmpty(node.path))
|
if (!Utils.IsNullOrEmpty(node.path))
|
||||||
|
|||||||
@@ -228,21 +228,15 @@ namespace v2rayN.Handler
|
|||||||
string fileName = CoreFindexe(coreInfo);
|
string fileName = CoreFindexe(coreInfo);
|
||||||
if (fileName == "") return -1;
|
if (fileName == "") return -1;
|
||||||
|
|
||||||
var pathTemp = Utils.GetConfigPath($"temp_{Utils.GetGUID(false)}.json");
|
|
||||||
File.WriteAllText(pathTemp, configStr);
|
|
||||||
if (!File.Exists(pathTemp))
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Process p = new Process
|
Process p = new Process
|
||||||
{
|
{
|
||||||
StartInfo = new ProcessStartInfo
|
StartInfo = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
FileName = fileName,
|
FileName = fileName,
|
||||||
Arguments = $"-config \"{pathTemp}\"",
|
Arguments = "-config stdin:",
|
||||||
WorkingDirectory = Utils.GetConfigPath(),
|
WorkingDirectory = Utils.GetConfigPath(),
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
|
RedirectStandardInput = true,
|
||||||
RedirectStandardOutput = true,
|
RedirectStandardOutput = true,
|
||||||
RedirectStandardError = true,
|
RedirectStandardError = true,
|
||||||
CreateNoWindow = true,
|
CreateNoWindow = true,
|
||||||
@@ -261,16 +255,15 @@ namespace v2rayN.Handler
|
|||||||
p.Start();
|
p.Start();
|
||||||
p.BeginOutputReadLine();
|
p.BeginOutputReadLine();
|
||||||
|
|
||||||
|
p.StandardInput.Write(configStr);
|
||||||
|
p.StandardInput.Close();
|
||||||
|
|
||||||
if (p.WaitForExit(1000))
|
if (p.WaitForExit(1000))
|
||||||
{
|
{
|
||||||
throw new Exception(p.StandardError.ReadToEnd());
|
throw new Exception(p.StandardError.ReadToEnd());
|
||||||
}
|
}
|
||||||
|
|
||||||
Global.processJob.AddProcess(p.Handle);
|
Global.processJob.AddProcess(p.Handle);
|
||||||
|
|
||||||
Thread.Sleep(1000);
|
|
||||||
File.Delete(pathTemp);
|
|
||||||
|
|
||||||
return p.Id;
|
return p.Id;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -195,7 +195,8 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, 10, out int responseTime);
|
var config = LazyConfig.Instance.GetConfig();
|
||||||
|
string status = GetRealPingTime(config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||||
bool noError = Utils.IsNullOrEmpty(status);
|
bool noError = Utils.IsNullOrEmpty(status);
|
||||||
return noError ? responseTime : -1;
|
return noError ? responseTime : -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ namespace v2rayN.Handler
|
|||||||
public List<ProfileItemModel> ProfileItems(string subid, string filter)
|
public List<ProfileItemModel> ProfileItems(string subid, string filter)
|
||||||
{
|
{
|
||||||
var sql = @$"select a.*
|
var sql = @$"select a.*
|
||||||
,b.remarks subRemarks
|
,b.remarks subRemarks
|
||||||
,case when a.indexId = '{_config.indexId}' then true else false end isActive
|
|
||||||
from ProfileItem a
|
from ProfileItem a
|
||||||
left join SubItem b on a.subid = b.id
|
left join SubItem b on a.subid = b.id
|
||||||
where 1=1 ";
|
where 1=1 ";
|
||||||
@@ -96,6 +95,10 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
if (!Utils.IsNullOrEmpty(filter))
|
if (!Utils.IsNullOrEmpty(filter))
|
||||||
{
|
{
|
||||||
|
if (filter.Contains("'"))
|
||||||
|
{
|
||||||
|
filter = filter.Replace("'", "");
|
||||||
|
}
|
||||||
sql += $" and a.remarks like '%{filter}%'";
|
sql += $" and a.remarks like '%{filter}%'";
|
||||||
}
|
}
|
||||||
sql += " order by a.sort";
|
sql += " order by a.sort";
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ namespace v2rayN.Handler
|
|||||||
path = item.path,
|
path = item.path,
|
||||||
tls = item.streamSecurity,
|
tls = item.streamSecurity,
|
||||||
sni = item.sni,
|
sni = item.sni,
|
||||||
alpn = item.alpn
|
alpn = item.alpn,
|
||||||
|
fp = item.fingerprint
|
||||||
};
|
};
|
||||||
|
|
||||||
url = Utils.ToJson(vmessQRCode);
|
url = Utils.ToJson(vmessQRCode);
|
||||||
@@ -202,6 +203,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
|
dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
|
||||||
}
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.fingerprint))
|
||||||
|
{
|
||||||
|
dicQuery.Add("fp", Utils.UrlEncode(item.fingerprint));
|
||||||
|
}
|
||||||
|
|
||||||
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp");
|
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp");
|
||||||
|
|
||||||
@@ -408,6 +413,7 @@ namespace v2rayN.Handler
|
|||||||
profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
|
profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
|
||||||
profileItem.sni = Utils.ToString(vmessQRCode.sni);
|
profileItem.sni = Utils.ToString(vmessQRCode.sni);
|
||||||
profileItem.alpn = Utils.ToString(vmessQRCode.alpn);
|
profileItem.alpn = Utils.ToString(vmessQRCode.alpn);
|
||||||
|
profileItem.fingerprint = Utils.ToString(vmessQRCode.fp);
|
||||||
|
|
||||||
return profileItem;
|
return profileItem;
|
||||||
}
|
}
|
||||||
@@ -759,6 +765,7 @@ namespace v2rayN.Handler
|
|||||||
item.streamSecurity = query["security"] ?? "";
|
item.streamSecurity = query["security"] ?? "";
|
||||||
item.sni = query["sni"] ?? "";
|
item.sni = query["sni"] ?? "";
|
||||||
item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
|
item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
|
||||||
|
item.fingerprint = Utils.UrlDecode(query["fp"] ?? "");
|
||||||
item.network = query["type"] ?? "tcp";
|
item.network = query["type"] ?? "tcp";
|
||||||
switch (item.network)
|
switch (item.network)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ namespace v2rayN.Handler
|
|||||||
_selecteds = new List<ServerTestItem>();
|
_selecteds = new List<ServerTestItem>();
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
|
if (it.configType == EConfigType.Custom)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
_selecteds.Add(new ServerTestItem()
|
_selecteds.Add(new ServerTestItem()
|
||||||
{
|
{
|
||||||
indexId = it.indexId,
|
indexId = it.indexId,
|
||||||
@@ -38,6 +42,25 @@ namespace v2rayN.Handler
|
|||||||
configType = it.configType
|
configType = it.configType
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
//clear test result
|
||||||
|
foreach (var it in _selecteds)
|
||||||
|
{
|
||||||
|
switch (actionType)
|
||||||
|
{
|
||||||
|
case ESpeedActionType.Ping:
|
||||||
|
case ESpeedActionType.Tcping:
|
||||||
|
case ESpeedActionType.Realping:
|
||||||
|
UpdateFunc(it.indexId, ResUI.Speedtesting, "");
|
||||||
|
break;
|
||||||
|
case ESpeedActionType.Speedtest:
|
||||||
|
UpdateFunc(it.indexId, "", ResUI.Speedtesting);
|
||||||
|
break;
|
||||||
|
case ESpeedActionType.Mixedtest:
|
||||||
|
UpdateFunc(it.indexId, ResUI.Speedtesting, ResUI.Speedtesting);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (actionType)
|
switch (actionType)
|
||||||
{
|
{
|
||||||
case ESpeedActionType.Ping:
|
case ESpeedActionType.Ping:
|
||||||
@@ -200,10 +223,10 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
if (it.delay < 0)
|
if (it.delay < 0)
|
||||||
{
|
{
|
||||||
|
UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||||
UpdateFunc(it.indexId, "", ResUI.Speedtesting);
|
|
||||||
|
|
||||||
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||||
if (item is null) continue;
|
if (item is null) continue;
|
||||||
@@ -225,6 +248,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
_coreHandler.CoreStopPid(pid);
|
_coreHandler.CoreStopPid(pid);
|
||||||
}
|
}
|
||||||
|
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||||
}
|
}
|
||||||
private async Task RunMixedtestAsync()
|
private async Task RunMixedtestAsync()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -90,10 +90,14 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否允许不安全连接
|
/// 是否允许不安全连接
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool defAllowInsecure
|
public bool defAllowInsecure { get; set; }
|
||||||
{
|
|
||||||
get; set;
|
public string defFingerprint { get; set; }
|
||||||
}
|
|
||||||
|
/// <summary>
|
||||||
|
/// 默认用户代理
|
||||||
|
/// </summary>
|
||||||
|
public string defUserAgent { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 域名解析策略
|
/// 域名解析策略
|
||||||
@@ -139,8 +143,6 @@
|
|||||||
|
|
||||||
public int trayMenuServersLimit { get; set; } = 20;
|
public int trayMenuServersLimit { get; set; } = 20;
|
||||||
|
|
||||||
public bool autoHideStartup { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region other entities
|
#region other entities
|
||||||
|
|||||||
@@ -57,10 +57,15 @@ namespace v2rayN.Mode
|
|||||||
public bool enableAutoAdjustMainLvColWidth { get; set; }
|
public bool enableAutoAdjustMainLvColWidth { get; set; }
|
||||||
public double mainWidth { get; set; }
|
public double mainWidth { get; set; }
|
||||||
public double mainHeight { get; set; }
|
public double mainHeight { get; set; }
|
||||||
|
public double mainGirdHeight1 { get; set; }
|
||||||
|
public double mainGirdHeight2 { get; set; }
|
||||||
public bool colorModeDark { get; set; }
|
public bool colorModeDark { get; set; }
|
||||||
public string? colorPrimaryName { get; set; }
|
public string? colorPrimaryName { get; set; }
|
||||||
public string currentLanguage { get; set; }
|
public string currentLanguage { get; set; }
|
||||||
|
public string currentFontFamily { get; set; }
|
||||||
public bool enableDragDropSort { get; set; }
|
public bool enableDragDropSort { get; set; }
|
||||||
|
public bool doubleClick2Activate { get; set; }
|
||||||
|
public bool autoHideStartup { get; set; } = true;
|
||||||
public Dictionary<string, int> mainLvColWidth { get; set; }
|
public Dictionary<string, int> mainLvColWidth { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace v2rayN.Mode
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace v2rayN.Mode
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// v2ray配置文件实体类
|
/// v2ray配置文件实体类
|
||||||
@@ -505,6 +507,12 @@
|
|||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Host { get; set; }
|
public string Host { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户代理
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("User-Agent")]
|
||||||
|
public string UserAgent { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class HttpSettings
|
public class HttpSettings
|
||||||
|
|||||||
@@ -63,5 +63,10 @@
|
|||||||
/// TLS alpn
|
/// TLS alpn
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string alpn { get; set; } = string.Empty;
|
public string alpn { get; set; } = string.Empty;
|
||||||
|
/// <summary>
|
||||||
|
/// TLS fingerprint
|
||||||
|
/// </summary>
|
||||||
|
public string fp { get; set; } = string.Empty;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
v2rayN/v2rayN/Resources/Fonts/SourceHanSansCN-Regular.ttf
Normal file
BIN
v2rayN/v2rayN/Resources/Fonts/SourceHanSansCN-Regular.ttf
Normal file
Binary file not shown.
110
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
110
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
@@ -681,6 +681,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Edit Server (Ctrl+D) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string menuEditServer {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("menuEditServer", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Exit 的本地化字符串。
|
/// 查找类似 Exit 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1114,7 +1123,7 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Share Server (Ctrl+D) 的本地化字符串。
|
/// 查找类似 Share Server (Ctrl+F) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string menuShareServer {
|
public static string menuShareServer {
|
||||||
get {
|
get {
|
||||||
@@ -1752,6 +1761,24 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Test completed 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string SpeedtestingCompleted {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SpeedtestingCompleted", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Skip test 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string SpeedtestingSkip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SpeedtestingSkip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 PAC failed to start. Please run this program as Administrator. 的本地化字符串。
|
/// 查找类似 PAC failed to start. Please run this program as Administrator. 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1861,6 +1888,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 AutoRefresh 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbAutoRefresh {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbAutoRefresh", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Domain and ip are auto sorted when saving 的本地化字符串。
|
/// 查找类似 Domain and ip are auto sorted when saving 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2356,6 +2392,24 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 FontFamily(Require restart) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsCurrentFontFamily {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsCurrentFontFamily", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Copy the font TTF file to the directory Resources\Fonts, restart the settings 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsCurrentFontFamilyTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsCurrentFontFamilyTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 AllowInsecure 的本地化字符串。
|
/// 查找类似 AllowInsecure 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2365,6 +2419,33 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Default TLS fingerprint 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefFingerprint {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefFingerprint", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 User-Agent 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefUserAgent {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefUserAgent", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 This parameter is valid only for tcp/http and ws 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDefUserAgentTips {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDefUserAgentTips", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。
|
/// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2374,6 +2455,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Double-click server make active 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsDoubleClick2Activate {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsDoubleClick2Activate", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Automatically adjust column width after updating subscription 的本地化字符串。
|
/// 查找类似 Automatically adjust column width after updating subscription 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2581,6 +2671,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 http port=socks port+1 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsSocksPortTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsSocksPortTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Start on boot 的本地化字符串。
|
/// 查找类似 Start on boot 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2590,6 +2689,15 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Set this with admin privileges, get admin privileges after startup 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsStartBootTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsStartBootTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Enable Statistics (Require restart) 的本地化字符串。
|
/// 查找类似 Enable Statistics (Require restart) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -130,7 +130,7 @@
|
|||||||
<value>فرمت پیکربندی نادرست است</value>
|
<value>فرمت پیکربندی نادرست است</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomServerTips" xml:space="preserve">
|
<data name="CustomServerTips" xml:space="preserve">
|
||||||
<value>Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually.</value>
|
<value>توجه داشته باشید که پیکربندی سفارشی کاملاً به پیکربندی خود شما بستگی دارد و با همه تنظیمات کار نمی کند. اگر می خواهید از پروکسی سیستم استفاده کنید، لطفاً پورت درحال شنود را به صورت دستی تغییر دهید.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Downloading" xml:space="preserve">
|
<data name="Downloading" xml:space="preserve">
|
||||||
<value>درحال دانلود...</value>
|
<value>درحال دانلود...</value>
|
||||||
@@ -187,10 +187,10 @@
|
|||||||
<value>پیکربندی اولیه</value>
|
<value>پیکربندی اولیه</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IsLatestCore" xml:space="preserve">
|
<data name="IsLatestCore" xml:space="preserve">
|
||||||
<value>{0} already up to date.</value>
|
<value>{0} در حال حاضر به روز است.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IsLatestN" xml:space="preserve">
|
<data name="IsLatestN" xml:space="preserve">
|
||||||
<value>{0} already up to date.</value>
|
<value>{0} در حال حاضر به روز است.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvAddress" xml:space="preserve">
|
<data name="LvAddress" xml:space="preserve">
|
||||||
<value>آدرس</value>
|
<value>آدرس</value>
|
||||||
@@ -262,28 +262,28 @@
|
|||||||
<value>شروع به دریافت اشتراک شد</value>
|
<value>شروع به دریافت اشتراک شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgStartUpdating" xml:space="preserve">
|
<data name="MsgStartUpdating" xml:space="preserve">
|
||||||
<value>Start updating {0}...</value>
|
<value>شروع بروزرسانی {0}...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgStartUpdatingPAC" xml:space="preserve">
|
<data name="MsgStartUpdatingPAC" xml:space="preserve">
|
||||||
<value>Start updating PAC...</value>
|
<value>شروع بروزرسانی PAC...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgSubscriptionDecodingFailed" xml:space="preserve">
|
<data name="MsgSubscriptionDecodingFailed" xml:space="preserve">
|
||||||
<value>محتوای اشتراک نامعتبر است</value>
|
<value>محتوای اشتراک نامعتبر است</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUnpacking" xml:space="preserve">
|
<data name="MsgUnpacking" xml:space="preserve">
|
||||||
<value>is unpacking...</value>
|
<value>در حال باز کردن بسته می باشد ...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateSubscriptionEnd" xml:space="preserve">
|
<data name="MsgUpdateSubscriptionEnd" xml:space="preserve">
|
||||||
<value>Update subscription end</value>
|
<value>بروزرسانی اشتراک به پایان رسید</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateSubscriptionStart" xml:space="preserve">
|
<data name="MsgUpdateSubscriptionStart" xml:space="preserve">
|
||||||
<value>Update subscription starts</value>
|
<value>بروزرسانی اشتراک شروع شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve">
|
<data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve">
|
||||||
<value>Update Core successfully</value>
|
<value>هسته با موفقیت بروزرسانی شد</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgUpdateV2rayCoreSuccessfullyMore" xml:space="preserve">
|
<data name="MsgUpdateV2rayCoreSuccessfullyMore" xml:space="preserve">
|
||||||
<value>Update Core successfully! Restarting service...</value>
|
<value>هسته با موفقیت بروزرسانی شد! راه اندازی مجدد سرویس...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NeedHttpGlobalProxy" xml:space="preserve">
|
<data name="NeedHttpGlobalProxy" xml:space="preserve">
|
||||||
<value> This feature relies on the Http global proxy, please set it correctly first.</value>
|
<value> This feature relies on the Http global proxy, please set it correctly first.</value>
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
<value>Scan completed, no valid QR code found</value>
|
<value>Scan completed, no valid QR code found</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OperationFailed" xml:space="preserve">
|
<data name="OperationFailed" xml:space="preserve">
|
||||||
<value> operation failed, please check and retry</value>
|
<value> عملیات انجام نشد، لطفا بررسی کنید و دوباره امتحان کنید</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PleaseFillRemarks" xml:space="preserve">
|
<data name="PleaseFillRemarks" xml:space="preserve">
|
||||||
<value>Please Fill Remarks</value>
|
<value>Please Fill Remarks</value>
|
||||||
@@ -343,20 +343,20 @@
|
|||||||
<value>Start service ({0})...</value>
|
<value>Start service ({0})...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfulConfiguration" xml:space="preserve">
|
<data name="SuccessfulConfiguration" xml:space="preserve">
|
||||||
<value>Configuration successful
|
<value>پیکربندی با موفقیت انجام شد
|
||||||
{0}</value>
|
{0}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
|
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
|
||||||
<value>سرور پیکربندی سفارشی با موفقیت وارد شد.</value>
|
<value>سرور پیکربندی سفارشی با موفقیت وارد شد.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
|
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
|
||||||
<value>{0} servers have been imported from clipboard.</value>
|
<value>{0} سرورها از کلیپ بورد وارد شده اند.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SuccessfullyImportedServerViaScan" xml:space="preserve">
|
<data name="SuccessfullyImportedServerViaScan" xml:space="preserve">
|
||||||
<value>Scan import URL successfully</value>
|
<value>اسکن URL وارد کردن با موفقیت</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TestMeOutput" xml:space="preserve">
|
<data name="TestMeOutput" xml:space="preserve">
|
||||||
<value>The ping of current service: {0} ms</value>
|
<value>پینگ سرویس فعلی: {0} ms</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OperationSuccess" xml:space="preserve">
|
<data name="OperationSuccess" xml:space="preserve">
|
||||||
<value>موفقیت عملیات</value>
|
<value>موفقیت عملیات</value>
|
||||||
@@ -368,7 +368,7 @@
|
|||||||
<value>آیا مطمئن هستید که قوانین را حذف می کنید؟</value>
|
<value>آیا مطمئن هستید که قوانین را حذف می کنید؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
|
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
|
||||||
<value>{0},One of the required.</value>
|
<value>{0},یکی از مورد نیاز.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvRemarks" xml:space="preserve">
|
<data name="LvRemarks" xml:space="preserve">
|
||||||
<value>Remarks</value>
|
<value>Remarks</value>
|
||||||
@@ -386,7 +386,7 @@
|
|||||||
<value>Do you want to append rules? Choose yes to append, choose otherwise to replace</value>
|
<value>Do you want to append rules? Choose yes to append, choose otherwise to replace</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
|
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
|
||||||
<value>Download GeoFile: {0} successfully</value>
|
<value>دانلود GeoFile: {0} با موفقیت</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MsgInformationTitle" xml:space="preserve">
|
<data name="MsgInformationTitle" xml:space="preserve">
|
||||||
<value>اطلاعات</value>
|
<value>اطلاعات</value>
|
||||||
@@ -536,7 +536,7 @@
|
|||||||
<value>پروکسی سیستم تغییر نکند</value>
|
<value>پروکسی سیستم تغییر نکند</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSystemProxyPac" xml:space="preserve">
|
<data name="menuSystemProxyPac" xml:space="preserve">
|
||||||
<value>Pac Mode</value>
|
<value>حالت Pac</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSystemProxySet" xml:space="preserve">
|
<data name="menuSystemProxySet" xml:space="preserve">
|
||||||
<value>تنظیم پراکسی سیستم</value>
|
<value>تنظیم پراکسی سیستم</value>
|
||||||
@@ -791,10 +791,10 @@
|
|||||||
<value>Outbound Freedom domainStrategy</value>
|
<value>Outbound Freedom domainStrategy</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsEnableAutoAdjustMainLvColWidth" xml:space="preserve">
|
<data name="TbSettingsEnableAutoAdjustMainLvColWidth" xml:space="preserve">
|
||||||
<value>Automatically adjust column width after updating subscription</value>
|
<value>پس از بهروزرسانی اشتراک، عرض ستون را به صورت خودکار تنظیم شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsEnableCheckPreReleaseUpdate" xml:space="preserve">
|
<data name="TbSettingsEnableCheckPreReleaseUpdate" xml:space="preserve">
|
||||||
<value>به روز رسانی های پیش از انتشار را بررسی کنید</value>
|
<value>به روز رسانی های پیش از انتشار را بررسی شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsException" xml:space="preserve">
|
<data name="TbSettingsException" xml:space="preserve">
|
||||||
<value>استثنا</value>
|
<value>استثنا</value>
|
||||||
@@ -827,13 +827,13 @@
|
|||||||
<value>تنظیمات v2rayN</value>
|
<value>تنظیمات v2rayN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsPacListenPort" xml:space="preserve">
|
<data name="TbSettingsPacListenPort" xml:space="preserve">
|
||||||
<value>Pac listen port</value>
|
<value>Pac پورت درحال شنود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsPass" xml:space="preserve">
|
<data name="TbSettingsPass" xml:space="preserve">
|
||||||
<value>Auth pass</value>
|
<value>Auth pass</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsRemoteDNS" xml:space="preserve">
|
<data name="TbSettingsRemoteDNS" xml:space="preserve">
|
||||||
<value>Custom DNS (multiple, separated by commas (,))</value>
|
<value>سفارشی DNS (multiple, separated by commas (,))</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSaveTip" xml:space="preserve">
|
<data name="TbSettingsSaveTip" xml:space="preserve">
|
||||||
<value>After modifying the following parameters, click Save to take effect</value>
|
<value>After modifying the following parameters, click Save to take effect</value>
|
||||||
@@ -845,16 +845,16 @@
|
|||||||
<value>Turn on Sniffing</value>
|
<value>Turn on Sniffing</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSocksPort" xml:space="preserve">
|
<data name="TbSettingsSocksPort" xml:space="preserve">
|
||||||
<value>Socks Port</value>
|
<value>ساکس Port</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStartBoot" xml:space="preserve">
|
<data name="TbSettingsStartBoot" xml:space="preserve">
|
||||||
<value>Start on boot</value>
|
<value>درهنگام راه ائدازی شروع شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>Enable Statistics (Require restart)</value>
|
<value>فعال کردن آمار (نیاز به راه اندازی مجدد)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
||||||
<value>Statistics freshrate (second)</value>
|
<value>نرخ تازه سازی آمار (ثانیه)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>Subscription conversion Url</value>
|
<value>Subscription conversion Url</value>
|
||||||
@@ -884,7 +884,7 @@
|
|||||||
<value>تنظیم کلید میانبر جهانی</value>
|
<value>تنظیم کلید میانبر جهانی</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
|
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
|
||||||
<value>Set directly by pressing the keyboard, Take effect after restart</value>
|
<value>مستقیماً با فشار دادن صفحه کلید تنظیم کنید، بعد از راه اندازی مجدد اعمال شود</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbNotChangeSystemProxy" xml:space="preserve">
|
<data name="TbNotChangeSystemProxy" xml:space="preserve">
|
||||||
<value>پروکسی سیستم را تغییر ندهید</value>
|
<value>پروکسی سیستم را تغییر ندهید</value>
|
||||||
@@ -899,7 +899,7 @@
|
|||||||
<value>حالت Pac</value>
|
<value>حالت Pac</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuShareServer" xml:space="preserve">
|
<data name="menuShareServer" xml:space="preserve">
|
||||||
<value>اشتراک گذاری سرور(Ctrl+D)</value>
|
<value>اشتراک گذاری سرور(Ctrl+F)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRouting" xml:space="preserve">
|
<data name="menuRouting" xml:space="preserve">
|
||||||
<value>مسیریابی</value>
|
<value>مسیریابی</value>
|
||||||
@@ -929,7 +929,7 @@
|
|||||||
<value>{0} Website</value>
|
<value>{0} Website</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRoutingAdvanced" xml:space="preserve">
|
<data name="menuRoutingAdvanced" xml:space="preserve">
|
||||||
<value>Advanced Function</value>
|
<value>عملکرد پیشرفته</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRoutingAdvancedAdd" xml:space="preserve">
|
<data name="menuRoutingAdvancedAdd" xml:space="preserve">
|
||||||
<value>اضافه کردن</value>
|
<value>اضافه کردن</value>
|
||||||
@@ -1001,7 +1001,7 @@
|
|||||||
<value>تنظیم جزئیات قانون مسیریابی</value>
|
<value>تنظیم جزئیات قانون مسیریابی</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbAutoSort" xml:space="preserve">
|
<data name="TbAutoSort" xml:space="preserve">
|
||||||
<value>Domain and ip are auto sorted when saving</value>
|
<value>دامنه و آی پی در هنگام ذخیره به طور خودکار مرتب می شوند</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRuleobjectDoc" xml:space="preserve">
|
<data name="TbRuleobjectDoc" xml:space="preserve">
|
||||||
<value>Ruleobject Doc</value>
|
<value>Ruleobject Doc</value>
|
||||||
@@ -1060,4 +1060,10 @@
|
|||||||
<data name="TbSettingsTunModeShowWindow" xml:space="preserve">
|
<data name="TbSettingsTunModeShowWindow" xml:space="preserve">
|
||||||
<value>نمایش کنسول</value>
|
<value>نمایش کنسول</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>User-Agent</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>This parameter is valid only for tcp/http and ws</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -899,7 +899,7 @@
|
|||||||
<value>Pac Mode</value>
|
<value>Pac Mode</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuShareServer" xml:space="preserve">
|
<data name="menuShareServer" xml:space="preserve">
|
||||||
<value>Share Server (Ctrl+D)</value>
|
<value>Share Server (Ctrl+F)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRouting" xml:space="preserve">
|
<data name="menuRouting" xml:space="preserve">
|
||||||
<value>Routing</value>
|
<value>Routing</value>
|
||||||
@@ -1069,4 +1069,40 @@
|
|||||||
<data name="TbSettingsEnableDragDropSort" xml:space="preserve">
|
<data name="TbSettingsEnableDragDropSort" xml:space="preserve">
|
||||||
<value>Enable Server Drag Drop Sort(Require restart)</value>
|
<value>Enable Server Drag Drop Sort(Require restart)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbAutoRefresh" xml:space="preserve">
|
||||||
|
<value>AutoRefresh</value>
|
||||||
|
</data>
|
||||||
|
<data name="SpeedtestingSkip" xml:space="preserve">
|
||||||
|
<value>Skip test</value>
|
||||||
|
</data>
|
||||||
|
<data name="menuEditServer" xml:space="preserve">
|
||||||
|
<value>Edit Server (Ctrl+D)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
||||||
|
<value>Double-click server make active</value>
|
||||||
|
</data>
|
||||||
|
<data name="SpeedtestingCompleted" xml:space="preserve">
|
||||||
|
<value>Test completed</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefFingerprint" xml:space="preserve">
|
||||||
|
<value>Default TLS fingerprint</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>User-Agent</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>This parameter is valid only for tcp/http and ws</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamily" xml:space="preserve">
|
||||||
|
<value>FontFamily(Require restart)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamilyTip" xml:space="preserve">
|
||||||
|
<value>Copy the font TTF file to the directory Resources\Fonts, restart the settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||||
|
<value>http port=socks port+1</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||||
|
<value>Set this with admin privileges, get admin privileges after startup</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -899,7 +899,7 @@
|
|||||||
<value>Pac模式</value>
|
<value>Pac模式</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuShareServer" xml:space="preserve">
|
<data name="menuShareServer" xml:space="preserve">
|
||||||
<value>分享服务器 (Ctrl+D)</value>
|
<value>分享服务器 (Ctrl+F)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRouting" xml:space="preserve">
|
<data name="menuRouting" xml:space="preserve">
|
||||||
<value>路由</value>
|
<value>路由</value>
|
||||||
@@ -1069,4 +1069,40 @@
|
|||||||
<data name="TbSettingsEnableDragDropSort" xml:space="preserve">
|
<data name="TbSettingsEnableDragDropSort" xml:space="preserve">
|
||||||
<value>启用服务器拖放排序(需重启)</value>
|
<value>启用服务器拖放排序(需重启)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbAutoRefresh" xml:space="preserve">
|
||||||
|
<value>自动刷新</value>
|
||||||
|
</data>
|
||||||
|
<data name="SpeedtestingSkip" xml:space="preserve">
|
||||||
|
<value>跳过测试</value>
|
||||||
|
</data>
|
||||||
|
<data name="menuEditServer" xml:space="preserve">
|
||||||
|
<value>编辑服务器 (Ctrl+D)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDoubleClick2Activate" xml:space="preserve">
|
||||||
|
<value>主界面双击设为活动服务器</value>
|
||||||
|
</data>
|
||||||
|
<data name="SpeedtestingCompleted" xml:space="preserve">
|
||||||
|
<value>测试完成</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefFingerprint" xml:space="preserve">
|
||||||
|
<value>默认TLS指纹(fingerprint)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgent" xml:space="preserve">
|
||||||
|
<value>用户代理(User-Agent)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsDefUserAgentTips" xml:space="preserve">
|
||||||
|
<value>仅对tcp/http、ws协议生效</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamily" xml:space="preserve">
|
||||||
|
<value>当前字体(需重启)</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCurrentFontFamilyTip" xml:space="preserve">
|
||||||
|
<value>拷贝字体TTF文件到目录Resources\Fonts,重启设置</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||||
|
<value>http端口=socks端口+1</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||||
|
<value>以管理员权限设置此项,在启动后获得管理员权限</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1 +1 @@
|
|||||||
{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}}
|
{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":[$requestUserAgent$],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}}
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
{
|
{
|
||||||
"dns": {
|
"dns": {
|
||||||
"servers": [
|
"servers": [
|
||||||
{
|
|
||||||
"tag": "google",
|
|
||||||
"address": "tls://8.8.8.8"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"tag": "local",
|
"tag": "local",
|
||||||
"address": "223.5.5.5",
|
"address": "223.5.5.5",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ namespace v2rayN.ViewModels
|
|||||||
public ReactiveCommand<Unit, Unit> BrowseServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> BrowseServerCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> EditServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> EditServerCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> SaveServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> SaveServerCmd { get; }
|
||||||
|
public bool IsModified { get; set; }
|
||||||
|
|
||||||
public AddServer2ViewModel(ProfileItem profileItem, Window view)
|
public AddServer2ViewModel(ProfileItem profileItem, Window view)
|
||||||
{
|
{
|
||||||
@@ -128,7 +129,11 @@ namespace v2rayN.ViewModels
|
|||||||
if (ConfigHandler.AddCustomServer(ref _config, item, false) == 0)
|
if (ConfigHandler.AddCustomServer(ref _config, item, false) == 0)
|
||||||
{
|
{
|
||||||
_noticeHandler?.Enqueue(ResUI.SuccessfullyImportedCustomServer);
|
_noticeHandler?.Enqueue(ResUI.SuccessfullyImportedCustomServer);
|
||||||
_view.DialogResult = true;
|
if (!Utils.IsNullOrEmpty(item.indexId))
|
||||||
|
{
|
||||||
|
SelectedSource = Utils.DeepCopy(item);
|
||||||
|
}
|
||||||
|
IsModified = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ namespace v2rayN.ViewModels
|
|||||||
public ReactiveCommand<Unit, Unit> AddServerViaClipboardCmd { get; }
|
public ReactiveCommand<Unit, Unit> AddServerViaClipboardCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> AddServerViaScanCmd { get; }
|
public ReactiveCommand<Unit, Unit> AddServerViaScanCmd { get; }
|
||||||
//servers delete
|
//servers delete
|
||||||
|
public ReactiveCommand<Unit, Unit> EditServerCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> RemoveServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> RemoveServerCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> RemoveDuplicateServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> RemoveDuplicateServerCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> CopyServerCmd { get; }
|
public ReactiveCommand<Unit, Unit> CopyServerCmd { get; }
|
||||||
@@ -112,8 +113,8 @@ namespace v2rayN.ViewModels
|
|||||||
public ReactiveCommand<Unit, Unit> SubSettingCmd { get; }
|
public ReactiveCommand<Unit, Unit> SubSettingCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> AddSubCmd { get; }
|
public ReactiveCommand<Unit, Unit> AddSubCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> SubUpdateCmd { get; }
|
public ReactiveCommand<Unit, Unit> SubUpdateCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> SubGroupUpdateCmd { get; }
|
|
||||||
public ReactiveCommand<Unit, Unit> SubUpdateViaProxyCmd { get; }
|
public ReactiveCommand<Unit, Unit> SubUpdateViaProxyCmd { get; }
|
||||||
|
public ReactiveCommand<Unit, Unit> SubGroupUpdateCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> SubGroupUpdateViaProxyCmd { get; }
|
public ReactiveCommand<Unit, Unit> SubGroupUpdateViaProxyCmd { get; }
|
||||||
|
|
||||||
//Setting
|
//Setting
|
||||||
@@ -211,6 +212,10 @@ namespace v2rayN.ViewModels
|
|||||||
SelectedMoveToGroup = new();
|
SelectedMoveToGroup = new();
|
||||||
SelectedRouting = new();
|
SelectedRouting = new();
|
||||||
SelectedServer = new();
|
SelectedServer = new();
|
||||||
|
if (_config.tunModeItem.enableTun && Utils.IsAdministrator())
|
||||||
|
{
|
||||||
|
EnableTun = true;
|
||||||
|
}
|
||||||
|
|
||||||
//RefreshServers();
|
//RefreshServers();
|
||||||
InitSubscriptionView();
|
InitSubscriptionView();
|
||||||
@@ -254,7 +259,7 @@ namespace v2rayN.ViewModels
|
|||||||
x => x.EnableTun,
|
x => x.EnableTun,
|
||||||
y => y == true)
|
y => y == true)
|
||||||
.Subscribe(c => DoEnableTun(c));
|
.Subscribe(c => DoEnableTun(c));
|
||||||
|
|
||||||
BindingUI();
|
BindingUI();
|
||||||
RestoreUI();
|
RestoreUI();
|
||||||
AutoHideStartup();
|
AutoHideStartup();
|
||||||
@@ -293,6 +298,10 @@ namespace v2rayN.ViewModels
|
|||||||
return ScanScreenTaskAsync();
|
return ScanScreenTaskAsync();
|
||||||
});
|
});
|
||||||
//servers delete
|
//servers delete
|
||||||
|
EditServerCmd = ReactiveCommand.Create(() =>
|
||||||
|
{
|
||||||
|
EditServer(false, EConfigType.Custom);
|
||||||
|
}, canEditRemove);
|
||||||
RemoveServerCmd = ReactiveCommand.Create(() =>
|
RemoveServerCmd = ReactiveCommand.Create(() =>
|
||||||
{
|
{
|
||||||
RemoveServer();
|
RemoveServer();
|
||||||
@@ -388,13 +397,13 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
UpdateSubscriptionProcess("", false);
|
UpdateSubscriptionProcess("", false);
|
||||||
});
|
});
|
||||||
SubGroupUpdateCmd = ReactiveCommand.Create(() =>
|
|
||||||
{
|
|
||||||
UpdateSubscriptionProcess(_subId, true);
|
|
||||||
});
|
|
||||||
SubUpdateViaProxyCmd = ReactiveCommand.Create(() =>
|
SubUpdateViaProxyCmd = ReactiveCommand.Create(() =>
|
||||||
{
|
{
|
||||||
UpdateSubscriptionProcess("", false);
|
UpdateSubscriptionProcess("", true);
|
||||||
|
});
|
||||||
|
SubGroupUpdateCmd = ReactiveCommand.Create(() =>
|
||||||
|
{
|
||||||
|
UpdateSubscriptionProcess(_subId, false);
|
||||||
});
|
});
|
||||||
SubGroupUpdateViaProxyCmd = ReactiveCommand.Create(() =>
|
SubGroupUpdateViaProxyCmd = ReactiveCommand.Create(() =>
|
||||||
{
|
{
|
||||||
@@ -555,7 +564,16 @@ namespace v2rayN.ViewModels
|
|||||||
item.totalDown = Utils.HumanFy(update.totalDown);
|
item.totalDown = Utils.HumanFy(update.totalDown);
|
||||||
item.totalUp = Utils.HumanFy(update.totalUp);
|
item.totalUp = Utils.HumanFy(update.totalUp);
|
||||||
|
|
||||||
_profileItems.Replace(item, Utils.DeepCopy(item));
|
if (SelectedProfile?.indexId == item.indexId)
|
||||||
|
{
|
||||||
|
var temp = Utils.DeepCopy(item);
|
||||||
|
_profileItems.Replace(item, temp);
|
||||||
|
SelectedProfile = temp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_profileItems.Replace(item, Utils.DeepCopy(item));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -577,7 +595,8 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
if (Utils.IsNullOrEmpty(indexId))
|
if (Utils.IsNullOrEmpty(indexId))
|
||||||
{
|
{
|
||||||
_noticeHandler?.SendMessage(delay);
|
_noticeHandler?.SendMessage(delay, true);
|
||||||
|
_noticeHandler?.Enqueue(delay);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var item = _profileItems.Where(it => it.indexId == indexId).FirstOrDefault();
|
var item = _profileItems.Where(it => it.indexId == indexId).FirstOrDefault();
|
||||||
@@ -684,6 +703,8 @@ namespace v2rayN.ViewModels
|
|||||||
List<ProfileItemModel> lstModel = LazyConfig.Instance.ProfileItems(_subId, _serverFilter);
|
List<ProfileItemModel> lstModel = LazyConfig.Instance.ProfileItems(_subId, _serverFilter);
|
||||||
_lstProfile = Utils.FromJson<List<ProfileItem>>(Utils.ToJson(lstModel));
|
_lstProfile = Utils.FromJson<List<ProfileItem>>(Utils.ToJson(lstModel));
|
||||||
|
|
||||||
|
ConfigHandler.SetDefaultServer(_config, _lstProfile);
|
||||||
|
|
||||||
List<ServerStatItem> lstServerStat = new();
|
List<ServerStatItem> lstServerStat = new();
|
||||||
if (_statistics != null && _statistics.Enable)
|
if (_statistics != null && _statistics.Enable)
|
||||||
{
|
{
|
||||||
@@ -704,25 +725,31 @@ namespace v2rayN.ViewModels
|
|||||||
network = t.network,
|
network = t.network,
|
||||||
streamSecurity = t.streamSecurity,
|
streamSecurity = t.streamSecurity,
|
||||||
subRemarks = t.subRemarks,
|
subRemarks = t.subRemarks,
|
||||||
isActive = t.isActive,
|
isActive = t.indexId == _config.indexId,
|
||||||
delay = t.delay,
|
delay = t.delay,
|
||||||
delayVal = t.delay > 0 ? $"{t.delay} {Global.DelayUnit}" : string.Empty,
|
delayVal = t.delay != 0 ? $"{t.delay} {Global.DelayUnit}" : string.Empty,
|
||||||
speedVal = t.speed > 0 ? $"{t.speed} {Global.SpeedUnit}" : string.Empty,
|
speedVal = t.speed != 0 ? $"{t.speed} {Global.SpeedUnit}" : string.Empty,
|
||||||
todayDown = t22 == null ? "" : Utils.HumanFy(t22.todayDown),
|
todayDown = t22 == null ? "" : Utils.HumanFy(t22.todayDown),
|
||||||
todayUp = t22 == null ? "" : Utils.HumanFy(t22.todayUp),
|
todayUp = t22 == null ? "" : Utils.HumanFy(t22.todayUp),
|
||||||
totalDown = t22 == null ? "" : Utils.HumanFy(t22.totalDown),
|
totalDown = t22 == null ? "" : Utils.HumanFy(t22.totalDown),
|
||||||
totalUp = t22 == null ? "" : Utils.HumanFy(t22.totalUp)
|
totalUp = t22 == null ? "" : Utils.HumanFy(t22.totalUp)
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
ConfigHandler.SetDefaultServer(_config, _lstProfile);
|
|
||||||
|
|
||||||
Application.Current.Dispatcher.Invoke((Action)(() =>
|
Application.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
{
|
{
|
||||||
_profileItems.Clear();
|
_profileItems.Clear();
|
||||||
_profileItems.AddRange(lstModel);
|
_profileItems.AddRange(lstModel);
|
||||||
if (lstModel.Count > 0)
|
if (lstModel.Count > 0)
|
||||||
{
|
{
|
||||||
SelectedProfile = lstModel[0];
|
var selected = lstModel.FirstOrDefault(t => t.indexId == _config.indexId);
|
||||||
|
if (selected != null)
|
||||||
|
{
|
||||||
|
SelectedProfile = selected;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SelectedProfile = lstModel[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RefreshServersMenu();
|
RefreshServersMenu();
|
||||||
@@ -800,6 +827,7 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
subid = _subId,
|
subid = _subId,
|
||||||
configType = eConfigType,
|
configType = eConfigType,
|
||||||
|
displayLog = false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -881,12 +909,16 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var exists = lstSelecteds.Exists(t => t.indexId == _config.indexId);
|
||||||
|
|
||||||
ConfigHandler.RemoveServer(_config, lstSelecteds);
|
ConfigHandler.RemoveServer(_config, lstSelecteds);
|
||||||
_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|
||||||
RefreshServers();
|
RefreshServers();
|
||||||
Reload();
|
if (exists)
|
||||||
|
{
|
||||||
|
Reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveDuplicateServer()
|
private void RemoveDuplicateServer()
|
||||||
@@ -912,7 +944,7 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
public void SetDefaultServer()
|
public void SetDefaultServer()
|
||||||
{
|
{
|
||||||
if (Utils.IsNullOrEmpty(SelectedProfile.indexId))
|
if (Utils.IsNullOrEmpty(SelectedProfile?.indexId))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1011,7 +1043,7 @@ namespace v2rayN.ViewModels
|
|||||||
}
|
}
|
||||||
(new UpdateHandle()).RunAvailabilityCheck((bool success, string msg) =>
|
(new UpdateHandle()).RunAvailabilityCheck((bool success, string msg) =>
|
||||||
{
|
{
|
||||||
_noticeHandler?.SendMessage(msg);
|
_noticeHandler?.SendMessage(msg, true);
|
||||||
Application.Current.Dispatcher.Invoke((Action)(() =>
|
Application.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
{
|
{
|
||||||
if (!Global.ShowInTaskbar)
|
if (!Global.ShowInTaskbar)
|
||||||
@@ -1133,7 +1165,7 @@ namespace v2rayN.ViewModels
|
|||||||
if (sb.Length > 0)
|
if (sb.Length > 0)
|
||||||
{
|
{
|
||||||
Utils.SetClipboardData(sb.ToString());
|
Utils.SetClipboardData(sb.ToString());
|
||||||
_noticeHandler?.Enqueue(ResUI.BatchExportURLSuccessfully);
|
_noticeHandler?.SendMessage(ResUI.BatchExportURLSuccessfully);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1158,7 +1190,7 @@ namespace v2rayN.ViewModels
|
|||||||
if (sb.Length > 0)
|
if (sb.Length > 0)
|
||||||
{
|
{
|
||||||
Utils.SetClipboardData(Utils.Base64Encode(sb.ToString()));
|
Utils.SetClipboardData(Utils.Base64Encode(sb.ToString()));
|
||||||
_noticeHandler?.Enqueue(ResUI.BatchExportSubscriptionSuccessfully);
|
_noticeHandler?.SendMessage(ResUI.BatchExportSubscriptionSuccessfully);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1651,7 +1683,7 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
private void AutoHideStartup()
|
private void AutoHideStartup()
|
||||||
{
|
{
|
||||||
if (_config.autoHideStartup)
|
if (_config.uiItem.autoHideStartup)
|
||||||
{
|
{
|
||||||
Observable.Range(1, 1)
|
Observable.Range(1, 1)
|
||||||
.Delay(TimeSpan.FromSeconds(1))
|
.Delay(TimeSpan.FromSeconds(1))
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive] public bool logEnabled { get; set; }
|
[Reactive] public bool logEnabled { get; set; }
|
||||||
[Reactive] public string loglevel { get; set; }
|
[Reactive] public string loglevel { get; set; }
|
||||||
[Reactive] public bool defAllowInsecure { get; set; }
|
[Reactive] public bool defAllowInsecure { get; set; }
|
||||||
|
[Reactive] public string defFingerprint { get; set; }
|
||||||
|
[Reactive] public string defUserAgent { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Core DNS
|
#region Core DNS
|
||||||
@@ -55,10 +57,13 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive] public bool EnableSecurityProtocolTls13 { get; set; }
|
[Reactive] public bool EnableSecurityProtocolTls13 { get; set; }
|
||||||
[Reactive] public bool AutoHideStartup { get; set; }
|
[Reactive] public bool AutoHideStartup { get; set; }
|
||||||
[Reactive] public bool EnableCheckPreReleaseUpdate { get; set; }
|
[Reactive] public bool EnableCheckPreReleaseUpdate { get; set; }
|
||||||
[Reactive] public bool EnableDragDropSort { get; set; }
|
[Reactive] public bool EnableDragDropSort { get; set; }
|
||||||
|
[Reactive] public bool DoubleClick2Activate { get; set; }
|
||||||
[Reactive] public int autoUpdateInterval { get; set; }
|
[Reactive] public int autoUpdateInterval { get; set; }
|
||||||
[Reactive] public int autoUpdateSubInterval { get; set; }
|
[Reactive] public int autoUpdateSubInterval { get; set; }
|
||||||
[Reactive] public int trayMenuServersLimit { get; set; }
|
[Reactive] public int trayMenuServersLimit { get; set; }
|
||||||
|
[Reactive] public string currentFontFamily { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System proxy
|
#region System proxy
|
||||||
@@ -109,6 +114,8 @@ namespace v2rayN.ViewModels
|
|||||||
logEnabled = _config.logEnabled;
|
logEnabled = _config.logEnabled;
|
||||||
loglevel = _config.loglevel;
|
loglevel = _config.loglevel;
|
||||||
defAllowInsecure = _config.defAllowInsecure;
|
defAllowInsecure = _config.defAllowInsecure;
|
||||||
|
defFingerprint = _config.defFingerprint;
|
||||||
|
defUserAgent = _config.defUserAgent;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Core DNS
|
#region Core DNS
|
||||||
@@ -134,12 +141,15 @@ namespace v2rayN.ViewModels
|
|||||||
IgnoreGeoUpdateCore = _config.ignoreGeoUpdateCore;
|
IgnoreGeoUpdateCore = _config.ignoreGeoUpdateCore;
|
||||||
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
||||||
EnableSecurityProtocolTls13 = _config.enableSecurityProtocolTls13;
|
EnableSecurityProtocolTls13 = _config.enableSecurityProtocolTls13;
|
||||||
AutoHideStartup = _config.autoHideStartup;
|
AutoHideStartup = _config.uiItem.autoHideStartup;
|
||||||
EnableCheckPreReleaseUpdate = _config.checkPreReleaseUpdate;
|
EnableCheckPreReleaseUpdate = _config.checkPreReleaseUpdate;
|
||||||
EnableDragDropSort = _config.uiItem.enableDragDropSort;
|
EnableDragDropSort = _config.uiItem.enableDragDropSort;
|
||||||
|
DoubleClick2Activate = _config.uiItem.doubleClick2Activate;
|
||||||
autoUpdateInterval = _config.autoUpdateInterval;
|
autoUpdateInterval = _config.autoUpdateInterval;
|
||||||
autoUpdateSubInterval = _config.autoUpdateSubInterval;
|
autoUpdateSubInterval = _config.autoUpdateSubInterval;
|
||||||
trayMenuServersLimit = _config.trayMenuServersLimit;
|
trayMenuServersLimit = _config.trayMenuServersLimit;
|
||||||
|
currentFontFamily = _config.uiItem.currentFontFamily;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System proxy
|
#region System proxy
|
||||||
@@ -267,6 +277,8 @@ namespace v2rayN.ViewModels
|
|||||||
_config.loglevel = loglevel;
|
_config.loglevel = loglevel;
|
||||||
_config.muxEnabled = muxEnabled;
|
_config.muxEnabled = muxEnabled;
|
||||||
_config.defAllowInsecure = defAllowInsecure;
|
_config.defAllowInsecure = defAllowInsecure;
|
||||||
|
_config.defFingerprint = defFingerprint;
|
||||||
|
_config.defUserAgent = defUserAgent;
|
||||||
|
|
||||||
|
|
||||||
//DNS
|
//DNS
|
||||||
@@ -297,12 +309,14 @@ namespace v2rayN.ViewModels
|
|||||||
_config.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
_config.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
||||||
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
||||||
_config.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
_config.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
||||||
_config.autoHideStartup = AutoHideStartup;
|
_config.uiItem.autoHideStartup = AutoHideStartup;
|
||||||
_config.autoUpdateInterval = autoUpdateInterval;
|
_config.autoUpdateInterval = autoUpdateInterval;
|
||||||
_config.autoUpdateSubInterval = autoUpdateSubInterval;
|
_config.autoUpdateSubInterval = autoUpdateSubInterval;
|
||||||
_config.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
_config.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
||||||
_config.uiItem.enableDragDropSort = EnableDragDropSort;
|
_config.uiItem.enableDragDropSort = EnableDragDropSort;
|
||||||
|
_config.uiItem.doubleClick2Activate = DoubleClick2Activate;
|
||||||
_config.trayMenuServersLimit = trayMenuServersLimit;
|
_config.trayMenuServersLimit = trayMenuServersLimit;
|
||||||
|
_config.uiItem.currentFontFamily = currentFontFamily;
|
||||||
|
|
||||||
//systemProxy
|
//systemProxy
|
||||||
_config.systemProxyExceptions = systemProxyExceptions;
|
_config.systemProxyExceptions = systemProxyExceptions;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:Views="clr-namespace:v2rayN.Views"
|
xmlns:Views="clr-namespace:v2rayN.Views"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:v2rayN"
|
xmlns:local="clr-namespace:v2rayN"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
@@ -15,7 +16,9 @@
|
|||||||
Height="500"
|
Height="500"
|
||||||
x:TypeArguments="vms:AddServer2ViewModel"
|
x:TypeArguments="vms:AddServer2ViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -44,7 +44,14 @@ namespace v2rayN.Views
|
|||||||
}
|
}
|
||||||
private void btnCancel_Click(object sender, System.Windows.RoutedEventArgs e)
|
private void btnCancel_Click(object sender, System.Windows.RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
this.Close();
|
if (ViewModel?.IsModified == true)
|
||||||
|
{
|
||||||
|
this.DialogResult = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.AddServerWindow"
|
x:Class="v2rayN.Views.AddServerWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="800"
|
Height="800"
|
||||||
x:TypeArguments="vms:AddServerViewModel"
|
x:TypeArguments="vms:AddServerViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
@@ -599,6 +602,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource ServerItemMargin}"
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
IsEditable="True"
|
||||||
Style="{StaticResource DefComboBox}" />
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:Views="clr-namespace:v2rayN.Views"
|
xmlns:Views="clr-namespace:v2rayN.Views"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -14,8 +15,10 @@
|
|||||||
Height="500"
|
Height="500"
|
||||||
x:TypeArguments="vms:SubEditViewModel"
|
x:TypeArguments="vms:SubEditViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
KeyDown="GlobalHotkeySettingWindow_KeyDown"
|
KeyDown="GlobalHotkeySettingWindow_KeyDown"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:base="clr-namespace:v2rayN.Base"
|
xmlns:base="clr-namespace:v2rayN.Base"
|
||||||
xmlns:converters="clr-namespace:v2rayN.Converters"
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:v2rayN.Views"
|
xmlns:local="clr-namespace:v2rayN.Views"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
@@ -19,7 +19,9 @@
|
|||||||
MinHeight="600"
|
MinHeight="600"
|
||||||
x:TypeArguments="vms:MainWindowViewModel"
|
x:TypeArguments="vms:MainWindowViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ShowInTaskbar="True"
|
ShowInTaskbar="True"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
@@ -31,7 +33,7 @@
|
|||||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Popupbox.xaml" />
|
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Popupbox.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
|
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
|
||||||
<converters:DelayColorConverter x:Key="DelayColorConverter" />
|
<conv:DelayColorConverter x:Key="DelayColorConverter" />
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
@@ -47,7 +49,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
ClipToBounds="True"
|
ClipToBounds="True"
|
||||||
Style="{StaticResource MaterialDesignToolBar}">
|
Style="{StaticResource MaterialDesignToolBar}">
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem Padding="8,0">
|
<MenuItem Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -93,7 +95,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem Padding="8,0">
|
<MenuItem Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -125,7 +127,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem Padding="8,0">
|
<MenuItem Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -163,7 +165,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem x:Name="menuReload" Padding="8,0">
|
<MenuItem x:Name="menuReload" Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -174,7 +176,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem Padding="8,0">
|
<MenuItem Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -215,7 +217,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem x:Name="menuHelp" Padding="8,0">
|
<MenuItem x:Name="menuHelp" Padding="8,0">
|
||||||
<MenuItem.Header>
|
<MenuItem.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -226,7 +228,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuPromotion"
|
x:Name="menuPromotion"
|
||||||
Padding="8,0"
|
Padding="8,0"
|
||||||
@@ -240,7 +242,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,8" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuClose"
|
x:Name="menuClose"
|
||||||
Padding="8,0"
|
Padding="8,0"
|
||||||
@@ -402,7 +404,7 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
</materialDesign:ColorZone>
|
</materialDesign:ColorZone>
|
||||||
|
|
||||||
<Grid>
|
<Grid x:Name="gridMain">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="1*" />
|
<RowDefinition Height="1*" />
|
||||||
<RowDefinition Height="10" />
|
<RowDefinition Height="10" />
|
||||||
@@ -411,7 +413,7 @@
|
|||||||
<DataGrid
|
<DataGrid
|
||||||
x:Name="lstProfiles"
|
x:Name="lstProfiles"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
materialDesign:DataGridAssist.CellPadding="1,0"
|
materialDesign:DataGridAssist.CellPadding="2,2"
|
||||||
AutoGenerateColumns="False"
|
AutoGenerateColumns="False"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
CanUserAddRows="False"
|
CanUserAddRows="False"
|
||||||
@@ -431,6 +433,10 @@
|
|||||||
</DataGrid.InputBindings>
|
</DataGrid.InputBindings>
|
||||||
<DataGrid.ContextMenu>
|
<DataGrid.ContextMenu>
|
||||||
<ContextMenu Style="{StaticResource DefContextMenu}">
|
<ContextMenu Style="{StaticResource DefContextMenu}">
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuEditServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuEditServer}" />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuSetDefaultServer"
|
x:Name="menuSetDefaultServer"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
@@ -452,6 +458,31 @@
|
|||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
Header="{x:Static resx:ResUI.menuShareServer}" />
|
Header="{x:Static resx:ResUI.menuShareServer}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuMixedTestServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuMixedTestServer}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuPingServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuPingServer}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuTcpingServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuTcpingServer}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuRealPingServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuRealPingServer}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuSpeedServer"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuSpeedServer}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuSortServerResult"
|
||||||
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
Header="{x:Static resx:ResUI.menuSortServerResult}" />
|
||||||
|
<Separator />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuMoveToGroup"
|
x:Name="menuMoveToGroup"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
@@ -491,31 +522,6 @@
|
|||||||
Click="menuSelectAll_Click"
|
Click="menuSelectAll_Click"
|
||||||
Header="{x:Static resx:ResUI.menuSelectAll}" />
|
Header="{x:Static resx:ResUI.menuSelectAll}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem
|
|
||||||
x:Name="menuMixedTestServer"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuMixedTestServer}" />
|
|
||||||
<MenuItem
|
|
||||||
x:Name="menuPingServer"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuPingServer}" />
|
|
||||||
<MenuItem
|
|
||||||
x:Name="menuTcpingServer"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuTcpingServer}" />
|
|
||||||
<MenuItem
|
|
||||||
x:Name="menuRealPingServer"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuRealPingServer}" />
|
|
||||||
<MenuItem
|
|
||||||
x:Name="menuSpeedServer"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuSpeedServer}" />
|
|
||||||
<MenuItem
|
|
||||||
x:Name="menuSortServerResult"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuSortServerResult}" />
|
|
||||||
<Separator />
|
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuExport2ClientConfig"
|
x:Name="menuExport2ClientConfig"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ namespace v2rayN.Views
|
|||||||
this.BindCommand(ViewModel, vm => vm.AddServerViaScanCmd, v => v.menuAddServerViaScan).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.AddServerViaScanCmd, v => v.menuAddServerViaScan).DisposeWith(disposables);
|
||||||
|
|
||||||
//servers delete
|
//servers delete
|
||||||
|
this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables);
|
||||||
@@ -103,8 +104,8 @@ namespace v2rayN.Views
|
|||||||
//sub
|
//sub
|
||||||
this.BindCommand(ViewModel, vm => vm.SubSettingCmd, v => v.menuSubSetting).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SubSettingCmd, v => v.menuSubSetting).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.SubUpdateCmd, v => v.menuSubUpdate).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SubUpdateCmd, v => v.menuSubUpdate).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.SubGroupUpdateCmd, v => v.menuSubGroupUpdate).DisposeWith(disposables);
|
|
||||||
this.BindCommand(ViewModel, vm => vm.SubUpdateViaProxyCmd, v => v.menuSubUpdateViaProxy).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SubUpdateViaProxyCmd, v => v.menuSubUpdateViaProxy).DisposeWith(disposables);
|
||||||
|
this.BindCommand(ViewModel, vm => vm.SubGroupUpdateCmd, v => v.menuSubGroupUpdate).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.SubGroupUpdateViaProxyCmd, v => v.menuSubGroupUpdateViaProxy).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SubGroupUpdateViaProxyCmd, v => v.menuSubGroupUpdateViaProxy).DisposeWith(disposables);
|
||||||
|
|
||||||
//setting
|
//setting
|
||||||
@@ -240,17 +241,32 @@ namespace v2rayN.Views
|
|||||||
|
|
||||||
private void LstProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
private void LstProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
ViewModel?.EditServer(false, EConfigType.Custom);
|
if (_config.uiItem.doubleClick2Activate)
|
||||||
|
{
|
||||||
|
ViewModel?.SetDefaultServer();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ViewModel?.EditServer(false, EConfigType.Custom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e)
|
private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var colHeader = sender as DataGridColumnHeader;
|
var colHeader = sender as DataGridColumnHeader;
|
||||||
if (colHeader == null || colHeader.TabIndex < 0)
|
if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (colHeader.TabIndex == 0)
|
|
||||||
|
//find index
|
||||||
|
var index = lstProfiles.Columns.IndexOf(colHeader.Column);
|
||||||
|
if (index < 0)
|
||||||
|
{
|
||||||
|
index = colHeader.TabIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == 0)
|
||||||
{
|
{
|
||||||
foreach (var it in lstProfiles.Columns)
|
foreach (var it in lstProfiles.Columns)
|
||||||
{
|
{
|
||||||
@@ -260,7 +276,7 @@ namespace v2rayN.Views
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewModel?.SortServer(colHeader.TabIndex);
|
ViewModel?.SortServer(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuSelectAll_Click(object sender, RoutedEventArgs e)
|
private void menuSelectAll_Click(object sender, RoutedEventArgs e)
|
||||||
@@ -323,6 +339,10 @@ namespace v2rayN.Views
|
|||||||
ViewModel?.Export2ShareUrl();
|
ViewModel?.Export2ShareUrl();
|
||||||
}
|
}
|
||||||
else if (e.Key == Key.D)
|
else if (e.Key == Key.D)
|
||||||
|
{
|
||||||
|
ViewModel?.EditServer(false, EConfigType.Custom);
|
||||||
|
}
|
||||||
|
else if (e.Key == Key.F)
|
||||||
{
|
{
|
||||||
ViewModel?.ShareServer();
|
ViewModel?.ShareServer();
|
||||||
}
|
}
|
||||||
@@ -397,6 +417,11 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
Height = SystemInformation.WorkingArea.Height * 96 / g.DpiY;
|
Height = SystemInformation.WorkingArea.Height * 96 / g.DpiY;
|
||||||
}
|
}
|
||||||
|
if (_config.uiItem.mainGirdHeight1 > 0 && _config.uiItem.mainGirdHeight2 > 0)
|
||||||
|
{
|
||||||
|
gridMain.RowDefinitions[0].Height = new GridLength(_config.uiItem.mainGirdHeight1, GridUnitType.Star);
|
||||||
|
gridMain.RowDefinitions[2].Height = new GridLength(_config.uiItem.mainGirdHeight2, GridUnitType.Star);
|
||||||
|
}
|
||||||
|
|
||||||
for (int k = 0; k < lstProfiles.Columns.Count; k++)
|
for (int k = 0; k < lstProfiles.Columns.Count; k++)
|
||||||
{
|
{
|
||||||
@@ -420,6 +445,8 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
ConfigHandler.AddformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].ActualWidth));
|
ConfigHandler.AddformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].ActualWidth));
|
||||||
}
|
}
|
||||||
|
_config.uiItem.mainGirdHeight1 = Math.Ceiling(gridMain.RowDefinitions[0].ActualHeight + 0.1);
|
||||||
|
_config.uiItem.mainGirdHeight2 = Math.Ceiling(gridMain.RowDefinitions[2].ActualHeight + 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddHelpMenuItem()
|
private void AddHelpMenuItem()
|
||||||
|
|||||||
@@ -21,12 +21,22 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Foreground="{DynamicResource PrimaryHueLightBrush}"
|
Foreground="{DynamicResource PrimaryHueLightBrush}"
|
||||||
Text="{x:Static resx:ResUI.MsgInformationTitle}" />
|
Text="{x:Static resx:ResUI.MsgInformationTitle}" />
|
||||||
<TextBox
|
<ComboBox
|
||||||
x:Name="txtMsgFilter"
|
x:Name="cmbMsgFilter"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgFilterTitle}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgFilterTitle}"
|
||||||
materialDesign:TextFieldAssist.HasClearButton="True" />
|
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||||
|
IsEditable="True" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="8,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{x:Static resx:ResUI.TbAutoRefresh}" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togAutoRefresh"
|
||||||
|
Margin="8,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
IsChecked="True" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox
|
<TextBox
|
||||||
Name="txtMsg"
|
Name="txtMsg"
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
MessageBus.Current.Listen<string>("MsgView").Subscribe(x => DelegateAppendText(x));
|
MessageBus.Current.Listen<string>("MsgView").Subscribe(x => DelegateAppendText(x));
|
||||||
|
Global.PresetMsgFilters.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbMsgFilter.Items.Add(it);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void DelegateAppendText(string msg)
|
void DelegateAppendText(string msg)
|
||||||
@@ -26,7 +30,11 @@ namespace v2rayN.Views
|
|||||||
ClearMsg();
|
ClearMsg();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var MsgFilter = txtMsgFilter.Text.TrimEx();
|
if (!togAutoRefresh.IsChecked.Value)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var MsgFilter = cmbMsgFilter.Text.TrimEx();
|
||||||
if (!Utils.IsNullOrEmpty(MsgFilter))
|
if (!Utils.IsNullOrEmpty(MsgFilter))
|
||||||
{
|
{
|
||||||
if (!Regex.IsMatch(msg, MsgFilter))
|
if (!Regex.IsMatch(msg, MsgFilter))
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.OptionSettingWindow"
|
x:Class="v2rayN.Views.OptionSettingWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="700"
|
Height="700"
|
||||||
x:TypeArguments="vms:OptionSettingViewModel"
|
x:TypeArguments="vms:OptionSettingViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
@@ -45,194 +48,241 @@
|
|||||||
|
|
||||||
<TabControl>
|
<TabControl>
|
||||||
<TabItem Header="{x:Static resx:ResUI.TbSettingsCore}">
|
<TabItem Header="{x:Static resx:ResUI.TbSettingsCore}">
|
||||||
<Grid Margin="{StaticResource SettingItemMargin}">
|
<ScrollViewer VerticalScrollBarVisibility="Visible">
|
||||||
<Grid.RowDefinitions>
|
<Grid Margin="{StaticResource SettingItemMargin}">
|
||||||
<RowDefinition Height="Auto" />
|
<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" />
|
||||||
<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>
|
<RowDefinition Height="Auto" />
|
||||||
<Grid.ColumnDefinitions>
|
<RowDefinition Height="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsSocksPort}" />
|
Text="{x:Static resx:ResUI.TbSettingsSocksPort}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtlocalPort"
|
x:Name="txtlocalPort"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsSocksPortTip}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsUdpEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsUdpEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togudpEnabled"
|
x:Name="togudpEnabled"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsSniffingEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsSniffingEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togsniffingEnabled"
|
x:Name="togsniffingEnabled"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsRouteOnly}" />
|
Text="{x:Static resx:ResUI.TbSettingsRouteOnly}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togrouteOnly"
|
x:Name="togrouteOnly"
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsAllowLAN}" />
|
Text="{x:Static resx:ResUI.TbSettingsAllowLAN}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togAllowLANConn"
|
x:Name="togAllowLANConn"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsNewPort4LAN}" />
|
Text="{x:Static resx:ResUI.TbSettingsNewPort4LAN}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togNewPort4LAN"
|
x:Name="togNewPort4LAN"
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsUser}" />
|
Text="{x:Static resx:ResUI.TbSettingsUser}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtuser"
|
x:Name="txtuser"
|
||||||
Grid.Row="6"
|
Grid.Row="6"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsPass}" />
|
Text="{x:Static resx:ResUI.TbSettingsPass}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtpass"
|
x:Name="txtpass"
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsMuxEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsMuxEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togmuxEnabled"
|
x:Name="togmuxEnabled"
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="9"
|
Grid.Row="9"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLogEnabled}" />
|
Text="{x:Static resx:ResUI.TbSettingsLogEnabled}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="toglogEnabled"
|
x:Name="toglogEnabled"
|
||||||
Grid.Row="9"
|
Grid.Row="9"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="10"
|
Grid.Row="10"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLogLevel}" />
|
Text="{x:Static resx:ResUI.TbSettingsLogLevel}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbloglevel"
|
x:Name="cmbloglevel"
|
||||||
Grid.Row="10"
|
Grid.Row="10"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
materialDesign:HintAssist.Hint="Level" />
|
materialDesign:HintAssist.Hint="Level" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="11"
|
Grid.Row="11"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsDefAllowInsecure}" />
|
Text="{x:Static resx:ResUI.TbSettingsDefAllowInsecure}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togdefAllowInsecure"
|
x:Name="togdefAllowInsecure"
|
||||||
Grid.Row="11"
|
Grid.Row="11"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
</Grid>
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="12"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefFingerprint}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbdefFingerprint"
|
||||||
|
Grid.Row="12"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
IsEditable="True" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefUserAgent}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbdefUserAgent"
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
IsEditable="True" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="13"
|
||||||
|
Grid.Column="3"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDefUserAgentTips}" />
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreDns}">
|
<TabItem Header="{x:Static resx:ResUI.TbSettingsCoreDns}">
|
||||||
@@ -416,10 +466,12 @@
|
|||||||
<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" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -435,6 +487,13 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsStartBootTip}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@@ -568,16 +627,30 @@
|
|||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsDoubleClick2Activate}" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togDoubleClick2Activate"
|
||||||
|
Grid.Row="11"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="12"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsAutoUpdateInterval}" />
|
Text="{x:Static resx:ResUI.TbSettingsAutoUpdateInterval}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtautoUpdateInterval"
|
x:Name="txtautoUpdateInterval"
|
||||||
Grid.Row="11"
|
Grid.Row="12"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="12"
|
Grid.Row="13"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
@@ -585,13 +658,13 @@
|
|||||||
Text="{x:Static resx:ResUI.TbSettingsAutoUpdate}" />
|
Text="{x:Static resx:ResUI.TbSettingsAutoUpdate}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtautoUpdateSubInterval"
|
x:Name="txtautoUpdateSubInterval"
|
||||||
Grid.Row="12"
|
Grid.Row="13"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="13"
|
Grid.Row="14"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
@@ -599,10 +672,31 @@
|
|||||||
Text="{x:Static resx:ResUI.TbSettingsTrayMenuServersLimit}" />
|
Text="{x:Static resx:ResUI.TbSettingsTrayMenuServersLimit}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txttrayMenuServersLimit"
|
x:Name="txttrayMenuServersLimit"
|
||||||
Grid.Row="13"
|
Grid.Row="14"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
Margin="{StaticResource SettingItemMargin}" />
|
Margin="{StaticResource SettingItemMargin}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamily}" />
|
||||||
|
<ComboBox
|
||||||
|
x:Name="cmbcurrentFontFamily"
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
|
MaxDropDownHeight="1000" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="15"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource ServerItemMargin}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamilyTip}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|||||||
@@ -1,15 +1,23 @@
|
|||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
using v2rayN.Mode;
|
||||||
using v2rayN.ViewModels;
|
using v2rayN.ViewModels;
|
||||||
|
|
||||||
namespace v2rayN.Views
|
namespace v2rayN.Views
|
||||||
{
|
{
|
||||||
public partial class OptionSettingWindow
|
public partial class OptionSettingWindow
|
||||||
{
|
{
|
||||||
|
private static Config _config;
|
||||||
|
|
||||||
public OptionSettingWindow()
|
public OptionSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
ViewModel = new OptionSettingViewModel(this);
|
ViewModel = new OptionSettingViewModel(this);
|
||||||
|
|
||||||
@@ -21,6 +29,14 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
cmbloglevel.Items.Add(it);
|
cmbloglevel.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
Global.fingerprints.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbdefFingerprint.Items.Add(it);
|
||||||
|
});
|
||||||
|
Global.userAgent.ForEach(it =>
|
||||||
|
{
|
||||||
|
cmbdefUserAgent.Items.Add(it);
|
||||||
|
});
|
||||||
Global.domainStrategy4Freedoms.ForEach(it =>
|
Global.domainStrategy4Freedoms.ForEach(it =>
|
||||||
{
|
{
|
||||||
cmbdomainStrategy4Freedom.Items.Add(it);
|
cmbdomainStrategy4Freedom.Items.Add(it);
|
||||||
@@ -47,6 +63,34 @@ namespace v2rayN.Views
|
|||||||
cmbCoreType6.Items.Add(it);
|
cmbCoreType6.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//fill fonts
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var dir = new DirectoryInfo(Utils.GetPath(@"Resources\Fonts"));
|
||||||
|
var files = dir.GetFiles("*.ttf");
|
||||||
|
var culture = _config.uiItem.currentLanguage.Equals(Global.Languages[0]) ? "zh-cn" : "en-us";
|
||||||
|
foreach (var it in files)
|
||||||
|
{
|
||||||
|
var glyphTypeface = new GlyphTypeface(new Uri(Utils.GetPath(@$"Resources\Fonts\{it.Name}")));
|
||||||
|
var fontFace = glyphTypeface.Win32FaceNames[new CultureInfo("en-us")];
|
||||||
|
if (!fontFace.Equals("Regular") && !fontFace.Equals("Normal"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var fontFamily = glyphTypeface.Win32FamilyNames[new CultureInfo(culture)];
|
||||||
|
if (Utils.IsNullOrEmpty(fontFamily))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cmbcurrentFontFamily.Items.Add(fontFamily);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("fill fonts error", ex);
|
||||||
|
}
|
||||||
|
cmbcurrentFontFamily.Items.Add(string.Empty);
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
this.Bind(ViewModel, vm => vm.localPort, v => v.txtlocalPort.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.localPort, v => v.txtlocalPort.Text).DisposeWith(disposables);
|
||||||
@@ -63,6 +107,8 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.logEnabled, v => v.toglogEnabled.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.logEnabled, v => v.toglogEnabled.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.loglevel, v => v.cmbloglevel.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.loglevel, v => v.cmbloglevel.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.defAllowInsecure, v => v.togdefAllowInsecure.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.defAllowInsecure, v => v.togdefAllowInsecure.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.defFingerprint, v => v.cmbdefFingerprint.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.defUserAgent, v => v.cmbdefUserAgent.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.domainStrategy4Freedom, v => v.cmbdomainStrategy4Freedom.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.domainStrategy4Freedom, v => v.cmbdomainStrategy4Freedom.Text).DisposeWith(disposables);
|
||||||
@@ -88,9 +134,11 @@ namespace v2rayN.Views
|
|||||||
this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.autoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.autoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.autoUpdateSubInterval, v => v.txtautoUpdateSubInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.autoUpdateSubInterval, v => v.txtautoUpdateSubInterval.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.trayMenuServersLimit, v => v.txttrayMenuServersLimit.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.trayMenuServersLimit, v => v.txttrayMenuServersLimit.Text).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.currentFontFamily, v => v.cmbcurrentFontFamily.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);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
d:DesignHeight="300"
|
d:DesignHeight="300"
|
||||||
d:DesignWidth="300"
|
d:DesignWidth="300"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<Grid Margin="16">
|
<Grid Margin="30">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.RoutingRuleDetailsWindow"
|
x:Class="v2rayN.Views.RoutingRuleDetailsWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="700"
|
Height="700"
|
||||||
x:TypeArguments="vms:RoutingRuleDetailsViewModel"
|
x:TypeArguments="vms:RoutingRuleDetailsViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.RoutingRuleSettingWindow"
|
x:Class="v2rayN.Views.RoutingRuleSettingWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="700"
|
Height="700"
|
||||||
x:TypeArguments="vms:RoutingRuleSettingViewModel"
|
x:TypeArguments="vms:RoutingRuleSettingViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -75,15 +75,15 @@ namespace v2rayN.Views
|
|||||||
{
|
{
|
||||||
ViewModel?.MoveRule(EMove.Top);
|
ViewModel?.MoveRule(EMove.Top);
|
||||||
}
|
}
|
||||||
else if (e.Key == Key.B)
|
else if (e.Key == Key.U)
|
||||||
{
|
{
|
||||||
ViewModel?.MoveRule(EMove.Up);
|
ViewModel?.MoveRule(EMove.Up);
|
||||||
}
|
}
|
||||||
else if (e.Key == Key.U)
|
else if (e.Key == Key.D)
|
||||||
{
|
{
|
||||||
ViewModel?.MoveRule(EMove.Down);
|
ViewModel?.MoveRule(EMove.Down);
|
||||||
}
|
}
|
||||||
else if (e.Key == Key.D)
|
else if (e.Key == Key.B)
|
||||||
{
|
{
|
||||||
ViewModel?.MoveRule(EMove.Bottom);
|
ViewModel?.MoveRule(EMove.Bottom);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.RoutingSettingWindow"
|
x:Class="v2rayN.Views.RoutingSettingWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="700"
|
Height="700"
|
||||||
x:TypeArguments="vms:RoutingSettingViewModel"
|
x:TypeArguments="vms:RoutingSettingViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.SubEditWindow"
|
x:Class="v2rayN.Views.SubEditWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="550"
|
Height="550"
|
||||||
x:TypeArguments="vms:SubEditViewModel"
|
x:TypeArguments="vms:SubEditViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
x:Class="v2rayN.Views.SubSettingWindow"
|
x:Class="v2rayN.Views.SubSettingWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
@@ -13,7 +14,9 @@
|
|||||||
Height="600"
|
Height="600"
|
||||||
x:TypeArguments="vms:SubSettingViewModel"
|
x:TypeArguments="vms:SubSettingViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
TextOptions.TextFormattingMode="Display"
|
TextOptions.TextFormattingMode="Display"
|
||||||
TextOptions.TextRenderingMode="Auto"
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
||||||
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
||||||
<FileVersion>6.5</FileVersion>
|
<FileVersion>6.8</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MaterialDesignThemes" Version="4.6.1" />
|
<PackageReference Include="MaterialDesignThemes" Version="4.7.1" />
|
||||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
<PackageReference Include="NHotkey" Version="2.1.0" />
|
<PackageReference Include="NHotkey" Version="2.1.0" />
|
||||||
@@ -101,4 +101,13 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="Resources\Fonts\SourceHanSansCN-Regular.ttf">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="Resources\Fonts\微软雅黑.ttf">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Reference in New Issue
Block a user