mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-10-26 10:14:42 +00:00 
			
		
		
		
	Compare commits
	
		
			6 commits
		
	
	
		
			377670eff8
			...
			65b78ce6f9
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 65b78ce6f9 | ||
|   | e96a4818c4 | ||
|   | 0377e7ce19 | ||
|   | 6929886b3e | ||
|   | 721d70c8c7 | ||
|   | 27b45aee83 | 
					 15 changed files with 87 additions and 56 deletions
				
			
		|  | @ -20,11 +20,11 @@ | |||
|     <PackageVersion Include="ReactiveUI.WPF" Version="20.4.1" /> | ||||
|     <PackageVersion Include="Semi.Avalonia" Version="11.2.1.10" /> | ||||
|     <PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.2.1.10" /> | ||||
|     <PackageVersion Include="Splat.NLog" Version="16.2.1" /> | ||||
|     <PackageVersion Include="Splat.NLog" Version="17.0.1" /> | ||||
|     <PackageVersion Include="sqlite-net-pcl" Version="1.9.172" /> | ||||
|     <PackageVersion Include="TaskScheduler" Version="2.12.2" /> | ||||
|     <PackageVersion Include="WebDav.Client" Version="2.9.0" /> | ||||
|     <PackageVersion Include="YamlDotNet" Version="16.3.0" /> | ||||
|     <PackageVersion Include="ZXing.Net.Bindings.SkiaSharp" Version="0.16.14" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| </Project> | ||||
|  |  | |||
|  | @ -6,16 +6,22 @@ namespace ServiceLib.Handler; | |||
| public static class AppEvents | ||||
| { | ||||
|     public static readonly Subject<Unit> ProfilesRefreshRequested = new(); | ||||
|     public static readonly Subject<Unit> SubscriptionsRefreshRequested = new(); | ||||
|     public static readonly Subject<Unit> ProxiesReloadRequested = new(); | ||||
|     public static readonly Subject<ServerSpeedItem> DispatcherStatisticsRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<string> SendSnackMsgRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<string> SendMsgViewRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<Unit> AppExitRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<bool> ShutdownRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<Unit> AdjustMainLvColWidthRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<ServerSpeedItem> DispatcherStatisticsRequested = new(); | ||||
|     public static readonly Subject<string> SetDefaultServerRequested = new(); | ||||
| 
 | ||||
|     public static readonly Subject<Unit> RoutingsMenuRefreshRequested = new(); | ||||
|     public static readonly Subject<Unit> TestServerRequested = new(); | ||||
|     public static readonly Subject<Unit> InboundDisplayRequested = new(); | ||||
|     public static readonly Subject<ESysProxyType> SysProxyChangeRequested = new(); | ||||
| } | ||||
|  |  | |||
|  | @ -69,6 +69,8 @@ public class ClashProxiesViewModel : MyReactiveObject | |||
|         SortingSelected = _config.ClashUIItem.ProxiesSorting; | ||||
|         RuleModeSelected = (int)_config.ClashUIItem.RuleMode; | ||||
| 
 | ||||
|         #region WhenAnyValue && ReactiveCommand | ||||
| 
 | ||||
|         this.WhenAnyValue( | ||||
|            x => x.SelectedGroup, | ||||
|            y => y != null && y.Name.IsNotEmpty()) | ||||
|  | @ -89,6 +91,17 @@ public class ClashProxiesViewModel : MyReactiveObject | |||
|         y => y == true) | ||||
|             .Subscribe(c => { _config.ClashUIItem.ProxiesAutoRefresh = AutoRefresh; }); | ||||
| 
 | ||||
|         #endregion WhenAnyValue && ReactiveCommand | ||||
| 
 | ||||
|         #region AppEvents | ||||
| 
 | ||||
|         AppEvents.ProxiesReloadRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await ProxiesReload()); | ||||
| 
 | ||||
|         #endregion AppEvents | ||||
| 
 | ||||
|         _ = Init(); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ using System.Reactive; | |||
| using System.Reactive.Concurrency; | ||||
| using ReactiveUI; | ||||
| using ReactiveUI.Fody.Helpers; | ||||
| using Splat; | ||||
| 
 | ||||
| namespace ServiceLib.ViewModels; | ||||
| 
 | ||||
