diff --git a/v2rayN/ServiceLib/Enums/EMsgCommand.cs b/v2rayN/ServiceLib/Enums/EMsgCommand.cs deleted file mode 100644 index fe7d01cc..00000000 --- a/v2rayN/ServiceLib/Enums/EMsgCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ServiceLib.Enums; - -public enum EMsgCommand -{ - ClearMsg, - SendMsgView, - SendSnackMsg, - AppExit -} diff --git a/v2rayN/ServiceLib/Handler/AppEvents.cs b/v2rayN/ServiceLib/Handler/AppEvents.cs index b2992721..093c5259 100644 --- a/v2rayN/ServiceLib/Handler/AppEvents.cs +++ b/v2rayN/ServiceLib/Handler/AppEvents.cs @@ -6,4 +6,10 @@ namespace ServiceLib.Handler; public static class AppEvents { public static readonly Subject ProfilesRefreshRequested = new(); + + public static readonly Subject SendSnackMsgRequested = new(); + + public static readonly Subject SendMsgViewRequested = new(); + + public static readonly Subject AppExitRequested = new(); } diff --git a/v2rayN/ServiceLib/Manager/NoticeManager.cs b/v2rayN/ServiceLib/Manager/NoticeManager.cs index 76c01a56..f9e149ed 100644 --- a/v2rayN/ServiceLib/Manager/NoticeManager.cs +++ b/v2rayN/ServiceLib/Manager/NoticeManager.cs @@ -1,5 +1,3 @@ -using ReactiveUI; - namespace ServiceLib.Manager; public class NoticeManager @@ -13,7 +11,7 @@ public class NoticeManager { return; } - MessageBus.Current.SendMessage(content, EMsgCommand.SendSnackMsg.ToString()); + AppEvents.SendSnackMsgRequested.OnNext(content); } public void SendMessage(string? content) @@ -22,7 +20,7 @@ public class NoticeManager { return; } - MessageBus.Current.SendMessage(content, EMsgCommand.SendMsgView.ToString()); + AppEvents.SendMsgViewRequested.OnNext(content); } public void SendMessageEx(string? content) diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 1e64d22a..9ea9e296 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -300,7 +300,7 @@ public class MainWindowViewModel : MyReactiveObject Logging.SaveLog("MyAppExitAsync Begin"); await SysProxyHandler.UpdateSysProxy(_config, true); - MessageBus.Current.SendMessage("", EMsgCommand.AppExit.ToString()); + AppEvents.AppExitRequested.OnNext(Unit.Default); await ConfigHandler.SaveConfig(_config); await ProfileExManager.Instance.SaveTo(); diff --git a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs index 4d13d007..87a3016c 100644 --- a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using System.Reactive.Linq; using System.Text.RegularExpressions; using ReactiveUI; using ReactiveUI.Fody.Helpers; @@ -34,12 +35,10 @@ public class MsgViewModel : MyReactiveObject y => y == true) .Subscribe(c => { _config.MsgUIItem.AutoRefresh = AutoRefresh; }); - MessageBus.Current.Listen(EMsgCommand.SendMsgView.ToString()).Subscribe(OnNext); - } - - private async void OnNext(string x) - { - await AppendQueueMsg(x); + AppEvents.SendMsgViewRequested + .AsObservable() + //.ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async content => await AppendQueueMsg(content)); } private async Task AppendQueueMsg(string msg) diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs index 0633e9af..0f1472a4 100644 --- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs @@ -1,4 +1,5 @@ using System.Reactive.Disposables; +using System.Reactive.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; @@ -39,7 +40,6 @@ public partial class MainWindow : WindowBase menuBackupAndRestore.Click += MenuBackupAndRestore_Click; menuClose.Click += MenuClose_Click; - MessageBus.Current.Listen(EMsgCommand.SendSnackMsg.ToString()).Subscribe(DelegateSnackMsg); ViewModel = new MainWindowViewModel(UpdateViewHandler); Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); @@ -136,6 +136,18 @@ public partial class MainWindow : WindowBase this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain2.SelectedIndex).DisposeWith(disposables); break; } + + AppEvents.SendSnackMsgRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async content => await DelegateSnackMsg(content)) + .DisposeWith(disposables); + + AppEvents.AppExitRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(_ => StorageUI()) + .DisposeWith(disposables); }); if (Utils.IsWindows()) @@ -156,7 +168,6 @@ public partial class MainWindow : WindowBase menuAddServerViaScan.IsVisible = false; AddHelpMenuItem(); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); } #region Event @@ -168,11 +179,9 @@ public partial class MainWindow : WindowBase DispatcherPriority.Default); } - private void DelegateSnackMsg(string content) + private async Task DelegateSnackMsg(string content) { - Dispatcher.UIThread.Post(() => - _manager?.Show(new Notification(null, content, NotificationType.Information)), - DispatcherPriority.Normal); + _manager?.Show(new Notification(null, content, NotificationType.Information)); } private async Task UpdateViewHandler(EViewAction action, object? obj) @@ -462,7 +471,7 @@ public partial class MainWindow : WindowBase } } - private void StorageUI(string? n = null) + private void StorageUI() { ConfigHandler.SaveWindowSizeItem(_config, GetType().Name, Width, Height); diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index 73115ed7..4253661b 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -1,4 +1,5 @@ using System.Reactive.Disposables; +using System.Reactive.Linq; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; @@ -96,11 +97,16 @@ public partial class ProfilesView : ReactiveUserControl this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); + + AppEvents.AppExitRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(_ => StorageUI()) + .DisposeWith(disposables); }); RestoreUI(); ViewModel?.RefreshServers(); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); } private async void LstProfiles_Sorting(object? sender, DataGridColumnEventArgs e) @@ -412,7 +418,7 @@ public partial class ProfilesView : ReactiveUserControl } } - private void StorageUI(string? n = null) + private void StorageUI() { List lvColumnItem = new(); foreach (var item2 in lstProfiles.Columns) diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index 37c6bba7..4270ce55 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using System.Reactive.Disposables; +using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -36,7 +37,6 @@ public partial class MainWindow menuCheckUpdate.Click += MenuCheckUpdate_Click; menuBackupAndRestore.Click += MenuBackupAndRestore_Click; - MessageBus.Current.Listen(EMsgCommand.SendSnackMsg.ToString()).Subscribe(DelegateSnackMsg); ViewModel = new MainWindowViewModel(UpdateViewHandler); Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); @@ -133,6 +133,18 @@ public partial class MainWindow this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain2.SelectedIndex).DisposeWith(disposables); break; } + + AppEvents.SendSnackMsgRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async content => await DelegateSnackMsg(content)) + .DisposeWith(disposables); + + AppEvents.AppExitRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(_ => StorageUI()) + .DisposeWith(disposables); }); this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}"; @@ -144,7 +156,6 @@ public partial class MainWindow AddHelpMenuItem(); WindowsManager.Instance.RegisterGlobalHotkey(_config, OnHotkeyHandler, null); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); } #region Event @@ -157,12 +168,9 @@ public partial class MainWindow })); } - private void DelegateSnackMsg(string content) + private async Task DelegateSnackMsg(string content) { - Application.Current?.Dispatcher.Invoke((() => - { - MainSnackbar.MessageQueue?.Enqueue(content); - }), DispatcherPriority.Normal); + MainSnackbar.MessageQueue?.Enqueue(content); } private async Task UpdateViewHandler(EViewAction action, object? obj) @@ -423,7 +431,7 @@ public partial class MainWindow } } - private void StorageUI(string? n = null) + private void StorageUI() { ConfigHandler.SaveWindowSizeItem(_config, GetType().Name, Width, Height); diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs index 456e6ddd..f2456b57 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs @@ -1,4 +1,5 @@ using System.Reactive.Disposables; +using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; @@ -90,11 +91,16 @@ public partial class ProfilesView this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); + + AppEvents.AppExitRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(_ => StorageUI()) + .DisposeWith(disposables); }); RestoreUI(); ViewModel?.RefreshServers(); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); } #region Event @@ -369,7 +375,7 @@ public partial class ProfilesView } } - private void StorageUI(string? n = null) + private void StorageUI() { List lvColumnItem = new(); foreach (var t in lstProfiles.Columns)