mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 11:56:30 +00:00
Meta - Replace WPF projects with Avalonia projects
This commit is contained in:
1 parent
fcf0376a9a
commit
d7f3ee1190
1110 files changed
+10872
-52240
No files matched your search
@@ -1,61 +0,0 @@
|
||||
<UserControl x:Class="Artemis.UI.Screens.Scripting.Dialogs.ScriptConfigurationCreateView"
|
||||
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:ScriptConfigurationCreateViewModel}">
|
||||
<UserControl.Resources>
|
||||
<shared:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />
|
||||
</UserControl.Resources>
|
||||
<StackPanel Margin="16">
|
||||
<TextBlock Style="{StaticResource MaterialDesignHeadline6TextBlock}">
|
||||
Add new script
|
||||
</TextBlock>
|
||||
|
||||
<TextBox materialDesign:HintAssist.Hint="Script name"
|
||||
Margin="0 8 0 16"
|
||||
Width="300"
|
||||
Style="{StaticResource MaterialDesignFilledTextBox}"
|
||||
Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
|
||||
|
||||
<ComboBox materialDesign:HintAssist.Hint="Scripting provider"
|
||||
Margin="0 8 0 16"
|
||||
Width="300"
|
||||
Style="{StaticResource MaterialDesignFilledComboBox}"
|
||||
SelectedItem="{Binding SelectedScriptingProvider}">
|
||||
<ComboBox.ItemsSource>
|
||||
<CompositeCollection>
|
||||
<ComboBoxItem IsEnabled="False"
|
||||
Visibility="{Binding HasScriptingProviders, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, Mode=OneWay}">
|
||||
No scripting providers found
|
||||
</ComboBoxItem>
|
||||
<CollectionContainer Collection="{Binding Data.ScriptingProviders, Source={StaticResource DataContextProxy}}" />
|
||||
</CompositeCollection>
|
||||
</ComboBox.ItemsSource>
|
||||
<ComboBox.ItemTemplate>
|
||||
<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 LanguageName}" VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0 8 0 0">
|
||||
<Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="True" Margin="0 0 8 0" Command="{s:Action Cancel}">
|
||||
CANCEL
|
||||
</Button>
|
||||
<Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 0 0 0" Command="{s:Action Accept}">
|
||||
ACCEPT
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
||||
@@ -1,57 +0,0 @@
|
||||
using System.Threading.Tasks;
|
||||
using Artemis.Core.ScriptingProviders;
|
||||
using Artemis.Core.Services;
|
||||
using Artemis.UI.Shared.Services;
|
||||
using FluentValidation;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens.Scripting.Dialogs
|
||||
{
|
||||
public class ScriptConfigurationCreateViewModel : DialogViewModelBase
|
||||
{
|
||||
private string _name;
|
||||
private ScriptingProvider _selectedScriptingProvider;
|
||||
|
||||
public ScriptConfigurationCreateViewModel(IModelValidator<ScriptConfigurationCreateViewModel> validator, IPluginManagementService pluginManagementService) : base(validator)
|
||||
{
|
||||
_name = "My script";
|
||||
|
||||
ScriptingProviders = new BindableCollection<ScriptingProvider>(pluginManagementService.GetFeaturesOfType<ScriptingProvider>());
|
||||
HasScriptingProviders = ScriptingProviders.Count > 0;
|
||||
}
|
||||
|
||||
public BindableCollection<ScriptingProvider> ScriptingProviders { get; }
|
||||
public bool HasScriptingProviders { get; }
|
||||
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
set => SetAndNotify(ref _name, value);
|
||||
}
|
||||
|
||||
public ScriptingProvider SelectedScriptingProvider
|
||||
{
|
||||
get => _selectedScriptingProvider;
|
||||
set => SetAndNotify(ref _selectedScriptingProvider, value);
|
||||
}
|
||||
|
||||
public async Task Accept()
|
||||
{
|
||||
await ValidateAsync();
|
||||
|
||||
if (HasErrors)
|
||||
return;
|
||||
|
||||
Session.Close(new ScriptConfiguration(SelectedScriptingProvider, Name));
|
||||
}
|
||||
}
|
||||
|
||||
public class ProfileElementScriptConfigurationCreateViewModelValidator : AbstractValidator<ScriptConfigurationCreateViewModel>
|
||||
{
|
||||
public ProfileElementScriptConfigurationCreateViewModelValidator()
|
||||
{
|
||||
RuleFor(m => m.Name).NotEmpty().WithMessage("Script name may not be empty");
|
||||
RuleFor(m => m.SelectedScriptingProvider).NotNull().WithMessage("Scripting provider is required");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
<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>
|
||||
@@ -1,53 +0,0 @@
|
||||
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,27 +0,0 @@
|
||||
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.Services;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens.Scripting
|
||||
{
|
||||
public class ScriptConfigurationViewModel : PropertyChangedBase
|
||||
{
|
||||
private readonly IDialogService _dialogService;
|
||||
private readonly IScriptingService _scriptingService;
|
||||
|
||||
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; }
|
||||
}
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
<mde:MaterialWindow x:Class="Artemis.UI.Screens.Scripting.ScriptsDialogView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
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:local="clr-namespace:Artemis.UI.Screens.Scripting"
|
||||
xmlns:mde="https://spiegelp.github.io/MaterialDesignExtensions/winfx/xaml"
|
||||
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
|
||||
xmlns:s="https://github.com/canton7/Stylet"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
|
||||
mc:Ignorable="d"
|
||||
FadeContentIfInactive="False"
|
||||
Icon="/Resources/Images/Logo/bow.ico"
|
||||
Title="{Binding DisplayName}"
|
||||
TitleBarIcon="{svgc:SvgImage Source=/Resources/Images/Logo/bow-white.svg}"
|
||||
Foreground="{DynamicResource MaterialDesignBody}"
|
||||
Background="{DynamicResource MaterialDesignPaper}"
|
||||
FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"
|
||||
UseLayoutRounding="True"
|
||||
Height="800" Width="1200"
|
||||
d:DataContext="{d:DesignInstance {x:Type local:ScriptsDialogViewModel}}">
|
||||
<mde:MaterialWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Sidebar/ArtemisSidebar.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
<shared:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />
|
||||
</ResourceDictionary>
|
||||
</mde:MaterialWindow.Resources>
|
||||
<materialDesign:DialogHost IsTabStop="False" Focusable="False" Identifier="ScriptsDialog" DialogTheme="Inherit">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="240" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<Border Grid.Column="0" ClipToBounds="True" Background="{DynamicResource MaterialDesignToolBarBackground}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<ListBox Grid.Row="0"
|
||||
Margin="0 10 0 0"
|
||||
ItemContainerStyle="{StaticResource SidebarListBoxItem}"
|
||||
HorizontalContentAlignment="Stretch"
|
||||
ItemsSource="{Binding ScriptConfigurations}"
|
||||
SelectedItem="{Binding SelectedScript}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="{x:Type local:ScriptConfigurationViewModel}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<shared:ArtemisIcon Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
Grid.RowSpan="2"
|
||||
Icon="{Binding ScriptConfiguration.Script.ScriptingProvider.Info.ResolvedIcon, FallbackValue=QuestionMark}"
|
||||
Width="18 "
|
||||
Height="18"
|
||||
Margin="0 0 10 0"
|
||||
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.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}"
|
||||
CommandParameter="{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>
|
||||
|
||||
<StackPanel Grid.Row="0"
|
||||
Visibility="{Binding HasScripts, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, Mode=OneWay}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center" Margin="0 20 0 10">
|
||||
<TextBlock Style="{StaticResource MaterialDesignBody2TextBlock}" HorizontalAlignment="Center">Your scripts will be listed here</TextBlock>
|
||||
</StackPanel>
|
||||
<Button Grid.Row="1"
|
||||
Style="{StaticResource MaterialDesignOutlinedButton}"
|
||||
Content="ADD NEW SCRIPT"
|
||||
Margin="10 10 10 0"
|
||||
Command="{s:Action AddScriptConfiguration}"
|
||||
VerticalAlignment="Top" />
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Script editor -->
|
||||
<ContentControl Grid.Column="1" s:View.Model="{Binding ActiveItem}" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" IsTabStop="False" />
|
||||
<StackPanel Grid.Column="1"
|
||||
Visibility="{Binding ActiveItem, Converter={StaticResource NullToVisibilityConverter}, ConverterParameter=Inverted}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center">
|
||||
<materialDesign:PackIcon Kind="CodeGreaterThanOrEqual" Width="150" Height="150" HorizontalAlignment="Center" />
|
||||
<TextBlock Style="{StaticResource MaterialDesignHeadline4TextBlock}" HorizontalAlignment="Center">Get ready to start scripting!</TextBlock>
|
||||
<TextBlock Style="{StaticResource MaterialDesignSubtitle1TextBlock}" HorizontalAlignment="Center">Use the sidebar to create new scripts and manage existing scripts.</TextBlock>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</materialDesign:DialogHost>
|
||||
</mde:MaterialWindow>
|
||||
@@ -1,173 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
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;
|
||||
|
||||
namespace Artemis.UI.Screens.Scripting
|
||||
{
|
||||
public class ScriptsDialogViewModel : Conductor<IScriptEditorViewModel>
|
||||
{
|
||||
private readonly IScriptingService _scriptingService;
|
||||
private readonly IDialogService _dialogService;
|
||||
private readonly IProfileService _profileService;
|
||||
private readonly IProfileEditorService _profileEditorService;
|
||||
private readonly IScriptVmFactory _scriptVmFactory;
|
||||
private readonly Dictionary<ScriptingProvider, IScriptEditorViewModel> _providerViewModels = new();
|
||||
private ScriptConfigurationViewModel _selectedScript;
|
||||
|
||||
public ScriptsDialogViewModel(Profile profile,
|
||||
IScriptingService scriptingService,
|
||||
IDialogService dialogService,
|
||||
IProfileService profileService,
|
||||
IProfileEditorService profileEditorService,
|
||||
IScriptVmFactory scriptVmFactory)
|
||||
{
|
||||
_scriptingService = scriptingService;
|
||||
_dialogService = dialogService;
|
||||
_profileService = profileService;
|
||||
_profileEditorService = profileEditorService;
|
||||
_scriptVmFactory = scriptVmFactory;
|
||||
|
||||
DisplayName = "Artemis | Profile Scripts";
|
||||
ScriptType = ScriptType.Profile;
|
||||
Profile = profile ?? throw new ArgumentNullException(nameof(profile));
|
||||
|
||||
ScriptConfigurations.AddRange(Profile.ScriptConfigurations.Select(scriptVmFactory.ScriptConfigurationViewModel));
|
||||
ScriptConfigurations.CollectionChanged += ItemsOnCollectionChanged;
|
||||
}
|
||||
|
||||
public ScriptType ScriptType { get; }
|
||||
public Profile Profile { get; }
|
||||
public BindableCollection<ScriptConfigurationViewModel> ScriptConfigurations { get; } = new();
|
||||
public bool HasScripts => ScriptConfigurations.Any();
|
||||
|
||||
public ScriptConfigurationViewModel SelectedScript
|
||||
{
|
||||
get => _selectedScript;
|
||||
set
|
||||
{
|
||||
if (!SetAndNotify(ref _selectedScript, value)) return;
|
||||
SetupScriptEditor(_selectedScript?.ScriptConfiguration);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupScriptEditor(ScriptConfiguration scriptConfiguration)
|
||||
{
|
||||
if (scriptConfiguration == null)
|
||||
{
|
||||
ActiveItem = null;
|
||||
return;
|
||||
}
|
||||
|
||||
// The script is null if the provider is missing
|
||||
if (scriptConfiguration.Script == null)
|
||||
{
|
||||
ActiveItem = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_providerViewModels.TryGetValue(scriptConfiguration.Script.ScriptingProvider, out IScriptEditorViewModel viewModel))
|
||||
{
|
||||
viewModel = scriptConfiguration.Script.ScriptingProvider.CreateScriptEditor(ScriptType);
|
||||
_providerViewModels.Add(scriptConfiguration.Script.ScriptingProvider, viewModel);
|
||||
}
|
||||
|
||||
ActiveItem = viewModel;
|
||||
ActiveItem.ChangeScript(scriptConfiguration.Script);
|
||||
}
|
||||
|
||||
private void ItemsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
NotifyOfPropertyChange(nameof(HasScripts));
|
||||
}
|
||||
|
||||
public async Task AddScriptConfiguration()
|
||||
{
|
||||
object result = await _dialogService.ShowDialogAt<ScriptConfigurationCreateViewModel>("ScriptsDialog");
|
||||
if (result is not ScriptConfiguration scriptConfiguration)
|
||||
return;
|
||||
|
||||
if (Profile != null)
|
||||
{
|
||||
Profile.ScriptConfigurations.Add(scriptConfiguration);
|
||||
_scriptingService.CreateScriptInstance(Profile, scriptConfiguration);
|
||||
}
|
||||
|
||||
ScriptConfigurationViewModel viewModel = _scriptVmFactory.ScriptConfigurationViewModel(scriptConfiguration);
|
||||
ScriptConfigurations.Add(viewModel);
|
||||
SelectedScript = viewModel;
|
||||
}
|
||||
|
||||
public async Task ViewProperties(ScriptConfigurationViewModel scriptConfigurationViewModel)
|
||||
{
|
||||
object result = await _dialogService.ShowDialogAt<ScriptConfigurationEditViewModel>(
|
||||
"ScriptsDialog",
|
||||
new Dictionary<string, object> {{"scriptConfiguration", scriptConfigurationViewModel.ScriptConfiguration}}
|
||||
);
|
||||
|
||||
if (result is nameof(ScriptConfigurationEditViewModel.Delete))
|
||||
await Delete(scriptConfigurationViewModel);
|
||||
}
|
||||
|
||||
private async Task Delete(ScriptConfigurationViewModel scriptConfigurationViewModel)
|
||||
{
|
||||
bool result = await _dialogService.ShowConfirmDialogAt(
|
||||
"ScriptsDialog",
|
||||
"Delete script",
|
||||
$"Are you sure you want to delete '{scriptConfigurationViewModel.ScriptConfiguration.Name}'?"
|
||||
);
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
switch (scriptConfigurationViewModel.Script)
|
||||
{
|
||||
case GlobalScript:
|
||||
_scriptingService.DeleteScript(scriptConfigurationViewModel.ScriptConfiguration);
|
||||
break;
|
||||
case ProfileScript profileScript:
|
||||
profileScript.Profile.ScriptConfigurations.Remove(scriptConfigurationViewModel.ScriptConfiguration);
|
||||
break;
|
||||
}
|
||||
|
||||
scriptConfigurationViewModel.ScriptConfiguration.DiscardPendingChanges();
|
||||
scriptConfigurationViewModel.ScriptConfiguration.Script?.Dispose();
|
||||
|
||||
SelectedScript = null;
|
||||
ScriptConfigurations.Remove(scriptConfigurationViewModel);
|
||||
}
|
||||
|
||||
#region Overrides of Screen
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnInitialActivate()
|
||||
{
|
||||
SelectedScript = ScriptConfigurations.FirstOrDefault();
|
||||
base.OnInitialActivate();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnClose()
|
||||
{
|
||||
if (Profile != null)
|
||||
{
|
||||
if (_profileEditorService.SelectedProfile == Profile)
|
||||
_profileEditorService.SaveSelectedProfileConfiguration();
|
||||
else
|
||||
_profileService.SaveProfile(Profile, false);
|
||||
}
|
||||
|
||||
ScriptConfigurations.CollectionChanged -= ItemsOnCollectionChanged;
|
||||
base.OnClose();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user