|  | @ -240,7 +239,6 @@ public class MainWindowViewModel : MyReactiveObject | |||
|         BlReloadEnabled = true; | ||||
|         await Reload(); | ||||
|         await AutoHideStartup(); | ||||
|         Locator.Current.GetService<StatusBarViewModel>()?.RefreshRoutingsMenu(); | ||||
|     } | ||||
| 
 | ||||
|     #endregion Init | ||||
|  | @ -301,7 +299,7 @@ public class MainWindowViewModel : MyReactiveObject | |||
| 
 | ||||
|     private void RefreshSubscriptions() | ||||
|     { | ||||
|         Locator.Current.GetService<ProfilesViewModel>()?.RefreshSubscriptions(); | ||||
|         AppEvents.SubscriptionsRefreshRequested.OnNext(Unit.Default); | ||||
|     } | ||||
| 
 | ||||
|     #endregion Servers && Groups | ||||
|  | @ -433,7 +431,7 @@ public class MainWindowViewModel : MyReactiveObject | |||
|         var ret = await _updateView?.Invoke(EViewAction.OptionSettingWindow, null); | ||||
|         if (ret == true) | ||||
|         { | ||||
|             Locator.Current.GetService<StatusBarViewModel>()?.InboundDisplayStatus(); | ||||
|             AppEvents.InboundDisplayRequested.OnNext(Unit.Default); | ||||
|             await Reload(); | ||||
|         } | ||||
|     } | ||||
|  | @ -444,7 +442,7 @@ public class MainWindowViewModel : MyReactiveObject | |||
|         if (ret == true) | ||||
|         { | ||||
|             await ConfigHandler.InitBuiltinRouting(_config); | ||||
|             Locator.Current.GetService<StatusBarViewModel>()?.RefreshRoutingsMenu(); | ||||
|             AppEvents.RoutingsMenuRefreshRequested.OnNext(Unit.Default); | ||||
|             await Reload(); | ||||
|         } | ||||
|     } | ||||
|  | @ -518,9 +516,15 @@ public class MainWindowViewModel : MyReactiveObject | |||
|             await SysProxyHandler.UpdateSysProxy(_config, false); | ||||
|             await Task.Delay(1000); | ||||
|         }); | ||||
|         Locator.Current.GetService<StatusBarViewModel>()?.TestServerAvailability(); | ||||
|         AppEvents.TestServerRequested.OnNext(Unit.Default); | ||||
| 
 | ||||
|         RxApp.MainThreadScheduler.Schedule(() => _ = ReloadResult()); | ||||
|         var showClashUI = _config.IsRunningCore(ECoreType.sing_box); | ||||
|         if (showClashUI) | ||||
|         { | ||||
|             AppEvents.ProxiesReloadRequested.OnNext(Unit.Default); | ||||
|         } | ||||
| 
 | ||||
|         RxApp.MainThreadScheduler.Schedule(() => ReloadResult(showClashUI)); | ||||
| 
 | ||||
|         BlReloadEnabled = true; | ||||
|         if (_hasNextReloadJob) | ||||
|  | @ -530,19 +534,11 @@ public class MainWindowViewModel : MyReactiveObject | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public async Task ReloadResult() | ||||
|     private void ReloadResult(bool showClashUI) | ||||
|     { | ||||
|         // BlReloadEnabled = true; | ||||
|         //Locator.Current.GetService<StatusBarViewModel>()?.ChangeSystemProxyAsync(_config.systemProxyItem.sysProxyType, false); | ||||
|         ShowClashUI = _config.IsRunningCore(ECoreType.sing_box); | ||||
|         if (ShowClashUI) | ||||
|         { | ||||
|             Locator.Current.GetService<ClashProxiesViewModel>()?.ProxiesReload(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             TabMainSelectedIndex = 0; | ||||
|         } | ||||
|         ShowClashUI = showClashUI; | ||||
|         TabMainSelectedIndex = showClashUI ? TabMainSelectedIndex : 0; | ||||
|     } | ||||
| 
 | ||||
|     private async Task LoadCore() | ||||
|  | @ -574,7 +570,7 @@ public class MainWindowViewModel : MyReactiveObject | |||
|     { | ||||
|         await ConfigHandler.ApplyRegionalPreset(_config, type); | ||||
|         await ConfigHandler.InitRouting(_config); | ||||
|         Locator.Current.GetService<StatusBarViewModel>()?.RefreshRoutingsMenu(); | ||||
|         AppEvents.RoutingsMenuRefreshRequested.OnNext(Unit.Default); | ||||
| 
 | ||||
|         await ConfigHandler.SaveConfig(_config); | ||||
|         await new UpdateService().UpdateGeoFileAll(_config, UpdateTaskHandler); | ||||
|  |  | |||
|  | @ -240,11 +240,21 @@ public class ProfilesViewModel : MyReactiveObject | |||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await RefreshServersBiz()); | ||||
| 
 | ||||
|         AppEvents.SubscriptionsRefreshRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await RefreshSubscriptions()); | ||||
| 
 | ||||
