1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Robert c99224ab2d Node editor - Added VM structure
Debugger - Run updates on UI thread
2022-03-11 17:22:29 +01:00

148 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.Core.Services;
using Artemis.UI.Shared;
using Artemis.UI.Shared.DataModelVisualization.Shared;
using Artemis.UI.Shared.Services.Interfaces;
using Avalonia.Threading;
using DynamicData;
using ReactiveUI;
namespace Artemis.UI.Screens.Debugger.DataModel;
public class DataModelDebugViewModel : ActivatableViewModelBase, IRoutableViewModel
{
private readonly IDataModelUIService _dataModelUIService;
private readonly IPluginManagementService _pluginManagementService;
private readonly DispatcherTimer _updateTimer;
private bool _isModuleFilterEnabled;
private DataModelPropertiesViewModel? _mainDataModel;
private string? _propertySearch;
private Module? _selectedModule;
private bool _slowUpdates;
public DataModelDebugViewModel(IScreen hostScreen, IDataModelUIService dataModelUIService, IPluginManagementService pluginManagementService)
{
_dataModelUIService = dataModelUIService;
_pluginManagementService = pluginManagementService;
_updateTimer = new DispatcherTimer(TimeSpan.FromMilliseconds(25), DispatcherPriority.Normal, (_, _) => Update());
HostScreen = hostScreen;
Modules = new ObservableCollection<Module>();
this.WhenActivated(disposables =>
{
Observable.FromEventPattern<PluginFeatureEventArgs>(x => pluginManagementService.PluginFeatureEnabled += x, x => pluginManagementService.PluginFeatureEnabled -= x)
.Subscribe(d => PluginFeatureToggled(d.EventArgs.PluginFeature))
.DisposeWith(disposables);
Observable.FromEventPattern<PluginFeatureEventArgs>(x => pluginManagementService.PluginFeatureDisabled += x, x => pluginManagementService.PluginFeatureDisabled -= x)
.Subscribe(d => PluginFeatureToggled(d.EventArgs.PluginFeature))
.DisposeWith(disposables);
GetDataModel();
_updateTimer.Start();
Disposable.Create(() => _updateTimer.Stop()).DisposeWith(disposables);
});
}
public DataModelPropertiesViewModel? MainDataModel
{
get => _mainDataModel;
set => RaiseAndSetIfChanged(ref _mainDataModel, value);
}
public string? PropertySearch
{
get => _propertySearch;
set => RaiseAndSetIfChanged(ref _propertySearch, value);
}
public bool SlowUpdates
{
get => _slowUpdates;
set
{
RaiseAndSetIfChanged(ref _slowUpdates, value);
_updateTimer.Interval = TimeSpan.FromMilliseconds(_slowUpdates ? 500 : 25);
}
}
public ObservableCollection<Module> Modules { get; }
public Module? SelectedModule
{
get => _selectedModule;
set
{
RaiseAndSetIfChanged(ref _selectedModule, value);
GetDataModel();
}
}
public bool IsModuleFilterEnabled
{
get => _isModuleFilterEnabled;
set
{
RaiseAndSetIfChanged(ref _isModuleFilterEnabled, value);
if (!IsModuleFilterEnabled)
SelectedModule = null;
else
GetDataModel();
}
}
private void Update()
{
if (MainDataModel == null)
return;
lock (MainDataModel)
{
MainDataModel.Update(_dataModelUIService, new DataModelUpdateConfiguration(true));
}
}
private void PluginFeatureToggled(PluginFeature pluginFeature)
{
if (pluginFeature is Module)
PopulateModules();
}
private void GetDataModel()
{
MainDataModel = SelectedModule != null
? _dataModelUIService.GetPluginDataModelVisualization(new List<Module> {SelectedModule}, false)
: _dataModelUIService.GetMainDataModelVisualization();
}
private void PopulateModules()
{
Modules.Clear();
Modules.AddRange(_pluginManagementService.GetFeaturesOfType<Module>().Where(p => p.IsEnabled).OrderBy(m => m.Info.Name));
if (MainDataModel == null)
return;
if (SelectedModule == null)
{
if (MainDataModel != null)
_dataModelUIService.UpdateModules(MainDataModel);
}
else if (!SelectedModule.IsEnabled)
{
SelectedModule = null;
}
}
public string UrlPathSegment => "data-model";
public IScreen HostScreen { get; }
}