Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ad22e0a73 | ||
|
|
ca1abb58eb | ||
|
|
3e353944b2 | ||
|
|
007a250f55 | ||
|
|
e9bb6a9951 | ||
|
|
82f236e07b | ||
|
|
17bfe74ecf | ||
|
|
b77827df90 | ||
|
|
a359a508ae | ||
|
|
3a740118f0 | ||
|
|
58d9bcbd14 | ||
|
|
24be7b2180 | ||
|
|
f4c9ca8dff | ||
|
|
9b8181b72b | ||
|
|
1ff1962425 | ||
|
|
9b05736746 | ||
|
|
dec722e693 | ||
|
|
49fa0a4c67 | ||
|
|
0cdc69e1e8 | ||
|
|
0494cc4ce7 | ||
|
|
30d82947d6 | ||
|
|
ec59249d79 | ||
|
|
7eb869ab1d | ||
|
|
d014724a2d | ||
|
|
dfb6cef364 | ||
|
|
0ebf8c9349 | ||
|
|
9dfd89c90d | ||
|
|
f6972125cd | ||
|
|
6e366bf55a | ||
|
|
5e2e45c673 | ||
|
|
f879235564 | ||
|
|
b00aee2ae7 | ||
|
|
28c2159ec3 | ||
|
|
33dcef2285 | ||
|
|
b9acd0ec28 | ||
|
|
7989d5180b | ||
|
|
238086942e |
@@ -17,6 +17,10 @@
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
<system:Double x:Key="MenuItemHeight">26</system:Double>
|
||||
<system:Double x:Key="StdFontSize">12</system:Double>
|
||||
<system:Double x:Key="StdFontSize1">13</system:Double>
|
||||
<system:Double x:Key="StdFontSize2">14</system:Double>
|
||||
<system:Double x:Key="StdFontSizeMsg">11</system:Double>
|
||||
<Thickness
|
||||
x:Key="ServerItemMargin"
|
||||
Bottom="4"
|
||||
@@ -33,19 +37,19 @@
|
||||
x:Key="ModuleTitle"
|
||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||
TargetType="{x:Type TextBlock}">
|
||||
<Setter Property="FontSize" Value="16" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize2}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="ToolbarTextBlock"
|
||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||
TargetType="{x:Type TextBlock}">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="StatusbarItem"
|
||||
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||
TargetType="{x:Type TextBlock}">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
<Setter Property="Padding" Value="0" />
|
||||
</Style>
|
||||
<Style TargetType="{x:Type TextElement}">
|
||||
@@ -58,7 +62,7 @@
|
||||
</Style>
|
||||
<Style x:Key="lvItemSelected" TargetType="{x:Type ListViewItem}">
|
||||
<Setter Property="Height" Value="20" />
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsSelected" Value="true">
|
||||
<Setter Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" />
|
||||
@@ -76,22 +80,19 @@
|
||||
x:Key="ListItemCheckBox"
|
||||
BasedOn="{StaticResource MaterialDesignUserForegroundCheckBox}"
|
||||
TargetType="{x:Type CheckBox}">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
</Style>
|
||||
<Style x:Key="ListItemChip" TargetType="{x:Type materialDesign:Chip}">
|
||||
<Setter Property="FontSize" Value="11" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="DefButton"
|
||||
BasedOn="{StaticResource MaterialDesignRaisedButton}"
|
||||
TargetType="{x:Type ButtonBase}">
|
||||
<Setter Property="FontSize" Value="14" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="DefContextMenu"
|
||||
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
||||
TargetType="{x:Type ContextMenu}">
|
||||
<Setter Property="FontSize" Value="13" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||
</Style>
|
||||
|
||||
@@ -99,7 +100,7 @@
|
||||
x:Key="ToolbarMenu"
|
||||
BasedOn="{StaticResource MaterialDesignMenu}"
|
||||
TargetType="{x:Type Menu}">
|
||||
<Setter Property="FontSize" Value="13" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize1}" />
|
||||
<Setter Property="FontFamily" Value="{x:Static conv:MaterialDesignFonts.MyFont}" />
|
||||
</Style>
|
||||
|
||||
@@ -107,15 +108,41 @@
|
||||
x:Key="DefComboBox"
|
||||
BasedOn="{StaticResource MaterialDesignComboBox}"
|
||||
TargetType="{x:Type ComboBox}">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
<Setter Property="HorizontalAlignment" Value="Left" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="DefDataGrid"
|
||||
BasedOn="{StaticResource MaterialDesignDataGrid}"
|
||||
TargetType="{x:Type DataGrid}">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="DefTextBox"
|
||||
BasedOn="{StaticResource MaterialDesignTextBox}"
|
||||
TargetType="{x:Type TextBox}">
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="MyOutlinedTextBox"
|
||||
BasedOn="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||
TargetType="{x:Type TextBox}">
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="MyGroupBox"
|
||||
BasedOn="{StaticResource MaterialDesignGroupBox}"
|
||||
TargetType="{x:Type GroupBox}">
|
||||
<Setter Property="FontSize" Value="{DynamicResource StdFontSize}" />
|
||||
</Style>
|
||||
<Style
|
||||
x:Key="MyChipListBoxItem"
|
||||
BasedOn="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBoxItem}"
|
||||
TargetType="{x:Type ListBoxItem}">
|
||||
<Setter Property="Margin" Value="-2,0" />
|
||||
</Style>
|
||||
|
||||
|
||||
</ResourceDictionary>
|
||||
|
||||
</Application.Resources>
|
||||
|
||||
206
v2rayN/v2rayN/Base/DownloaderHelper.cs
Normal file
206
v2rayN/v2rayN/Base/DownloaderHelper.cs
Normal file
@@ -0,0 +1,206 @@
|
||||
using Downloader;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
|
||||
namespace v2rayN.Base
|
||||
{
|
||||
internal class DownloaderHelper
|
||||
{
|
||||
private static readonly Lazy<DownloaderHelper> _instance = new Lazy<DownloaderHelper>(() => new());
|
||||
public static DownloaderHelper Instance => _instance.Value;
|
||||
|
||||
public DownloaderHelper()
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<string> DownloadStringAsync(IWebProxy webProxy, string url, string? userAgent, int timeout)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
cancellationToken.CancelAfter(timeout * 1000);
|
||||
|
||||
Uri uri = new Uri(url);
|
||||
//Authorization Header
|
||||
var headers = new WebHeaderCollection();
|
||||
if (!Utils.IsNullOrEmpty(uri.UserInfo))
|
||||
{
|
||||
headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo));
|
||||
}
|
||||
|
||||
var downloadOpt = new DownloadConfiguration()
|
||||
{
|
||||
Timeout = timeout * 1000,
|
||||
MaxTryAgainOnFailover = 2,
|
||||
RequestConfiguration =
|
||||
{
|
||||
Headers = headers,
|
||||
UserAgent = userAgent,
|
||||
Timeout = timeout * 1000,
|
||||
Proxy = webProxy
|
||||
}
|
||||
};
|
||||
|
||||
string text = string.Empty;
|
||||
using (var downloader = new DownloadService(downloadOpt))
|
||||
{
|
||||
downloader.DownloadFileCompleted += (sender, value) =>
|
||||
{
|
||||
if (value.Error != null)
|
||||
{
|
||||
throw new Exception(string.Format("{0}", value.Error.Message));
|
||||
}
|
||||
};
|
||||
using (var stream = await downloader.DownloadFileTaskAsync(address: url, cancellationToken: cancellationToken.Token))
|
||||
{
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
text = reader.ReadToEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
downloadOpt = null;
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
|
||||
public async Task DownloadDataAsync4Speed(IWebProxy webProxy, string url, IProgress<string> progress, int timeout)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
throw new ArgumentNullException("url");
|
||||
}
|
||||
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
cancellationToken.CancelAfter(timeout * 1000);
|
||||
|
||||
var downloadOpt = new DownloadConfiguration()
|
||||
{
|
||||
Timeout = timeout * 1000,
|
||||
MaxTryAgainOnFailover = 2,
|
||||
RequestConfiguration =
|
||||
{
|
||||
Timeout= timeout * 1000,
|
||||
Proxy = webProxy
|
||||
}
|
||||
};
|
||||
|
||||
DateTime totalDatetime = DateTime.Now;
|
||||
int totalSecond = 0;
|
||||
var hasValue = false;
|
||||
double maxSpeed = 0;
|
||||
using (var downloader = new DownloadService(downloadOpt))
|
||||
{
|
||||
//downloader.DownloadStarted += (sender, value) =>
|
||||
//{
|
||||
// if (progress != null)
|
||||
// {
|
||||
// progress.Report("Start download data...");
|
||||
// }
|
||||
//};
|
||||
downloader.DownloadProgressChanged += (sender, value) =>
|
||||
{
|
||||
TimeSpan ts = (DateTime.Now - totalDatetime);
|
||||
if (progress != null && ts.Seconds > totalSecond)
|
||||
{
|
||||
hasValue = true;
|
||||
totalSecond = ts.Seconds;
|
||||
if (value.BytesPerSecondSpeed > maxSpeed)
|
||||
{
|
||||
maxSpeed = value.BytesPerSecondSpeed;
|
||||
var speed = (maxSpeed / 1000 / 1000).ToString("#0.0");
|
||||
progress.Report(speed);
|
||||
}
|
||||
}
|
||||
};
|
||||
downloader.DownloadFileCompleted += (sender, value) =>
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
if (!hasValue && value.Error != null)
|
||||
{
|
||||
progress.Report(value.Error?.Message);
|
||||
}
|
||||
}
|
||||
};
|
||||
progress.Report("......");
|
||||
|
||||
await downloader.DownloadFileTaskAsync(address: url, cancellationToken: cancellationToken.Token);
|
||||
}
|
||||
|
||||
downloadOpt = null;
|
||||
}
|
||||
|
||||
public async Task DownloadFileAsync(IWebProxy webProxy, string url, string fileName, IProgress<double> progress, int timeout)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
throw new ArgumentNullException("url");
|
||||
}
|
||||
if (string.IsNullOrEmpty(fileName))
|
||||
{
|
||||
throw new ArgumentNullException("fileName");
|
||||
}
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
File.Delete(fileName);
|
||||
}
|
||||
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
cancellationToken.CancelAfter(timeout * 1000);
|
||||
|
||||
var downloadOpt = new DownloadConfiguration()
|
||||
{
|
||||
Timeout = timeout * 1000,
|
||||
MaxTryAgainOnFailover = 2,
|
||||
RequestConfiguration =
|
||||
{
|
||||
Timeout= timeout * 1000,
|
||||
Proxy = webProxy
|
||||
}
|
||||
};
|
||||
|
||||
var progressPercentage = 0;
|
||||
var hasValue = false;
|
||||
using (var downloader = new DownloadService(downloadOpt))
|
||||
{
|
||||
downloader.DownloadStarted += (sender, value) =>
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(0);
|
||||
}
|
||||
};
|
||||
downloader.DownloadProgressChanged += (sender, value) =>
|
||||
{
|
||||
hasValue = true;
|
||||
var percent = (int)value.ProgressPercentage;// Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100);
|
||||
if (progressPercentage != percent && percent % 10 == 0)
|
||||
{
|
||||
progressPercentage = percent;
|
||||
progress.Report(percent);
|
||||
}
|
||||
};
|
||||
downloader.DownloadFileCompleted += (sender, value) =>
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
if (hasValue && value.Error == null)
|
||||
{
|
||||
progress.Report(101);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
await downloader.DownloadFileTaskAsync(url, fileName, cancellationToken: cancellationToken.Token);
|
||||
}
|
||||
|
||||
downloadOpt = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.IO;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media;
|
||||
using v2rayN.Handler;
|
||||
|
||||
namespace v2rayN.Converters
|
||||
@@ -15,8 +14,8 @@ namespace v2rayN.Converters
|
||||
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}");
|
||||
var fontPath = Utils.GetFontsPath();
|
||||
MyFont = new FontFamily(new Uri(@$"file:///{fontPath}\"), $"./#{fontFamily}");
|
||||
}
|
||||
}
|
||||
catch
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
class Global
|
||||
{
|
||||
#region const
|
||||
public const string githubUrl = "https://github.com";
|
||||
public const string githubApiUrl = "https://api.github.com/repos";
|
||||
public const string v2rayWebsiteUrl = @"https://www.v2fly.org/";
|
||||
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
|
||||
public const string UpdateUrl = AboutUrl + @"/releases";
|
||||
@@ -17,7 +19,6 @@
|
||||
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
||||
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
||||
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
||||
public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test";
|
||||
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
||||
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
||||
|
||||
@@ -77,6 +78,7 @@
|
||||
public const string CommandClearMsg = "CommandClearMsg";
|
||||
public const string DelayUnit = "";
|
||||
public const string SpeedUnit = "";
|
||||
public const int MinFontSize = 10;
|
||||
|
||||
public static readonly List<string> IEProxyProtocols = new List<string> {
|
||||
"{ip}:{http_port}",
|
||||
@@ -107,14 +109,15 @@
|
||||
};
|
||||
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> Languages = new List<string> { "zh-Hans", "en", "fa-Ir" };
|
||||
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en", "fa-Ir", "ru" };
|
||||
public static readonly List<string> alpns = new List<string> { "h2", "http/1.1", "h2,http/1.1", "" };
|
||||
public static readonly List<string> LogLevel = new List<string> { "debug", "info", "warning", "error", "none" };
|
||||
public static readonly List<string> InboundTags = new List<string> { "socks", "http", "socks2", "http2" };
|
||||
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> TunStacks = new List<string> { "gvisor", "system" };
|
||||
public static readonly List<string> PresetMsgFilters = new List<string> { "^(?!.*proxy).*$", "^(?!.*direct).*$", "" };
|
||||
public static readonly List<string> PresetMsgFilters = new List<string> { "proxy", "direct", "block", "" };
|
||||
public static readonly List<string> SpeedTestUrls = new List<string> { @"http://cachefly.cachefly.net/100mb.test", @"http://cachefly.cachefly.net/10mb.test" };
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -43,18 +43,17 @@ namespace v2rayN.Handler
|
||||
if (config == null)
|
||||
{
|
||||
config = new Config
|
||||
{
|
||||
};
|
||||
}
|
||||
if (config.coreBasicItem == null)
|
||||
{
|
||||
config.coreBasicItem = new()
|
||||
{
|
||||
logEnabled = false,
|
||||
loglevel = "warning",
|
||||
|
||||
//Mux
|
||||
muxEnabled = false,
|
||||
|
||||
enableStatistics = false,
|
||||
|
||||
statisticsFreshRate = 1,
|
||||
|
||||
enableRoutingAdvanced = true
|
||||
};
|
||||
}
|
||||
|
||||
@@ -87,10 +86,17 @@ namespace v2rayN.Handler
|
||||
config.inbound[0].protocol = Global.InboundSocks;
|
||||
}
|
||||
}
|
||||
//路由规则
|
||||
if (Utils.IsNullOrEmpty(config.domainStrategy))
|
||||
if (config.routingBasicItem == null)
|
||||
{
|
||||
config.domainStrategy = Global.domainStrategys[0];//"IPIfNonMatch";
|
||||
config.routingBasicItem = new()
|
||||
{
|
||||
enableRoutingAdvanced = true
|
||||
};
|
||||
}
|
||||
//路由规则
|
||||
if (Utils.IsNullOrEmpty(config.routingBasicItem.domainStrategy))
|
||||
{
|
||||
config.routingBasicItem.domainStrategy = Global.domainStrategys[0];//"IPIfNonMatch";
|
||||
}
|
||||
//if (Utils.IsNullOrEmpty(config.domainMatcher))
|
||||
//{
|
||||
@@ -130,6 +136,14 @@ namespace v2rayN.Handler
|
||||
mtu = 9000,
|
||||
};
|
||||
}
|
||||
if (config.guiItem == null)
|
||||
{
|
||||
config.guiItem = new()
|
||||
{
|
||||
enableStatistics = false,
|
||||
statisticsFreshRate = 1,
|
||||
};
|
||||
}
|
||||
if (config.uiItem == null)
|
||||
{
|
||||
config.uiItem = new UIItem()
|
||||
@@ -150,14 +164,6 @@ namespace v2rayN.Handler
|
||||
{
|
||||
config.constItem = new ConstItem();
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(config.constItem.speedTestUrl))
|
||||
{
|
||||
config.constItem.speedTestUrl = Global.SpeedTestUrl;
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(config.constItem.speedPingTestUrl))
|
||||
{
|
||||
config.constItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions))
|
||||
{
|
||||
config.constItem.defIEProxyExceptions = Global.IEProxyExceptions;
|
||||
@@ -167,9 +173,26 @@ namespace v2rayN.Handler
|
||||
// config.remoteDNS = "1.1.1.1";
|
||||
//}
|
||||
|
||||
if (config.statisticsFreshRate > 100 || config.statisticsFreshRate < 1)
|
||||
if (config.speedTestItem == null)
|
||||
{
|
||||
config.statisticsFreshRate = 1;
|
||||
config.speedTestItem = new();
|
||||
}
|
||||
if (config.speedTestItem.speedTestTimeout < 10)
|
||||
{
|
||||
config.speedTestItem.speedTestTimeout = 10;
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(config.speedTestItem.speedTestUrl))
|
||||
{
|
||||
config.speedTestItem.speedTestUrl = Global.SpeedTestUrls[0];
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(config.speedTestItem.speedPingTestUrl))
|
||||
{
|
||||
config.speedTestItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
||||
}
|
||||
|
||||
if (config.guiItem.statisticsFreshRate > 100 || config.guiItem.statisticsFreshRate < 1)
|
||||
{
|
||||
config.guiItem.statisticsFreshRate = 1;
|
||||
}
|
||||
|
||||
if (config == null)
|
||||
@@ -288,20 +311,45 @@ namespace v2rayN.Handler
|
||||
}
|
||||
|
||||
config = Utils.FromJson<Config>(Utils.ToJson(configOld));
|
||||
if (config.tunModeItem == null)
|
||||
|
||||
if (config.coreBasicItem == null)
|
||||
{
|
||||
config.tunModeItem = new TunModeItem
|
||||
config.coreBasicItem = new()
|
||||
{
|
||||
enableTun = false,
|
||||
showWindow = true,
|
||||
mtu = 9000,
|
||||
logEnabled = configOld.logEnabled,
|
||||
loglevel = configOld.loglevel,
|
||||
muxEnabled = configOld.muxEnabled,
|
||||
};
|
||||
}
|
||||
|
||||
if (config.routingBasicItem == null)
|
||||
{
|
||||
config.routingBasicItem = new()
|
||||
{
|
||||
enableRoutingAdvanced = configOld.enableRoutingAdvanced,
|
||||
domainStrategy = configOld.domainStrategy
|
||||
};
|
||||
}
|
||||
|
||||
if (config.guiItem == null)
|
||||
{
|
||||
config.guiItem = new()
|
||||
{
|
||||
enableStatistics = configOld.enableStatistics,
|
||||
statisticsFreshRate = configOld.statisticsFreshRate,
|
||||
keepOlderDedupl = configOld.keepOlderDedupl,
|
||||
ignoreGeoUpdateCore = configOld.ignoreGeoUpdateCore,
|
||||
autoUpdateInterval = configOld.autoUpdateInterval,
|
||||
checkPreReleaseUpdate = configOld.checkPreReleaseUpdate,
|
||||
enableSecurityProtocolTls13 = configOld.enableSecurityProtocolTls13,
|
||||
trayMenuServersLimit = configOld.trayMenuServersLimit,
|
||||
};
|
||||
}
|
||||
|
||||
GetDefaultServer(ref config);
|
||||
GetDefaultRouting(ref config);
|
||||
SaveConfig(ref config);
|
||||
LazyConfig.Instance.SetConfig(ref config);
|
||||
LoadConfig(ref config);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -638,7 +686,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||
{
|
||||
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
||||
profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower();
|
||||
}
|
||||
|
||||
AddServerCommon(ref config, profileItem);
|
||||
@@ -745,7 +793,7 @@ namespace v2rayN.Handler
|
||||
public static int DedupServerList(ref Config config, ref List<ProfileItem> lstProfile)
|
||||
{
|
||||
List<ProfileItem> source = lstProfile;
|
||||
bool keepOlder = config.keepOlderDedupl;
|
||||
bool keepOlder = config.guiItem.keepOlderDedupl;
|
||||
|
||||
List<ProfileItem> list = new List<ProfileItem>();
|
||||
if (!keepOlder) source.Reverse(); // Remove the early items first
|
||||
@@ -772,7 +820,7 @@ namespace v2rayN.Handler
|
||||
profileItem.configVersion = 2;
|
||||
if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
|
||||
{
|
||||
profileItem.allowInsecure = config.defAllowInsecure.ToString().ToLower();
|
||||
profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower();
|
||||
}
|
||||
if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
|
||||
{
|
||||
@@ -1437,7 +1485,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
if (SqliteHelper.Instance.Table<RoutingItem>().Where(t => t.id == routingItem.id).Count() > 0)
|
||||
{
|
||||
config.routingIndexId = routingItem.id;
|
||||
config.routingBasicItem.routingIndexId = routingItem.id;
|
||||
}
|
||||
|
||||
Global.reloadCore = true;
|
||||
@@ -1448,7 +1496,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
public static RoutingItem GetDefaultRouting(ref Config config)
|
||||
{
|
||||
var item = LazyConfig.Instance.GetRoutingItem(config.routingIndexId);
|
||||
var item = LazyConfig.Instance.GetRoutingItem(config.routingBasicItem.routingIndexId);
|
||||
if (item is null)
|
||||
{
|
||||
var item2 = SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(t => t.locked == false);
|
||||
@@ -1461,13 +1509,16 @@ namespace v2rayN.Handler
|
||||
|
||||
public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false)
|
||||
{
|
||||
if (blImportAdvancedRules || LazyConfig.Instance.RoutingItems().Count <= 0)
|
||||
var items = LazyConfig.Instance.RoutingItems();
|
||||
if (blImportAdvancedRules || items.Count <= 0)
|
||||
{
|
||||
var maxSort = items.Count;
|
||||
//Bypass the mainland
|
||||
var item2 = new RoutingItem()
|
||||
{
|
||||
remarks = "绕过大陆(Whitelist)",
|
||||
url = string.Empty,
|
||||
sort = maxSort + 1,
|
||||
};
|
||||
AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white"));
|
||||
|
||||
@@ -1476,6 +1527,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
remarks = "黑名单(Blacklist)",
|
||||
url = string.Empty,
|
||||
sort = maxSort + 2,
|
||||
};
|
||||
AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black"));
|
||||
|
||||
@@ -1484,6 +1536,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
remarks = "全局(Global)",
|
||||
url = string.Empty,
|
||||
sort = maxSort + 3,
|
||||
};
|
||||
AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global"));
|
||||
|
||||
|
||||
@@ -73,28 +73,29 @@ namespace v2rayN.Handler
|
||||
{
|
||||
if (blExport)
|
||||
{
|
||||
if (config.logEnabled)
|
||||
if (config.coreBasicItem.logEnabled)
|
||||
{
|
||||
v2rayConfig.log.loglevel = config.loglevel;
|
||||
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||
}
|
||||
else
|
||||
{
|
||||
v2rayConfig.log.loglevel = config.loglevel;
|
||||
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||
v2rayConfig.log.access = "";
|
||||
v2rayConfig.log.error = "";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (config.logEnabled)
|
||||
if (config.coreBasicItem.logEnabled)
|
||||
{
|
||||
v2rayConfig.log.loglevel = config.loglevel;
|
||||
v2rayConfig.log.access = Utils.GetLogPath(v2rayConfig.log.access);
|
||||
v2rayConfig.log.error = Utils.GetLogPath(v2rayConfig.log.error);
|
||||
var dtNow = DateTime.Now;
|
||||
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||
v2rayConfig.log.access = Utils.GetLogPath($"Vaccess_{dtNow.ToString("yyyy-MM-dd")}.txt");
|
||||
v2rayConfig.log.error = Utils.GetLogPath($"Verror_{dtNow.ToString("yyyy-MM-dd")}.txt");
|
||||
}
|
||||
else
|
||||
{
|
||||
v2rayConfig.log.loglevel = config.loglevel;
|
||||
v2rayConfig.log.loglevel = config.coreBasicItem.loglevel;
|
||||
v2rayConfig.log.access = "";
|
||||
v2rayConfig.log.error = "";
|
||||
}
|
||||
@@ -186,10 +187,10 @@ namespace v2rayN.Handler
|
||||
if (v2rayConfig.routing != null
|
||||
&& v2rayConfig.routing.rules != null)
|
||||
{
|
||||
v2rayConfig.routing.domainStrategy = config.domainStrategy;
|
||||
v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(config.domainMatcher) ? null : config.domainMatcher;
|
||||
v2rayConfig.routing.domainStrategy = config.routingBasicItem.domainStrategy;
|
||||
v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(config.routingBasicItem.domainMatcher) ? null : config.routingBasicItem.domainMatcher;
|
||||
|
||||
if (config.enableRoutingAdvanced)
|
||||
if (config.routingBasicItem.enableRoutingAdvanced)
|
||||
{
|
||||
var routing = ConfigHandler.GetDefaultRouting(ref config);
|
||||
if (routing != null)
|
||||
@@ -347,8 +348,8 @@ namespace v2rayN.Handler
|
||||
}
|
||||
|
||||
//Mux
|
||||
outbound.mux.enabled = config.muxEnabled;
|
||||
outbound.mux.concurrency = config.muxEnabled ? 8 : -1;
|
||||
outbound.mux.enabled = config.coreBasicItem.muxEnabled;
|
||||
outbound.mux.concurrency = config.coreBasicItem.muxEnabled ? 8 : -1;
|
||||
|
||||
boundStreamSettings(node, "out", outbound.streamSettings);
|
||||
|
||||
@@ -451,8 +452,8 @@ namespace v2rayN.Handler
|
||||
usersItem.encryption = node.security;
|
||||
|
||||
//Mux
|
||||
outbound.mux.enabled = config.muxEnabled;
|
||||
outbound.mux.concurrency = config.muxEnabled ? 8 : -1;
|
||||
outbound.mux.enabled = config.coreBasicItem.muxEnabled;
|
||||
outbound.mux.concurrency = config.coreBasicItem.muxEnabled ? 8 : -1;
|
||||
|
||||
boundStreamSettings(node, "out", outbound.streamSettings);
|
||||
|
||||
@@ -547,15 +548,15 @@ namespace v2rayN.Handler
|
||||
string host = node.requestHost.TrimEx();
|
||||
string sni = node.sni;
|
||||
string useragent = "";
|
||||
if (!config.defUserAgent.IsNullOrEmpty())
|
||||
if (!config.coreBasicItem.defUserAgent.IsNullOrEmpty())
|
||||
{
|
||||
try
|
||||
{
|
||||
useragent = Global.userAgentTxt[config.defUserAgent];
|
||||
useragent = Global.userAgentTxt[config.coreBasicItem.defUserAgent];
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
useragent = config.defUserAgent;
|
||||
useragent = config.coreBasicItem.defUserAgent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -566,9 +567,9 @@ namespace v2rayN.Handler
|
||||
|
||||
TlsSettings tlsSettings = new TlsSettings
|
||||
{
|
||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||
alpn = node.GetAlpn(),
|
||||
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.defFingerprint : node.fingerprint
|
||||
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint
|
||||
};
|
||||
if (!string.IsNullOrWhiteSpace(sni))
|
||||
{
|
||||
@@ -588,9 +589,9 @@ namespace v2rayN.Handler
|
||||
|
||||
TlsSettings xtlsSettings = new TlsSettings
|
||||
{
|
||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||
allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||
alpn = node.GetAlpn(),
|
||||
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.defFingerprint : node.fingerprint
|
||||
fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint
|
||||
};
|
||||
if (!string.IsNullOrWhiteSpace(sni))
|
||||
{
|
||||
@@ -824,7 +825,7 @@ namespace v2rayN.Handler
|
||||
|
||||
private static int statistic(Config config, ref V2rayConfig v2rayConfig)
|
||||
{
|
||||
if (config.enableStatistics)
|
||||
if (config.guiItem.enableStatistics)
|
||||
{
|
||||
string tag = Global.InboundAPITagName;
|
||||
API apiObj = new API();
|
||||
|
||||
@@ -20,6 +20,9 @@ namespace v2rayN.Handler
|
||||
public CoreHandler(Action<bool, string> update)
|
||||
{
|
||||
_updateFunc = update;
|
||||
|
||||
Environment.SetEnvironmentVariable("v2ray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process);
|
||||
Environment.SetEnvironmentVariable("xray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process);
|
||||
}
|
||||
|
||||
public void LoadCore(Config config)
|
||||
|
||||
@@ -33,20 +33,13 @@ namespace v2rayN.Handler
|
||||
|
||||
public async Task<int> DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action<bool, string> update)
|
||||
{
|
||||
var hasValue = false;
|
||||
try
|
||||
{
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||
|
||||
var client = new HttpClient(new SocketsHttpHandler()
|
||||
{
|
||||
Proxy = webProxy
|
||||
});
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||
|
||||
var progress = new Progress<string>();
|
||||
progress.ProgressChanged += (sender, value) =>
|
||||
{
|
||||
hasValue = true;
|
||||
if (update != null)
|
||||
{
|
||||
string msg = $"{value}";
|
||||
@@ -54,22 +47,17 @@ namespace v2rayN.Handler
|
||||
}
|
||||
};
|
||||
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
cancellationToken.CancelAfter(downloadTimeout * 1000);
|
||||
await HttpClientHelper.GetInstance().DownloadDataAsync4Speed(client,
|
||||
await DownloaderHelper.Instance.DownloadDataAsync4Speed(webProxy,
|
||||
url,
|
||||
progress,
|
||||
cancellationToken.Token);
|
||||
downloadTimeout);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!hasValue)
|
||||
update(false, ex.Message);
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
update(false, ex.Message);
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
update(false, ex.InnerException.Message);
|
||||
}
|
||||
update(false, ex.InnerException.Message);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -79,14 +67,9 @@ namespace v2rayN.Handler
|
||||
{
|
||||
try
|
||||
{
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading));
|
||||
|
||||
var client = new HttpClient(new SocketsHttpHandler()
|
||||
{
|
||||
Proxy = GetWebProxy(blProxy)
|
||||
});
|
||||
|
||||
var progress = new Progress<double>();
|
||||
progress.ProgressChanged += (sender, value) =>
|
||||
{
|
||||
@@ -97,12 +80,12 @@ namespace v2rayN.Handler
|
||||
}
|
||||
};
|
||||
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
_ = HttpClientHelper.GetInstance().DownloadFileAsync(client,
|
||||
url,
|
||||
Utils.GetTempPath(Utils.GetDownloadFileName(url)),
|
||||
progress,
|
||||
cancellationToken.Token);
|
||||
var webProxy = GetWebProxy(blProxy);
|
||||
_ = DownloaderHelper.Instance.DownloadFileAsync(webProxy,
|
||||
url,
|
||||
Utils.GetTempPath(Utils.GetDownloadFileName(url)),
|
||||
progress,
|
||||
downloadTimeout);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -118,7 +101,7 @@ namespace v2rayN.Handler
|
||||
|
||||
public async Task<string> UrlRedirectAsync(string url, bool blProxy)
|
||||
{
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||
var webRequestHandler = new SocketsHttpHandler
|
||||
{
|
||||
AllowAutoRedirect = false,
|
||||
@@ -138,6 +121,70 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> TryDownloadString(string url, bool blProxy, string userAgent)
|
||||
{
|
||||
try
|
||||
{
|
||||
var result1 = await DownloadStringAsync(url, blProxy, userAgent);
|
||||
if (!Utils.IsNullOrEmpty(result1))
|
||||
{
|
||||
return result1;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var result2 = await DownloadStringViaDownloader(url, blProxy, userAgent);
|
||||
if (!Utils.IsNullOrEmpty(result2))
|
||||
{
|
||||
return result2;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using (var wc = new WebClient())
|
||||
{
|
||||
wc.Proxy = GetWebProxy(blProxy);
|
||||
var result3 = await wc.DownloadStringTaskAsync(url);
|
||||
if (!Utils.IsNullOrEmpty(result3))
|
||||
{
|
||||
return result3;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DownloadString
|
||||
/// </summary>
|
||||
@@ -146,7 +193,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
try
|
||||
{
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||
var client = new HttpClient(new SocketsHttpHandler()
|
||||
{
|
||||
Proxy = GetWebProxy(blProxy)
|
||||
@@ -183,6 +230,38 @@ namespace v2rayN.Handler
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DownloadString
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
public async Task<string> DownloadStringViaDownloader(string url, bool blProxy, string userAgent)
|
||||
{
|
||||
try
|
||||
{
|
||||
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
|
||||
|
||||
var webProxy = GetWebProxy(blProxy);
|
||||
|
||||
if (Utils.IsNullOrEmpty(userAgent))
|
||||
{
|
||||
userAgent = $"{Utils.GetVersion(false)}";
|
||||
}
|
||||
var result = await DownloaderHelper.Instance.DownloadStringAsync(webProxy, url, userAgent, 30);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||
if (ex.InnerException != null)
|
||||
{
|
||||
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public int RunAvailabilityCheck(WebProxy webProxy)
|
||||
{
|
||||
try
|
||||
@@ -196,7 +275,7 @@ namespace v2rayN.Handler
|
||||
try
|
||||
{
|
||||
var config = LazyConfig.Instance.GetConfig();
|
||||
string status = GetRealPingTime(config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||
string status = GetRealPingTime(config.speedTestItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||
bool noError = Utils.IsNullOrEmpty(status);
|
||||
return noError ? responseTime : -1;
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ namespace v2rayN.Handler
|
||||
|
||||
public List<RoutingItem> RoutingItems()
|
||||
{
|
||||
return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).ToList();
|
||||
return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).OrderBy(t => t.sort).ToList();
|
||||
}
|
||||
public RoutingItem GetRoutingItem(string id)
|
||||
{
|
||||
@@ -209,7 +209,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
coreType = ECoreType.v2rayN,
|
||||
coreUrl = Global.NUrl,
|
||||
coreReleaseApiUrl = Global.NUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.NUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||
coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||
});
|
||||
@@ -220,7 +220,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "wv2ray", "v2ray" },
|
||||
arguments = "",
|
||||
coreUrl = Global.v2flyCoreUrl,
|
||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
match = "V2Ray",
|
||||
@@ -234,7 +234,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "SagerNet", "v2ray" },
|
||||
arguments = "run",
|
||||
coreUrl = Global.SagerNetCoreUrl,
|
||||
coreReleaseApiUrl = Global.SagerNetCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.SagerNetCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
coreDownloadUrl64 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
match = "V2Ray",
|
||||
@@ -248,7 +248,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "v2ray" },
|
||||
arguments = "run",
|
||||
coreUrl = Global.v2flyCoreUrl,
|
||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||
match = "V2Ray",
|
||||
@@ -262,7 +262,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "xray", "wxray" },
|
||||
arguments = "",
|
||||
coreUrl = Global.xrayCoreUrl,
|
||||
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||
coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||
match = "Xray",
|
||||
@@ -276,7 +276,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" },
|
||||
arguments = "-f config.json",
|
||||
coreUrl = Global.clashCoreUrl,
|
||||
coreReleaseApiUrl = Global.clashCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.clashCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip",
|
||||
coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip",
|
||||
match = "v",
|
||||
@@ -290,7 +290,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" },
|
||||
arguments = "-f config.json",
|
||||
coreUrl = Global.clashMetaCoreUrl,
|
||||
coreReleaseApiUrl = Global.clashMetaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.clashMetaCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip",
|
||||
coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip",
|
||||
match = "v",
|
||||
@@ -304,7 +304,7 @@ namespace v2rayN.Handler
|
||||
coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" },
|
||||
arguments = "",
|
||||
coreUrl = Global.hysteriaCoreUrl,
|
||||
coreReleaseApiUrl = Global.hysteriaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||
coreReleaseApiUrl = Global.hysteriaCoreUrl.Replace(Global.githubUrl, Global.githubApiUrl),
|
||||
coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-386.exe",
|
||||
coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-amd64.exe",
|
||||
redirectInfo = true,
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!config.enableRoutingAdvanced)
|
||||
if (!config.routingBasicItem.enableRoutingAdvanced)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -309,9 +309,9 @@ namespace v2rayN.Handler
|
||||
{
|
||||
var dtNow = DateTime.Now;
|
||||
|
||||
if (config.autoUpdateSubInterval > 0)
|
||||
if (config.guiItem.autoUpdateSubInterval > 0)
|
||||
{
|
||||
if ((dtNow - autoUpdateSubTime).Hours % config.autoUpdateSubInterval == 0)
|
||||
if ((dtNow - autoUpdateSubTime).Hours % config.guiItem.autoUpdateSubInterval == 0)
|
||||
{
|
||||
updateHandle.UpdateSubscriptionProcess(config, "", true, (bool success, string msg) =>
|
||||
{
|
||||
@@ -324,9 +324,9 @@ namespace v2rayN.Handler
|
||||
Thread.Sleep(60000);
|
||||
}
|
||||
|
||||
if (config.autoUpdateInterval > 0)
|
||||
if (config.guiItem.autoUpdateInterval > 0)
|
||||
{
|
||||
if ((dtNow - autoUpdateGeoTime).Hours % config.autoUpdateInterval == 0)
|
||||
if ((dtNow - autoUpdateGeoTime).Hours % config.guiItem.autoUpdateInterval == 0)
|
||||
{
|
||||
updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) =>
|
||||
{
|
||||
|
||||
@@ -34,6 +34,10 @@ namespace v2rayN.Handler
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (it.port <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
_selecteds.Add(new ServerTestItem()
|
||||
{
|
||||
indexId = it.indexId,
|
||||
@@ -195,10 +199,10 @@ namespace v2rayN.Handler
|
||||
private async Task RunSpeedTestAsync()
|
||||
{
|
||||
int pid = -1;
|
||||
if (_actionType == ESpeedActionType.Mixedtest)
|
||||
{
|
||||
_selecteds = _selecteds.OrderBy(t => t.delay).ToList();
|
||||
}
|
||||
//if (_actionType == ESpeedActionType.Mixedtest)
|
||||
//{
|
||||
// _selecteds = _selecteds.OrderBy(t => t.delay).ToList();
|
||||
//}
|
||||
|
||||
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||
if (pid < 0)
|
||||
@@ -207,10 +211,11 @@ namespace v2rayN.Handler
|
||||
return;
|
||||
}
|
||||
|
||||
string url = _config.constItem.speedTestUrl;
|
||||
string url = _config.speedTestItem.speedTestUrl;
|
||||
var timeout = _config.speedTestItem.speedTestTimeout;
|
||||
|
||||
DownloadHandle downloadHandle = new DownloadHandle();
|
||||
|
||||
var timeout = 8;
|
||||
foreach (var it in _selecteds)
|
||||
{
|
||||
if (!it.allowTest)
|
||||
@@ -221,11 +226,11 @@ namespace v2rayN.Handler
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (it.delay < 0)
|
||||
{
|
||||
UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip);
|
||||
continue;
|
||||
}
|
||||
//if (it.delay < 0)
|
||||
//{
|
||||
// UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip);
|
||||
// continue;
|
||||
//}
|
||||
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||
|
||||
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||
@@ -250,18 +255,71 @@ namespace v2rayN.Handler
|
||||
}
|
||||
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||
}
|
||||
|
||||
private async Task RunSpeedTestMulti()
|
||||
{
|
||||
int pid = -1;
|
||||
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||
if (pid < 0)
|
||||
{
|
||||
UpdateFunc("", ResUI.FailedToRunCore);
|
||||
return;
|
||||
}
|
||||
|
||||
string url = _config.speedTestItem.speedTestUrl;
|
||||
var timeout = _config.speedTestItem.speedTestTimeout;
|
||||
|
||||
DownloadHandle downloadHandle = new DownloadHandle();
|
||||
|
||||
foreach (var it in _selecteds)
|
||||
{
|
||||
if (!it.allowTest)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (it.configType == EConfigType.Custom)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||
|
||||
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||
if (item is null) continue;
|
||||
|
||||
WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
|
||||
_ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (bool success, string msg) =>
|
||||
{
|
||||
decimal.TryParse(msg, out decimal dec);
|
||||
if (dec > 0)
|
||||
{
|
||||
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", msg);
|
||||
}
|
||||
UpdateFunc(it.indexId, "", msg);
|
||||
});
|
||||
Thread.Sleep(2000);
|
||||
}
|
||||
|
||||
Thread.Sleep((timeout + 2) * 1000);
|
||||
|
||||
if (pid > 0)
|
||||
{
|
||||
_coreHandler.CoreStopPid(pid);
|
||||
}
|
||||
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||
}
|
||||
|
||||
private async Task RunMixedtestAsync()
|
||||
{
|
||||
await RunRealPing();
|
||||
|
||||
Thread.Sleep(1000);
|
||||
|
||||
await RunSpeedTestAsync();
|
||||
await RunSpeedTestMulti();
|
||||
}
|
||||
|
||||
public string GetRealPingTime(DownloadHandle downloadHandle, WebProxy webProxy)
|
||||
{
|
||||
string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||
string status = downloadHandle.GetRealPingTime(_config.speedTestItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||
//string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
|
||||
return FormatOut(Utils.IsNullOrEmpty(status) ? responseTime : -1, Global.DelayUnit);
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace v2rayN.Handler
|
||||
public StatisticsHandler(Mode.Config config, Action<ServerSpeedItem> update)
|
||||
{
|
||||
config_ = config;
|
||||
Enable = config.enableStatistics;
|
||||
Enable = config.guiItem.enableStatistics;
|
||||
updateFunc_ = update;
|
||||
exitFlag_ = false;
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
}
|
||||
var sleep = config_.statisticsFreshRate < 1 ? 1 : config_.statisticsFreshRate;
|
||||
var sleep = config_.guiItem.statisticsFreshRate < 1 ? 1 : config_.guiItem.statisticsFreshRate;
|
||||
Thread.Sleep(1000 * sleep);
|
||||
channel_.ConnectAsync();
|
||||
}
|
||||
|
||||
@@ -100,6 +100,17 @@ namespace v2rayN.Base
|
||||
configStr = configStr.Replace("$strict_route$", $"{_config.tunModeItem.strictRoute.ToString().ToLower()}");
|
||||
configStr = configStr.Replace("$stack$", $"{_config.tunModeItem.stack}");
|
||||
|
||||
//logs
|
||||
if (_config.tunModeItem.showWindow)
|
||||
{
|
||||
configStr = configStr.Replace("$log_output$", $"");
|
||||
}
|
||||
else
|
||||
{
|
||||
var dtNow = DateTime.Now;
|
||||
var log_output = $"\"output\": \"{Utils.GetLogPath($"singbox_{dtNow.ToString("yyyy-MM-dd")}.txt")}\", ";
|
||||
configStr = configStr.Replace("$log_output$", $"{log_output.Replace(@"\", @"\\")}");
|
||||
}
|
||||
|
||||
//port
|
||||
configStr = configStr.Replace("$socksPort$", $"{_socksPort}");
|
||||
@@ -118,13 +129,13 @@ namespace v2rayN.Base
|
||||
{
|
||||
if (!lstDnsExe.Contains(it2) && it.coreType != ECoreType.sing_box)
|
||||
{
|
||||
lstDnsExe.Add(it2);
|
||||
//lstDnsExe.Add(it2);
|
||||
lstDnsExe.Add($"{it2}.exe");
|
||||
}
|
||||
|
||||
if (!lstDirectExe.Contains(it2))
|
||||
{
|
||||
lstDirectExe.Add(it2);
|
||||
//lstDirectExe.Add(it2);
|
||||
lstDirectExe.Add($"{it2}.exe");
|
||||
}
|
||||
}
|
||||
@@ -135,27 +146,45 @@ namespace v2rayN.Base
|
||||
string strDirect = string.Join("\",\"", lstDirectExe.ToArray());
|
||||
configStr = configStr.Replace("$directProcessName$", $"\"{strDirect}\"");
|
||||
|
||||
if (_config.tunModeItem.bypassMode)
|
||||
{
|
||||
//direct ips
|
||||
if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
|
||||
{
|
||||
var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
|
||||
configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
|
||||
}
|
||||
//direct process
|
||||
if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
|
||||
{
|
||||
var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
|
||||
configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//proxy ips
|
||||
if (_config.tunModeItem.proxyIP != null && _config.tunModeItem.proxyIP.Count > 0)
|
||||
{
|
||||
var ips = new { outbound = "proxy", ip_cidr = _config.tunModeItem.proxyIP };
|
||||
configStr = configStr.Replace("$ruleProxyIPs$", "," + Utils.ToJson(ips));
|
||||
}
|
||||
//proxy process
|
||||
if (_config.tunModeItem.proxyProcess != null && _config.tunModeItem.proxyProcess.Count > 0)
|
||||
{
|
||||
var process = new { outbound = "proxy", process_name = _config.tunModeItem.proxyProcess };
|
||||
configStr = configStr.Replace("$ruleProxyProcess$", "," + Utils.ToJson(process));
|
||||
}
|
||||
|
||||
//ips
|
||||
if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
|
||||
{
|
||||
var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
|
||||
configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
|
||||
}
|
||||
else
|
||||
{
|
||||
configStr = configStr.Replace("$ruleDirectIPs$", "");
|
||||
}
|
||||
//process
|
||||
if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
|
||||
{
|
||||
var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
|
||||
configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
|
||||
}
|
||||
else
|
||||
{
|
||||
configStr = configStr.Replace("$ruleDirectProcess$", "");
|
||||
var final = new { outbound = "direct", inbound = "tun-in" };
|
||||
configStr = configStr.Replace("$ruleFinally$", "," + Utils.ToJson(final));
|
||||
}
|
||||
configStr = configStr.Replace("$ruleDirectIPs$", "");
|
||||
configStr = configStr.Replace("$ruleDirectProcess$", "");
|
||||
configStr = configStr.Replace("$ruleProxyIPs$", "");
|
||||
configStr = configStr.Replace("$ruleProxyProcess$", "");
|
||||
configStr = configStr.Replace("$ruleFinally$", "");
|
||||
|
||||
|
||||
File.WriteAllText(Utils.GetConfigPath(_tunConfigName), configStr);
|
||||
|
||||
@@ -172,6 +201,7 @@ namespace v2rayN.Base
|
||||
KillProcess(_process);
|
||||
_process.Dispose();
|
||||
_process = null;
|
||||
_needRestart = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -213,10 +213,10 @@ namespace v2rayN.Handler
|
||||
url = Utils.GetPunycode(url);
|
||||
|
||||
_updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}");
|
||||
var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent);
|
||||
var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent);
|
||||
if (blProxy && Utils.IsNullOrEmpty(result))
|
||||
{
|
||||
result = await downloadHandle.DownloadStringAsync(url, false, userAgent);
|
||||
result = await downloadHandle.TryDownloadString(url, false, userAgent);
|
||||
}
|
||||
|
||||
if (Utils.IsNullOrEmpty(result))
|
||||
@@ -278,11 +278,13 @@ namespace v2rayN.Handler
|
||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
Global.coreTypes.ForEach(it =>
|
||||
{
|
||||
string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
|
||||
File.Copy(fileName, targetPath, true);
|
||||
});
|
||||
//Global.coreTypes.ForEach(it =>
|
||||
//{
|
||||
// string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
|
||||
// File.Copy(fileName, targetPath, true);
|
||||
//});
|
||||
string targetPath = Utils.GetBinPath($"{geoName}.dat");
|
||||
File.Copy(fileName, targetPath, true);
|
||||
|
||||
File.Delete(fileName);
|
||||
//_updateFunc(true, "");
|
||||
|
||||
@@ -8,150 +8,31 @@
|
||||
{
|
||||
#region property
|
||||
|
||||
/// <summary>
|
||||
/// 允许日志
|
||||
/// </summary>
|
||||
public bool logEnabled
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 日志等级
|
||||
/// </summary>
|
||||
public string loglevel
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public string indexId
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 允许Mux多路复用
|
||||
/// </summary>
|
||||
public bool muxEnabled
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public ESysProxyType sysProxyType
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public bool autoRun { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 启用实时网速和流量统计
|
||||
/// </summary>
|
||||
public bool enableStatistics
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 去重时优先保留较旧(顶部)节点
|
||||
/// </summary>
|
||||
public bool keepOlderDedupl
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 视图刷新率
|
||||
/// </summary>
|
||||
public int statisticsFreshRate
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义远程DNS
|
||||
/// </summary>
|
||||
public string remoteDNS
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
public string indexId { get; set; }
|
||||
|
||||
public string remoteDNS { get; set; }
|
||||
/// <summary>
|
||||
/// Outbound Freedom domainStrategy
|
||||
/// </summary>
|
||||
public string domainStrategy4Freedom
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
public string domainStrategy4Freedom { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否允许不安全连接
|
||||
/// </summary>
|
||||
public bool defAllowInsecure { get; set; }
|
||||
|
||||
public string defFingerprint { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 默认用户代理
|
||||
/// </summary>
|
||||
public string defUserAgent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 域名解析策略
|
||||
/// </summary>
|
||||
public string domainStrategy
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
public string domainMatcher
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
public string routingIndexId { get; set; }
|
||||
public bool enableRoutingAdvanced
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public bool ignoreGeoUpdateCore
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// systemProxyExceptions
|
||||
/// </summary>
|
||||
public string systemProxyExceptions
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
public ESysProxyType sysProxyType { get; set; }
|
||||
public string systemProxyExceptions { get; set; }
|
||||
public string systemProxyAdvancedProtocol { get; set; }
|
||||
|
||||
public int autoUpdateInterval { get; set; } = 10;
|
||||
|
||||
public int autoUpdateSubInterval { get; set; } = 10;
|
||||
|
||||
public bool checkPreReleaseUpdate { get; set; } = false;
|
||||
|
||||
public bool enableSecurityProtocolTls13
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public int trayMenuServersLimit { get; set; } = 20;
|
||||
|
||||
#endregion
|
||||
|
||||
#region other entities
|
||||
|
||||
public CoreBasicItem coreBasicItem { get; set; }
|
||||
public TunModeItem tunModeItem { get; set; }
|
||||
public KcpItem kcpItem { get; set; }
|
||||
public GrpcItem grpcItem { get; set; }
|
||||
public RoutingBasicItem routingBasicItem { get; set; }
|
||||
public GUIItem guiItem { get; set; }
|
||||
public UIItem uiItem { get; set; }
|
||||
public ConstItem constItem { get; set; }
|
||||
public SpeedTestItem speedTestItem { get; set; }
|
||||
public List<InItem> inbound { get; set; }
|
||||
public List<KeyEventItem> globalHotkeys { get; set; }
|
||||
public List<CoreTypeItem> coreTypeItem { get; set; }
|
||||
|
||||
@@ -2,6 +2,37 @@
|
||||
|
||||
namespace v2rayN.Mode
|
||||
{
|
||||
[Serializable]
|
||||
public class CoreBasicItem
|
||||
{
|
||||
/// <summary>
|
||||
/// 允许日志
|
||||
/// </summary>
|
||||
public bool logEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 日志等级
|
||||
/// </summary>
|
||||
public string loglevel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 允许Mux多路复用
|
||||
/// </summary>
|
||||
public bool muxEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否允许不安全连接
|
||||
/// </summary>
|
||||
public bool defAllowInsecure { get; set; }
|
||||
|
||||
public string defFingerprint { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 默认用户代理
|
||||
/// </summary>
|
||||
public string defUserAgent { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class InItem
|
||||
{
|
||||
@@ -51,6 +82,30 @@ namespace v2rayN.Mode
|
||||
public int initial_windows_size { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class GUIItem
|
||||
{
|
||||
public bool autoRun { get; set; }
|
||||
|
||||
public bool enableStatistics { get; set; }
|
||||
|
||||
public int statisticsFreshRate { get; set; }
|
||||
|
||||
public bool keepOlderDedupl { get; set; }
|
||||
|
||||
public bool ignoreGeoUpdateCore { get; set; } = true;
|
||||
|
||||
public int autoUpdateInterval { get; set; } = 10;
|
||||
|
||||
public int autoUpdateSubInterval { get; set; } = 10;
|
||||
|
||||
public bool checkPreReleaseUpdate { get; set; } = false;
|
||||
|
||||
public bool enableSecurityProtocolTls13 { get; set; }
|
||||
|
||||
public int trayMenuServersLimit { get; set; } = 20;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class UIItem
|
||||
{
|
||||
@@ -63,17 +118,17 @@ namespace v2rayN.Mode
|
||||
public string? colorPrimaryName { get; set; }
|
||||
public string currentLanguage { get; set; }
|
||||
public string currentFontFamily { get; set; }
|
||||
public int currentFontSize { get; set; }
|
||||
public bool enableDragDropSort { get; set; }
|
||||
public bool doubleClick2Activate { get; set; }
|
||||
public bool autoHideStartup { get; set; } = true;
|
||||
public string mainMsgFilter { get; set; }
|
||||
public Dictionary<string, int> mainLvColWidth { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class ConstItem
|
||||
{
|
||||
public string speedTestUrl { get; set; }
|
||||
public string speedPingTestUrl { get; set; }
|
||||
public string defIEProxyExceptions { get; set; }
|
||||
}
|
||||
|
||||
@@ -109,8 +164,32 @@ namespace v2rayN.Mode
|
||||
public string stack { get; set; }
|
||||
public int mtu { get; set; }
|
||||
public string customTemplate { get; set; }
|
||||
public bool bypassMode { get; set; } = true;
|
||||
public List<string> directIP { get; set; }
|
||||
public List<string> directProcess { get; set; }
|
||||
public List<string> proxyIP { get; set; }
|
||||
public List<string> proxyProcess { get; set; }
|
||||
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class SpeedTestItem
|
||||
{
|
||||
public int speedTestTimeout { get; set; }
|
||||
public string speedTestUrl { get; set; }
|
||||
public string speedPingTestUrl { get; set; }
|
||||
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class RoutingBasicItem
|
||||
{
|
||||
/// <summary>
|
||||
/// 域名解析策略
|
||||
/// </summary>
|
||||
public string domainStrategy { get; set; }
|
||||
public string domainMatcher { get; set; }
|
||||
public string routingIndexId { get; set; }
|
||||
public bool enableRoutingAdvanced { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace v2rayN.Mode
|
||||
public bool locked { get; set; }
|
||||
public string customIcon { get; set; }
|
||||
public string domainStrategy { get; set; }
|
||||
public int sort { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +67,6 @@
|
||||
/// TLS fingerprint
|
||||
/// </summary>
|
||||
public string fp { get; set; } = string.Empty;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
71
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
71
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
@@ -70,7 +70,7 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 All servers 的本地化字符串。
|
||||
/// 查找类似 All 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string AllGroupServers {
|
||||
get {
|
||||
@@ -790,7 +790,7 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 One-click test Latency and speed (Ctrl+E) 的本地化字符串。
|
||||
/// 查找类似 One-click multi test Latency and speed (Ctrl+E) 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string menuMixedTestServer {
|
||||
get {
|
||||
@@ -2402,7 +2402,7 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Copy the font TTF file to the directory Resources\Fonts, restart the settings 的本地化字符串。
|
||||
/// 查找类似 Copy the font TTF file to the directory guiFonts, restart the settings 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsCurrentFontFamilyTip {
|
||||
get {
|
||||
@@ -2509,6 +2509,15 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 FontSize 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFontSize {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFontSize", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Http Port 的本地化字符串。
|
||||
/// </summary>
|
||||
@@ -2546,7 +2555,7 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Language 的本地化字符串。
|
||||
/// 查找类似 Language(Restart) 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsLanguage {
|
||||
get {
|
||||
@@ -2680,6 +2689,24 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 SpeedTest Single Timeout Value 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsSpeedTestTimeout {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsSpeedTestTimeout", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 SpeedTest Url 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsSpeedTestUrl {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsSpeedTestUrl", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Start on boot 的本地化字符串。
|
||||
/// </summary>
|
||||
@@ -2761,6 +2788,24 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Bypass Mode 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsTunModeBypassMode {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsTunModeBypassMode", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Enable: If no route matches, the final proxy 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsTunModeBypassModeTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsTunModeBypassModeTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Custom Template 的本地化字符串。
|
||||
/// </summary>
|
||||
@@ -2788,6 +2833,24 @@ namespace v2rayN.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Proxy IP CIDR, separated by commas (,) 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsTunModeProxyIP {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsTunModeProxyIP", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Proxy Process name, separated by commas (,) 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsTunModeProxyProcess {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsTunModeProxyProcess", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Show console 的本地化字符串。
|
||||
/// </summary>
|
||||
|
||||
@@ -449,7 +449,7 @@
|
||||
<value>Ungrouped</value>
|
||||
</data>
|
||||
<data name="AllGroupServers" xml:space="preserve">
|
||||
<value>All servers</value>
|
||||
<value>All</value>
|
||||
</data>
|
||||
<data name="FillServerAddressCustom" xml:space="preserve">
|
||||
<value>Please browse to import server configuration</value>
|
||||
@@ -548,7 +548,7 @@
|
||||
<value>Dark Mode</value>
|
||||
</data>
|
||||
<data name="TbSettingsLanguage" xml:space="preserve">
|
||||
<value>Language</value>
|
||||
<value>Language(Restart)</value>
|
||||
</data>
|
||||
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
||||
<value>Import bulk URL from clipboard (Ctrl+V)</value>
|
||||
@@ -1022,7 +1022,7 @@
|
||||
<value>RouteOnly</value>
|
||||
</data>
|
||||
<data name="menuMixedTestServer" xml:space="preserve">
|
||||
<value>One-click test Latency and speed (Ctrl+E)</value>
|
||||
<value>One-click multi test Latency and speed (Ctrl+E)</value>
|
||||
</data>
|
||||
<data name="LvTestDelay" xml:space="preserve">
|
||||
<value>Delay(ms)</value>
|
||||
@@ -1097,7 +1097,7 @@
|
||||
<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>
|
||||
<value>Copy the font TTF file to the directory guiFonts, restart the settings</value>
|
||||
</data>
|
||||
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||
<value>http port=socks port+1</value>
|
||||
@@ -1105,4 +1105,25 @@
|
||||
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||
<value>Set this with admin privileges, get admin privileges after startup</value>
|
||||
</data>
|
||||
<data name="TbSettingsFontSize" xml:space="preserve">
|
||||
<value>FontSize</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeProxyIP" xml:space="preserve">
|
||||
<value>Proxy IP CIDR, separated by commas (,)</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeProxyProcess" xml:space="preserve">
|
||||
<value>Proxy Process name, separated by commas (,)</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeBypassMode" xml:space="preserve">
|
||||
<value>Bypass Mode</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeBypassModeTip" xml:space="preserve">
|
||||
<value>Enable: If no route matches, the final proxy</value>
|
||||
</data>
|
||||
<data name="TbSettingsSpeedTestTimeout" xml:space="preserve">
|
||||
<value>SpeedTest Single Timeout Value</value>
|
||||
</data>
|
||||
<data name="TbSettingsSpeedTestUrl" xml:space="preserve">
|
||||
<value>SpeedTest Url</value>
|
||||
</data>
|
||||
</root>
|
||||
1111
v2rayN/v2rayN/Resx/ResUI.ru.resx
Normal file
1111
v2rayN/v2rayN/Resx/ResUI.ru.resx
Normal file
File diff suppressed because it is too large
Load Diff
@@ -449,7 +449,7 @@
|
||||
<value>未分组服务器</value>
|
||||
</data>
|
||||
<data name="AllGroupServers" xml:space="preserve">
|
||||
<value>所有服务器</value>
|
||||
<value>所有</value>
|
||||
</data>
|
||||
<data name="FillServerAddressCustom" xml:space="preserve">
|
||||
<value>请浏览导入服务器配置</value>
|
||||
@@ -548,7 +548,7 @@
|
||||
<value>暗黑模式</value>
|
||||
</data>
|
||||
<data name="TbSettingsLanguage" xml:space="preserve">
|
||||
<value>语言</value>
|
||||
<value>语言(重启)</value>
|
||||
</data>
|
||||
<data name="menuAddServerViaClipboard" xml:space="preserve">
|
||||
<value>从剪贴板导入批量URL (Ctrl+V)</value>
|
||||
@@ -1022,7 +1022,7 @@
|
||||
<value>RouteOnly</value>
|
||||
</data>
|
||||
<data name="menuMixedTestServer" xml:space="preserve">
|
||||
<value>一键测试延迟和速度 (Ctrl+E)</value>
|
||||
<value>一键多线程测试延迟和速度 (Ctrl+E)</value>
|
||||
</data>
|
||||
<data name="LvTestDelay" xml:space="preserve">
|
||||
<value>延迟(ms)</value>
|
||||
@@ -1097,7 +1097,7 @@
|
||||
<value>当前字体(需重启)</value>
|
||||
</data>
|
||||
<data name="TbSettingsCurrentFontFamilyTip" xml:space="preserve">
|
||||
<value>拷贝字体TTF文件到目录Resources\Fonts,重启设置</value>
|
||||
<value>拷贝字体TTF文件到目录guiFonts,重启设置</value>
|
||||
</data>
|
||||
<data name="TbSettingsSocksPortTip" xml:space="preserve">
|
||||
<value>http端口=socks端口+1</value>
|
||||
@@ -1105,4 +1105,25 @@
|
||||
<data name="TbSettingsStartBootTip" xml:space="preserve">
|
||||
<value>以管理员权限设置此项,在启动后获得管理员权限</value>
|
||||
</data>
|
||||
<data name="TbSettingsFontSize" xml:space="preserve">
|
||||
<value>字体大小</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeProxyIP" xml:space="preserve">
|
||||
<value>代理的IP CIDR,用逗号(,)分隔</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeProxyProcess" xml:space="preserve">
|
||||
<value>代理的进程名,用逗号(,)分隔</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeBypassMode" xml:space="preserve">
|
||||
<value>绕行模式</value>
|
||||
</data>
|
||||
<data name="TbSettingsTunModeBypassModeTip" xml:space="preserve">
|
||||
<value>启用:路由无匹配则最终代理</value>
|
||||
</data>
|
||||
<data name="TbSettingsSpeedTestTimeout" xml:space="preserve">
|
||||
<value>测速单个超时值</value>
|
||||
</data>
|
||||
<data name="TbSettingsSpeedTestUrl" xml:space="preserve">
|
||||
<value>测速文件地址</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"log": {
|
||||
"disabled": false,
|
||||
"level": "debug",
|
||||
$log_output$
|
||||
"timestamp": true
|
||||
},
|
||||
"dns": {
|
||||
"servers": [
|
||||
{
|
||||
@@ -23,6 +29,7 @@
|
||||
"inbounds": [
|
||||
{
|
||||
"type": "tun",
|
||||
"tag": "tun-in",
|
||||
"interface_name": "singbox_tun",
|
||||
"inet4_address": "172.19.0.1/30",
|
||||
|
||||
@@ -102,6 +109,9 @@
|
||||
}
|
||||
$ruleDirectIPs$
|
||||
$ruleDirectProcess$
|
||||
$ruleProxyIPs$
|
||||
$ruleProxyProcess$
|
||||
$ruleFinally$
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -786,6 +786,10 @@ namespace v2rayN
|
||||
var task = taskService.NewTask();
|
||||
task.RegistrationInfo.Description = taskDescription;
|
||||
task.Settings.DisallowStartIfOnBatteries = false;
|
||||
task.Settings.StopIfGoingOnBatteries = false;
|
||||
task.Settings.RunOnlyIfIdle = false;
|
||||
task.Settings.IdleSettings.StopOnIdleEnd = false;
|
||||
task.Settings.ExecutionTimeLimit = TimeSpan.Zero;
|
||||
task.Triggers.Add(new LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromMinutes(1) });
|
||||
task.Principal.RunLevel = TaskRunLevel.Highest;
|
||||
task.Actions.Add(new ExecAction(deamonFileName));
|
||||
@@ -1117,7 +1121,14 @@ namespace v2rayN
|
||||
Directory.CreateDirectory(_tempPath);
|
||||
}
|
||||
}
|
||||
return Path.Combine(_tempPath, filename);
|
||||
if (string.IsNullOrEmpty(filename))
|
||||
{
|
||||
return _tempPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Path.Combine(_tempPath, filename);
|
||||
}
|
||||
}
|
||||
public static string GetLogPath(string filename = "")
|
||||
{
|
||||
@@ -1135,6 +1146,22 @@ namespace v2rayN
|
||||
return Path.Combine(_tempPath, filename);
|
||||
}
|
||||
}
|
||||
public static string GetFontsPath(string filename = "")
|
||||
{
|
||||
string _tempPath = Path.Combine(StartupPath(), "guiFonts");
|
||||
if (!Directory.Exists(_tempPath))
|
||||
{
|
||||
Directory.CreateDirectory(_tempPath);
|
||||
}
|
||||
if (string.IsNullOrEmpty(filename))
|
||||
{
|
||||
return _tempPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Path.Combine(_tempPath, filename);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -189,6 +189,8 @@ namespace v2rayN.ViewModels
|
||||
public IObservableCollection<Swatch> Swatches => _swatches;
|
||||
[Reactive]
|
||||
public Swatch SelectedSwatch { get; set; }
|
||||
[Reactive]
|
||||
public int CurrentFontSize { get; set; }
|
||||
|
||||
[Reactive]
|
||||
public string CurrentLanguage { get; set; }
|
||||
@@ -259,7 +261,7 @@ namespace v2rayN.ViewModels
|
||||
x => x.EnableTun,
|
||||
y => y == true)
|
||||
.Subscribe(c => DoEnableTun(c));
|
||||
|
||||
|
||||
BindingUI();
|
||||
RestoreUI();
|
||||
AutoHideStartup();
|
||||
@@ -504,7 +506,7 @@ namespace v2rayN.ViewModels
|
||||
//MainFormHandler.Instance.BackupGuiNConfig(_config, true);
|
||||
_coreHandler = new CoreHandler(UpdateHandler);
|
||||
|
||||
if (_config.enableStatistics)
|
||||
if (_config.guiItem.enableStatistics)
|
||||
{
|
||||
_statistics = new StatisticsHandler(_config, UpdateStatisticsHandler);
|
||||
}
|
||||
@@ -535,7 +537,12 @@ namespace v2rayN.ViewModels
|
||||
_noticeHandler?.SendMessage(msg);
|
||||
if (success)
|
||||
{
|
||||
RefreshServers();
|
||||
Reload();
|
||||
if (_config.uiItem.enableAutoAdjustMainLvColWidth)
|
||||
{
|
||||
_updateView("AdjustMainLvColWidth");
|
||||
}
|
||||
}
|
||||
}
|
||||
private void UpdateStatisticsHandler(ServerSpeedItem update)
|
||||
@@ -766,7 +773,7 @@ namespace v2rayN.ViewModels
|
||||
private void RefreshServersMenu()
|
||||
{
|
||||
_servers.Clear();
|
||||
if (_lstProfile.Count > _config.trayMenuServersLimit)
|
||||
if (_lstProfile.Count > _config.guiItem.trayMenuServersLimit)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1219,20 +1226,7 @@ namespace v2rayN.ViewModels
|
||||
|
||||
private void UpdateSubscriptionProcess(string subId, bool blProxy)
|
||||
{
|
||||
void _updateUI(bool success, string msg)
|
||||
{
|
||||
_noticeHandler?.SendMessage(msg);
|
||||
if (success)
|
||||
{
|
||||
RefreshServers();
|
||||
if (_config.uiItem.enableAutoAdjustMainLvColWidth)
|
||||
{
|
||||
_updateView("AdjustMainLvColWidth");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
(new UpdateHandle()).UpdateSubscriptionProcess(_config, subId, blProxy, _updateUI);
|
||||
(new UpdateHandle()).UpdateSubscriptionProcess(_config, subId, blProxy, UpdateTaskHandler);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -1307,7 +1301,7 @@ namespace v2rayN.ViewModels
|
||||
MyAppExit(false);
|
||||
}
|
||||
};
|
||||
(new UpdateHandle()).CheckUpdateGuiN(_config, _updateUI, _config.checkPreReleaseUpdate);
|
||||
(new UpdateHandle()).CheckUpdateGuiN(_config, _updateUI, _config.guiItem.checkPreReleaseUpdate);
|
||||
}
|
||||
|
||||
private void CheckUpdateCore(ECoreType type)
|
||||
@@ -1322,7 +1316,7 @@ namespace v2rayN.ViewModels
|
||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(msg));
|
||||
string toPath = Utils.GetBinPath("", type);
|
||||
|
||||
FileManager.ZipExtractToFile(fileName, toPath, _config.ignoreGeoUpdateCore ? "geo" : "");
|
||||
FileManager.ZipExtractToFile(fileName, toPath, _config.guiItem.ignoreGeoUpdateCore ? "geo" : "");
|
||||
|
||||
_noticeHandler?.SendMessage(ResUI.MsgUpdateV2rayCoreSuccessfullyMore);
|
||||
|
||||
@@ -1336,7 +1330,7 @@ namespace v2rayN.ViewModels
|
||||
}
|
||||
}
|
||||
};
|
||||
(new UpdateHandle()).CheckUpdateCore(type, _config, _updateUI, _config.checkPreReleaseUpdate);
|
||||
(new UpdateHandle()).CheckUpdateCore(type, _config, _updateUI, _config.guiItem.checkPreReleaseUpdate);
|
||||
}
|
||||
|
||||
private void CheckUpdateGeo()
|
||||
@@ -1440,7 +1434,7 @@ namespace v2rayN.ViewModels
|
||||
private void RefreshRoutingsMenu()
|
||||
{
|
||||
_routingItems.Clear();
|
||||
if (!_config.enableRoutingAdvanced)
|
||||
if (!_config.routingBasicItem.enableRoutingAdvanced)
|
||||
{
|
||||
BlRouting = false;
|
||||
return;
|
||||
@@ -1451,7 +1445,7 @@ namespace v2rayN.ViewModels
|
||||
foreach (var item in routings)
|
||||
{
|
||||
_routingItems.Add(item);
|
||||
if (item.id.Equals(_config.routingIndexId))
|
||||
if (item.id.Equals(_config.routingBasicItem.routingIndexId))
|
||||
{
|
||||
SelectedRouting = item;
|
||||
}
|
||||
@@ -1475,7 +1469,7 @@ namespace v2rayN.ViewModels
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (_config.routingIndexId == item.id)
|
||||
if (_config.routingBasicItem.routingIndexId == item.id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1576,6 +1570,7 @@ namespace v2rayN.ViewModels
|
||||
{
|
||||
SelectedSwatch = _swatches.FirstOrDefault(t => t.Name == _config.uiItem.colorPrimaryName);
|
||||
}
|
||||
CurrentFontSize = _config.uiItem.currentFontSize;
|
||||
CurrentLanguage = _config.uiItem.currentLanguage;
|
||||
|
||||
this.WhenAnyValue(
|
||||
@@ -1611,6 +1606,24 @@ namespace v2rayN.ViewModels
|
||||
}
|
||||
});
|
||||
|
||||
this.WhenAnyValue(
|
||||
x => x.CurrentFontSize,
|
||||
y => y > 0)
|
||||
.Subscribe(c =>
|
||||
{
|
||||
if (CurrentFontSize >= Global.MinFontSize)
|
||||
{
|
||||
_config.uiItem.currentFontSize = CurrentFontSize;
|
||||
double size = (long)CurrentFontSize;
|
||||
Application.Current.Resources["StdFontSize"] = size;
|
||||
Application.Current.Resources["StdFontSize1"] = size + 1;
|
||||
Application.Current.Resources["StdFontSize2"] = size + 2;
|
||||
Application.Current.Resources["StdFontSizeMsg"] = size - 1;
|
||||
|
||||
ConfigHandler.SaveConfig(ref _config);
|
||||
}
|
||||
});
|
||||
|
||||
this.WhenAnyValue(
|
||||
x => x.CurrentLanguage,
|
||||
y => y != null && !y.IsNullOrEmpty())
|
||||
|
||||
@@ -63,6 +63,8 @@ namespace v2rayN.ViewModels
|
||||
[Reactive] public int autoUpdateSubInterval { get; set; }
|
||||
[Reactive] public int trayMenuServersLimit { get; set; }
|
||||
[Reactive] public string currentFontFamily { get; set; }
|
||||
[Reactive] public int SpeedTestTimeout { get; set; }
|
||||
[Reactive] public string SpeedTestUrl { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -77,8 +79,12 @@ namespace v2rayN.ViewModels
|
||||
[Reactive] public string TunStack { get; set; }
|
||||
[Reactive] public int TunMtu { get; set; }
|
||||
[Reactive] public string TunCustomTemplate { get; set; }
|
||||
[Reactive] public bool TunBypassMode { get; set; }
|
||||
[Reactive] public bool TunBypassMode2 { get; set; }
|
||||
[Reactive] public string TunDirectIP { get; set; }
|
||||
[Reactive] public string TunDirectProcess { get; set; }
|
||||
[Reactive] public string TunProxyIP { get; set; }
|
||||
[Reactive] public string TunProxyProcess { get; set; }
|
||||
#endregion
|
||||
|
||||
#region CoreType
|
||||
@@ -110,12 +116,12 @@ namespace v2rayN.ViewModels
|
||||
newPort4LAN = inbound.newPort4LAN;
|
||||
user = inbound.user;
|
||||
pass = inbound.pass;
|
||||
muxEnabled = _config.muxEnabled;
|
||||
logEnabled = _config.logEnabled;
|
||||
loglevel = _config.loglevel;
|
||||
defAllowInsecure = _config.defAllowInsecure;
|
||||
defFingerprint = _config.defFingerprint;
|
||||
defUserAgent = _config.defUserAgent;
|
||||
muxEnabled = _config.coreBasicItem.muxEnabled;
|
||||
logEnabled = _config.coreBasicItem.logEnabled;
|
||||
loglevel = _config.coreBasicItem.loglevel;
|
||||
defAllowInsecure = _config.coreBasicItem.defAllowInsecure;
|
||||
defFingerprint = _config.coreBasicItem.defFingerprint;
|
||||
defUserAgent = _config.coreBasicItem.defUserAgent;
|
||||
#endregion
|
||||
|
||||
#region Core DNS
|
||||
@@ -134,21 +140,23 @@ namespace v2rayN.ViewModels
|
||||
#endregion
|
||||
|
||||
#region UI
|
||||
AutoRun = _config.autoRun;
|
||||
EnableStatistics = _config.enableStatistics;
|
||||
StatisticsFreshRate = _config.statisticsFreshRate;
|
||||
KeepOlderDedupl = _config.keepOlderDedupl;
|
||||
IgnoreGeoUpdateCore = _config.ignoreGeoUpdateCore;
|
||||
AutoRun = _config.guiItem.autoRun;
|
||||
EnableStatistics = _config.guiItem.enableStatistics;
|
||||
StatisticsFreshRate = _config.guiItem.statisticsFreshRate;
|
||||
KeepOlderDedupl = _config.guiItem.keepOlderDedupl;
|
||||
IgnoreGeoUpdateCore = _config.guiItem.ignoreGeoUpdateCore;
|
||||
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
||||
EnableSecurityProtocolTls13 = _config.enableSecurityProtocolTls13;
|
||||
EnableSecurityProtocolTls13 = _config.guiItem.enableSecurityProtocolTls13;
|
||||
AutoHideStartup = _config.uiItem.autoHideStartup;
|
||||
EnableCheckPreReleaseUpdate = _config.checkPreReleaseUpdate;
|
||||
EnableCheckPreReleaseUpdate = _config.guiItem.checkPreReleaseUpdate;
|
||||
EnableDragDropSort = _config.uiItem.enableDragDropSort;
|
||||
DoubleClick2Activate = _config.uiItem.doubleClick2Activate;
|
||||
autoUpdateInterval = _config.autoUpdateInterval;
|
||||
autoUpdateSubInterval = _config.autoUpdateSubInterval;
|
||||
trayMenuServersLimit = _config.trayMenuServersLimit;
|
||||
autoUpdateInterval = _config.guiItem.autoUpdateInterval;
|
||||
autoUpdateSubInterval = _config.guiItem.autoUpdateSubInterval;
|
||||
trayMenuServersLimit = _config.guiItem.trayMenuServersLimit;
|
||||
currentFontFamily = _config.uiItem.currentFontFamily;
|
||||
SpeedTestTimeout = _config.speedTestItem.speedTestTimeout;
|
||||
SpeedTestUrl = _config.speedTestItem.speedTestUrl;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -164,8 +172,14 @@ namespace v2rayN.ViewModels
|
||||
TunStack = _config.tunModeItem.stack;
|
||||
TunMtu = _config.tunModeItem.mtu;
|
||||
TunCustomTemplate = _config.tunModeItem.customTemplate;
|
||||
TunBypassMode = _config.tunModeItem.bypassMode;
|
||||
TunDirectIP = Utils.List2String(_config.tunModeItem.directIP, true);
|
||||
TunDirectProcess = Utils.List2String(_config.tunModeItem.directProcess, true);
|
||||
TunProxyIP = Utils.List2String(_config.tunModeItem.proxyIP, true);
|
||||
TunProxyProcess = Utils.List2String(_config.tunModeItem.proxyProcess, true);
|
||||
this.WhenAnyValue(
|
||||
x => x.TunBypassMode)
|
||||
.Subscribe(c => TunBypassMode2 = !TunBypassMode);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -273,12 +287,12 @@ namespace v2rayN.ViewModels
|
||||
{
|
||||
_config.inbound.RemoveAt(1);
|
||||
}
|
||||
_config.logEnabled = logEnabled;
|
||||
_config.loglevel = loglevel;
|
||||
_config.muxEnabled = muxEnabled;
|
||||
_config.defAllowInsecure = defAllowInsecure;
|
||||
_config.defFingerprint = defFingerprint;
|
||||
_config.defUserAgent = defUserAgent;
|
||||
_config.coreBasicItem.logEnabled = logEnabled;
|
||||
_config.coreBasicItem.loglevel = loglevel;
|
||||
_config.coreBasicItem.muxEnabled = muxEnabled;
|
||||
_config.coreBasicItem.defAllowInsecure = defAllowInsecure;
|
||||
_config.coreBasicItem.defFingerprint = defFingerprint;
|
||||
_config.coreBasicItem.defUserAgent = defUserAgent;
|
||||
|
||||
|
||||
//DNS
|
||||
@@ -298,25 +312,27 @@ namespace v2rayN.ViewModels
|
||||
|
||||
//UI
|
||||
Utils.SetAutoRun(AutoRun);
|
||||
_config.autoRun = AutoRun;
|
||||
_config.enableStatistics = EnableStatistics;
|
||||
_config.statisticsFreshRate = StatisticsFreshRate;
|
||||
if (_config.statisticsFreshRate > 100 || _config.statisticsFreshRate < 1)
|
||||
_config.guiItem.autoRun = AutoRun;
|
||||
_config.guiItem.enableStatistics = EnableStatistics;
|
||||
_config.guiItem.statisticsFreshRate = StatisticsFreshRate;
|
||||
if (_config.guiItem.statisticsFreshRate > 100 || _config.guiItem.statisticsFreshRate < 1)
|
||||
{
|
||||
_config.statisticsFreshRate = 1;
|
||||
_config.guiItem.statisticsFreshRate = 1;
|
||||
}
|
||||
_config.keepOlderDedupl = KeepOlderDedupl;
|
||||
_config.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
||||
_config.guiItem.keepOlderDedupl = KeepOlderDedupl;
|
||||
_config.guiItem.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
||||
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
||||
_config.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
||||
_config.guiItem.enableSecurityProtocolTls13 = EnableSecurityProtocolTls13;
|
||||
_config.uiItem.autoHideStartup = AutoHideStartup;
|
||||
_config.autoUpdateInterval = autoUpdateInterval;
|
||||
_config.autoUpdateSubInterval = autoUpdateSubInterval;
|
||||
_config.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
||||
_config.guiItem.autoUpdateInterval = autoUpdateInterval;
|
||||
_config.guiItem.autoUpdateSubInterval = autoUpdateSubInterval;
|
||||
_config.guiItem.checkPreReleaseUpdate = EnableCheckPreReleaseUpdate;
|
||||
_config.uiItem.enableDragDropSort = EnableDragDropSort;
|
||||
_config.uiItem.doubleClick2Activate = DoubleClick2Activate;
|
||||
_config.trayMenuServersLimit = trayMenuServersLimit;
|
||||
_config.guiItem.trayMenuServersLimit = trayMenuServersLimit;
|
||||
_config.uiItem.currentFontFamily = currentFontFamily;
|
||||
_config.speedTestItem.speedTestTimeout = SpeedTestTimeout;
|
||||
_config.speedTestItem.speedTestUrl = SpeedTestUrl;
|
||||
|
||||
//systemProxy
|
||||
_config.systemProxyExceptions = systemProxyExceptions;
|
||||
@@ -328,8 +344,11 @@ namespace v2rayN.ViewModels
|
||||
_config.tunModeItem.stack = TunStack;
|
||||
_config.tunModeItem.mtu = TunMtu;
|
||||
_config.tunModeItem.customTemplate = TunCustomTemplate;
|
||||
_config.tunModeItem.bypassMode = TunBypassMode;
|
||||
_config.tunModeItem.directIP = Utils.String2List(TunDirectIP);
|
||||
_config.tunModeItem.directProcess = Utils.String2List(TunDirectProcess);
|
||||
_config.tunModeItem.proxyIP = Utils.String2List(TunProxyIP);
|
||||
_config.tunModeItem.proxyProcess = Utils.String2List(TunProxyProcess);
|
||||
|
||||
//coreType
|
||||
SaveCoreType();
|
||||
|
||||
@@ -71,9 +71,9 @@ namespace v2rayN.ViewModels
|
||||
|
||||
ConfigHandler.InitBuiltinRouting(ref _config);
|
||||
|
||||
enableRoutingAdvanced = _config.enableRoutingAdvanced;
|
||||
domainStrategy = _config.domainStrategy;
|
||||
domainMatcher = _config.domainMatcher;
|
||||
enableRoutingAdvanced = _config.routingBasicItem.enableRoutingAdvanced;
|
||||
domainStrategy = _config.routingBasicItem.domainStrategy;
|
||||
domainMatcher = _config.routingBasicItem.domainMatcher;
|
||||
|
||||
RefreshRoutingItems();
|
||||
|
||||
@@ -163,7 +163,7 @@ namespace v2rayN.ViewModels
|
||||
foreach (var item in routings)
|
||||
{
|
||||
bool def = false;
|
||||
if (item.id.Equals(_config.routingIndexId))
|
||||
if (item.id.Equals(_config.routingBasicItem.routingIndexId))
|
||||
{
|
||||
def = true;
|
||||
}
|
||||
@@ -176,15 +176,16 @@ namespace v2rayN.ViewModels
|
||||
remarks = item.remarks,
|
||||
url = item.url,
|
||||
customIcon = item.customIcon,
|
||||
sort = item.sort,
|
||||
};
|
||||
_routingItems.Add(it);
|
||||
}
|
||||
}
|
||||
private void SaveRouting()
|
||||
{
|
||||
_config.domainStrategy = domainStrategy;
|
||||
_config.enableRoutingAdvanced = enableRoutingAdvanced;
|
||||
_config.domainMatcher = domainMatcher;
|
||||
_config.routingBasicItem.domainStrategy = domainStrategy;
|
||||
_config.routingBasicItem.enableRoutingAdvanced = enableRoutingAdvanced;
|
||||
_config.routingBasicItem.domainMatcher = domainMatcher;
|
||||
|
||||
EndBindingLockedData();
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
Margin="4"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -91,7 +91,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
<StackPanel
|
||||
Grid.Row="2"
|
||||
Grid.Column="2"
|
||||
@@ -125,6 +125,7 @@
|
||||
Width="200"
|
||||
Margin="4"
|
||||
HorizontalAlignment="Left"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
MaxDropDownHeight="1000"
|
||||
Style="{StaticResource MaterialDesignOutlinedComboBox}" />
|
||||
|
||||
@@ -157,7 +158,7 @@
|
||||
Margin="4"
|
||||
HorizontalAlignment="Left"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
<StackPanel
|
||||
Grid.Row="6"
|
||||
Grid.Column="1"
|
||||
|
||||
@@ -83,7 +83,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -97,7 +98,8 @@
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
@@ -112,7 +114,8 @@
|
||||
Grid.Column="1"
|
||||
Width="100"
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
</Grid>
|
||||
|
||||
<Separator
|
||||
@@ -148,7 +151,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
<Button
|
||||
x:Name="btnGUID"
|
||||
Grid.Row="1"
|
||||
@@ -171,7 +175,8 @@
|
||||
Grid.Column="1"
|
||||
Width="100"
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
@@ -216,7 +221,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -261,7 +267,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -275,7 +282,8 @@
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
</Grid>
|
||||
<Grid
|
||||
@@ -306,7 +314,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
<Button
|
||||
x:Name="btnGUID5"
|
||||
Grid.Row="1"
|
||||
@@ -344,7 +353,8 @@
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
</Grid>
|
||||
<Grid
|
||||
x:Name="gridTrojan"
|
||||
@@ -373,7 +383,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -478,7 +489,8 @@
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
<TextBlock
|
||||
x:Name="tipRequestHost"
|
||||
Grid.Row="3"
|
||||
@@ -500,7 +512,8 @@
|
||||
Grid.Row="4"
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}" />
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
<TextBlock
|
||||
x:Name="tipPath"
|
||||
Grid.Row="4"
|
||||
@@ -572,7 +585,8 @@
|
||||
Grid.Column="1"
|
||||
Width="400"
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -88,7 +88,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
@@ -105,7 +105,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="4"
|
||||
Grid.Column="0"
|
||||
@@ -121,7 +121,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="5"
|
||||
Grid.Column="0"
|
||||
@@ -137,7 +137,7 @@
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
IsReadOnly="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
</Grid>
|
||||
|
||||
<TextBlock
|
||||
|
||||
@@ -261,37 +261,74 @@
|
||||
HorizontalAlignment="Right"
|
||||
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
|
||||
<StackPanel Margin="8">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsColorMode}" />
|
||||
<ToggleButton x:Name="togDarkMode" Margin="8" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<ToggleButton
|
||||
x:Name="togDarkMode"
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Margin="8" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsColor}" />
|
||||
<ComboBox
|
||||
x:Name="cmbSwatches"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="100"
|
||||
Margin="8"
|
||||
DisplayMemberPath="Name"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFontSize}" />
|
||||
<ComboBox
|
||||
x:Name="cmbCurrentFontSize"
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="100"
|
||||
Margin="8"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsLanguage}" />
|
||||
<ComboBox
|
||||
x:Name="cmbCurrentLanguage"
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="100"
|
||||
Margin="8"
|
||||
materialDesign:HintAssist.Hint="Language"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</materialDesign:PopupBox>
|
||||
</ToolBar>
|
||||
@@ -302,7 +339,11 @@
|
||||
VerticalAlignment="Center"
|
||||
ClipToBounds="True"
|
||||
Style="{StaticResource MaterialDesignToolBar}">
|
||||
<ListBox x:Name="lstGroup" Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
|
||||
<ListBox
|
||||
x:Name="lstGroup"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
ItemContainerStyle="{StaticResource MyChipListBoxItem}"
|
||||
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding remarks}" />
|
||||
@@ -313,17 +354,18 @@
|
||||
x:Name="btnAddSub"
|
||||
Width="30"
|
||||
Height="30"
|
||||
Margin="8,0"
|
||||
Margin="4,0"
|
||||
Style="{StaticResource MaterialDesignFloatingActionMiniLightButton}">
|
||||
<materialDesign:PackIcon Kind="Plus" />
|
||||
</Button>
|
||||
<Separator />
|
||||
<TextBox
|
||||
x:Name="txtServerFilter"
|
||||
Width="200"
|
||||
Margin="8,0"
|
||||
Width="100"
|
||||
Margin="4,0"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}"
|
||||
materialDesign:TextFieldAssist.HasClearButton="True" />
|
||||
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
</ToolBar>
|
||||
</ToolBarTray>
|
||||
|
||||
@@ -374,6 +416,7 @@
|
||||
Width="120"
|
||||
Margin="8,0"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSystemproxy}"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFloatingHintComboBox}">
|
||||
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxyClear}" />
|
||||
<ComboBoxItem Content="{x:Static resx:ResUI.menuSystemProxySet}" />
|
||||
@@ -387,6 +430,7 @@
|
||||
Margin="8,0"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
||||
DisplayMemberPath="remarks"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFloatingHintComboBox}" />
|
||||
</StackPanel>
|
||||
|
||||
@@ -495,6 +539,7 @@
|
||||
Width="200"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuSubscription}"
|
||||
DisplayMemberPath="remarks"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||
</DockPanel>
|
||||
</MenuItem.Header>
|
||||
@@ -703,6 +748,7 @@
|
||||
MaxWidth="300"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuRouting}"
|
||||
DisplayMemberPath="remarks"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||
</DockPanel>
|
||||
</MenuItem.Header>
|
||||
@@ -715,6 +761,7 @@
|
||||
MaxWidth="300"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.menuServers}"
|
||||
DisplayMemberPath="Text"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFilledComboBox}" />
|
||||
</DockPanel>
|
||||
</MenuItem.Header>
|
||||
|
||||
@@ -45,6 +45,11 @@ namespace v2rayN.Views
|
||||
ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler);
|
||||
Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel));
|
||||
|
||||
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 8; i++)
|
||||
{
|
||||
cmbCurrentFontSize.Items.Add(i.ToString());
|
||||
}
|
||||
|
||||
Global.Languages.ForEach(it =>
|
||||
{
|
||||
cmbCurrentLanguage.Items.Add(it);
|
||||
@@ -173,6 +178,7 @@ namespace v2rayN.Views
|
||||
this.Bind(ViewModel, vm => vm.ColorModeDark, v => v.togDarkMode.IsChecked).DisposeWith(disposables);
|
||||
this.OneWayBind(ViewModel, vm => vm.Swatches, v => v.cmbSwatches.ItemsSource).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables);
|
||||
});
|
||||
|
||||
@@ -428,7 +434,7 @@ namespace v2rayN.Views
|
||||
var width = ConfigHandler.GetformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].Width.Value));
|
||||
lstProfiles.Columns[k].Width = width;
|
||||
}
|
||||
if (!_config.enableStatistics)
|
||||
if (!_config.guiItem.enableStatistics)
|
||||
{
|
||||
colTodayUp.Visibility = Visibility.Hidden;
|
||||
colTodayDown.Visibility = Visibility.Hidden;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
Margin="8,0"
|
||||
VerticalAlignment="Center"
|
||||
Foreground="{DynamicResource PrimaryHueLightBrush}"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.MsgInformationTitle}" />
|
||||
<ComboBox
|
||||
x:Name="cmbMsgFilter"
|
||||
@@ -27,10 +28,13 @@
|
||||
Margin="8,0"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgFilterTitle}"
|
||||
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||
IsEditable="True" />
|
||||
IsEditable="True"
|
||||
Style="{StaticResource DefComboBox}"
|
||||
TextBoxBase.TextChanged="cmbMsgFilter_TextChanged" />
|
||||
<TextBlock
|
||||
Margin="8,0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbAutoRefresh}" />
|
||||
<ToggleButton
|
||||
x:Name="togAutoRefresh"
|
||||
@@ -41,9 +45,10 @@
|
||||
<TextBox
|
||||
Name="txtMsg"
|
||||
BorderThickness="0"
|
||||
FontSize="11"
|
||||
FontSize="{DynamicResource StdFontSizeMsg}"
|
||||
HorizontalScrollBarVisibility="Auto"
|
||||
IsReadOnly="True"
|
||||
TextAlignment="Left"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Visible">
|
||||
<TextBox.ContextMenu>
|
||||
|
||||
@@ -3,19 +3,27 @@ using System.Reactive.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Threading;
|
||||
using v2rayN.Base;
|
||||
using v2rayN.Handler;
|
||||
using v2rayN.Mode;
|
||||
|
||||
namespace v2rayN.Views
|
||||
{
|
||||
public partial class MsgView
|
||||
{
|
||||
private static Config _config;
|
||||
public MsgView()
|
||||
{
|
||||
InitializeComponent();
|
||||
_config = LazyConfig.Instance.GetConfig();
|
||||
MessageBus.Current.Listen<string>("MsgView").Subscribe(x => DelegateAppendText(x));
|
||||
Global.PresetMsgFilters.ForEach(it =>
|
||||
{
|
||||
cmbMsgFilter.Items.Add(it);
|
||||
});
|
||||
if (!_config.uiItem.mainMsgFilter.IsNullOrEmpty())
|
||||
{
|
||||
cmbMsgFilter.Text = _config.uiItem.mainMsgFilter;
|
||||
}
|
||||
}
|
||||
|
||||
void DelegateAppendText(string msg)
|
||||
@@ -87,6 +95,10 @@ namespace v2rayN.Views
|
||||
{
|
||||
ClearMsg();
|
||||
}
|
||||
private void cmbMsgFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
|
||||
{
|
||||
_config.uiItem.mainMsgFilter = cmbMsgFilter.Text.TrimEx();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -85,7 +85,8 @@
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="0"
|
||||
Grid.Column="2"
|
||||
@@ -176,7 +177,8 @@
|
||||
Grid.Row="6"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="7"
|
||||
@@ -190,7 +192,8 @@
|
||||
Grid.Row="7"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="8"
|
||||
@@ -231,8 +234,10 @@
|
||||
x:Name="cmbloglevel"
|
||||
Grid.Row="10"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
materialDesign:HintAssist.Hint="Level" />
|
||||
materialDesign:HintAssist.Hint="Level"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="11"
|
||||
@@ -259,8 +264,10 @@
|
||||
x:Name="cmbdefFingerprint"
|
||||
Grid.Row="12"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
IsEditable="True" />
|
||||
IsEditable="True"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="13"
|
||||
@@ -273,8 +280,10 @@
|
||||
x:Name="cmbdefUserAgent"
|
||||
Grid.Row="13"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
IsEditable="True" />
|
||||
IsEditable="True"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="13"
|
||||
Grid.Column="3"
|
||||
@@ -296,7 +305,8 @@
|
||||
<ComboBox
|
||||
x:Name="cmbdomainStrategy4Freedom"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
|
||||
@@ -320,6 +330,7 @@
|
||||
VerticalAlignment="Stretch"
|
||||
AcceptsReturn="True"
|
||||
BorderThickness="1"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</DockPanel>
|
||||
@@ -353,7 +364,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="mtu" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcpmtu"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
@@ -367,7 +378,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="tti" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcptti"
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
@@ -381,7 +392,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="uplinkCapacity" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcpuplinkCapacity"
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
@@ -395,7 +406,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="downlinkCapacity" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcpdownlinkCapacity"
|
||||
Grid.Row="4"
|
||||
Grid.Column="1"
|
||||
@@ -409,7 +420,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="readBufferSize" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcpreadBufferSize"
|
||||
Grid.Row="5"
|
||||
Grid.Column="1"
|
||||
@@ -423,7 +434,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="writeBufferSize" />
|
||||
<TextBox
|
||||
<TextBox Style="{StaticResource DefTextBox}"
|
||||
x:Name="txtKcpwriteBufferSize"
|
||||
Grid.Row="6"
|
||||
Grid.Column="1"
|
||||
@@ -467,6 +478,8 @@
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
@@ -521,7 +534,8 @@
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="4"
|
||||
@@ -647,7 +661,9 @@
|
||||
Grid.Row="12"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="13"
|
||||
@@ -661,7 +677,9 @@
|
||||
Grid.Row="13"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="14"
|
||||
@@ -675,7 +693,9 @@
|
||||
Grid.Row="14"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="15"
|
||||
@@ -688,8 +708,10 @@
|
||||
x:Name="cmbcurrentFontFamily"
|
||||
Grid.Row="15"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
MaxDropDownHeight="1000" />
|
||||
MaxDropDownHeight="1000"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
<TextBlock
|
||||
Grid.Row="15"
|
||||
Grid.Column="2"
|
||||
@@ -697,6 +719,36 @@
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamilyTip}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="16"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsSpeedTestTimeout}" />
|
||||
<ComboBox
|
||||
x:Name="cmbSpeedTestTimeout"
|
||||
Grid.Row="16"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="17"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsSpeedTestUrl}" />
|
||||
<ComboBox
|
||||
x:Name="cmbSpeedTestUrl"
|
||||
Grid.Row="17"
|
||||
Grid.Column="1"
|
||||
Width="300"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
@@ -713,8 +765,10 @@
|
||||
<ComboBox
|
||||
x:Name="cmbsystemProxyAdvancedProtocol"
|
||||
Grid.Row="4"
|
||||
MinWidth="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
materialDesign:HintAssist.Hint="Protocol" />
|
||||
materialDesign:HintAssist.Hint="Protocol"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
</StackPanel>
|
||||
|
||||
@@ -731,6 +785,7 @@
|
||||
VerticalAlignment="Stretch"
|
||||
AcceptsReturn="True"
|
||||
BorderThickness="1"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</DockPanel>
|
||||
@@ -751,6 +806,7 @@
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
@@ -799,7 +855,8 @@
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="4"
|
||||
@@ -814,7 +871,8 @@
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="5"
|
||||
@@ -827,10 +885,11 @@
|
||||
x:Name="txtCustomTemplate"
|
||||
Grid.Row="5"
|
||||
Grid.Column="1"
|
||||
Width="600"
|
||||
Width="400"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
<Button
|
||||
x:Name="btnBrowse"
|
||||
@@ -841,9 +900,35 @@
|
||||
Click="btnBrowse_Click"
|
||||
Content="{x:Static resx:ResUI.TbBrowse}"
|
||||
Style="{StaticResource DefButton}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="6"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsTunModeBypassMode}" />
|
||||
<ToggleButton
|
||||
x:Name="togBypassMode"
|
||||
Grid.Row="6"
|
||||
Grid.Column="1"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left" />
|
||||
<TextBlock
|
||||
Grid.Row="6"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource ServerItemMargin}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsTunModeBypassModeTip}" />
|
||||
</Grid>
|
||||
|
||||
<Grid Margin="{StaticResource SettingItemMargin}">
|
||||
|
||||
<Grid
|
||||
x:Name="gridTunModeDirect"
|
||||
Width="600"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1*" />
|
||||
<ColumnDefinition Width="10" />
|
||||
@@ -852,10 +937,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectIP}"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtDirectIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -863,14 +949,51 @@
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="{x:Static resx:ResUI.TbSettingsTunModeDirectProcess}"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtDirectProcess"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
<Grid
|
||||
x:Name="gridTunModeProxy"
|
||||
Width="600"
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
HorizontalAlignment="Left">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1*" />
|
||||
<ColumnDefinition Width="10" />
|
||||
<ColumnDefinition Width="1*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="{x:Static resx:ResUI.TbSettingsTunModeProxyIP}"
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtProxyIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="{x:Static resx:ResUI.TbSettingsTunModeProxyProcess}"
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtProxyProcess"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
</DockPanel>
|
||||
</TabItem>
|
||||
|
||||
@@ -901,7 +1024,8 @@
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -915,7 +1039,8 @@
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
@@ -929,7 +1054,8 @@
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="4"
|
||||
@@ -943,7 +1069,8 @@
|
||||
Grid.Row="4"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="5"
|
||||
@@ -957,7 +1084,8 @@
|
||||
Grid.Row="5"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="6"
|
||||
@@ -971,7 +1099,8 @@
|
||||
Grid.Row="6"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource SettingItemMargin}" />
|
||||
Margin="{StaticResource SettingItemMargin}"
|
||||
Style="{StaticResource DefComboBox}" />
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
|
||||
@@ -63,26 +63,49 @@ namespace v2rayN.Views
|
||||
cmbCoreType6.Items.Add(it);
|
||||
});
|
||||
|
||||
for (int i = 2; i <= 6; i++)
|
||||
{
|
||||
cmbSpeedTestTimeout.Items.Add(i * 5);
|
||||
}
|
||||
Global.SpeedTestUrls.ForEach(it =>
|
||||
{
|
||||
cmbSpeedTestUrl.Items.Add(it);
|
||||
});
|
||||
|
||||
//fill fonts
|
||||
try
|
||||
{
|
||||
var dir = new DirectoryInfo(Utils.GetPath(@"Resources\Fonts"));
|
||||
var dir = new DirectoryInfo(Utils.GetFontsPath());
|
||||
var files = dir.GetFiles("*.ttf");
|
||||
var culture = _config.uiItem.currentLanguage.Equals(Global.Languages[0]) ? "zh-cn" : "en-us";
|
||||
var culture2 = "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"))
|
||||
var families = Fonts.GetFontFamilies(Utils.GetFontsPath(it.Name));
|
||||
foreach (FontFamily family in families)
|
||||
{
|
||||
continue;
|
||||
var typefaces = family.GetTypefaces();
|
||||
foreach (Typeface typeface in typefaces)
|
||||
{
|
||||
typeface.TryGetGlyphTypeface(out GlyphTypeface glyph);
|
||||
//var fontFace = glyph.Win32FaceNames[new CultureInfo("en-us")];
|
||||
//if (!fontFace.Equals("Regular") && !fontFace.Equals("Normal"))
|
||||
//{
|
||||
// continue;
|
||||
//}
|
||||
var fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture)];
|
||||
if (Utils.IsNullOrEmpty(fontFamily))
|
||||
{
|
||||
fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture2)];
|
||||
if (Utils.IsNullOrEmpty(fontFamily))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
cmbcurrentFontFamily.Items.Add(fontFamily);
|
||||
break;
|
||||
}
|
||||
}
|
||||
var fontFamily = glyphTypeface.Win32FamilyNames[new CultureInfo(culture)];
|
||||
if (Utils.IsNullOrEmpty(fontFamily))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
cmbcurrentFontFamily.Items.Add(fontFamily);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -139,6 +162,8 @@ namespace v2rayN.Views
|
||||
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.currentFontFamily, v => v.cmbcurrentFontFamily.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SpeedTestTimeout, v => v.cmbSpeedTestTimeout.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SpeedTestUrl, v => v.cmbSpeedTestUrl.Text).DisposeWith(disposables);
|
||||
|
||||
|
||||
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);
|
||||
@@ -150,8 +175,13 @@ namespace v2rayN.Views
|
||||
this.Bind(ViewModel, vm => vm.TunStack, v => v.cmbStack.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunMtu, v => v.cmbMtu.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunCustomTemplate, v => v.txtCustomTemplate.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunBypassMode, v => v.togBypassMode.IsChecked).DisposeWith(disposables);
|
||||
this.OneWayBind(ViewModel, vm => vm.TunBypassMode, v => v.gridTunModeDirect.Visibility, vmToViewConverterOverride: new BooleanToVisibilityTypeConverter()).DisposeWith(disposables);
|
||||
this.OneWayBind(ViewModel, vm => vm.TunBypassMode2, v => v.gridTunModeProxy.Visibility, vmToViewConverterOverride: new BooleanToVisibilityTypeConverter()).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunDirectIP, v => v.txtDirectIP.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunDirectProcess, v => v.txtDirectProcess.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunProxyIP, v => v.txtProxyIP.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.TunProxyProcess, v => v.txtProxyProcess.Text).DisposeWith(disposables);
|
||||
|
||||
|
||||
this.Bind(ViewModel, vm => vm.CoreType1, v => v.cmbCoreType1.Text).DisposeWith(disposables);
|
||||
|
||||
@@ -65,7 +65,8 @@
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="4"
|
||||
HorizontalAlignment="Left" />
|
||||
HorizontalAlignment="Left"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
@@ -80,6 +81,7 @@
|
||||
Grid.Column="1"
|
||||
Margin="4"
|
||||
HorizontalAlignment="Left"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
||||
|
||||
<TextBlock
|
||||
@@ -94,6 +96,7 @@
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Margin="4"
|
||||
FontSize="{DynamicResource StdFontSize}"
|
||||
Style="{StaticResource MaterialDesignFilterChipPrimaryListBox}" />
|
||||
|
||||
<TextBlock
|
||||
@@ -143,7 +146,7 @@
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center">
|
||||
<CheckBox x:Name="chkAutoSort">
|
||||
<TextBlock Text="{x:Static resx:ResUI.TbAutoSort}" />
|
||||
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.TbAutoSort}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<Button
|
||||
@@ -172,10 +175,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="Domain"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtDomain"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -183,10 +187,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="IP"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
@@ -114,6 +115,7 @@
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
@@ -146,6 +148,7 @@
|
||||
Margin="4"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
@@ -163,6 +166,7 @@
|
||||
Margin="4"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
<Button
|
||||
x:Name="btnBrowse"
|
||||
@@ -174,6 +178,23 @@
|
||||
Content="{x:Static resx:ResUI.TbBrowse}"
|
||||
Style="{StaticResource DefButton}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="4"
|
||||
Grid.Column="0"
|
||||
Margin="4"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.LvSort}" />
|
||||
<TextBox
|
||||
x:Name="txtSort"
|
||||
Grid.Row="4"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="4"
|
||||
HorizontalAlignment="Left"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
</Grid>
|
||||
|
||||
<TabControl x:Name="tabAdvanced">
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace v2rayN.Views
|
||||
this.Bind(ViewModel, vm => vm.SelectedRouting.domainStrategy, v => v.cmbdomainStrategy.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SelectedRouting.url, v => v.txtUrl.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SelectedRouting.customIcon, v => v.txtCustomIcon.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.SelectedRouting.sort, v => v.txtSort.Text).DisposeWith(disposables);
|
||||
|
||||
this.BindCommand(ViewModel, vm => vm.RuleAddCmd, v => v.menuRuleAdd).DisposeWith(disposables);
|
||||
this.BindCommand(ViewModel, vm => vm.ImportRulesFromFileCmd, v => v.menuImportRulesFromFile).DisposeWith(disposables);
|
||||
|
||||
@@ -197,15 +197,19 @@
|
||||
Binding="{Binding remarks}"
|
||||
Header="{x:Static resx:ResUI.LvAlias}" />
|
||||
<DataGridTextColumn
|
||||
Width="70"
|
||||
Width="60"
|
||||
Binding="{Binding ruleNum}"
|
||||
Header="{x:Static resx:ResUI.LvCount}" />
|
||||
<DataGridTextColumn
|
||||
Width="280"
|
||||
Width="60"
|
||||
Binding="{Binding sort}"
|
||||
Header="{x:Static resx:ResUI.LvSort}" />
|
||||
<DataGridTextColumn
|
||||
Width="260"
|
||||
Binding="{Binding url}"
|
||||
Header="{x:Static resx:ResUI.LvUrl}" />
|
||||
<DataGridTextColumn
|
||||
Width="280"
|
||||
Width="260"
|
||||
Binding="{Binding customIcon}"
|
||||
Header="{x:Static resx:ResUI.LvCustomIcon}" />
|
||||
</DataGrid.Columns>
|
||||
@@ -224,10 +228,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="Domain"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtProxyDomain"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -235,10 +240,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="IP"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtProxyIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -255,10 +261,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="Domain"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtDirectDomain"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -266,10 +273,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="IP"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtDirectIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -286,10 +294,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="0"
|
||||
Header="Domain"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtBlockDomain"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
@@ -297,10 +306,11 @@
|
||||
<GroupBox
|
||||
Grid.Column="2"
|
||||
Header="IP"
|
||||
Style="{StaticResource MaterialDesignGroupBox}">
|
||||
Style="{StaticResource MyGroupBox}">
|
||||
<TextBox
|
||||
Name="txtBlockIP"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource DefTextBox}"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Auto" />
|
||||
</GroupBox>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
Margin="4"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||
Style="{StaticResource MyOutlinedTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
@@ -88,7 +88,7 @@
|
||||
VerticalAlignment="Top"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||
Style="{StaticResource MyOutlinedTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
@@ -120,7 +120,7 @@
|
||||
VerticalAlignment="Top"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||
Style="{StaticResource MyOutlinedTextBox}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
@@ -139,7 +139,7 @@
|
||||
VerticalAlignment="Top"
|
||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.SubUrlTips}"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="6"
|
||||
@@ -156,7 +156,7 @@
|
||||
Margin="4"
|
||||
VerticalAlignment="Top"
|
||||
AcceptsReturn="True"
|
||||
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
|
||||
Style="{StaticResource MyOutlinedTextBox}" />
|
||||
|
||||
</Grid>
|
||||
<Grid
|
||||
|
||||
@@ -9,10 +9,11 @@
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
||||
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
||||
<FileVersion>6.8</FileVersion>
|
||||
<FileVersion>6.12</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Downloader" Version="3.0.3" />
|
||||
<PackageReference Include="MaterialDesignThemes" Version="4.7.1" />
|
||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
@@ -25,7 +26,7 @@
|
||||
<PackageReference Include="ReactiveUI.Fody" Version="18.4.1" />
|
||||
<PackageReference Include="ReactiveUI.Validation" Version="3.0.22" />
|
||||
<PackageReference Include="ReactiveUI.WPF" Version="18.4.1" />
|
||||
<PackageReference Include="Splat.NLog" Version="14.6.1" />
|
||||
<PackageReference Include="Splat.NLog" Version="14.6.8" />
|
||||
<PackageReference Include="System.Reactive" Version="5.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -99,15 +100,9 @@
|
||||
<EmbeddedResource Update="Resx\ResUI.fa-Ir.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="Resources\Fonts\SourceHanSansCN-Regular.ttf">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="Resources\Fonts\微软雅黑.ttf">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<EmbeddedResource Update="Resx\ResUI.ru.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
Reference in New Issue
Block a user