diff --git a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs index 9f7cd85af..375efa7f4 100644 --- a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs +++ b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs @@ -5,6 +5,7 @@ using Artemis.Core.ScriptingProviders; using Artemis.UI.Screens.Header; using Artemis.UI.Screens.Plugins; using Artemis.UI.Screens.ProfileEditor.Conditions; +using Artemis.UI.Screens.ProfileEditor.DisplayConditions; using Artemis.UI.Screens.ProfileEditor.LayerProperties; using Artemis.UI.Screens.ProfileEditor.LayerProperties.DataBindings; using Artemis.UI.Screens.ProfileEditor.LayerProperties.DataBindings.ConditionalDataBinding; @@ -17,6 +18,7 @@ using Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs.AdaptionHints; using Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem; using Artemis.UI.Screens.ProfileEditor.Visualization; using Artemis.UI.Screens.ProfileEditor.Visualization.Tools; +using Artemis.UI.Screens.ProfileEditor.Windows; using Artemis.UI.Screens.Scripting; using Artemis.UI.Screens.Settings.Device; using Artemis.UI.Screens.Settings.Device.Tabs; @@ -124,6 +126,11 @@ namespace Artemis.UI.Ninject.Factories ModuleActivationRequirementViewModel ModuleActivationRequirementViewModel(IModuleActivationRequirement activationRequirement); } + public interface INodeVmFactory : IVmFactory + { + NodeScriptWindowViewModel NodeScriptWindowViewModel(NodeScript nodeScript); + } + // TODO: Move these two public interface IDataBindingsVmFactory { diff --git a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml index 1905c82e0..a9f8b3867 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml @@ -9,6 +9,7 @@ xmlns:displayConditions="clr-namespace:Artemis.UI.Screens.ProfileEditor.DisplayConditions" xmlns:core="clr-namespace:Artemis.Core;assembly=Artemis.Core" xmlns:controls="clr-namespace:Artemis.VisualScripting.Editor.Controls;assembly=Artemis.VisualScripting" + xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" x:Class="Artemis.UI.Screens.ProfileEditor.DisplayConditions.DisplayConditionsView" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" @@ -16,6 +17,7 @@ + @@ -40,35 +42,36 @@ - - - - + + + + + + + Click to edit script + diff --git a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs index 871609421..ae26c1933 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; +using System.ComponentModel; +using System.Windows.Input; using Artemis.Core; -using Artemis.Core.Services; using Artemis.UI.Ninject.Factories; using Artemis.UI.Screens.ProfileEditor.Conditions; using Artemis.UI.Shared; @@ -13,33 +11,17 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions { public class DisplayConditionsViewModel : Conductor, IProfileEditorPanelViewModel { - private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory; + private readonly INodeVmFactory _nodeVmFactory; private readonly IProfileEditorService _profileEditorService; - private readonly INodeService _nodeService; - private RenderProfileElement _renderProfileElement; - private bool _displayStartHint; + private readonly IWindowManager _windowManager; private bool _isEventCondition; + private RenderProfileElement _renderProfileElement; - public DisplayConditionsViewModel(IProfileEditorService profileEditorService, INodeService nodeService, IDataModelConditionsVmFactory dataModelConditionsVmFactory) + public DisplayConditionsViewModel(IProfileEditorService profileEditorService, IWindowManager windowManager, INodeVmFactory nodeVmFactory) { _profileEditorService = profileEditorService; - _nodeService = nodeService; - _dataModelConditionsVmFactory = dataModelConditionsVmFactory; - - AvailableNodes = _nodeService.AvailableNodes; - } - - private IEnumerable _availableNodes; - public IEnumerable AvailableNodes - { - get => _availableNodes; - set => SetAndNotify(ref _availableNodes, value); - } - - public bool DisplayStartHint - { - get => _displayStartHint; - set => SetAndNotify(ref _displayStartHint, value); + _windowManager = windowManager; + _nodeVmFactory = nodeVmFactory; } public bool IsEventCondition @@ -111,19 +93,9 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions base.OnClose(); } - private void SelectedProfileEditorServiceOnSelectedProfileElementChanged(object sender, RenderProfileElementEventArgs e) - { - Update(e.RenderProfileElement); - } - private void Update(RenderProfileElement renderProfileElement) { - if (RenderProfileElement != null) - { - //RenderProfileElement.DisplayCondition.ChildAdded -= DisplayConditionOnChildrenModified; - //RenderProfileElement.DisplayCondition.ChildRemoved -= DisplayConditionOnChildrenModified; - RenderProfileElement.Timeline.PropertyChanged -= TimelineOnPropertyChanged; - } + if (RenderProfileElement != null) RenderProfileElement.Timeline.PropertyChanged -= TimelineOnPropertyChanged; RenderProfileElement = renderProfileElement; @@ -137,27 +109,32 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions return; } - // Ensure the layer has a root display condition group - //if (renderProfileElement.DisplayCondition == null) - // renderProfileElement.DisplayCondition = new DataModelConditionGroup(null); - - if (renderProfileElement.DisplayCondition == null) - renderProfileElement.DisplayCondition = new NodeScript("Display Condition (TODO)", "-"); - - //List modules = new(); - //if (_profileEditorService.SelectedProfileConfiguration?.Module != null) - // modules.Add(_profileEditorService.SelectedProfileConfiguration.Module); - //ActiveItem = _dataModelConditionsVmFactory.DataModelConditionGroupViewModel(renderProfileElement.DisplayCondition, ConditionGroupType.General, modules); - //ActiveItem.IsRootGroup = true; - - //DisplayStartHint = !RenderProfileElement.DisplayCondition.Children.Any(); - //IsEventCondition = RenderProfileElement.DisplayCondition.Children.Any(c => c is DataModelConditionEvent); - - //RenderProfileElement.DisplayCondition.ChildAdded += DisplayConditionOnChildrenModified; - //RenderProfileElement.DisplayCondition.ChildRemoved += DisplayConditionOnChildrenModified; RenderProfileElement.Timeline.PropertyChanged += TimelineOnPropertyChanged; } + #region Event handlers + + public void ScriptGridMouseUp(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton != MouseButton.Left) + return; + + RenderProfileElement.DisplayCondition ??= new NodeScript("End Result", ""); + + _windowManager.ShowDialog(_nodeVmFactory.NodeScriptWindowViewModel(RenderProfileElement.DisplayCondition)); + _profileEditorService.SaveSelectedProfileElement(); + } + + public void EventTriggerModeSelected() + { + _profileEditorService.SaveSelectedProfileElement(); + } + + private void SelectedProfileEditorServiceOnSelectedProfileElementChanged(object sender, RenderProfileElementEventArgs e) + { + Update(e.RenderProfileElement); + } + private void TimelineOnPropertyChanged(object sender, PropertyChangedEventArgs e) { NotifyOfPropertyChange(nameof(DisplayContinuously)); @@ -165,15 +142,6 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions NotifyOfPropertyChange(nameof(EventOverlapMode)); } - private void DisplayConditionOnChildrenModified(object sender, EventArgs e) - { - //DisplayStartHint = !RenderProfileElement.DisplayCondition.Children.Any(); - //IsEventCondition = RenderProfileElement.DisplayCondition.Children.Any(c => c is DataModelConditionEvent); - } - - public void EventTriggerModeSelected() - { - _profileEditorService.SaveSelectedProfileElement(); - } + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowView.xaml new file mode 100644 index 000000000..5076ff482 --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowView.xaml @@ -0,0 +1,26 @@ + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowViewModel.cs new file mode 100644 index 000000000..e0b6185dc --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowViewModel.cs @@ -0,0 +1,18 @@ +using Artemis.Core; +using Artemis.Core.Services; +using Stylet; + +namespace Artemis.UI.Screens.ProfileEditor.Windows +{ + public class NodeScriptWindowViewModel : Screen + { + public NodeScriptWindowViewModel(NodeScript nodeScript, INodeService nodeService) + { + NodeScript = nodeScript; + AvailableNodes = new BindableCollection(nodeService.AvailableNodes); + } + + public NodeScript NodeScript { get; } + public BindableCollection AvailableNodes { get; } + } +}