mirror of
https://github.com/2dust/v2rayN.git
synced 2025-08-29 22:36:20 +00:00
add autoswitch toggle button
This commit is contained in:
parent
a0c6b39f5a
commit
5986853801
10 changed files with 100 additions and 6 deletions
|
@ -133,6 +133,13 @@ namespace v2rayN.Handler
|
||||||
mtu = 9000,
|
mtu = 9000,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (config.autoSwitchItem == null)
|
||||||
|
{
|
||||||
|
config.autoSwitchItem = new AutoSwitchItem
|
||||||
|
{
|
||||||
|
EnableAutoSwitch = false,
|
||||||
|
};
|
||||||
|
}
|
||||||
if (config.guiItem == null)
|
if (config.guiItem == null)
|
||||||
{
|
{
|
||||||
config.guiItem = new()
|
config.guiItem = new()
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace v2rayN.Handler
|
||||||
public string indexId { get; set; }
|
public string indexId { get; set; }
|
||||||
public long latency { get; set; }
|
public long latency { get; set; }
|
||||||
}
|
}
|
||||||
internal class ServerAutoSwitch
|
public class ServerAutoSwitch
|
||||||
{
|
{
|
||||||
private List<TestResultItem> testResultItems= new List<TestResultItem>();
|
private List<TestResultItem> testResultItems= new List<TestResultItem>();
|
||||||
private static readonly object objLock = new();
|
private static readonly object objLock = new();
|
||||||
|
@ -70,6 +70,11 @@ namespace v2rayN.Handler
|
||||||
if (taskmain != null)
|
if (taskmain != null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var profiles = LazyConfig.Instance.ProfileItemsAutoSwitch();
|
||||||
|
if (profiles.Count < 2)
|
||||||
|
return;
|
||||||
|
bStop = false;
|
||||||
|
|
||||||
taskmain = Task.Run(() =>
|
taskmain = Task.Run(() =>
|
||||||
{
|
{
|
||||||
int iFailTimeMax = 30;
|
int iFailTimeMax = 30;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
public CoreBasicItem coreBasicItem { get; set; }
|
public CoreBasicItem coreBasicItem { get; set; }
|
||||||
public TunModeItem tunModeItem { get; set; }
|
public TunModeItem tunModeItem { get; set; }
|
||||||
|
public AutoSwitchItem autoSwitchItem { get; set; }
|
||||||
public KcpItem kcpItem { get; set; }
|
public KcpItem kcpItem { get; set; }
|
||||||
public GrpcItem grpcItem { get; set; }
|
public GrpcItem grpcItem { get; set; }
|
||||||
public RoutingBasicItem routingBasicItem { get; set; }
|
public RoutingBasicItem routingBasicItem { get; set; }
|
||||||
|
|
|
@ -167,6 +167,15 @@ namespace v2rayN.Mode
|
||||||
public bool enableIPv6Address { get; set; } = true;
|
public bool enableIPv6Address { get; set; } = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class AutoSwitchItem
|
||||||
|
{
|
||||||
|
public bool EnableAutoSwitch { get; set; }
|
||||||
|
public int FailTimeMax { get; set; } = 60;
|
||||||
|
public int ServerSelectMode { get; set; } = 1;
|
||||||
|
public int mode { get; set; } = 0;
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class SpeedTestItem
|
public class SpeedTestItem
|
||||||
{
|
{
|
||||||
|
|
9
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
9
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
|
@ -2041,6 +2041,15 @@ namespace v2rayN.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 AutoSwitch 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbEnableAutoSwitchAs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbEnableAutoSwitchAs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Enable advanced function 的本地化字符串。
|
/// 查找类似 Enable advanced function 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -988,6 +988,9 @@
|
||||||
<data name="TbEnableTunAs" xml:space="preserve">
|
<data name="TbEnableTunAs" xml:space="preserve">
|
||||||
<value>Enable Tun</value>
|
<value>Enable Tun</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbEnableAutoSwitchAs" xml:space="preserve">
|
||||||
|
<value>AutoSwitch</value>
|
||||||
|
</data>
|
||||||
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
||||||
<value>New Port for LAN</value>
|
<value>New Port for LAN</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -988,6 +988,9 @@
|
||||||
<data name="TbEnableTunAs" xml:space="preserve">
|
<data name="TbEnableTunAs" xml:space="preserve">
|
||||||
<value>启用Tun模式</value>
|
<value>启用Tun模式</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbEnableAutoSwitchAs" xml:space="preserve">
|
||||||
|
<value>自动切换</value>
|
||||||
|
</data>
|
||||||
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
||||||
<value>为局域网开启新的端口</value>
|
<value>为局域网开启新的端口</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -21,6 +21,7 @@ using v2rayN.Views;
|
||||||
|
|
||||||
namespace v2rayN.ViewModels
|
namespace v2rayN.ViewModels
|
||||||
{
|
{
|
||||||
|
public delegate void SetAutoSwitchTogDelegate(bool b);
|
||||||
public class MainWindowViewModel : ReactiveObject
|
public class MainWindowViewModel : ReactiveObject
|
||||||
{
|
{
|
||||||
#region private prop
|
#region private prop
|
||||||
|
@ -35,7 +36,11 @@ namespace v2rayN.ViewModels
|
||||||
private readonly PaletteHelper _paletteHelper = new();
|
private readonly PaletteHelper _paletteHelper = new();
|
||||||
private Dictionary<string, bool> _dicHeaderSort = new();
|
private Dictionary<string, bool> _dicHeaderSort = new();
|
||||||
private Action<EViewAction> _updateView;
|
private Action<EViewAction> _updateView;
|
||||||
|
private SetAutoSwitchTogDelegate _setAutoSwitchTog;
|
||||||
|
public void SetDelegate(SetAutoSwitchTogDelegate s = null)
|
||||||
|
{
|
||||||
|
this._setAutoSwitchTog = s;
|
||||||
|
}
|
||||||
#endregion private prop
|
#endregion private prop
|
||||||
|
|
||||||
#region ObservableCollection
|
#region ObservableCollection
|
||||||
|
@ -228,6 +233,9 @@ namespace v2rayN.ViewModels
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public bool EnableTun { get; set; }
|
public bool EnableTun { get; set; }
|
||||||
|
|
||||||
|
[Reactive]
|
||||||
|
public bool EnableAutoSwitch { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public bool ColorModeDark { get; set; }
|
public bool ColorModeDark { get; set; }
|
||||||
|
|
||||||
|
@ -250,7 +258,7 @@ namespace v2rayN.ViewModels
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ServerAutoSwitch ServerAutoSwitchs= new ServerAutoSwitch();
|
public ServerAutoSwitch ServerAutoSwitchs= new ServerAutoSwitch();
|
||||||
|
|
||||||
#region Init
|
#region Init
|
||||||
|
|
||||||
|
@ -276,6 +284,8 @@ namespace v2rayN.ViewModels
|
||||||
}
|
}
|
||||||
_subId = _config.subIndexId;
|
_subId = _config.subIndexId;
|
||||||
|
|
||||||
|
EnableAutoSwitch = _config.autoSwitchItem.EnableAutoSwitch;
|
||||||
|
|
||||||
InitSubscriptionView();
|
InitSubscriptionView();
|
||||||
RefreshRoutingsMenu();
|
RefreshRoutingsMenu();
|
||||||
RefreshServers();
|
RefreshServers();
|
||||||
|
@ -319,6 +329,8 @@ namespace v2rayN.ViewModels
|
||||||
y => y == true)
|
y => y == true)
|
||||||
.Subscribe(c => DoEnableTun(c));
|
.Subscribe(c => DoEnableTun(c));
|
||||||
|
|
||||||
|
this.WhenAnyValue(x => x.EnableAutoSwitch).Subscribe(c => DoEnableAutoSwitch(c));
|
||||||
|
|
||||||
BindingUI();
|
BindingUI();
|
||||||
RestoreUI();
|
RestoreUI();
|
||||||
AutoHideStartup();
|
AutoHideStartup();
|
||||||
|
@ -593,7 +605,8 @@ namespace v2rayN.ViewModels
|
||||||
Reload();
|
Reload();
|
||||||
ChangeSystemProxyStatus(_config.sysProxyType, true);
|
ChangeSystemProxyStatus(_config.sysProxyType, true);
|
||||||
ServerAutoSwitchs.SetDelegate(SetDefaultServer);
|
ServerAutoSwitchs.SetDelegate(SetDefaultServer);
|
||||||
ServerAutoSwitchs.Start();
|
if(_config.autoSwitchItem.EnableAutoSwitch)
|
||||||
|
ServerAutoSwitchs.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProgramStarted(object state, bool timeout)
|
private void OnProgramStarted(object state, bool timeout)
|
||||||
|
@ -1644,6 +1657,37 @@ namespace v2rayN.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DoEnableAutoSwitch(bool c)
|
||||||
|
{
|
||||||
|
if (_config.autoSwitchItem.EnableAutoSwitch != c)
|
||||||
|
{
|
||||||
|
_config.autoSwitchItem.EnableAutoSwitch = c;
|
||||||
|
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
var profiles = LazyConfig.Instance.ProfileItemsAutoSwitch();
|
||||||
|
if (profiles.Count < 2)
|
||||||
|
{
|
||||||
|
MessageBox.Show("选择的切换服务器必须大于等于2才能启动切换!");
|
||||||
|
_setAutoSwitchTog(false);
|
||||||
|
_config.autoSwitchItem.EnableAutoSwitch = false;
|
||||||
|
EnableAutoSwitch = false;
|
||||||
|
ConfigHandler.SaveConfig(ref _config);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ServerAutoSwitchs.Start();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
ServerAutoSwitchs.Stop();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
ConfigHandler.SaveConfig(ref _config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion System proxy and Routings
|
#endregion System proxy and Routings
|
||||||
|
|
||||||
#region UI
|
#region UI
|
||||||
|
|
|
@ -431,6 +431,12 @@
|
||||||
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}"
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}"
|
||||||
materialDesign:TextFieldAssist.HasClearButton="True"
|
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||||
Style="{StaticResource DefTextBox}" />
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
<TextBlock
|
||||||
|
Text="{x:Static resx:ResUI.TbEnableAutoSwitchAs}" VerticalAlignment="Center" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togEnableAutoSwitch"
|
||||||
|
Margin="4"
|
||||||
|
HorizontalAlignment="Left" />
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
|
|
||||||
<materialDesign:ColorZone
|
<materialDesign:ColorZone
|
||||||
|
@ -785,7 +791,7 @@
|
||||||
x:Name="tbNotify"
|
x:Name="tbNotify"
|
||||||
IconSource="/v2rayN.ico"
|
IconSource="/v2rayN.ico"
|
||||||
NoLeftClickDelay="True"
|
NoLeftClickDelay="True"
|
||||||
ToolTipText="v2rayN">
|
ToolTipText="v2rayN" d:IsHidden="True">
|
||||||
<tb:TaskbarIcon.ContextMenu>
|
<tb:TaskbarIcon.ContextMenu>
|
||||||
<ContextMenu Style="{StaticResource DefContextMenu}">
|
<ContextMenu Style="{StaticResource DefContextMenu}">
|
||||||
<MenuItem x:Name="menuSystemProxyClear" Height="{StaticResource MenuItemHeight}">
|
<MenuItem x:Name="menuSystemProxyClear" Height="{StaticResource MenuItemHeight}">
|
||||||
|
|
|
@ -60,6 +60,8 @@ namespace v2rayN.Views
|
||||||
ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler);
|
ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler);
|
||||||
Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel));
|
Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel));
|
||||||
|
|
||||||
|
ViewModel.SetDelegate((bool b)=> togEnableAutoSwitch.IsChecked = b);
|
||||||
|
|
||||||
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 8; i++)
|
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 8; i++)
|
||||||
{
|
{
|
||||||
cmbCurrentFontSize.Items.Add(i.ToString());
|
cmbCurrentFontSize.Items.Add(i.ToString());
|
||||||
|
@ -192,6 +194,7 @@ namespace v2rayN.Views
|
||||||
this.OneWayBind(ViewModel, vm => vm.SpeedProxyDisplay, v => v.txtSpeedProxyDisplay.Text).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.SpeedProxyDisplay, v => v.txtSpeedProxyDisplay.Text).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.SpeedDirectDisplay, v => v.txtSpeedDirectDisplay.Text).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.SpeedDirectDisplay, v => v.txtSpeedDirectDisplay.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableTun, v => v.togEnableTun.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableTun, v => v.togEnableTun.IsChecked).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.EnableAutoSwitch, v => v.togEnableAutoSwitch.IsChecked).DisposeWith(disposables);
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.SystemProxySelected, v => v.cmbSystemProxy.SelectedIndex).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SystemProxySelected, v => v.cmbSystemProxy.SelectedIndex).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.RoutingItems, v => v.cmbRoutings2.ItemsSource).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.RoutingItems, v => v.cmbRoutings2.ItemsSource).DisposeWith(disposables);
|
||||||
|
@ -466,7 +469,7 @@ namespace v2rayN.Views
|
||||||
Width = _config.uiItem.mainWidth;
|
Width = _config.uiItem.mainWidth;
|
||||||
Height = _config.uiItem.mainHeight;
|
Height = _config.uiItem.mainHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxWidth = SystemParameters.WorkArea.Width;
|
var maxWidth = SystemParameters.WorkArea.Width;
|
||||||
var maxHeight = SystemParameters.WorkArea.Height;
|
var maxHeight = SystemParameters.WorkArea.Height;
|
||||||
if (Width > maxWidth) Width = maxWidth;
|
if (Width > maxWidth) Width = maxWidth;
|
||||||
|
@ -569,6 +572,10 @@ namespace v2rayN.Views
|
||||||
var item = LazyConfig.Instance.GetProfileItem(ViewModel.SelectedProfile.indexId);
|
var item = LazyConfig.Instance.GetProfileItem(ViewModel.SelectedProfile.indexId);
|
||||||
item.autoSwitch = ViewModel.SelectedProfile.autoSwitch;
|
item.autoSwitch = ViewModel.SelectedProfile.autoSwitch;
|
||||||
SqliteHelper.Instance.Update(item);
|
SqliteHelper.Instance.Update(item);
|
||||||
|
//if(ViewModel.EnableAutoSwitch)
|
||||||
|
//{
|
||||||
|
// ViewModel.ServerAutoSwitchs.Start();
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
#endregion UI
|
#endregion UI
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue