using Avalonia; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Documents; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using FxpConvert.Common; using Shaker.Models; using ShakerApp.Tools; using ShakerApp.ViewModels; using SukiUI.Dialogs; using SukiUI.Toasts; using System; using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Input; namespace ShakerApp.ViewModels; public class MainViewModel : ViewModelBase { public ICalc Calc { get; } = new SIMDFxpConvert.SIMDCalc(); private AvaloniaDictionary OpenedWindows = new AvaloniaDictionary(); private bool canDebug = false; private MainViewModel() { #if DEBUG CanDebug = true; #else CanDebug = false; #endif GetEvent(ShakerSettingViewModel.LANGUAGECHANGEDEVENT).Subscrip((_, _) => { OnPropertyChanged(nameof(Title)); }); MainPageViewModel.Instance.PropertyChanged += (sender, args) => { switch(args.PropertyName) { case nameof(MainPageViewModel.MainPageType): OnPropertyChanged(nameof(Title)); break; } }; this.GetType().Assembly.GetTypes() .Where(x => x.IsAnsiClass && !x.IsAbstract && x.IsAssignableTo(typeof(ObservableObject))) .ToList() .ForEach(x => { var val = x.GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public) .FirstOrDefault(y => y.PropertyType == x); val?.GetValue(null); }); } static MainViewModel() { } public ICommand ExitCommand => new RelayCommand(Exit); private void Exit() { Dialogs.Ask(App.Current?.FindResource("PromptExitMsg")+"",()=> { CommunicationViewModel.Intance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null); Environment.Exit(0); }); } public override string Title => MainPageViewModel.Instance.MainPageType == MainPageType.StartPage ? App.Current?.FindResource("Title")+"" : $"{App.Current?.FindResource("Title")}-[{App.Current?.FindResource(MainPageViewModel.Instance.MainPageType.Description())}]"; public bool CanDebug { get => canDebug; set =>SetProperty(ref canDebug, value); } public ICommand SettingCommand => new RelayCommand(Setting); private async void Setting(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { ShakerSettingViewModel.Instance.InitData(); ShakerSettingViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = ShakerSettingViewModel.Instance; await window.ShowDialog(desktop.MainWindow!); } } public ICommand DeviceMangerCommand => new RelayCommand(DeviceManger); private async void DeviceManger(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { DeviceMangerViewModel.Instance.InitData(); DeviceMangerViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = DeviceMangerViewModel.Instance; DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close(); await window.ShowDialog(desktop.MainWindow!); } } public ICommand SelectTestTypeCommand => new RelayCommand(SelectTestType); private void SelectTestType(MainPageType type) { MainPageViewModel.Instance.MainPageType = type; } public ICommand SaveConfigCommand => new RelayCommand(SaveConfig); private async void SaveConfig(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { SaveConfigViewModel.Instance.InitData(); SaveConfigViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = SaveConfigViewModel.Instance; DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close(); await window.ShowDialog(desktop.MainWindow!); } } public ICommand SignalPreviewCommand=> new RelayCommand(SignalPreview); private void SignalPreview(string? p) { if (string.IsNullOrEmpty(p)) return; if (OpenedWindows.TryGetValue(p, out var w)) { if (w != null && w.IsLoaded) { w.Activate(); return; } } SignalPreviewViewModel.Instance.InitData(); SignalPreviewViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = SignalPreviewViewModel.Instance; OpenedWindows[p] = window; SignalPreviewViewModel.Instance.CloseWindowAction = () => { window?.Close(); OpenedWindows[p] = null; }; window.Show(); } public ICommand LoadConfigCommand => new RelayCommand(LoadConfig); private async void LoadConfig(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { LoadConfigViewModel.Instance.InitData(); LoadConfigViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = LoadConfigViewModel.Instance; DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close(); await window.ShowDialog(desktop.MainWindow!); } } public ICommand ShakerConfigCommand => new RelayCommand(ShakerConfig); private async void ShakerConfig(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { ShakerConfigViewModel.Instance.InitData(); ShakerConfigViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = ShakerConfigViewModel.Instance; ShakerConfigViewModel.Instance.CloseWindowAction = () => window?.Close(); await window.ShowDialog(desktop.MainWindow!); } } public ICommand OilControlCommand => new RelayCommand(OilControl); private void OilControl(string? p) { if (string.IsNullOrEmpty(p)) return; if(OpenedWindows.TryGetValue(p,out var w)) { if(w!=null && w.IsLoaded) { w.Activate(); return; } } OilSourceStatusViewModel.Instance.InitData(); OilSourceStatusViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = OilSourceStatusViewModel.Instance; OpenedWindows[p] = window; OilSourceStatusViewModel.Instance.CloseWindowAction = () => { window?.Close(); OpenedWindows[p] = null; }; window.Show(); } public ICommand CloseCommand => new RelayCommand(Close); private void Close() { CommunicationViewModel.Intance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null); Environment.Exit(0); } public ICommand DebugCommand => new RelayCommand(Debug); public async void Debug(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { InputPassWordViewModel.Instance.InitData(); BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = InputPassWordViewModel.Instance; InputPassWordViewModel.Instance.CloseWindowAction = () => window?.Close(); InputPassWordViewModel.Instance.InputAction = (pass) => { window?.Close(); if(pass != "123456") { ToastManager.CreateSimpleInfoToast().WithTitle(App.Current?.FindResource("PromptTitle")+"").WithContent(App.Current?.FindResource("PassWordError") + "").Queue(); return; } ShowDebug(p); }; await window.ShowDialog(desktop.MainWindow!); } } private async void ShowDebug(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { ShakerControlViewModel.Instance.InitData(); ShakerControlViewModel.Instance.Title = p; ShakerControlViewModel.Instance.Content = typeof(Views.DebugView); BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = ShakerControlViewModel.Instance; ShakerControlViewModel.Instance.CloseWindowAction = () => { window?.Close(); }; await window.ShowDialog(desktop.MainWindow!); } } public ICommand SweepConfigCommand => new RelayCommand(SweepConfig); private async void SweepConfig(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { SweepConfigViewModel.Instance.InitData(); SweepConfigViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = SweepConfigViewModel.Instance; await window.ShowDialog(desktop.MainWindow!); } } public ICommand RandomConfigCommand => new RelayCommand(RandomConfig); private async void RandomConfig(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { RandomConfigViewModel.Instance.InitData(); RandomConfigViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = RandomConfigViewModel.Instance; await window.ShowDialog(desktop.MainWindow!); } } public ICommand AboutCommand => new RelayCommand(About); private async void About(string? p) { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p)) { AboutViewModel.Instance.InitData(); AboutViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = AboutViewModel.Instance; await window.ShowDialog(desktop.MainWindow!); } } public ICommand DisConnectCommand => new RelayCommand(DisConnect); private void DisConnect() { Dialogs.Ask(App.Current?.FindResource("AskDisconnect") + "", () => { CommunicationViewModel.Intance.LocalCommunication?.GetEvent(Topic.STOP).Publish(this, null); CommunicationViewModel.Intance.DisConnect(); }); } public ICommand ShakerControlCommand => new RelayCommand(ShakerControl); private void ShakerControl(string? p) { if (string.IsNullOrEmpty(p)) return; if (OpenedWindows.TryGetValue(p, out var w)) { if (w != null && w.IsLoaded) { w.Activate(); return; } } ShakerStatusViewModel.Instance.InitData(); ShakerStatusViewModel.Instance.Title = p; BaseDialogWindow window = new BaseDialogWindow(); window.DataContext = ShakerStatusViewModel.Instance; OpenedWindows[p] = window; ShakerStatusViewModel.Instance.CloseWindowAction = () => { window?.Close(); OpenedWindows[p] = null; }; window.Show(); } public void SyncConfig() { var config= CommunicationViewModel.Intance.LocalCommunication.GetEvent(Shaker.Models.Topic.SYNCCONFIG).Publish(this); if(config ==null) { base.ToastManager.CreateSimpleInfoToast() .WithTitle(App.Current?.FindResource("PromptTitle") + "") .WithContent(App.Current?.FindResource("GetConfigError")+"") .Queue(); CommunicationViewModel.Intance.LocalCommunication.Close(); return; } GetEvent().Publish(this, config); CommunicationViewModel.Intance.LocalCommunication.GetEvent(Topic.START).Publish(this); } public static MainViewModel Default { get; } = new MainViewModel(); }