|         AppEvents.DispatcherStatisticsRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async result => await UpdateStatistics(result)); | ||||
| 
 | ||||
|         AppEvents.SetDefaultServerRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async indexId => await SetDefaultServer(indexId)); | ||||
| 
 | ||||
|         #endregion AppEvents | ||||
| 
 | ||||
|         _ = Init(); | ||||
|  | @ -380,7 +390,7 @@ public class ProfilesViewModel : MyReactiveObject | |||
|         await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null); | ||||
|     } | ||||
| 
 | ||||
|     public async Task RefreshSubscriptions() | ||||
|     private async Task RefreshSubscriptions() | ||||
|     { | ||||
|         SubItems.Clear(); | ||||
| 
 | ||||
|  | @ -565,7 +575,7 @@ public class ProfilesViewModel : MyReactiveObject | |||
|         await SetDefaultServer(SelectedProfile.IndexId); | ||||
|     } | ||||
| 
 | ||||
|     public async Task SetDefaultServer(string? indexId) | ||||
|     private async Task SetDefaultServer(string? indexId) | ||||
|     { | ||||
|         if (indexId.IsNullOrEmpty()) | ||||
|         { | ||||
|  |  | |||
|  | @ -11,6 +11,9 @@ namespace ServiceLib.ViewModels; | |||
| 
 | ||||
| public class StatusBarViewModel : MyReactiveObject | ||||
| { | ||||
|     private static readonly Lazy<StatusBarViewModel> _instance = new(() => new(null)); | ||||
|     public static StatusBarViewModel Instance => _instance.Value; | ||||
| 
 | ||||
|     #region ObservableCollection | ||||
| 
 | ||||
|     public IObservableCollection<RoutingItem> RoutingItems { get; } = new ObservableCollectionExtended<RoutingItem>(); | ||||
|  | @ -209,6 +212,26 @@ public class StatusBarViewModel : MyReactiveObject | |||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async result => await UpdateStatistics(result)); | ||||
| 
 | ||||
|         AppEvents.RoutingsMenuRefreshRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await RefreshRoutingsMenu()); | ||||
| 
 | ||||
|         AppEvents.TestServerRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await TestServerAvailability()); | ||||
| 
 | ||||
|         AppEvents.InboundDisplayRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async _ => await InboundDisplayStatus()); | ||||
| 
 | ||||
|         AppEvents.SysProxyChangeRequested | ||||
|             .AsObservable() | ||||
|             .ObserveOn(RxApp.MainThreadScheduler) | ||||
|             .Subscribe(async result => await SetListenerType(result)); | ||||
| 
 | ||||
|         #endregion AppEvents | ||||
| 
 | ||||
|         _ = Init(); | ||||
|  | @ -329,7 +352,7 @@ public class StatusBarViewModel : MyReactiveObject | |||
|         { | ||||
|             return; | ||||
|         } | ||||
|         Locator.Current.GetService<ProfilesViewModel>()?.SetDefaultServer(SelectedServer.ID); | ||||
|         AppEvents.SetDefaultServerRequested.OnNext(SelectedServer.ID); | ||||
|     } | ||||
| 
 | ||||
|     public async Task TestServerAvailability() | ||||
|  | @ -364,7 +387,7 @@ public class StatusBarViewModel : MyReactiveObject | |||
| 
 | ||||
|     #region System proxy and Routings | ||||
| 
 | ||||
