diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 774c6d3f..87030e41 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -162,6 +162,7 @@ namespace ServiceLib.Handler config.ClashUIItem ??= new(); config.SystemProxyItem ??= new(); config.WebDavItem ??= new(); + config.CheckUpdateItem ??= new(); return config; } diff --git a/v2rayN/ServiceLib/Models/CheckUpdateItem.cs b/v2rayN/ServiceLib/Models/CheckUpdateModel.cs similarity index 88% rename from v2rayN/ServiceLib/Models/CheckUpdateItem.cs rename to v2rayN/ServiceLib/Models/CheckUpdateModel.cs index 4ce1c74f..03080c79 100644 --- a/v2rayN/ServiceLib/Models/CheckUpdateItem.cs +++ b/v2rayN/ServiceLib/Models/CheckUpdateModel.cs @@ -1,6 +1,6 @@ namespace ServiceLib.Models { - public class CheckUpdateItem + public class CheckUpdateModel { public bool? IsSelected { get; set; } public string? CoreType { get; set; } diff --git a/v2rayN/ServiceLib/Models/Config.cs b/v2rayN/ServiceLib/Models/Config.cs index fce57300..075f5049 100644 --- a/v2rayN/ServiceLib/Models/Config.cs +++ b/v2rayN/ServiceLib/Models/Config.cs @@ -15,15 +15,14 @@ public bool IsRunningCore(ECoreType type) { - if (type == ECoreType.Xray && RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5) + switch (type) { - return true; + case ECoreType.Xray when RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5: + case ECoreType.sing_box when RunningCoreType is ECoreType.sing_box or ECoreType.mihomo: + return true; + default: + return false; } - if (type == ECoreType.sing_box && RunningCoreType is ECoreType.sing_box or ECoreType.mihomo) - { - return true; - } - return false; } #endregion property @@ -46,6 +45,7 @@ public ClashUIItem ClashUIItem { get; set; } public SystemProxyItem SystemProxyItem { get; set; } public WebDavItem WebDavItem { get; set; } + public CheckUpdateItem CheckUpdateItem { get; set; } public List Inbound { get; set; } public List GlobalHotkeys { get; set; } public List CoreTypeItem { get; set; } diff --git a/v2rayN/ServiceLib/Models/ConfigItems.cs b/v2rayN/ServiceLib/Models/ConfigItems.cs index 08414081..84c9ff3f 100644 --- a/v2rayN/ServiceLib/Models/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/ConfigItems.cs @@ -80,9 +80,7 @@ public bool IgnoreGeoUpdateCore { get; set; } = true; public int AutoUpdateInterval { get; set; } - - public bool CheckPreReleaseUpdate { get; set; } = false; - + public bool EnableSecurityProtocolTls13 { get; set; } public int TrayMenuServersLimit { get; set; } = 20; @@ -245,4 +243,11 @@ public string? Password { get; set; } public string? DirName { get; set; } } + + [Serializable] + public class CheckUpdateItem + { + public bool CheckPreReleaseUpdate { get; set; } + public List? SelectedCoreTypes { get; set; } + } } \ No newline at end of file diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index a467f746..a62c3f2a 100644 --- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -12,10 +12,10 @@ namespace ServiceLib.ViewModels { private const string _geo = "GeoFiles"; private string _v2rayN = ECoreType.v2rayN.ToString(); - private List _lstUpdated = []; + private List _lstUpdated = []; - private IObservableCollection _checkUpdateItem = new ObservableCollectionExtended(); - public IObservableCollection CheckUpdateItems => _checkUpdateItem; + private IObservableCollection _checkUpdateModel = new ObservableCollectionExtended(); + public IObservableCollection CheckUpdateModels => _checkUpdateModel; public ReactiveCommand CheckUpdateCmd { get; } [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } @@ -29,65 +29,56 @@ namespace ServiceLib.ViewModels await CheckUpdate(); }); - EnableCheckPreReleaseUpdate = _config.GuiItem.CheckPreReleaseUpdate; + EnableCheckPreReleaseUpdate = _config.CheckUpdateItem.CheckPreReleaseUpdate; this.WhenAnyValue( x => x.EnableCheckPreReleaseUpdate, y => y == true) - .Subscribe(c => { _config.GuiItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); + .Subscribe(c => { _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); - RefreshSubItems(); + RefreshCheckUpdateItems(); } - private void RefreshSubItems() + private void RefreshCheckUpdateItems() { - _checkUpdateItem.Clear(); + _checkUpdateModel.Clear(); if (RuntimeInformation.ProcessArchitecture != Architecture.X86) { - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = false, - CoreType = _v2rayN, - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.Xray.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.mihomo.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); - _checkUpdateItem.Add(new CheckUpdateItem() - { - IsSelected = true, - CoreType = ECoreType.sing_box.ToString(), - Remarks = ResUI.menuCheckUpdate, - }); + _checkUpdateModel.Add(GetCheckUpdateModel(_v2rayN)); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.Xray.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString())); } + _checkUpdateModel.Add(GetCheckUpdateModel(_geo)); + } - _checkUpdateItem.Add(new CheckUpdateItem() + private CheckUpdateModel GetCheckUpdateModel(string coreType) + { + return new() { - IsSelected = true, - CoreType = _geo, + IsSelected = _config.CheckUpdateItem.SelectedCoreTypes?.Contains(coreType) ?? true, + CoreType = coreType, Remarks = ResUI.menuCheckUpdate, - }); + }; + } + + private async Task SaveSelectedCoreTypes() + { + _config.CheckUpdateItem.SelectedCoreTypes = _checkUpdateModel.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList(); + await ConfigHandler.SaveConfig(_config); } private async Task CheckUpdate() { _lstUpdated.Clear(); - _lstUpdated = _checkUpdateItem.Where(x => x.IsSelected == true) - .Select(x => new CheckUpdateItem() { CoreType = x.CoreType }).ToList(); + _lstUpdated = _checkUpdateModel.Where(x => x.IsSelected == true) + .Select(x => new CheckUpdateModel() { CoreType = x.CoreType }).ToList(); + await SaveSelectedCoreTypes(); - for (var k = _checkUpdateItem.Count - 1; k >= 0; k--) + for (var k = _checkUpdateModel.Count - 1; k >= 0; k--) { - var item = _checkUpdateItem[k]; + var item = _checkUpdateModel[k]; if (item.IsSelected != true) continue; UpdateView(item.CoreType, "..."); @@ -161,23 +152,23 @@ namespace ServiceLib.ViewModels }); } - private async Task CheckUpdateCore(CheckUpdateItem item, bool preRelease) + private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease) { void _updateUI(bool success, string msg) { - UpdateView(item.CoreType, msg); + UpdateView(model.CoreType, msg); if (success) { - UpdateView(item.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); + UpdateView(model.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); - UpdatedPlusPlus(item.CoreType, msg); + UpdatedPlusPlus(model.CoreType, msg); } } - var type = (ECoreType)Enum.Parse(typeof(ECoreType), item.CoreType); + var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType); await (new UpdateService()).CheckUpdateCore(type, _config, _updateUI, preRelease) .ContinueWith(t => { - UpdatedPlusPlus(item.CoreType, ""); + UpdatedPlusPlus(model.CoreType, ""); }); } @@ -291,7 +282,7 @@ namespace ServiceLib.ViewModels private void UpdateView(string coreType, string msg) { - var item = new CheckUpdateItem() + var item = new CheckUpdateModel() { CoreType = coreType, Remarks = msg, @@ -299,13 +290,13 @@ namespace ServiceLib.ViewModels _updateView?.Invoke(EViewAction.DispatcherCheckUpdate, item); } - public void UpdateViewResult(CheckUpdateItem item) + public void UpdateViewResult(CheckUpdateModel model) { - var found = _checkUpdateItem.FirstOrDefault(t => t.CoreType == item.CoreType); + var found = _checkUpdateModel.FirstOrDefault(t => t.CoreType == model.CoreType); if (found == null) return; var itemCopy = JsonUtils.DeepCopy(found); - itemCopy.Remarks = item.Remarks; - _checkUpdateItem.Replace(found, itemCopy); + itemCopy.Remarks = model.Remarks; + _checkUpdateModel.Replace(found, itemCopy); } } } \ No newline at end of file diff --git a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs index 26a78152..65369944 100644 --- a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs @@ -53,7 +53,6 @@ namespace ServiceLib.ViewModels [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } [Reactive] public bool EnableSecurityProtocolTls13 { get; set; } [Reactive] public bool AutoHideStartup { get; set; } - [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } [Reactive] public bool EnableDragDropSort { get; set; } [Reactive] public bool DoubleClick2Activate { get; set; } [Reactive] public int AutoUpdateInterval { get; set; } @@ -166,7 +165,6 @@ namespace ServiceLib.ViewModels EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; EnableSecurityProtocolTls13 = _config.GuiItem.EnableSecurityProtocolTls13; AutoHideStartup = _config.UiItem.AutoHideStartup; - EnableCheckPreReleaseUpdate = _config.GuiItem.CheckPreReleaseUpdate; EnableDragDropSort = _config.UiItem.EnableDragDropSort; DoubleClick2Activate = _config.UiItem.DoubleClick2Activate; AutoUpdateInterval = _config.GuiItem.AutoUpdateInterval; @@ -317,7 +315,6 @@ namespace ServiceLib.ViewModels _config.GuiItem.EnableSecurityProtocolTls13 = EnableSecurityProtocolTls13; _config.UiItem.AutoHideStartup = AutoHideStartup; _config.GuiItem.AutoUpdateInterval = AutoUpdateInterval; - _config.GuiItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; _config.UiItem.EnableDragDropSort = EnableDragDropSort; _config.UiItem.DoubleClick2Activate = DoubleClick2Activate; _config.GuiItem.TrayMenuServersLimit = TrayMenuServersLimit; diff --git a/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml b/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml index cd6f3843..8ccd0f07 100644 --- a/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml @@ -39,7 +39,7 @@ + ItemsSource="{Binding CheckUpdateModels}"> diff --git a/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs index 6859b577..5395b1c3 100644 --- a/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/CheckUpdateView.axaml.cs @@ -15,7 +15,7 @@ namespace v2rayN.Desktop.Views this.WhenActivated(disposables => { - this.OneWayBind(ViewModel, vm => vm.CheckUpdateItems, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.CheckUpdateModels, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.CheckUpdateCmd, v => v.btnCheckUpdate).DisposeWith(disposables); @@ -29,7 +29,7 @@ namespace v2rayN.Desktop.Views case EViewAction.DispatcherCheckUpdate: if (obj is null) return false; Dispatcher.UIThread.Post(() => - ViewModel?.UpdateViewResult((CheckUpdateItem)obj), + ViewModel?.UpdateViewResult((CheckUpdateModel)obj), DispatcherPriority.Default); break; diff --git a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml index 8ac6dedc..e56e6c56 100644 --- a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -489,18 +489,7 @@ HorizontalAlignment="Left" Classes="Margin8" /> - - + vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableSecurityProtocolTls13, v => v.togEnableSecurityProtocolTls13.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.CurrentFontFamily, v => v.cmbcurrentFontFamily.SelectedValue).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs b/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs index ad676092..27200ee9 100644 --- a/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs +++ b/v2rayN/v2rayN/Views/CheckUpdateView.xaml.cs @@ -15,7 +15,7 @@ namespace v2rayN.Views this.WhenActivated(disposables => { - this.OneWayBind(ViewModel, vm => vm.CheckUpdateItems, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.CheckUpdateModels, v => v.lstCheckUpdates.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.CheckUpdateCmd, v => v.btnCheckUpdate).DisposeWith(disposables); @@ -30,7 +30,7 @@ namespace v2rayN.Views if (obj is null) return false; Application.Current?.Dispatcher.Invoke((() => { - ViewModel?.UpdateViewResult((CheckUpdateItem)obj); + ViewModel?.UpdateViewResult((CheckUpdateModel)obj); }), DispatcherPriority.Normal); break; diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index a9e51859..61ce6d2c 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -661,20 +661,6 @@ Margin="{StaticResource Margin8}" HorizontalAlignment="Left" /> - - - vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableSecurityProtocolTls13, v => v.togEnableSecurityProtocolTls13.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableCheckPreReleaseUpdate, v => v.togEnableCheckPreReleaseUpdate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoUpdateInterval, v => v.txtautoUpdateInterval.Text).DisposeWith(disposables);