Core - Fixed a lot of compiler warnings

Scripting - Added script renaming/deleting
This commit is contained in:
Robert committed 2021-06-21 19:34:34 +02:00
1 parent 4a69baebb7
commit 5367027471
36 files changed
+434 -96

No files matched your search

@@ -43,7 +43,7 @@
<DataTemplate DataType="{x:Type scriptingProviders:ScriptingProvider}">
<StackPanel Orientation="Horizontal">
<shared:ArtemisIcon Icon="{Binding Info.ResolvedIcon}" Width="18 " Height="18" Margin="0 0 5 0" VerticalAlignment="Center" />
<TextBlock Text="{Binding Info.Name}" VerticalAlignment="Center" />
<TextBlock Text="{Binding LanguageName}" VerticalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
@@ -0,0 +1,46 @@
<UserControl x:Class="Artemis.UI.Screens.Scripting.Dialogs.ScriptConfigurationEditView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.UI.Screens.Scripting.Dialogs"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:scriptingProviders="clr-namespace:Artemis.Core.ScriptingProviders;assembly=Artemis.Core"
xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance local:ScriptConfigurationEditViewModel}">
<StackPanel Margin="16">
<TextBlock Style="{StaticResource MaterialDesignHeadline6TextBlock}">
Edit script
</TextBlock>
<TextBox materialDesign:HintAssist.Hint="Script name"
Margin="0 8 0 16"
Width="300"
Style="{StaticResource MaterialDesignFilledTextBox}"
Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
<Grid Margin="0 8 0 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0"
HorizontalAlignment="Left"
Style="{StaticResource MaterialDesignFlatAccentButton}"
Command="{s:Action Delete}">
DELETE
</Button>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="True" Command="{s:Action Cancel}">
CANCEL
</Button>
<Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Command="{s:Action Accept}">
ACCEPT
</Button>
</StackPanel>
</Grid>
</StackPanel>
</UserControl>
@@ -0,0 +1,53 @@
using System.Threading.Tasks;
using Artemis.Core.ScriptingProviders;
using Artemis.UI.Shared.Services;
using FluentValidation;
using Stylet;
namespace Artemis.UI.Screens.Scripting.Dialogs
{
public class ScriptConfigurationEditViewModel : DialogViewModelBase
{
private string _name;
public ScriptConfigurationEditViewModel(IModelValidator<ScriptConfigurationEditViewModel> validator, ScriptConfiguration scriptConfiguration) : base(validator)
{
ScriptConfiguration = scriptConfiguration;
_name = ScriptConfiguration.Name;
}
public ScriptConfiguration ScriptConfiguration { get; }
public string Name
{
get => _name;
set => SetAndNotify(ref _name, value);
}
public async Task Accept()
{
await ValidateAsync();
if (HasErrors)
return;
ScriptConfiguration.Name = Name;
if (Session is {IsEnded: false})
Session.Close(nameof(Accept));
}
public void Delete()
{
if (Session is {IsEnded: false})
Session.Close(nameof(Delete));
}
}
public class ProfileElementScriptConfigurationEditViewModelValidator : AbstractValidator<ScriptConfigurationEditViewModel>
{
public ProfileElementScriptConfigurationEditViewModelValidator()
{
RuleFor(m => m.Name).NotEmpty().WithMessage("Script name may not be empty");
}
}
}
@@ -1,25 +1,26 @@
using Artemis.Core.ScriptingProviders;
using System.Collections.Generic;
using System.Threading.Tasks;
using Artemis.Core.ScriptingProviders;
using Artemis.Core.Services;
using Artemis.UI.Screens.Scripting.Dialogs;
using Artemis.UI.Shared.ScriptingProviders;
using Artemis.UI.Shared.Services;
using Stylet;
namespace Artemis.UI.Screens.Scripting
{
public class ScriptConfigurationViewModel : Conductor<IScriptEditorViewModel>
{
public ScriptConfigurationViewModel(ScriptConfiguration scriptConfiguration)
private readonly IScriptingService _scriptingService;
private readonly IDialogService _dialogService;
public ScriptConfigurationViewModel(ScriptConfiguration scriptConfiguration, IScriptingService scriptingService, IDialogService dialogService)
{
_scriptingService = scriptingService;
_dialogService = dialogService;
ScriptConfiguration = scriptConfiguration;
Script = ScriptConfiguration.Script;
}
public Script Script { get; set; }
public ScriptConfiguration ScriptConfiguration { get; }
#region Overrides of Screen
/// <inheritdoc />
protected override void OnActivate()
{
ActiveItem = Script switch
{
GlobalScript globalScript => Script.ScriptingProvider.CreateGlobalScriptEditor(globalScript),
@@ -28,18 +29,47 @@ namespace Artemis.UI.Screens.Scripting
PropertyScript propertyScript => Script.ScriptingProvider.CreatePropertyScriptEditor(propertyScript),
_ => new UnknownScriptEditorViewModel(null)
};
base.OnActivate();
}
/// <inheritdoc />
protected override void OnClose()
public Script Script { get; set; }
public ScriptConfiguration ScriptConfiguration { get; }
public async Task ViewProperties()
{
ActiveItem = null;
base.OnClose();
object result = await _dialogService.ShowDialog<ScriptConfigurationEditViewModel>(new Dictionary<string, object>
{
{"scriptConfiguration", ScriptConfiguration}
});
if (result is nameof(ScriptConfigurationEditViewModel.Delete))
await Delete();
}
#endregion
private async Task Delete()
{
bool result = await _dialogService.ShowConfirmDialogAt("ScriptsDialog", "Delete script", $"Are you sure you want to delete '{ScriptConfiguration.Name}'?");
if (!result)
return;
switch (Script)
{
case GlobalScript globalScript:
_scriptingService.DeleteScript(ScriptConfiguration);
break;
case LayerScript layerScript:
layerScript.Layer.ScriptConfigurations.Remove(ScriptConfiguration);
break;
case ProfileScript profileScript:
profileScript.Profile.ScriptConfigurations.Remove(ScriptConfiguration);
break;
case PropertyScript propertyScript:
propertyScript.LayerProperty.ScriptConfigurations.Remove(ScriptConfiguration);
break;
}
ScriptConfiguration.DiscardPendingChanges();
RequestClose();
}
}
public class UnknownScriptEditorViewModel : ScriptEditorViewModel
@@ -44,6 +44,7 @@
<ListBox Grid.Row="0"
Margin="0 10 0 0"
ItemContainerStyle="{StaticResource SidebarListBoxItem}"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Items}"
SelectedItem="{Binding ActiveItem}">
<ListBox.ItemTemplate>
@@ -52,6 +53,8 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
@@ -65,20 +68,56 @@
Height="18"
Margin="0 0 10 0"
VerticalAlignment="Center" />
<TextBlock Grid.Row="0"
Grid.Column="1"
Text="{Binding ScriptConfiguration.Name}" VerticalAlignment="Center" />
<TextBlock Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" Text="{Binding ScriptConfiguration.Name}"
Visibility="{Binding ScriptConfiguration.HasChanges, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, Mode=OneWay}"/>
<TextBlock Grid.Row="0" Grid.Column="1" VerticalAlignment="Center"
Visibility="{Binding ScriptConfiguration.HasChanges, Converter={x:Static s:BoolToVisibilityConverter.Instance}, Mode=OneWay}">
<Run Text="{Binding ScriptConfiguration.Name}" FontWeight="Bold" />
<Run Text="*" />
</TextBlock>
<TextBlock Grid.Row="1"
Grid.Column="1"
Text="{Binding ScriptConfiguration.Script.ScriptingProvider.Info.Name, FallbackValue='Unknown scripting provider'}"
Text="{Binding ScriptConfiguration.Script.ScriptingProvider.LanguageName, FallbackValue='Unknown scripting provider'}"
Foreground="{DynamicResource MaterialDesignBodyLight}"
VerticalAlignment="Center" />
<Button Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" ToolTip="View properties" Width="20" Height="20" Command="{s:Action ViewProperties}" s:View.ActionTarget="{Binding}" HorizontalAlignment="Right">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignIconForegroundButton}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<materialDesign:PackIcon Kind="Cog" Width="16" Height="16" />
</Button>
<ToggleButton Grid.Row="0" Grid.RowSpan="2" Grid.Column="3" ToolTip="Suspend profile" Width="18" Height="18" Margin="2 0 0 0" IsChecked="{Binding ScriptConfiguration.IsSuspended}">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource MaterialDesignFlatToggleButton}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
<materialDesign:PackIcon Kind="Pause" Height="14" Width="14" />
</ToggleButton>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Grid.Row="1" Style="{StaticResource MaterialDesignOutlinedButton}" Content="ADD NEW SCRIPT" Margin="10 10 10 0" Command="{s:Action AddScriptConfiguration}"
<Button Grid.Row="1"
Style="{StaticResource MaterialDesignOutlinedButton}"
Content="ADD NEW SCRIPT"
Margin="10 10 10 0"
Command="{s:Action AddScriptConfiguration}"
VerticalAlignment="Top" />
</Grid>
</Border>
@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.ScriptingProviders;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Scripting.Dialogs;
using Artemis.UI.Shared.Services;
using Stylet;
@@ -14,19 +15,21 @@ namespace Artemis.UI.Screens.Scripting
{
private readonly IScriptingService _scriptingService;
private readonly IDialogService _dialogService;
private readonly IScriptVmFactory _scriptVmFactory;
public Profile Profile { get; }
public Layer Layer { get; }
public ILayerProperty LayerProperty { get; }
public ScriptsDialogViewModel(Profile profile, IScriptingService scriptingService, IDialogService dialogService)
public ScriptsDialogViewModel(Profile profile, IScriptingService scriptingService, IDialogService dialogService, IScriptVmFactory scriptVmFactory)
{
_scriptingService = scriptingService;
_dialogService = dialogService;
_scriptVmFactory = scriptVmFactory;
DisplayName = "Artemins | Profile Scripts";
DisplayName = "Artemis | Profile Scripts";
Profile = profile ?? throw new ArgumentNullException(nameof(profile));
Items.AddRange(Profile.ScriptConfigurations.Select(s => new ScriptConfigurationViewModel(s)));
Items.AddRange(Profile.ScriptConfigurations.Select(scriptVmFactory.ScriptConfigurationViewModel));
}
public ScriptsDialogViewModel(Layer layer, IDialogService dialogService)
@@ -35,7 +38,7 @@ namespace Artemis.UI.Screens.Scripting
DisplayName = "Artemins | Layer Scripts";
Layer = layer ?? throw new ArgumentNullException(nameof(layer));
Items.AddRange(Layer.ScriptConfigurations.Select(s => new ScriptConfigurationViewModel(s)));
Items.AddRange(Layer.ScriptConfigurations.Select(_scriptVmFactory.ScriptConfigurationViewModel));
}
public ScriptsDialogViewModel(ILayerProperty layerProperty, IDialogService dialogService)
@@ -44,7 +47,7 @@ namespace Artemis.UI.Screens.Scripting
DisplayName = "Artemins | Layer Property Scripts";
LayerProperty = layerProperty ?? throw new ArgumentNullException(nameof(layerProperty));
Items.AddRange(LayerProperty.ScriptConfigurations.Select(s => new ScriptConfigurationViewModel(s)));
Items.AddRange(Layer.ScriptConfigurations.Select(_scriptVmFactory.ScriptConfigurationViewModel));
}
public async Task AddScriptConfiguration()
@@ -69,7 +72,7 @@ namespace Artemis.UI.Screens.Scripting
_scriptingService.CreateScriptInstance(LayerProperty, scriptConfiguration);
}
Items.Add(new ScriptConfigurationViewModel(scriptConfiguration));
Items.Add(_scriptVmFactory.ScriptConfigurationViewModel(scriptConfiguration));
}
}
}