Node editor - Added preview mode

in this mode the editor is read-only and rescales itself to fit it's container
This commit is contained in:
Robert committed 2022-04-01 00:48:56 +02:00
1 parent 7c83d5345f
commit 8fd18b9565
16 files changed
+299 -21

No files matched your search

@@ -0,0 +1,31 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:displayCondition="clr-namespace:Artemis.UI.Screens.ProfileEditor.DisplayCondition"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.DisplayConditionScriptView"
x:DataType="displayCondition:DisplayConditionScriptViewModel">
<Grid>
<Grid IsVisible="{CompiledBinding NodeScriptViewModel, Converter={x:Static ObjectConverters.IsNotNull}}">
<ContentControl Content="{CompiledBinding NodeScriptViewModel}" />
<Button Classes="icon-button"
ToolTip.Tip="Open editor"
VerticalAlignment="Top"
HorizontalAlignment="Right"
Margin="4"
Command="{Binding OpenEditor}">
<avalonia:MaterialIcon Kind="OpenInNew"></avalonia:MaterialIcon>
</Button>
</Grid>
<Button VerticalAlignment="Center"
HorizontalAlignment="Center"
Command="{Binding EnableConditions}"
IsVisible="{CompiledBinding NodeScriptViewModel, Converter={x:Static ObjectConverters.IsNull}}">
Enable display conditions
</Button>
</Grid>
</UserControl>
@@ -0,0 +1,18 @@
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition
{
public partial class DisplayConditionScriptView : ReactiveUserControl<DisplayConditionScriptViewModel>
{
public DisplayConditionScriptView()
{
InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
}
@@ -0,0 +1,58 @@
using System;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.VisualScripting;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.ProfileEditor.Commands;
using Avalonia.Controls.Mixins;
using ReactiveUI;
namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition;
public class DisplayConditionScriptViewModel : ActivatableViewModelBase
{
private readonly IProfileEditorService _profileEditorService;
private readonly IWindowService _windowService;
private ObservableAsPropertyHelper<NodeScriptViewModel?>? _nodeScriptViewModel;
private RenderProfileElement? _profileElement;
public DisplayConditionScriptViewModel(IProfileEditorService profileEditorService, INodeVmFactory nodeVmFactory, IWindowService windowService)
{
_profileEditorService = profileEditorService;
_windowService = windowService;
this.WhenActivated(d =>
{
profileEditorService.ProfileElement.Subscribe(p => _profileElement = p).DisposeWith(d);
_nodeScriptViewModel = profileEditorService.ProfileElement
.Select(p => p?.WhenAnyValue(element => element.DisplayCondition) ?? Observable.Never<ICondition?>())
.Switch()
.Select(c => c is StaticCondition staticCondition ? nodeVmFactory.NodeScriptViewModel(staticCondition.Script, true) : null)
.ToProperty(this, vm => vm.NodeScriptViewModel)
.DisposeWith(d);
});
}
public NodeScriptViewModel? NodeScriptViewModel => _nodeScriptViewModel?.Value;
public async Task EnableConditions()
{
bool confirmed = await _windowService.ShowConfirmContentDialog(
"Display conditions",
"Do you want to enable display conditions for this element? \r\n" +
"Using display conditions you can dynamically hide or show layers and folders depending on certain parameters."
);
if (confirmed && _profileElement != null)
_profileEditorService.ExecuteCommand(new ChangeElementDisplayCondition(_profileElement, new StaticCondition(_profileElement)));
}
public async Task OpenEditor()
{
if (_profileElement?.DisplayCondition is StaticCondition staticCondition)
await _windowService.ShowDialogAsync<NodeScriptWindowViewModel, bool>(("nodeScript", staticCondition.Script));
}
}
@@ -97,7 +97,7 @@
<GridSplitter Grid.Row="1" Classes="editor-grid-splitter-horizontal" />
<Border Grid.Row="2" Classes="card card-condensed" Margin="4">
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Conditions</TextBlock>
<ContentControl Content="{CompiledBinding DisplayConditionScriptViewModel}"></ContentControl>
</Border>
</Grid>
@@ -3,6 +3,7 @@ using System.Collections.ObjectModel;
using System.Reactive.Disposables;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Screens.ProfileEditor.DisplayCondition;
using Artemis.UI.Screens.ProfileEditor.ProfileTree;
using Artemis.UI.Screens.ProfileEditor.Properties;
using Artemis.UI.Screens.ProfileEditor.StatusBar;
@@ -29,6 +30,7 @@ public class ProfileEditorViewModel : MainScreenViewModel
ProfileTreeViewModel profileTreeViewModel,
ProfileEditorTitleBarViewModel profileEditorTitleBarViewModel,
PropertiesViewModel propertiesViewModel,
DisplayConditionScriptViewModel displayConditionScriptViewModel,
StatusBarViewModel statusBarViewModel)
: base(hostScreen, "profile-editor")
{
@@ -36,9 +38,10 @@ public class ProfileEditorViewModel : MainScreenViewModel
VisualEditorViewModel = visualEditorViewModel;
ProfileTreeViewModel = profileTreeViewModel;
PropertiesViewModel = propertiesViewModel;
DisplayConditionScriptViewModel = displayConditionScriptViewModel;
StatusBarViewModel = statusBarViewModel;
TitleBarViewModel = profileEditorTitleBarViewModel;
this.WhenActivated(d =>
{
_profileConfiguration = profileEditorService.ProfileConfiguration.ToProperty(this, vm => vm.ProfileConfiguration).DisposeWith(d);
@@ -56,6 +59,7 @@ public class ProfileEditorViewModel : MainScreenViewModel
public VisualEditorViewModel VisualEditorViewModel { get; }
public ProfileTreeViewModel ProfileTreeViewModel { get; }
public PropertiesViewModel PropertiesViewModel { get; }
public DisplayConditionScriptViewModel DisplayConditionScriptViewModel { get; }
public StatusBarViewModel StatusBarViewModel { get; }
public ReadOnlyObservableCollection<IToolViewModel>? Tools
@@ -70,6 +74,7 @@ public class ProfileEditorViewModel : MainScreenViewModel
public PluginSetting<double> ConditionsHeight => _settingsService.GetSetting("ProfileEditor.ConditionsHeight", 300.0);
public PluginSetting<double> PropertiesHeight => _settingsService.GetSetting("ProfileEditor.PropertiesHeight", 300.0);
public void OpenUrl(string url)
{
Utilities.OpenUrl(url);