diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingView.xaml b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingView.xaml index 856fe4b5d..395f7baab 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingView.xaml @@ -53,6 +53,7 @@ BorderBrush="#ab47bc" Style="{StaticResource DisplayConditionButton}" ToolTip="{Binding SelectedLeftSideProperty.DisplayPropertyPath}" + IsEnabled="{Binding IsDataBindingEnabled}" HorizontalAlignment="Left"> @@ -82,7 +83,8 @@ + MinWidth="128" + IsEnabled="{Binding IsDataBindingEnabled}"> Replace value @@ -99,13 +101,15 @@ Text="200" materialDesign:TextFieldAssist.HasClearButton="True" materialDesign:TextFieldAssist.SuffixText="ms" - materialDesign:HintAssist.Hint="Smoothing time" /> + materialDesign:HintAssist.Hint="Smoothing time" + IsEnabled="{Binding IsDataBindingEnabled}" /> + MinWidth="128" + IsEnabled="{Binding IsDataBindingEnabled}"> Ease in @@ -149,6 +153,10 @@ + + + + @@ -158,7 +166,8 @@ HorizontalAlignment="Left" FontSize="12" Padding="6 4" - Height="22"> + Height="22" + IsEnabled="{Binding IsDataBindingEnabled}"> @@ -167,7 +176,18 @@ + + Enable data binding + + - diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingViewModel.cs index 678e04626..dc8099e6f 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingViewModel.cs @@ -1,29 +1,91 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; +using System.Threading.Tasks; +using System.Timers; using Artemis.Core; +using Artemis.Core.Services; +using Artemis.UI.Shared; +using Artemis.UI.Shared.Services; using Stylet; namespace Artemis.UI.Screens.ProfileEditor.LayerProperties.DataBindings { public class DataBindingViewModel : PropertyChangedBase { + private readonly IDataModelService _dataModelService; + private readonly IDataModelUIService _dataModelUIService; + private readonly IProfileEditorService _profileEditorService; + private readonly ISettingsService _settingsService; + private readonly Timer _updateTimer; private DataBinding _dataBinding; + private bool _isDataBindingEnabled; + private DataModelPropertiesViewModel _sourceDataModel; + private DataModelVisualizationViewModel _selectedSourceProperty; - public DataBindingViewModel(BaseLayerProperty layerProperty, PropertyInfo targetProperty) + public DataBindingViewModel( + BaseLayerProperty layerProperty, + PropertyInfo targetProperty, + IProfileEditorService profileEditorService, + IDataModelUIService dataModelUIService, + IDataModelService dataModelService, + ISettingsService settingsService) { + _profileEditorService = profileEditorService; + _dataModelUIService = dataModelUIService; + _dataModelService = dataModelService; + _settingsService = settingsService; + _updateTimer = new Timer(500); + LayerProperty = layerProperty; TargetProperty = targetProperty; DisplayName = TargetProperty.Name.ToUpper(); ModifierViewModels = new BindableCollection(); DataBinding = layerProperty.DataBindings.FirstOrDefault(d => d.TargetProperty == targetProperty); + + ShowDataModelValues = settingsService.GetSetting("ProfileEditor.ShowDataModelValues"); + + _isDataBindingEnabled = DataBinding != null; + + // Initialize async, no need to wait for it + Task.Run(Initialize); } + public bool SourceDataModelOpen { get; set; } + + public DataModelPropertiesViewModel SourceDataModel + { + get => _sourceDataModel; + set => SetAndNotify(ref _sourceDataModel, value); + } + + public DataModelVisualizationViewModel SelectedSourceProperty + { + get => _selectedSourceProperty; + set => SetAndNotify(ref _selectedSourceProperty, value); + } + + public PluginSetting ShowDataModelValues { get; } public BaseLayerProperty LayerProperty { get; } public PropertyInfo TargetProperty { get; } public string DisplayName { get; } public BindableCollection ModifierViewModels { get; } - + + public bool IsDataBindingEnabled + { + get => _isDataBindingEnabled; + set + { + if (!SetAndNotify(ref _isDataBindingEnabled, value)) return; + if (value) + EnableDataBinding(); + else + RemoveDataBinding(); + } + } + public DataBinding DataBinding { get => _dataBinding; @@ -63,6 +125,30 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties.DataBindings ModifierViewModels.Add(new DataBindingModifierViewModel(modifier)); } + private void Initialize() + { + // Get the data models + SourceDataModel = _dataModelUIService.GetMainDataModelVisualization(); + if (!_dataModelUIService.GetPluginExtendsDataModel(_profileEditorService.GetCurrentModule())) + SourceDataModel.Children.Add(_dataModelUIService.GetPluginDataModelVisualization(_profileEditorService.GetCurrentModule())); + + SourceDataModel.UpdateRequested += SourceDataModelOnUpdateRequested; + + _updateTimer.Start(); + _updateTimer.Elapsed += OnUpdateTimerOnElapsed; + } + + private void SourceDataModelOnUpdateRequested(object sender, EventArgs e) + { + SourceDataModel.ApplyTypeFilter(true, DataBinding.TargetProperty.PropertyType); + } + + private void OnUpdateTimerOnElapsed(object sender, ElapsedEventArgs e) + { + if (SourceDataModelOpen) + SourceDataModel.Update(_dataModelUIService); + } + private void UpdateModifierViewModels() { ModifierViewModels.Clear();