|     public async Task SetListenerType(ESysProxyType type) | ||||
|     private async Task SetListenerType(ESysProxyType type) | ||||
|     { | ||||
|         if (_config.SystemProxyItem.SysProxyType == type) | ||||
|         { | ||||
|  | @ -393,7 +416,7 @@ public class StatusBarViewModel : MyReactiveObject | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public async Task RefreshRoutingsMenu() | ||||
|     private async Task RefreshRoutingsMenu() | ||||
|     { | ||||
|         RoutingItems.Clear(); | ||||
| 
 | ||||
|  | @ -501,7 +524,7 @@ public class StatusBarViewModel : MyReactiveObject | |||
| 
 | ||||
|     #region UI | ||||
| 
 | ||||
|     public async Task InboundDisplayStatus() | ||||
|     private async Task InboundDisplayStatus() | ||||
|     { | ||||
|         StringBuilder sb = new(); | ||||
|         sb.Append($"[{EInboundProtocol.mixed}:{AppManager.Instance.GetLocalPort(EInboundProtocol.socks)}"); | ||||
|  |  | |||
|  | @ -16,9 +16,7 @@ public partial class App : Application | |||
|         AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; | ||||
|         TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; | ||||
| 
 | ||||
|         var ViewModel = new StatusBarViewModel(null); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(StatusBarViewModel)); | ||||
|         DataContext = ViewModel; | ||||
|         DataContext = StatusBarViewModel.Instance; | ||||
|     } | ||||
| 
 | ||||
|     public override void OnFrameworkInitializationCompleted() | ||||
|  |  | |||
|  | @ -3,7 +3,6 @@ using Avalonia.Input; | |||
| using Avalonia.ReactiveUI; | ||||
| using DynamicData; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| 
 | ||||
| namespace v2rayN.Desktop.Views; | ||||
| 
 | ||||
|  | @ -13,7 +12,6 @@ public partial class ClashProxiesView : ReactiveUserControl<ClashProxiesViewMode | |||
|     { | ||||
|         InitializeComponent(); | ||||
|         ViewModel = new ClashProxiesViewModel(UpdateViewHandler); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); | ||||
|         lstProxyDetails.DoubleTapped += LstProxyDetails_DoubleTapped; | ||||
|         this.KeyDown += ClashProxiesView_KeyDown; | ||||
| 
 | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ namespace v2rayN.Desktop.Views; | |||
| public partial class MainWindow : WindowBase<MainWindowViewModel> | ||||
| { | ||||
|     private static Config _config; | ||||
|     private WindowNotificationManager? _manager; | ||||
|     private readonly WindowNotificationManager? _manager; | ||||
|     private CheckUpdateView? _checkUpdateView; | ||||
|     private BackupAndRestoreView? _backupAndRestoreView; | ||||
|     private bool _blCloseByUser = false; | ||||
|  | @ -259,7 +259,7 @@ public partial class MainWindow : WindowBase<MainWindowViewModel> | |||
|             case EGlobalHotkey.SystemProxySet: | ||||
|             case EGlobalHotkey.SystemProxyUnchanged: | ||||
|             case EGlobalHotkey.SystemProxyPac: | ||||
|                 Locator.Current.GetService<StatusBarViewModel>()?.SetListenerType((ESysProxyType)((int)e - 1)); | ||||
|                 AppEvents.SysProxyChangeRequested.OnNext((ESysProxyType)((int)e - 1)); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -8,7 +8,6 @@ using Avalonia.Threading; | |||
| using DialogHostAvalonia; | ||||
| using MsBox.Avalonia.Enums; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| using v2rayN.Desktop.Common; | ||||
| 
 | ||||
| namespace v2rayN.Desktop.Views; | ||||
|  | @ -48,7 +47,6 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel> | |||
|         //} | ||||
| 
 | ||||
|         ViewModel = new ProfilesViewModel(UpdateViewHandler); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); | ||||
| 
 | ||||
|         this.WhenActivated(disposables => | ||||
|         { | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ using Avalonia.ReactiveUI; | |||
| using Avalonia.Threading; | ||||
| using DialogHostAvalonia; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| using v2rayN.Desktop.Common; | ||||
| 
 | ||||
| namespace v2rayN.Desktop.Views; | ||||
|  | @ -20,9 +19,8 @@ public partial class StatusBarView : ReactiveUserControl<StatusBarViewModel> | |||
|         InitializeComponent(); | ||||
| 
 | ||||
|         _config = AppManager.Instance.Config; | ||||
|         //ViewModel = new StatusBarViewModel(UpdateViewHandler); | ||||
|         //Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(StatusBarViewModel)); | ||||
|         ViewModel = Locator.Current.GetService<StatusBarViewModel>(); | ||||
|          | ||||
|         ViewModel = StatusBarViewModel.Instance; | ||||
|         ViewModel?.InitUpdateView(UpdateViewHandler); | ||||
| 
 | ||||
|         txtRunningServerDisplay.Tapped += TxtRunningServerDisplay_Tapped; | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| using System.Reactive.Disposables; | ||||
| using System.Windows.Input; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| 
 | ||||
| namespace v2rayN.Views; | ||||
| 
 | ||||
|  | @ -14,7 +13,6 @@ public partial class ClashProxiesView | |||
|     { | ||||
|         InitializeComponent(); | ||||
|         ViewModel = new ClashProxiesViewModel(UpdateViewHandler); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); | ||||
|         lstProxyDetails.PreviewMouseDoubleClick += lstProxyDetails_PreviewMouseDoubleClick; | ||||
| 
 | ||||
|         this.WhenActivated(disposables => | ||||
|  |  | |||
|  | @ -249,7 +249,7 @@ public partial class MainWindow | |||
|             case EGlobalHotkey.SystemProxySet: | ||||
|             case EGlobalHotkey.SystemProxyUnchanged: | ||||
|             case EGlobalHotkey.SystemProxyPac: | ||||
|                 Locator.Current.GetService<StatusBarViewModel>()?.SetListenerType((ESysProxyType)((int)e - 1)); | ||||
|                 AppEvents.SysProxyChangeRequested.OnNext((ESysProxyType)((int)e - 1)); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | @ -287,11 +287,7 @@ public partial class MainWindow | |||
|                     var clipboardData = WindowsUtils.GetClipboardData(); | ||||
|                     if (clipboardData.IsNotEmpty()) | ||||
|                     { | ||||
|                         var service = Locator.Current.GetService<MainWindowViewModel>(); | ||||
|                         if (service != null) | ||||
|                         { | ||||
|                             _ = service.AddServerViaClipboardAsync(clipboardData); | ||||
|                         } | ||||
|                         ViewModel?.AddServerViaClipboardAsync(clipboardData); | ||||
|                     } | ||||
| 
 | ||||
|                     break; | ||||
|  |  | |||
|  | @ -8,7 +8,6 @@ using System.Windows.Media; | |||
| using System.Windows.Threading; | ||||
| using MaterialDesignThemes.Wpf; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| using v2rayN.Base; | ||||
| using Point = System.Windows.Point; | ||||
| 
 | ||||
|  | @ -42,7 +41,6 @@ public partial class ProfilesView | |||
|         } | ||||
| 
 | ||||
|         ViewModel = new ProfilesViewModel(UpdateViewHandler); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); | ||||
| 
 | ||||
|         this.WhenActivated(disposables => | ||||
|         { | ||||
|  |  | |||
|  | @ -3,7 +3,6 @@ using System.Windows; | |||
| using System.Windows.Input; | ||||
| using System.Windows.Threading; | ||||
| using ReactiveUI; | ||||
| using Splat; | ||||
| using v2rayN.Manager; | ||||
| 
 | ||||
| namespace v2rayN.Views; | ||||
|  | @ -16,8 +15,8 @@ public partial class StatusBarView | |||
|     { | ||||
|         InitializeComponent(); | ||||
|         _config = AppManager.Instance.Config; | ||||
|         ViewModel = new StatusBarViewModel(UpdateViewHandler); | ||||
|         Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(StatusBarViewModel)); | ||||
|         ViewModel = StatusBarViewModel.Instance; | ||||
|         ViewModel?.InitUpdateView(UpdateViewHandler); | ||||
| 
 | ||||
|         menuExit.Click += menuExit_Click; | ||||
|         txtRunningServerDisplay.PreviewMouseDown += txtRunningInfoDisplay_MouseDoubleClick; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue