From 19679c0ba69853509103d6848223de03db0eb686 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 25 Apr 2021 23:18:00 +0200 Subject: [PATCH 01/35] Plugins - Added prerequisites system --- .../Artemis.Core.csproj.DotSettings | 2 + .../Extensions/StreamExtensions.cs | 133 +++++++++++++++ .../Plugins/IPluginBootstrapper.cs | 10 +- src/Artemis.Core/Plugins/Plugin.cs | 9 +- src/Artemis.Core/Plugins/PluginFeature.cs | 8 +- .../Prerequisites/PluginPrerequisite.cs | 156 ++++++++++++++++++ .../Prerequisites/PluginPrerequisiteAction.cs | 76 +++++++++ .../PrerequisiteAction/CopyFolderAction.cs | 78 +++++++++ .../PrerequisiteAction/WriteToFileAction.cs | 70 ++++++++ .../PrerequisiteActionProgress.cs | 91 ++++++++++ .../Services/PluginManagementService.cs | 3 + .../Services/ColorPickerService.cs | 2 +- .../Services/Dialog/DialogViewModelBase.cs | 4 +- .../Interfaces/IColorPickerService.cs | 2 +- .../Ninject/Factories/IVMFactory.cs | 11 +- .../Plugins/PluginPrerequisiteActionView.xaml | 26 +++ .../PluginPrerequisiteActionViewModel.cs | 71 ++++++++ .../Plugins/PluginPrerequisiteView.xaml | 37 +++++ .../Plugins/PluginPrerequisiteViewModel.cs | 142 ++++++++++++++++ .../PluginPrerequisitesDialogView.xaml | 126 ++++++++++++++ .../PluginPrerequisitesDialogViewModel.cs | 127 ++++++++++++++ .../Tabs/Plugins/PluginSettingsViewModel.cs | 39 ++++- 22 files changed, 1210 insertions(+), 13 deletions(-) create mode 100644 src/Artemis.Core/Extensions/StreamExtensions.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteActionProgress.cs create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.xaml create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionViewModel.cs create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.xaml create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesDialogView.xaml create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesDialogViewModel.cs diff --git a/src/Artemis.Core/Artemis.Core.csproj.DotSettings b/src/Artemis.Core/Artemis.Core.csproj.DotSettings index f99fab4de..00c64717e 100644 --- a/src/Artemis.Core/Artemis.Core.csproj.DotSettings +++ b/src/Artemis.Core/Artemis.Core.csproj.DotSettings @@ -53,6 +53,8 @@ True True True + True + True True True True diff --git a/src/Artemis.Core/Extensions/StreamExtensions.cs b/src/Artemis.Core/Extensions/StreamExtensions.cs new file mode 100644 index 000000000..f4d5b9a5f --- /dev/null +++ b/src/Artemis.Core/Extensions/StreamExtensions.cs @@ -0,0 +1,133 @@ +// Based on: https://www.codeproject.com/Tips/5274597/An-Improved-Stream-CopyToAsync-that-Reports-Progre +// The MIT License +// +// Copyright (c) 2020 honey the codewitch +// +// Permission is hereby granted, free of charge, +// to any person obtaining a copy of this software and +// associated documentation files (the "Software"), to +// deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, +// merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom +// the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice +// shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + internal static class StreamExtensions + { + private const int DefaultBufferSize = 81920; + + /// + /// Copys a stream to another stream + /// + /// The source to copy from + /// The length of the source stream, if known - used for progress reporting + /// The destination to copy to + /// The size of the copy block buffer + /// An implementation for reporting progress + /// A cancellation token + /// A task representing the operation + public static async Task CopyToAsync( + this Stream source, + long sourceLength, + Stream destination, + int bufferSize, + IProgress<(long, long)> progress, + CancellationToken cancellationToken) + { + if (0 == bufferSize) + bufferSize = DefaultBufferSize; + byte[]? buffer = new byte[bufferSize]; + if (0 > sourceLength && source.CanSeek) + sourceLength = source.Length - source.Position; + long totalBytesCopied = 0L; + if (null != progress) + progress.Report((totalBytesCopied, sourceLength)); + int bytesRead = -1; + while (0 != bytesRead && !cancellationToken.IsCancellationRequested) + { + bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken); + if (0 == bytesRead || cancellationToken.IsCancellationRequested) + break; + await destination.WriteAsync(buffer, 0, buffer.Length, cancellationToken); + totalBytesCopied += bytesRead; + progress?.Report((totalBytesCopied, sourceLength)); + } + + if (0 < totalBytesCopied) + progress?.Report((totalBytesCopied, sourceLength)); + cancellationToken.ThrowIfCancellationRequested(); + } + + /// + /// Copys a stream to another stream + /// + /// The source to copy from + /// The length of the source stream, if known - used for progress reporting + /// The destination to copy to + /// An implementation for reporting progress + /// A cancellation token + /// A task representing the operation + public static Task CopyToAsync(this Stream source, long sourceLength, Stream destination, IProgress<(long, long)> progress, CancellationToken cancellationToken) + { + return CopyToAsync(source, sourceLength, destination, 0, progress, cancellationToken); + } + + /// + /// Copys a stream to another stream + /// + /// The source to copy from + /// The destination to copy to + /// An implementation for reporting progress + /// A cancellation token + /// A task representing the operation + public static Task CopyToAsync(this Stream source, Stream destination, IProgress<(long, long)> progress, CancellationToken cancellationToken) + { + return CopyToAsync(source, 0L, destination, 0, progress, cancellationToken); + } + + /// + /// Copys a stream to another stream + /// + /// The source to copy from + /// The length of the source stream, if known - used for progress reporting + /// The destination to copy to + /// An implementation for reporting progress + /// A task representing the operation + public static Task CopyToAsync(this Stream source, long sourceLength, Stream destination, IProgress<(long, long)> progress) + { + return CopyToAsync(source, sourceLength, destination, 0, progress, default); + } + + /// + /// Copys a stream to another stream + /// + /// The source to copy from + /// The destination to copy to + /// An implementation for reporting progress + /// A task representing the operation + public static Task CopyToAsync(this Stream source, Stream destination, IProgress<(long, long)> progress) + { + return CopyToAsync(source, 0L, destination, 0, progress, default); + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/IPluginBootstrapper.cs b/src/Artemis.Core/Plugins/IPluginBootstrapper.cs index af4b607d7..bc2c20cb0 100644 --- a/src/Artemis.Core/Plugins/IPluginBootstrapper.cs +++ b/src/Artemis.Core/Plugins/IPluginBootstrapper.cs @@ -5,16 +5,22 @@ /// public interface IPluginBootstrapper { + /// + /// Called when the plugin is loaded + /// + /// + void OnPluginLoaded(Plugin plugin); + /// /// Called when the plugin is activated /// /// The plugin instance of your plugin - void Enable(Plugin plugin); + void OnPluginEnabled(Plugin plugin); /// /// Called when the plugin is deactivated or when Artemis shuts down /// /// The plugin instance of your plugin - void Disable(Plugin plugin); + void OnPluginDisabled(Plugin plugin); } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Plugin.cs b/src/Artemis.Core/Plugins/Plugin.cs index da4e3f7aa..03403cf51 100644 --- a/src/Artemis.Core/Plugins/Plugin.cs +++ b/src/Artemis.Core/Plugins/Plugin.cs @@ -78,6 +78,11 @@ namespace Artemis.Core /// public IKernel? Kernel { get; internal set; } + /// + /// Gets a list of prerequisites for this plugin feature + /// + public List Prerequisites { get; } = new(); + /// /// The PluginLoader backing this plugin /// @@ -235,12 +240,12 @@ namespace Artemis.Core if (enable) { - Bootstrapper?.Enable(this); + Bootstrapper?.OnPluginEnabled(this); OnEnabled(); } else { - Bootstrapper?.Disable(this); + Bootstrapper?.OnPluginDisabled(this); OnDisabled(); } } diff --git a/src/Artemis.Core/Plugins/PluginFeature.cs b/src/Artemis.Core/Plugins/PluginFeature.cs index 8b9943a0a..dbe5a87d0 100644 --- a/src/Artemis.Core/Plugins/PluginFeature.cs +++ b/src/Artemis.Core/Plugins/PluginFeature.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading.Tasks; @@ -15,7 +16,7 @@ namespace Artemis.Core private readonly Stopwatch _updateStopwatch = new(); private bool _isEnabled; private Exception? _loadException; - + /// /// Gets the plugin feature info related to this feature /// @@ -59,6 +60,11 @@ namespace Artemis.Core /// public TimeSpan RenderTime { get; private set; } + /// + /// Gets a list of prerequisites for this plugin feature + /// + public List Prerequisites { get; } = new(); + internal PluginFeatureEntity Entity { get; set; } = null!; // Will be set right after construction /// diff --git a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs new file mode 100644 index 000000000..ea272786b --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs @@ -0,0 +1,156 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents a prerequisite for a or + /// + public abstract class PluginPrerequisite : CorePropertyChanged + { + private PluginPrerequisiteAction? _currentAction; + + /// + /// Creates a new instance of the class + /// + /// The plugin this is a prerequisite for + protected PluginPrerequisite(Plugin plugin) + { + Plugin = plugin; + } + + /// + /// Creates a new instance of the class + /// + /// The plugin feature this is a prerequisite for + protected PluginPrerequisite(PluginFeature pluginFeature) + { + PluginFeature = pluginFeature; + } + + /// + /// Gets the name of the prerequisite + /// + public abstract string Name { get; } + + /// + /// Gets the description of the prerequisite + /// + public abstract string Description { get; } + + /// + /// Gets a boolean indicating whether installing or uninstalling this prerequisite requires admin privileges + /// + public abstract bool RequiresElevation { get; } + + /// + /// Gets a list of actions to execute when is called + /// + public abstract List InstallActions { get; } + + /// + /// Gets a list of actions to execute when is called + /// + public abstract List UninstallActions { get; } + + /// + /// Gets or sets the action currently being executed + /// + public PluginPrerequisiteAction? CurrentAction + { + get => _currentAction; + private set => SetAndNotify(ref _currentAction, value); + } + + /// + /// Gets or sets the plugin this prerequisite is for + /// Note: Only one plugin or a plugin feature can be set at once + /// + public Plugin? Plugin { get; } + + /// + /// Gets or sets the feature this prerequisite is for + /// Note: Only one plugin or a plugin feature can be set at once + /// + public PluginFeature? PluginFeature { get; } + + /// + /// Execute all install actions + /// + public async Task Install(CancellationToken cancellationToken) + { + try + { + OnInstallStarting(); + foreach (PluginPrerequisiteAction installAction in InstallActions) + { + cancellationToken.ThrowIfCancellationRequested(); + CurrentAction = installAction; + await installAction.Execute(cancellationToken); + } + } + finally + { + CurrentAction = null; + OnInstallFinished(); + } + } + + /// + /// Execute all uninstall actions + /// + public async Task Uninstall(CancellationToken cancellationToken) + { + try + { + OnUninstallStarting(); + foreach (PluginPrerequisiteAction uninstallAction in UninstallActions) + { + cancellationToken.ThrowIfCancellationRequested(); + CurrentAction = uninstallAction; + await uninstallAction.Execute(cancellationToken); + } + } + finally + { + CurrentAction = null; + OnUninstallFinished(); + } + } + + /// + /// Called to determine whether the prerequisite is met + /// + /// if the prerequisite is met; otherwise + public abstract Task IsMet(); + + /// + /// Called before installation starts + /// + protected virtual void OnInstallStarting() + { + } + + /// + /// Called after installation finishes + /// + protected virtual void OnInstallFinished() + { + } + + /// + /// Called before uninstall starts + /// + protected virtual void OnUninstallStarting() + { + } + + /// + /// Called after uninstall finished + /// + protected virtual void OnUninstallFinished() + { + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs new file mode 100644 index 000000000..344d4412d --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs @@ -0,0 +1,76 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents an action that must be taken to install or uninstall a plugin prerequisite + /// + public abstract class PluginPrerequisiteAction : CorePropertyChanged + { + private bool _progressIndeterminate; + private string? _status; + private bool _subProgressIndeterminate; + + /// + /// The base constructor for all plugin prerequisite actions + /// + /// The name of the action + protected PluginPrerequisiteAction(string name) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + } + + #region Implementation of IPluginPrerequisiteAction + + /// + /// Gets the name of the action + /// + public string Name { get; } + + /// + /// Gets or sets the status of the action + /// + public string? Status + { + get => _status; + set => SetAndNotify(ref _status, value); + } + + /// + /// Gets or sets a boolean indicating whether the progress is indeterminate or not + /// + public bool ProgressIndeterminate + { + get => _progressIndeterminate; + set => SetAndNotify(ref _progressIndeterminate, value); + } + + /// + /// Gets or sets a boolean indicating whether the progress is indeterminate or not + /// + public bool SubProgressIndeterminate + { + get => _subProgressIndeterminate; + set => SetAndNotify(ref _subProgressIndeterminate, value); + } + + /// + /// Gets or sets the progress of the action (0 to 100) + /// + public PrerequisiteActionProgress Progress { get; } = new(); + + /// + /// Gets or sets the sub progress of the action + /// + public PrerequisiteActionProgress SubProgress { get; } = new(); + + /// + /// Called when the action must execute + /// + public abstract Task Execute(CancellationToken cancellationToken); + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs new file mode 100644 index 000000000..7a18f5f08 --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs @@ -0,0 +1,78 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Humanizer; + +namespace Artemis.Core +{ + /// + /// Represents a plugin prerequisite action that copies a folder + /// + public class CopyFolderAction : PluginPrerequisiteAction + { + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The source folder to copy + /// The target folder to copy to (will be created if needed) + public CopyFolderAction(string name, string source, string target) : base(name) + { + Source = source; + Target = target; + } + + /// + /// Gets the source directory + /// + public string Source { get; } + + /// + /// Gets or sets the target directory + /// + public string Target { get; } + + /// + public override async Task Execute(CancellationToken cancellationToken) + { + DirectoryInfo source = new(Source); + DirectoryInfo target = new(Target); + + if (!source.Exists) + throw new ArtemisCoreException($"The source directory at '{source}' was not found."); + + int filesCopied = 0; + FileInfo[] files = source.GetFiles("*", SearchOption.AllDirectories); + + foreach (FileInfo fileInfo in files) + { + string outputPath = fileInfo.FullName.Replace(source.FullName, target.FullName); + string outputDir = Path.GetDirectoryName(outputPath)!; + Utilities.CreateAccessibleDirectory(outputDir); + + void SubProgressOnProgressReported(object? sender, EventArgs e) + { + if (SubProgress.ProgressPerSecond != 0) + Status = $"Copying {fileInfo.Name} - {SubProgress.ProgressPerSecond.Bytes().Humanize("#.##")}/sec"; + else + Status = $"Copying {fileInfo.Name}"; + } + + Progress.Report((filesCopied, files.Length)); + SubProgress.ProgressReported += SubProgressOnProgressReported; + + await using FileStream sourceStream = fileInfo.OpenRead(); + await using FileStream destinationStream = File.Create(outputPath); + + await sourceStream.CopyToAsync(fileInfo.Length, destinationStream, SubProgress, cancellationToken); + + filesCopied++; + SubProgress.ProgressReported -= SubProgressOnProgressReported; + } + + Progress.Report((filesCopied, files.Length)); + Status = $"Finished copying {filesCopied} file(s)"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs new file mode 100644 index 000000000..0dedc3f28 --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs @@ -0,0 +1,70 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents a plugin prerequisite action that copies a folder + /// + public class WriteToFileAction : PluginPrerequisiteAction + { + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The target file to write to (will be created if needed) + /// The contents to write + public WriteToFileAction(string name, string target, string content) : base(name) + { + Target = target ?? throw new ArgumentNullException(nameof(target)); + Content = content ?? throw new ArgumentNullException(nameof(content)); + } + + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The target file to write to (will be created if needed) + /// The contents to write + public WriteToFileAction(string name, string target, byte[] content) : base(name) + { + Target = target; + ByteContent = content ?? throw new ArgumentNullException(nameof(content)); + } + + /// + /// Gets or sets the target file + /// + public string Target { get; } + + /// + /// Gets the contents that will be written + /// + public string? Content { get; } + + /// + /// Gets the bytes that will be written + /// + public byte[]? ByteContent { get; } + + /// + public override async Task Execute(CancellationToken cancellationToken) + { + string outputDir = Path.GetDirectoryName(Target)!; + Utilities.CreateAccessibleDirectory(outputDir); + + ProgressIndeterminate = true; + Status = $"Writing to {Path.GetFileName(Target)}..."; + + if (Content != null) + await File.WriteAllTextAsync(Target, Content, cancellationToken); + else if (ByteContent != null) + await File.WriteAllBytesAsync(Target, ByteContent, cancellationToken); + + ProgressIndeterminate = false; + Status = $"Finished writing to {Path.GetFileName(Target)}"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteActionProgress.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteActionProgress.cs new file mode 100644 index 000000000..96b48bde3 --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteActionProgress.cs @@ -0,0 +1,91 @@ +using System; + +namespace Artemis.Core +{ + /// + /// Represents progress on a plugin prerequisite action + /// + public class PrerequisiteActionProgress : CorePropertyChanged, IProgress<(long, long)> + { + private long _current; + private DateTime _lastReport; + private double _percentage; + private double _progressPerSecond; + private long _total; + private long _lastReportValue; + + /// + /// The current amount + /// + public long Current + { + get => _current; + set => SetAndNotify(ref _current, value); + } + + /// + /// The total amount + /// + public long Total + { + get => _total; + set => SetAndNotify(ref _total, value); + } + + /// + /// The percentage + /// + public double Percentage + { + get => _percentage; + set => SetAndNotify(ref _percentage, value); + } + + /// + /// Gets or sets the progress per second + /// + public double ProgressPerSecond + { + get => _progressPerSecond; + set => SetAndNotify(ref _progressPerSecond, value); + } + + #region Implementation of IProgress + + /// + public void Report((long, long) value) + { + (long newCurrent, long newTotal) = value; + + TimeSpan timePassed = DateTime.Now - _lastReport; + if (timePassed >= TimeSpan.FromSeconds(1)) + { + ProgressPerSecond = Math.Max(0, Math.Round(1.0 / timePassed.TotalSeconds * (newCurrent - _lastReportValue), 2)); + _lastReportValue = newCurrent; + _lastReport = DateTime.Now; + } + + Current = newCurrent; + Total = newTotal; + Percentage = Math.Round((double) Current / Total * 100.0, 2); + + OnProgressReported(); + } + + #endregion + + #region Events + + /// + /// Occurs when progress has been reported + /// + public event EventHandler? ProgressReported; + + protected virtual void OnProgressReported() + { + ProgressReported?.Invoke(this, EventArgs.Empty); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Services/PluginManagementService.cs b/src/Artemis.Core/Services/PluginManagementService.cs index 4f833282d..9fcd8829a 100644 --- a/src/Artemis.Core/Services/PluginManagementService.cs +++ b/src/Artemis.Core/Services/PluginManagementService.cs @@ -340,7 +340,10 @@ namespace Artemis.Core.Services if (bootstrappers.Count > 1) _logger.Warning($"{plugin} has more than one bootstrapper, only initializing {bootstrappers.First().FullName}"); if (bootstrappers.Any()) + { plugin.Bootstrapper = (IPluginBootstrapper?) Activator.CreateInstance(bootstrappers.First()); + plugin.Bootstrapper?.OnPluginLoaded(plugin); + } lock (_plugins) { diff --git a/src/Artemis.UI.Shared/Services/ColorPickerService.cs b/src/Artemis.UI.Shared/Services/ColorPickerService.cs index a3602c1b7..bacb62802 100644 --- a/src/Artemis.UI.Shared/Services/ColorPickerService.cs +++ b/src/Artemis.UI.Shared/Services/ColorPickerService.cs @@ -53,7 +53,7 @@ namespace Artemis.UI.Shared.Services public LinkedList RecentColors => RecentColorsSetting.Value; - public Task ShowGradientPicker(ColorGradient colorGradient, string dialogHost) + public Task ShowGradientPicker(ColorGradient colorGradient, string dialogHost) { if (!string.IsNullOrWhiteSpace(dialogHost)) return _dialogService.ShowDialogAt(dialogHost, new Dictionary {{"colorGradient", colorGradient}}); diff --git a/src/Artemis.UI.Shared/Services/Dialog/DialogViewModelBase.cs b/src/Artemis.UI.Shared/Services/Dialog/DialogViewModelBase.cs index 3cdddba3b..81c7fbbf0 100644 --- a/src/Artemis.UI.Shared/Services/Dialog/DialogViewModelBase.cs +++ b/src/Artemis.UI.Shared/Services/Dialog/DialogViewModelBase.cs @@ -6,7 +6,7 @@ namespace Artemis.UI.Shared.Services /// /// Represents the base class for a dialog view model /// - public abstract class DialogViewModelBase : ValidatingModelBase + public abstract class DialogViewModelBase : Screen { private DialogViewModelHost? _dialogViewModelHost; private DialogSession? _session; @@ -47,6 +47,7 @@ namespace Artemis.UI.Shared.Services /// public virtual void OnDialogClosed(object sender, DialogClosingEventArgs e) { + ScreenExtensions.TryClose(this); } /// @@ -61,6 +62,7 @@ namespace Artemis.UI.Shared.Services internal void OnDialogOpened(object sender, DialogOpenedEventArgs e) { Session = e.Session; + ScreenExtensions.TryActivate(this); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Services/Interfaces/IColorPickerService.cs b/src/Artemis.UI.Shared/Services/Interfaces/IColorPickerService.cs index a5bbc26f8..6fcee45e3 100644 --- a/src/Artemis.UI.Shared/Services/Interfaces/IColorPickerService.cs +++ b/src/Artemis.UI.Shared/Services/Interfaces/IColorPickerService.cs @@ -7,7 +7,7 @@ namespace Artemis.UI.Shared.Services { internal interface IColorPickerService : IArtemisSharedUIService { - Task ShowGradientPicker(ColorGradient colorGradient, string dialogHost); + Task ShowGradientPicker(ColorGradient colorGradient, string dialogHost); PluginSetting PreviewSetting { get; } LinkedList RecentColors { get; } diff --git a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs index e24134dce..d5d54ef50 100644 --- a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs +++ b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs @@ -2,6 +2,7 @@ using Artemis.Core.Modules; using Artemis.UI.Screens.Modules; using Artemis.UI.Screens.Modules.Tabs; +using Artemis.UI.Screens.Plugins; using Artemis.UI.Screens.ProfileEditor; using Artemis.UI.Screens.ProfileEditor.Conditions; using Artemis.UI.Screens.ProfileEditor.LayerProperties; @@ -95,7 +96,13 @@ namespace Artemis.UI.Ninject.Factories TimelineSegmentViewModel TimelineSegmentViewModel(SegmentViewModelType segment, IObservableCollection layerPropertyGroups); } - public interface IDataBindingsVmFactory + public interface IPrerequisitesVmFactory : IVmFactory + { + PluginPrerequisiteViewModel PluginPrerequisiteViewModel(PluginPrerequisite pluginPrerequisite); + } + + // TODO: Move these two + public interface IDataBindingsVmFactory { IDataBindingViewModel DataBindingViewModel(IDataBindingRegistration registration); DirectDataBindingModeViewModel DirectDataBindingModeViewModel(DirectDataBinding directDataBinding); @@ -104,7 +111,7 @@ namespace Artemis.UI.Ninject.Factories DataBindingConditionViewModel DataBindingConditionViewModel(DataBindingCondition dataBindingCondition); } - public interface IPropertyVmFactory + public interface IPropertyVmFactory { ITreePropertyViewModel TreePropertyViewModel(ILayerProperty layerProperty, LayerPropertyViewModel layerPropertyViewModel); ITimelinePropertyViewModel TimelinePropertyViewModel(ILayerProperty layerProperty, LayerPropertyViewModel layerPropertyViewModel); diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.xaml b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.xaml new file mode 100644 index 000000000..31ec31f24 --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.xaml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionViewModel.cs new file mode 100644 index 000000000..279414a6a --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionViewModel.cs @@ -0,0 +1,71 @@ +using System; +using System.ComponentModel; +using Artemis.Core; +using Stylet; + +namespace Artemis.UI.Screens.Plugins +{ + public class PluginPrerequisiteActionViewModel : Screen + { + private bool _showProgressBar; + private bool _showSubProgressBar; + + public PluginPrerequisiteActionViewModel(PluginPrerequisiteAction action) + { + Action = action; + } + + public PluginPrerequisiteAction Action { get; } + + public bool ShowProgressBar + { + get => _showProgressBar; + set => SetAndNotify(ref _showProgressBar, value); + } + + public bool ShowSubProgressBar + { + get => _showSubProgressBar; + set => SetAndNotify(ref _showSubProgressBar, value); + } + + private void ActionOnPropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(Action.ProgressIndeterminate) || e.PropertyName == nameof(Action.SubProgressIndeterminate)) + UpdateProgress(); + } + + private void ProgressReported(object? sender, EventArgs e) + { + UpdateProgress(); + } + + private void UpdateProgress() + { + ShowSubProgressBar = Action.SubProgress.Percentage != 0 || Action.SubProgressIndeterminate; + ShowProgressBar = ShowSubProgressBar || Action.Progress.Percentage != 0 || Action.ProgressIndeterminate; + } + + #region Overrides of Screen + + /// + protected override void OnInitialActivate() + { + Action.Progress.ProgressReported += ProgressReported; + Action.SubProgress.ProgressReported += ProgressReported; + Action.PropertyChanged += ActionOnPropertyChanged; + base.OnInitialActivate(); + } + + /// + protected override void OnClose() + { + Action.Progress.ProgressReported -= ProgressReported; + Action.SubProgress.ProgressReported -= ProgressReported; + Action.PropertyChanged -= ActionOnPropertyChanged; + base.OnClose(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.xaml b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.xaml new file mode 100644 index 000000000..3049b6c16 --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs new file mode 100644 index 000000000..b70b97ba4 --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs @@ -0,0 +1,142 @@ +using System; +using System.ComponentModel; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Artemis.Core; +using Artemis.Core.Services; +using Artemis.UI.Shared.Services; +using Stylet; + +namespace Artemis.UI.Screens.Plugins +{ + public class PluginPrerequisiteViewModel : Conductor.Collection.OneActive + { + private readonly ICoreService _coreService; + private readonly IDialogService _dialogService; + private bool _installing; + private bool _uninstalling; + private bool _isMet; + + public PluginPrerequisiteViewModel(PluginPrerequisite pluginPrerequisite, ICoreService coreService, IDialogService dialogService) + { + _coreService = coreService; + _dialogService = dialogService; + + PluginPrerequisite = pluginPrerequisite; + } + + public PluginPrerequisite PluginPrerequisite { get; } + + public bool Installing + { + get => _installing; + set + { + SetAndNotify(ref _installing, value); + NotifyOfPropertyChange(nameof(Busy)); + } + } + + public bool Uninstalling + { + get => _uninstalling; + set + { + SetAndNotify(ref _uninstalling, value); + NotifyOfPropertyChange(nameof(Busy)); + } + } + + public bool IsMet + { + get => _isMet; + set => SetAndNotify(ref _isMet, value); + } + + public bool Busy => Installing || Uninstalling; + public int ActiveStemNumber => Items.IndexOf(ActiveItem) + 1; + public bool HasMultipleActions => Items.Count > 1; + + public async Task Install(CancellationToken cancellationToken) + { + if (Busy) + return; + + if (PluginPrerequisite.RequiresElevation && !_coreService.IsElevated) + { + await _dialogService.ShowConfirmDialog("Install plugin prerequisite", "This plugin prerequisite admin rights to install (restart & elevate NYI)"); + return; + } + + Installing = true; + try + { + await PluginPrerequisite.Install(cancellationToken); + } + finally + { + Installing = false; + IsMet = await PluginPrerequisite.IsMet(); + } + } + + public async Task Uninstall(CancellationToken cancellationToken) + { + if (Busy) + return; + + if (PluginPrerequisite.RequiresElevation && !_coreService.IsElevated) + { + await _dialogService.ShowConfirmDialog("Install plugin prerequisite", "This plugin prerequisite admin rights to install (restart & elevate NYI)"); + return; + } + + Uninstalling = true; + try + { + await PluginPrerequisite.Uninstall(cancellationToken); + } + finally + { + Uninstalling = false; + IsMet = await PluginPrerequisite.IsMet(); + } + } + + private void PluginPrerequisiteOnPropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(PluginPrerequisite.CurrentAction)) + ActivateCurrentAction(); + } + + private void ActivateCurrentAction() + { + ActiveItem = Items.FirstOrDefault(i => i.Action == PluginPrerequisite.CurrentAction); + NotifyOfPropertyChange(nameof(ActiveStemNumber)); + } + + #region Overrides of Screen + + /// + protected override void OnClose() + { + PluginPrerequisite.PropertyChanged += PluginPrerequisiteOnPropertyChanged; + base.OnClose(); + } + + /// + protected override void OnInitialActivate() + { + PluginPrerequisite.PropertyChanged -= PluginPrerequisiteOnPropertyChanged; + Task.Run(async () => IsMet = await PluginPrerequisite.IsMet()); + + Items.AddRange(PluginPrerequisite.InstallActions.Select(a => new PluginPrerequisiteActionViewModel(a))); + Items.AddRange(PluginPrerequisite.UninstallActions.Select(a => new PluginPrerequisiteActionViewModel(a))); + + base.OnInitialActivate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesDialogView.xaml b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesDialogView.xaml new file mode 100644 index 000000000..124406e0b --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesDialogView.xaml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + Plugin prerequisites + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In order for this plugin to function certain prerequisites must be met. + On the left side you can see all prerequisites and whether they are currently met or not. + Clicking install prerequisites will automatically set everything up for you. + + + + + + + + + Selected stop: @@ -122,8 +157,12 @@ Margin="8,0,0,0" IsEnabled="{Binding HasSelectedColorStopViewModel}" Command="{s:Action RemoveColorStop}" - CommandParameter="{Binding SelectedColorStopViewModel}"> - DELETE + CommandParameter="{Binding SelectedColorStopViewModel}" + ToolTip="Delete Selected Stop"> + + + Delete + diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorViewModel.cs b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorViewModel.cs index 497d81963..fb170cc33 100644 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorViewModel.cs +++ b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorViewModel.cs @@ -27,6 +27,7 @@ namespace Artemis.UI.Shared.Screens.GradientEditor PropertyChanged += UpdateColorStopViewModels; ColorGradient.CollectionChanged += ColorGradientOnCollectionChanged; + ColorStopViewModels.CollectionChanged += ColorStopViewModelsOnCollectionChanged; } #region Overrides of DialogViewModelBase @@ -53,6 +54,7 @@ namespace Artemis.UI.Shared.Screens.GradientEditor } public bool HasSelectedColorStopViewModel => SelectedColorStopViewModel != null; + public bool HasMoreThanOneStop => ColorStopViewModels.Count > 1; public ColorGradient ColorGradient { get; } @@ -79,6 +81,7 @@ namespace Artemis.UI.Shared.Screens.GradientEditor ColorStopViewModels.Insert(index, viewModel); SelectColorStop(viewModel); + NotifyOfPropertyChange(nameof(HasMoreThanOneStop)); } public void RemoveColorStop(ColorStopViewModel colorStopViewModel) @@ -90,6 +93,38 @@ namespace Artemis.UI.Shared.Screens.GradientEditor ColorGradient.Remove(colorStopViewModel.ColorStop); SelectColorStop(null); + NotifyOfPropertyChange(nameof(HasMoreThanOneStop)); + } + + public void SpreadColorStops() + { + var stops = ColorStopViewModels.OrderBy(x => x.OffsetFloat); + int index = 0; + foreach (ColorStopViewModel stop in stops) + { + stop.OffsetFloat = index / ((float)stops.Count() - 1); + index++; + } + } + + public void RotateColorStops() + { + var stops = ColorStopViewModels.OrderByDescending(x => x.OffsetFloat); + float lastStopPosition = stops.Last().OffsetFloat; + foreach (ColorStopViewModel stop in stops) + { + float tempStop = stop.OffsetFloat; + stop.OffsetFloat = lastStopPosition; + lastStopPosition = tempStop; + } + } + + public void FlipColorStops() + { + foreach (ColorStopViewModel stop in ColorStopViewModels) + { + stop.OffsetFloat = 1 - stop.OffsetFloat; + } } public Point GetPositionInPreview(object sender, MouseEventArgs e) @@ -127,10 +162,15 @@ namespace Artemis.UI.Shared.Screens.GradientEditor foreach (ColorGradientStop colorStop in ColorGradient) ColorStopViewModels.Add(new ColorStopViewModel(this, colorStop)); } - + private void ColorGradientOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { NotifyOfPropertyChange(nameof(ColorGradient)); } + + private void ColorStopViewModelsOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + NotifyOfPropertyChange(nameof(HasMoreThanOneStop)); + } } } \ No newline at end of file From 0cfddcbbaf0c0fd14f1ba1c738a8166aa7b8bd67 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 28 Apr 2021 00:32:42 +0200 Subject: [PATCH 03/35] Plugin prerequisites - Added UI for installing/removing prerequisites Plugin settings - Added button to reload plugin from disk Confirm dialogs - Made cancel text optional so you can hide the button --- .../ArtemisPluginPrerequisiteException.cs | 38 +++++ src/Artemis.Core/Plugins/Plugin.cs | 8 + .../Prerequisites/PluginPrerequisite.cs | 2 +- .../Prerequisites/PluginPrerequisiteAction.cs | 20 +++ .../PrerequisiteAction/CopyFolderAction.cs | 3 + .../PrerequisiteAction/DeleteFileAction.cs | 44 +++++ .../PrerequisiteAction/DeleteFolderAction.cs | 49 ++++++ .../WriteBytesToFileAction.cs | 62 +++++++ ...leAction.cs => WriteStringToFileAction.cs} | 42 ++--- .../Services/PluginManagementService.cs | 14 +- .../Screens/Dialogs/ConfirmDialogView.xaml | 13 +- .../Services/Dialog/DialogService.cs | 10 +- src/Artemis.UI/Artemis.UI.csproj | 3 + .../Ninject/Factories/IVMFactory.cs | 2 +- .../Plugins/PluginPrerequisiteActionView.xaml | 4 +- .../PluginPrerequisiteActionViewModel.cs | 54 +----- .../Plugins/PluginPrerequisiteViewModel.cs | 18 +- ...PluginPrerequisitesInstallDialogView.xaml} | 4 +- ...ginPrerequisitesInstallDialogViewModel.cs} | 37 ++++- ...luginPrerequisitesUninstallDialogView.xaml | 125 ++++++++++++++ ...inPrerequisitesUninstallDialogViewModel.cs | 154 ++++++++++++++++++ .../Tabs/Devices/DeviceSettingsView.xaml | 2 +- .../Tabs/Plugins/PluginSettingsTabView.xaml | 1 - .../Tabs/Plugins/PluginSettingsView.xaml | 86 +++++++--- .../Tabs/Plugins/PluginSettingsViewModel.cs | 104 +++++++++--- 25 files changed, 741 insertions(+), 158 deletions(-) create mode 100644 src/Artemis.Core/Exceptions/ArtemisPluginPrerequisiteException.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFileAction.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFolderAction.cs create mode 100644 src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteBytesToFileAction.cs rename src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/{WriteToFileAction.cs => WriteStringToFileAction.cs} (55%) rename src/Artemis.UI/Screens/Plugins/{PluginPrerequisitesDialogView.xaml => PluginPrerequisitesInstallDialogView.xaml} (99%) rename src/Artemis.UI/Screens/Plugins/{PluginPrerequisitesDialogViewModel.cs => PluginPrerequisitesInstallDialogViewModel.cs} (66%) create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogView.xaml create mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs diff --git a/src/Artemis.Core/Exceptions/ArtemisPluginPrerequisiteException.cs b/src/Artemis.Core/Exceptions/ArtemisPluginPrerequisiteException.cs new file mode 100644 index 000000000..fd2dbe169 --- /dev/null +++ b/src/Artemis.Core/Exceptions/ArtemisPluginPrerequisiteException.cs @@ -0,0 +1,38 @@ +using System; + +namespace Artemis.Core +{ + /// + /// An exception thrown when a plugin prerequisite-related error occurs + /// + public class ArtemisPluginPrerequisiteException : Exception + { + internal ArtemisPluginPrerequisiteException(Plugin plugin, PluginPrerequisite? pluginPrerequisite) + { + Plugin = plugin; + PluginPrerequisite = pluginPrerequisite; + } + + internal ArtemisPluginPrerequisiteException(Plugin plugin, PluginPrerequisite? pluginPrerequisite, string message) : base(message) + { + Plugin = plugin; + PluginPrerequisite = pluginPrerequisite; + } + + internal ArtemisPluginPrerequisiteException(Plugin plugin, PluginPrerequisite? pluginPrerequisite, string message, Exception inner) : base(message, inner) + { + Plugin = plugin; + PluginPrerequisite = pluginPrerequisite; + } + + /// + /// Gets the plugin the error is related to + /// + public Plugin Plugin { get; } + + /// + /// Gets the plugin prerequisite the error is related to + /// + public PluginPrerequisite? PluginPrerequisite { get; } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Plugin.cs b/src/Artemis.Core/Plugins/Plugin.cs index 03403cf51..a8dbaf7ad 100644 --- a/src/Artemis.Core/Plugins/Plugin.cs +++ b/src/Artemis.Core/Plugins/Plugin.cs @@ -125,6 +125,14 @@ namespace Artemis.Core return Info.ToString(); } + /// + /// Determines whether the prerequisites of this plugin are met + /// + public bool ArePrerequisitesMet() + { + return Prerequisites.All(p => p.IsMet()); + } + /// /// Occurs when the plugin is enabled /// diff --git a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs index ea272786b..5267b4d33 100644 --- a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs +++ b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisite.cs @@ -123,7 +123,7 @@ namespace Artemis.Core /// Called to determine whether the prerequisite is met /// /// if the prerequisite is met; otherwise - public abstract Task IsMet(); + public abstract bool IsMet(); /// /// Called before installation starts diff --git a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs index 344d4412d..90d9a787e 100644 --- a/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs +++ b/src/Artemis.Core/Plugins/Prerequisites/PluginPrerequisiteAction.cs @@ -10,6 +10,8 @@ namespace Artemis.Core public abstract class PluginPrerequisiteAction : CorePropertyChanged { private bool _progressIndeterminate; + private bool _showProgressBar; + private bool _showSubProgressBar; private string? _status; private bool _subProgressIndeterminate; @@ -56,6 +58,24 @@ namespace Artemis.Core set => SetAndNotify(ref _subProgressIndeterminate, value); } + /// + /// Gets or sets a boolean indicating whether the progress bar should be shown + /// + public bool ShowProgressBar + { + get => _showProgressBar; + set => SetAndNotify(ref _showProgressBar, value); + } + + /// + /// Gets or sets a boolean indicating whether the sub progress bar should be shown + /// + public bool ShowSubProgressBar + { + get => _showSubProgressBar; + set => SetAndNotify(ref _showSubProgressBar, value); + } + /// /// Gets or sets the progress of the action (0 to 100) /// diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs index 7a18f5f08..6602567e0 100644 --- a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/CopyFolderAction.cs @@ -21,6 +21,9 @@ namespace Artemis.Core { Source = source; Target = target; + + ShowProgressBar = true; + ShowSubProgressBar = true; } /// diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFileAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFileAction.cs new file mode 100644 index 000000000..e6324bf8f --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFileAction.cs @@ -0,0 +1,44 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents a plugin prerequisite action that deletes a file + /// + public class DeleteFileAction : PluginPrerequisiteAction + { + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The target folder to delete recursively + public DeleteFileAction(string name, string target) : base(name) + { + Target = target; + ProgressIndeterminate = true; + } + + /// + /// Gets or sets the target directory + /// + public string Target { get; } + + /// + public override async Task Execute(CancellationToken cancellationToken) + { + ShowProgressBar = true; + Status = $"Removing {Target}"; + + await Task.Run(() => + { + if (File.Exists(Target)) + File.Delete(Target); + }, cancellationToken); + + ShowProgressBar = false; + Status = $"Removed {Target}"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFolderAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFolderAction.cs new file mode 100644 index 000000000..62b4dfc41 --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/DeleteFolderAction.cs @@ -0,0 +1,49 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents a plugin prerequisite action that recursively deletes a folder + /// + public class DeleteFolderAction : PluginPrerequisiteAction + { + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The target folder to delete recursively + public DeleteFolderAction(string name, string target) : base(name) + { + if (Enum.GetValues().Select(Environment.GetFolderPath).Contains(target)) + throw new ArtemisCoreException($"Cannot delete special folder {target}, silly goose."); + + Target = target; + ProgressIndeterminate = true; + } + + /// + /// Gets or sets the target directory + /// + public string Target { get; } + + /// + public override async Task Execute(CancellationToken cancellationToken) + { + ShowProgressBar = true; + Status = $"Removing {Target}"; + + await Task.Run(() => + { + if (Directory.Exists(Target)) + Directory.Delete(Target, true); + }, cancellationToken); + + ShowProgressBar = false; + Status = $"Removed {Target}"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteBytesToFileAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteBytesToFileAction.cs new file mode 100644 index 000000000..92c7d0294 --- /dev/null +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteBytesToFileAction.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Artemis.Core +{ + /// + /// Represents a plugin prerequisite action that copies a folder + /// + public class WriteBytesToFileAction : PluginPrerequisiteAction + { + /// + /// Creates a new instance of a copy folder action + /// + /// The name of the action + /// The target file to write to (will be created if needed) + /// The contents to write + public WriteBytesToFileAction(string name, string target, byte[] content) : base(name) + { + Target = target; + ByteContent = content ?? throw new ArgumentNullException(nameof(content)); + } + + /// + /// Gets or sets the target file + /// + public string Target { get; } + + /// + /// Gets or sets a boolean indicating whether or not to append to the file if it exists already, if set to + /// the file will be deleted and recreated + /// + public bool Append { get; set; } = false; + + /// + /// Gets the bytes that will be written + /// + public byte[] ByteContent { get; } + + /// + public override async Task Execute(CancellationToken cancellationToken) + { + string outputDir = Path.GetDirectoryName(Target)!; + Utilities.CreateAccessibleDirectory(outputDir); + + ShowProgressBar = true; + Status = $"Writing to {Path.GetFileName(Target)}..."; + + if (!Append && File.Exists(Target)) + File.Delete(Target); + + await using Stream fileStream = File.OpenWrite(Target); + await using MemoryStream sourceStream = new(ByteContent); + await sourceStream.CopyToAsync(sourceStream.Length, fileStream, Progress, cancellationToken); + + ShowProgressBar = false; + Status = $"Finished writing to {Path.GetFileName(Target)}"; + } + } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteStringToFileAction.cs similarity index 55% rename from src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs rename to src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteStringToFileAction.cs index 0dedc3f28..e4e6a9875 100644 --- a/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteToFileAction.cs +++ b/src/Artemis.Core/Plugins/Prerequisites/PrerequisiteAction/WriteStringToFileAction.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Text; using System.Threading; using System.Threading.Tasks; @@ -8,7 +9,7 @@ namespace Artemis.Core /// /// Represents a plugin prerequisite action that copies a folder /// - public class WriteToFileAction : PluginPrerequisiteAction + public class WriteStringToFileAction : PluginPrerequisiteAction { /// /// Creates a new instance of a copy folder action @@ -16,22 +17,12 @@ namespace Artemis.Core /// The name of the action /// The target file to write to (will be created if needed) /// The contents to write - public WriteToFileAction(string name, string target, string content) : base(name) - { - Target = target ?? throw new ArgumentNullException(nameof(target)); - Content = content ?? throw new ArgumentNullException(nameof(content)); - } - - /// - /// Creates a new instance of a copy folder action - /// - /// The name of the action - /// The target file to write to (will be created if needed) - /// The contents to write - public WriteToFileAction(string name, string target, byte[] content) : base(name) + public WriteStringToFileAction(string name, string target, string content) : base(name) { Target = target; - ByteContent = content ?? throw new ArgumentNullException(nameof(content)); + Content = content ?? throw new ArgumentNullException(nameof(content)); + + ProgressIndeterminate = true; } /// @@ -40,30 +31,31 @@ namespace Artemis.Core public string Target { get; } /// - /// Gets the contents that will be written + /// Gets or sets a boolean indicating whether or not to append to the file if it exists already, if set to + /// the file will be deleted and recreated /// - public string? Content { get; } + public bool Append { get; set; } = false; /// - /// Gets the bytes that will be written + /// Gets the string that will be written /// - public byte[]? ByteContent { get; } - + public string Content { get; } + /// public override async Task Execute(CancellationToken cancellationToken) { string outputDir = Path.GetDirectoryName(Target)!; Utilities.CreateAccessibleDirectory(outputDir); - ProgressIndeterminate = true; + ShowProgressBar = true; Status = $"Writing to {Path.GetFileName(Target)}..."; - if (Content != null) + if (Append) + await File.AppendAllTextAsync(Target, Content, cancellationToken); + else await File.WriteAllTextAsync(Target, Content, cancellationToken); - else if (ByteContent != null) - await File.WriteAllBytesAsync(Target, ByteContent, cancellationToken); - ProgressIndeterminate = false; + ShowProgressBar = false; Status = $"Finished writing to {Path.GetFileName(Target)}"; } } diff --git a/src/Artemis.Core/Services/PluginManagementService.cs b/src/Artemis.Core/Services/PluginManagementService.cs index 9fcd8829a..a46c1e3fb 100644 --- a/src/Artemis.Core/Services/PluginManagementService.cs +++ b/src/Artemis.Core/Services/PluginManagementService.cs @@ -241,7 +241,16 @@ namespace Artemis.Core.Services } foreach (Plugin plugin in _plugins.Where(p => p.Entity.IsEnabled)) - EnablePlugin(plugin, false, ignorePluginLock); + { + try + { + EnablePlugin(plugin, false, ignorePluginLock); + } + catch (ArtemisPluginPrerequisiteException) + { + _logger.Warning("Skipped enabling plugin {plugin} because not all prerequisites are met", plugin); + } + } _logger.Debug("Enabled {count} plugin(s)", _plugins.Count(p => p.IsEnabled)); // ReSharper restore InconsistentlySynchronizedField @@ -372,6 +381,9 @@ namespace Artemis.Core.Services return; } + if (!plugin.ArePrerequisitesMet()) + throw new ArtemisPluginPrerequisiteException(plugin, null, "Cannot enable a plugin whose prerequisites aren't all met"); + // Create the Ninject child kernel and load the module plugin.Kernel = new ChildKernel(_kernel, new PluginModule(plugin)); OnPluginEnabling(new PluginEventArgs(plugin)); diff --git a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml b/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml index 9fced07e6..a65e58422 100644 --- a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml +++ b/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml @@ -1,14 +1,18 @@ - + d:DataContext="{d:DesignInstance {x:Type dialogs:ConfirmDialogViewModel}}"> + + + + Content="{Binding CancelText}" + Visibility="{Binding CancelText, Converter={StaticResource NullToVisibilityConverter}, Mode=OneWay}" /> - - + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs index f025488c1..e3aa2f065 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs @@ -10,23 +10,24 @@ using Artemis.UI.Ninject.Factories; using Artemis.UI.Screens.Plugins; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; -using MaterialDesignThemes.Wpf; using Ninject; using Stylet; -using Constants = Artemis.Core.Constants; namespace Artemis.UI.Screens.Settings.Tabs.Plugins { public class PluginSettingsViewModel : Conductor.Collection.AllActive { + private readonly ICoreService _coreService; private readonly IDialogService _dialogService; + private readonly IMessageService _messageService; private readonly IPluginManagementService _pluginManagementService; private readonly ISettingsVmFactory _settingsVmFactory; - private readonly ICoreService _coreService; - private readonly IMessageService _messageService; private readonly IWindowManager _windowManager; private bool _enabling; private Plugin _plugin; + private bool _isSettingsPopupOpen; + private bool _canInstallPrerequisites; + private bool _canRemovePrerequisites; public PluginSettingsViewModel(Plugin plugin, ISettingsVmFactory settingsVmFactory, @@ -70,6 +71,28 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins set => Task.Run(() => UpdateEnabled(value)); } + public bool IsSettingsPopupOpen + { + get => _isSettingsPopupOpen; + set + { + if (!SetAndNotify(ref _isSettingsPopupOpen, value)) return; + CheckPrerequisites(); + } + } + + public bool CanInstallPrerequisites + { + get => _canInstallPrerequisites; + set => SetAndNotify(ref _canInstallPrerequisites, value); + } + + public bool CanRemovePrerequisites + { + get => _canRemovePrerequisites; + set => SetAndNotify(ref _canRemovePrerequisites, value); + } + public void OpenSettings() { PluginConfigurationDialog configurationViewModel = (PluginConfigurationDialog) Plugin.ConfigurationDialog; @@ -88,6 +111,49 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins } } + public void OpenPluginDirectory() + { + try + { + Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", Plugin.Directory.FullName); + } + catch (Exception e) + { + _dialogService.ShowExceptionDialog("Welp, we couldn't open the device's plugin folder for you", e); + } + } + + public async Task Reload() + { + bool wasEnabled = IsEnabled; + + _pluginManagementService.UnloadPlugin(Plugin); + Items.Clear(); + + Plugin = _pluginManagementService.LoadPlugin(Plugin.Directory); + foreach (PluginFeatureInfo pluginFeatureInfo in Plugin.Features) + Items.Add(_settingsVmFactory.CreatePluginFeatureViewModel(pluginFeatureInfo, false)); + + if (wasEnabled) + await UpdateEnabled(true); + } + + public async Task InstallPrerequisites() + { + if (Plugin.Prerequisites.Any()) + await ShowPrerequisitesDialog(false); + } + + public async Task RemovePrerequisites() + { + if (Plugin.Prerequisites.Any(p => p.UninstallActions.Any())) + { + await ShowPrerequisitesDialog(true); + NotifyOfPropertyChange(nameof(IsEnabled)); + NotifyOfPropertyChange(nameof(CanOpenSettings)); + } + } + public async Task RemoveSettings() { bool confirmed = await _dialogService.ShowConfirmDialog("Clear plugin settings", "Are you sure you want to clear the settings of this plugin?"); @@ -109,7 +175,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins public async Task Remove() { - bool confirmed = await _dialogService.ShowConfirmDialog("Delete plugin", "Are you sure you want to delete this plugin?"); + bool confirmed = await _dialogService.ShowConfirmDialog("Remove plugin", "Are you sure you want to remove this plugin?"); if (!confirmed) return; @@ -170,10 +236,10 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins } // Check if all prerequisites are met async - if (!await ArePrerequisitesMetAsync()) + if (!Plugin.ArePrerequisitesMet()) { - await _dialogService.ShowDialog(new Dictionary {{"pluginOrFeature", Plugin}}); - if (!await ArePrerequisitesMetAsync()) + await ShowPrerequisitesDialog(false); + if (!Plugin.ArePrerequisitesMet()) { CancelEnable(); return; @@ -194,9 +260,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins } } else - { _pluginManagementService.DisablePlugin(Plugin, true); - } NotifyOfPropertyChange(nameof(IsEnabled)); NotifyOfPropertyChange(nameof(CanOpenSettings)); @@ -209,19 +273,17 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins NotifyOfPropertyChange(nameof(CanOpenSettings)); } - private async Task ArePrerequisitesMetAsync() + private void CheckPrerequisites() { - bool needsPrerequisites = false; - foreach (PluginPrerequisite pluginPrerequisite in Plugin.Prerequisites) - { - if (await pluginPrerequisite.IsMet()) - continue; + CanInstallPrerequisites = Plugin.Prerequisites.Any(); + CanRemovePrerequisites = Plugin.Prerequisites.Any(p => p.UninstallActions.Any()); + } - needsPrerequisites = true; - break; - } - - return !needsPrerequisites; + private async Task ShowPrerequisitesDialog(bool uninstall) + { + if (uninstall) + return await _dialogService.ShowDialog(new Dictionary { { "pluginOrFeature", Plugin } }); + return await _dialogService.ShowDialog(new Dictionary { { "pluginOrFeature", Plugin } }); } } } \ No newline at end of file From a874a494ff33143efe1fdb0e232901d1c682c346 Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Wed, 28 Apr 2021 09:49:35 -0400 Subject: [PATCH 04/35] Add more gradient tools --- .../GradientEditor/GradientEditorView.xaml | 51 ++++++++++++++----- .../GradientEditor/GradientEditorViewModel.cs | 38 ++++++++++++++ 2 files changed, 76 insertions(+), 13 deletions(-) diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml index 2d8a50a73..32236519e 100644 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml +++ b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml @@ -12,8 +12,8 @@ Background="{DynamicResource MaterialDesignPaper}" FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto" Width="400" - Height="425" - d:DesignHeight="425" + Height="450" + d:DesignHeight="450" d:DesignWidth="400" d:DataContext="{d:DesignInstance local:GradientEditorViewModel}"> @@ -90,41 +90,66 @@ - + + + + + + Selected stop: @@ -135,7 +160,7 @@ - + - x.OffsetFloat).Last(); + + if (stop == SelectedColorStopViewModel) SelectColorStop(null); + + ColorStopViewModels.Remove(stop); + ColorGradient.Remove(stop.ColorStop); + + // Distribute the stops if there is still more than one + if (ColorGradient.Count > 1) + SpreadColorStops(); + } + else + { + // Add a stop to the end that is the same color as the first stop + ColorGradientStop stop = new(ColorGradient.First().Color, 100); + ColorGradient.Add(stop); + + ColorStopViewModel viewModel = new(this, stop); + ColorStopViewModels.Add(viewModel); + + NotifyOfPropertyChange(nameof(HasMoreThanOneStop)); + + // Distribute the stops + SpreadColorStops(); + } + } + public void ClearGradient() + { + ColorGradient.Clear(); + ColorStopViewModels.Clear(); + } + public Point GetPositionInPreview(object sender, MouseEventArgs e) { Canvas? parent = VisualTreeUtilities.FindParent((DependencyObject) sender, null); From e82c031f3b5ed7c465384deaf873163b45e6e01e Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Wed, 28 Apr 2021 09:51:00 -0400 Subject: [PATCH 05/35] Color Picker Textbox QoL Change Make the text always uppercase and make the font monospace to make sure it's visible in low width environments (ie. the gradient picker) --- src/Artemis.UI.Shared/Controls/ColorPicker.xaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml b/src/Artemis.UI.Shared/Controls/ColorPicker.xaml index 740f659f0..c28b32576 100644 --- a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml +++ b/src/Artemis.UI.Shared/Controls/ColorPicker.xaml @@ -73,7 +73,9 @@ MinWidth="95" MaxLength="9" Margin="0" - HorizontalAlignment="Stretch"> + HorizontalAlignment="Stretch" + FontFamily="Consolas" + CharacterCasing="Upper"> + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Resources/Images/Logo/bow.ico b/src/Artemis.UI/Resources/Images/Logo/bow.ico new file mode 100644 index 0000000000000000000000000000000000000000..d3b788ab753150d3f14f6c6221a06c9103323032 GIT binary patch literal 35937 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 - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Resources/Images/Logo/logo-512.ico b/src/Artemis.UI/Resources/Images/Logo/logo-512.ico deleted file mode 100644 index 015d1ffa8531e7e0a01ff368edb15cec40428223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112887 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 O3_AG^`RsI+)ZYP5w$HZ! diff --git a/src/Artemis.UI/Resources/Images/Logo/logo-512.png b/src/Artemis.UI/Resources/Images/Logo/logo-512.png deleted file mode 100644 index d1cd8ebe70ce8ac82eef0dc9d52f8e4408481c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22804 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 L4tDo8a8CUXw*0?E diff --git a/src/Artemis.UI/Screens/Home/HomeView.xaml b/src/Artemis.UI/Screens/Home/HomeView.xaml index 78db3be5c..0842eb9dc 100644 --- a/src/Artemis.UI/Screens/Home/HomeView.xaml +++ b/src/Artemis.UI/Screens/Home/HomeView.xaml @@ -7,6 +7,7 @@ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:home="clr-namespace:Artemis.UI.Screens.Home" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" + xmlns:svgc="http://sharpvectors.codeplex.com/svgc/" mc:Ignorable="d" d:DesignHeight="574.026" d:DesignWidth="1029.87" @@ -37,7 +38,7 @@ - + Welcome to Artemis, RGB on steroids. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintViewModel.cs new file mode 100644 index 000000000..b6ff0db12 --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintViewModel.cs @@ -0,0 +1,46 @@ +using Artemis.Core; +using Artemis.UI.Shared; +using Stylet; + +namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs.AdaptionHints +{ + public class CategoryAdaptionHintViewModel : AdaptionHintViewModel + { + private bool _takeAllDevices; + + /// + public CategoryAdaptionHintViewModel(CategoryAdaptionHint adaptionHint) : base(adaptionHint) + { + CategoryAdaptionHint = adaptionHint; + Categories = new BindableCollection(EnumUtilities.GetAllValuesAndDescriptions(typeof(DeviceCategory))); + } + + public CategoryAdaptionHint CategoryAdaptionHint { get; } + public BindableCollection Categories { get; } + + public bool TakeAllDevices + { + get => _takeAllDevices; + set => SetAndNotify(ref _takeAllDevices, value); + } + + #region Overrides of Screen + + /// + protected override void OnInitialActivate() + { + TakeAllDevices = !CategoryAdaptionHint.LimitAmount; + base.OnInitialActivate(); + } + + + /// + protected override void OnClose() + { + CategoryAdaptionHint.LimitAmount = !TakeAllDevices; + base.OnClose(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.xaml b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.xaml new file mode 100644 index 000000000..601bd6854 --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.xaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintViewModel.cs new file mode 100644 index 000000000..bf307ac5c --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintViewModel.cs @@ -0,0 +1,47 @@ +using Artemis.Core; +using Artemis.UI.Shared; +using RGB.NET.Core; +using Stylet; + +namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs.AdaptionHints +{ + public class DeviceAdaptionHintViewModel : AdaptionHintViewModel + { + private bool _takeAllDevices; + + /// + public DeviceAdaptionHintViewModel(DeviceAdaptionHint adaptionHint) : base(adaptionHint) + { + DeviceAdaptionHint = adaptionHint; + DeviceTypes = new BindableCollection(EnumUtilities.GetAllValuesAndDescriptions(typeof(RGBDeviceType))); + } + + public DeviceAdaptionHint DeviceAdaptionHint { get; } + public BindableCollection DeviceTypes { get; } + + public bool TakeAllDevices + { + get => _takeAllDevices; + set => SetAndNotify(ref _takeAllDevices, value); + } + + #region Overrides of Screen + + /// + protected override void OnInitialActivate() + { + TakeAllDevices = !DeviceAdaptionHint.LimitAmount; + base.OnInitialActivate(); + } + + + /// + protected override void OnClose() + { + DeviceAdaptionHint.LimitAmount = !TakeAllDevices; + base.OnClose(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.xaml b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.xaml new file mode 100644 index 000000000..2d5a3ecb9 --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.xaml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintViewModel.cs new file mode 100644 index 000000000..1796757d9 --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintViewModel.cs @@ -0,0 +1,19 @@ +using Artemis.Core; +using Artemis.UI.Shared; +using Stylet; + +namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs.AdaptionHints +{ + public class KeyboardSectionAdaptionHintViewModel : AdaptionHintViewModel + { + /// + public KeyboardSectionAdaptionHintViewModel(KeyboardSectionAdaptionHint adaptionHint) : base(adaptionHint) + { + KeyboardSectionAdaptionHint = adaptionHint; + Sections = new BindableCollection(EnumUtilities.GetAllValuesAndDescriptions(typeof(KeyboardSection))); + } + + public KeyboardSectionAdaptionHint KeyboardSectionAdaptionHint { get; } + public BindableCollection Sections { get; } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml new file mode 100644 index 000000000..c20cb440c --- /dev/null +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction + + + In this window you can tell Artemis how this layer should be adapted when the profile is applied to a different set of devices by providing so-called adaption hints. + + When sharing your profile with other people good hints help them import your profile without the need for manual adjustments. + + + + Adaption hints + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - Open Source - - This project is completely open source. If you like it and want to say thanks you could hit the GitHub Star button, - I like numbers. You could even make plugins, there's a full documentation on the website - - - - + + + + + + + + + + + + + + + Have a chat + + If you need help, have some feedback or have any other questions feel free to contact us through any of the + following channels. + + + + + + + + + - - Feel like you want to make a donation? It would be gratefully received. Click the button to donate via PayPal. - - - - - - - + + + + + + + + + + + + + + + + + + + + + Open Source + + This project is completely open source. If you like it and want to say thanks you could hit the GitHub Star button, + I like numbers. You could even make plugins, there's a full documentation on the website + + + + + + + Feel like you want to make a donation? It would be gratefully received. Click the button to donate via PayPal. + + + + + + + O+^S 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 aAqE<=?ATl((4)5hPp!=COm7=|#r+3M3E1}l literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F5.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F5.png new file mode 100644 index 0000000000000000000000000000000000000000..80ad70b92a6af714b48e118547dc0b3ee40b5d16 GIT binary patch literal 3963 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F6.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F6.png new file mode 100644 index 0000000000000000000000000000000000000000..92636fca7cae78ee391b4dba84bdfd9ad0c08fae GIT binary patch literal 4008 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F7.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F7.png new file mode 100644 index 0000000000000000000000000000000000000000..a154bad308dbd74e35b62c4035606e481fa81566 GIT binary patch literal 3898 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F9.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/F9.png new file mode 100644 index 0000000000000000000000000000000000000000..f0724beef2cbabed03e605606b32fafd6d341ddb GIT binary patch literal 4015 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/G.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/G.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcd7312f2e821c7466805b724e63167b2612dd6 GIT binary patch literal 3934 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Gui.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Gui.png new file mode 100644 index 0000000000000000000000000000000000000000..03129b609b568b8c1138d09b9fdf842308743a50 GIT binary patch literal 6984 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/H.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/H.png new file mode 100644 index 0000000000000000000000000000000000000000..142fc4e584b7a030de06780bbf3dbed77f7a4cc2 GIT binary patch literal 3638 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/I.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/I.png new file mode 100644 index 0000000000000000000000000000000000000000..1ffd1a1cea4f35065b7e6c2387e5f16df862d3ec GIT binary patch literal 3601 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Insert.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Insert.png new file mode 100644 index 0000000000000000000000000000000000000000..74d2da7d9c901741027d8e0aa94c144d733432be GIT binary patch literal 4185 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 Bc(nik literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/J.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/J.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cd8f1505ad52d8db7db1fcd0018fb203121992 GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/K.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/K.png new file mode 100644 index 0000000000000000000000000000000000000000..6052850dffad8ddc0b6ca86710674dcc4d795d2f GIT binary patch literal 3890 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 S6xsd>23Z`lH7zvpi1|Mv68o?K literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/L.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/L.png new file mode 100644 index 0000000000000000000000000000000000000000..fe858d8698dd5e5b2f492c36e7dfde7affe8fffb GIT binary patch literal 3623 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/LessThan_Comma.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/LessThan_Comma.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2cd0146e94a8693754f0a6a4bea360ed4613bf GIT binary patch literal 3936 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 Lad=eL~a`#j&@vwY5TF1Wea%WhWN3;+OR9roII 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M2.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M2.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd6ec16a4e5ed180eefb40c50b76352b0b6213a GIT binary patch literal 4187 zcmaJ^c{o&U8y{tfidI5pjBI5VGsetdM%GXyBuO!54hA#B%vc+1H5IaCsif?o5G{yo zkt`+q5|v$+BC>Dac;9-z?~nKT&UKyhEa(2+_wU}$^_-igCMR|ZNeF>Jpq+*Wx@O$b zcJtoG&wYlUlAPlX;w(KYmO0&lhA6ST1J1^`CGRG}ng6*L%wgDI<`RB$*YFcP7Rg(I+VWfW9dRZRt_cf$C;#{EuQ9^LL=QA%lAp-QdbF1e{9U^y@EaCd&-? zFO7edW?J~T0dO;bN%vroxcP99`2*(0?*ALw6y&l|JI$bQlR|XWrIS3U0F7m+i-&OE zz{nJ`8VZfZq7WztD4>e9hdSU?P*8guf(*sjV@S#*jEX9XO#Y+i-|)IBD%vXA7z|EF zRaseCPg@J4ht)>oFseud0*BDi`hzv3F@lhcRkS@84f%~H|4;n>u2b#~*AKTpbktCr00b6* zI;fH{P!gbmff5loRVct!ha;j~$g|1<`7@lR_3G;TjJ zxQ$~QBB~Ao?VuX!YFT)Hn!IS}BzjWpdo}i*;!$B;UB5FJ*ufh&GOKZbH_eDM%*d44kPscm@y=j3dJlxFbM*K&E$ z%!tmmwjt+|`Hf}$(ALnHBGIMU(T~+D4HK?FTYLL(@7}rShDd20Mgef%%DZ>oHF9}* zIp7Ubttx#`OJR9&@Lj~lTh9I?iy(F0SHnGp^vh-Jr9F0novC~x;gVa9uYt0`9m6_< z#B?+AHEL`I!=^rT?}d8>OjF^&>R=BTn?HN@ydBF%TP94@uCmxpv*TyBl@x(pq)1;~ z{P|tFFTgiQgyQNtIr;rNb$xY-$zocDV5*@JBWjjB~0@IwK%ahTfAB0SKumoCfk-?x7pGDx) z*!pL#qs1Uk#jbYb@#nl^6NoouWrWsv*|qM~?Uj!BpziA;QpfeE{f`ce(%k@k$F;PEitwLn` z_>oB7hhhx|fuiu#drir@mJy_10yA2}O9T?XeP8}IEy@jmIe^!%w#0S?d*%f_S$?!_57$5_Ag3}I+iYLkx}9Ziod;Yis;Sr8UZs_{1*MmdE26eROd zyQ{-?-#+Y{6)T+(){X8f5Q=KB>9v3nx?AaYkW%>EdO+qqKJ>Ic3Ek^1| zyT%My*C^kgE%iy%Jj?w;>Amv)9!ehT`zy2CYwAm>-NKL0H#?!{pB=%n7xTKyE-%pX zTsm_TnDO!P!E+Ox0v8Hg1$9k#ClLJ9u#6!Ctv*!DDQ8(iPJT!G^RQ#5=K0u9XQO;( zM~Im+9n1MD7>s;ezUTK(eO>t^T!oJQEs6c#)!hel(-Q2Ld96KcH05@)=WU{Ew1*ADR$7Yg6w)IBE^Zt&wcvXys; z#UGsP59J=r@VsWrdqG5L$t_z%Q$A?>E}lyXt~~|NXKvdRM%uE>N4m=VR#Hs%kbe%m z`7#Frukk36U&@&FLvuAV~!cjrYKTJ zlRyxNBLu9kIz3pm9nY78Pe%_7G6WR{2i}G{IC*gu;ojYW+tR+(IkdyNUokVzPksAl zfd65RoTkDx>a{ejXl_S3l?>2vnSsxma#KZ1$;wa0d+9LWOu*TXq7JNRr@ zwgh}@lGXvfjTy=3T=31mJeCD5w^j;n-bPyAf6P+19Q5%zvQI?#Al7d6O;Q z7@hXe`>j)k*_KP4{X@eIcS>{d-qUsnQcalC8n?jtZrR6~jo;QEKMGAcV2zJ)UtjeZ zMIUG;pAdRRtl~K3-=r!OI}fZHZLb(v-0AybtMU87`0Zk_)w$(4mnph*a(0$^hW^*_ zuCn2uOUqrNUy2EtNB85$Eu|Jl!m8?`<%~m|qJo4pQ(66;?d@kthc0Ex)r;@AU4?Ep zzyqm)LI)nMn-HB0w~9aAbkUV0Q`J08+q_0n(s+^sPi zq22s)tF}4sbM7^pa7D;{8|NxM5(Xs$;}ZP@?=+k6`^)hKM|8#AG`>fP=q|jtP6C_m zdKl}Y54?_8qiAZ^_RR38wzQgw6F}##n1Ad9c^?WqVg2sMj~@w|*GEy>krM2C#Rp&Q zh#XLbUAICT5jFm>YiSqI^-q{aHWTM{Z`K4()Pl8UgDXW}t(6GD;(} zz<|T2qI3zYZNz)z20rk|*x1cS(|!Ko&Lb<3$1vz(9%!sPYsb(RfdvwWk36k202xV) z>9!p1Y#K6KyCBF{Yv_WV6+vh*=xJckH>*6Ux)NZ1n!QL6VB0q60JZdIZ+0p0t%}IM zHx$W3xNGLzi0x>Vdwb2*J*%y?DGUnLvS|c6ta7y63&7%Ld%Zu*-e&lXTW6d$XkGP4 zevLaCVp+k)eahPFmc_empX@|Zz}yaev2a0e(hSzT?PQY23&@n>luJpWh@4?(Tb+q{ zyxc@|Hbl|muEo`a4ug&DmsYl3u#hesW_JC6Yn?KBmi)D*+ur9wUZ1(A=5&8u^Lrt~ z2A3y!&?~lP6ZR7~8c3gUf-t7;B#0*-UY!#5{e-}G zqJpm=aH*yo;dAms3p|?P_sBoc(ozzalf#|vX*=TEhTLgfJZ*sd*smk)l%5K{7?*Y=mzbOFTYvO3+V#!$rn`~%?@QRj`+!s-Xibgqfxu|I-RKY>F>^_T!#l(>UhZ%BDehyPWJA(<%a5hF8Z~B0 zKY+`lT4Nk50=Oq4;j}W@#e|Kl7{OdWrM8inR_lNk&?Utfna*L}4+&k_Qj2#5t@Y&? za!K}Er-Y;j8-MaOq$?$^h#|?;`-&2Ki%Y$Krql?nPZ{*_WM1E!+4E?eiB?a1>vdJR zamG)f_AIT}Grm|}(N+R_kml#NHrMrYRUnz=<%Kc6i|B{HPK^<&Excl8@ch+a}p*H*d9?a>~MAX9;92(!j7?k^c1^vuz|y@ujlVl7a=^$)GFf z<6jZ>c6Bb?qXFXcHJ|>A(S9e-%|? literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M3.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M3.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7e684342fafa44ffd314278e85895abc942ded GIT binary patch literal 4252 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 NU}bsCf@9_#_kRGfj~)O3 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M4.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M4.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1c7989d1a9252da72f8b5b813ada3d3c775022 GIT binary patch literal 4082 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 IY~U90fA@NXSpWb4 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M6.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/M6.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf0dd173a19b115d91c2216bb3b0e85d54657c4 GIT binary patch literal 4242 zcmaJ_c|4SB`yWyvTx`#K6fWGV*@0H|sDQ1Om#L;ze=x`(lU`=r0w9 zo4VBBPTerR3PMw8M39OC9P9{HRspFZ6`*jKG7>2dQc{E>Ac_bG6b6REQOb%aB_+_0 zONwKSMsPymbo74M;=HL#IWrhk6a?b!?XBPqQ=rgpL7+$^5~8RCQBnePG{AIUcLv@E z>`p)blR<|_cci&c87>re&^{yHf#S(fm*RN(cL-#vvGG5|?(`pt;-n1XgQr5E3W^Xi zc|WedwCM~S@&DcUS8ckvFO>+v5$P09nj@zkPUnAuIl24ahV~UX-k?lrE}Wv^Njelq zPcqS+fz?r$;(SpcxDZe<6%_Q#{wR7P-x~93h8GTTy>@}D0F8E6@*6bR~-qG`PIdpK=G!_?w9HBsC9@m7cU|~k47Pb z{>n4T;xyMf*pyBRXt7!*ojE2ibnWtt-k+gS zQPE8oFP;2wzdowUZ0^xlZPDrQBQ}*;Rl@IVdBbWuS}b*h&5v2j$h9~}g*hsBG}+lz z*sc3YZ&(cZ(WO1J3jI_DYu3~0_4I`zzp0+>ZT5S^Jf(Q-xk4tP8cOb09_NEOy>Z@J znKUe~R}R|S9s2%l{w5)G%g5N*xVRFw_w@|e1cD=hS6;`W-x zH-s=hm&wbkx%?D)t*BWP&goD{`TP7`fRUFre^Rr*5*KC z*x^?KTv;TkC$0E*|L}UZDvT1w(`4AjNT(<4qtI-go|n%sAS74q7>?c4jp0H z+pr`Dd@M+U5^4x}%G%d=k%0}t-rSNnJG;;QLqkKG)9(vLzC1fYiK=*R!PnXldY~z~ z+n_=_J0!Y%4nZ9cI0a4}5e`_8)Cln5t+Fn+2E+yixPM5}!!CWQ398_cv0rYA6dX|A zJU74n<%s++WP&SXZ)p^5U-bMacT`wurfNcigQke9&CQdS$j6y>yi3IvkRrS8BMYWE zjj3RXPMx-MU;8dD;g$nTm9CWYhz=;e%*e=KsTgj-*rH*be%$37 zi=S^t@2&->Hf}(QS4~M_`K@+5NvW?Wq#UYw%-i^^dy<;NXHX31E(VucV^@e?=o#to zZrq^92g#|dUB#>i=k*VbXbDkyb@^!oZJ*jS+q-HAS=xCh@?Ev? z;R_7)^?Knk;Fv&lOAtWAcV&WF&&Lo`aqhB_AJElOU@qbgWjvfh^Etomi%kUBVWgj) zm%_ymcq?T-v-b2J{L!#+#Pydro($1;Oo#|1N9^-s9*bDVwZkh~lWYY+yQmXr-|p<` zfhGU3Kkp8=CqdAk^#jw&$f2xpEJKE5G@sXd*jyI)RQ51{T$zt#Sd$cPOkahOJyj6T%-%C zQ~c6TE4o%+T_Wv-7(~yh&Flb#dgQr?ZzwPsGvCLPfRwDRy$pQ{_axey(tge)c6Jx1_g+dleJ!&!+cF5Wc)g8Ge_e-xRp9FtqBm zFev6bl&$;Q3v}es@cPB!KW69qN}K#NVj8b0++cw=14kOT7Pr}}zPCHCD*fkC)$^8T z3zmA8F%nlE0%b+szR6HOgFc%faV%lol|*959Wm&y^)6BMn(K>a^N7XwS7~@*Qq+GX z@1Vl)ea$MDPc}1B-Flua^XHU4er8?W&A0jGixZ`fg>PJh-RkfuFwHzVw&u_Udc|s8 zCGFJ29zV$@PGlvz^)l^eLw^yC@f@9!q5fKAHA#3~>opGy(T`CMdL4gSG5nOtNAK^a*LE*`Wz)-1mDAgdz< zCVelgr^IeC9pUk^mO84<3JJ0(u}$};ytpu;uZx@%z9(T@!;ls4x2g3acP!@_CPl1W zc%ox~MxzTsGF*eEz_Gf(@81p@JYoFS+BzDJ7-@eTm8MFG7&K)~AI9hw6&3Z&Le~sK zh24j0Cdq?U(4}*cf_vW;966`2R>~vNwBC}jCP( zi`cmrq}@GJU!3s#`SUx_y)t5Zn2Hor6k>}&lDGJc!8B{$=rVOWlGU0JZ3{fPRC83i z#JYNnG5^G@;N|?z_l-#46`yK+Qv@pjF=AlQ1E*OEa7RD>ctD;JZ_OhTxV`B?8K@*{ z-3y-UD`k#n<=s9kXkjX-x^Sk|fVaUZIZA>o+{of?nHM^X)hev^oV9S1E@BD?Jw*oZ zZfBO*{z2On5pGLWcEK$b#Z2FnNGgdn9wiSRzMhw@KQu$8bRd{&?t@iVLix=%#faiT z^Yim6Eu-PC+00!K(%S6)2QxUZFl2OEkm!Fs`$YP)=iy?`1tnHDKHiqx@Xj>fx+eY9 zE;M$7wexAz;w6ACU;n`_BTvY*jr~#oGCN=)soO+oJRm8*FX=43**S7g%OHzVP&$q_4}#dkI5Z*$ME(q_dd1_rpnIeGBXW;yTJ#y*I;!T&g|(VDn~X_fCFtt zkyH8-QobbzUhW89I|zJPuGCq0Z=+OmTA$bVrbdIFpOswG!4X&L4Er>o_NnSOdab#;m?g-qROmTT zBirIW6T;731#U{3BtMj}$BzYB30*2GFfI!xRhrLWom&zT8xmnrV)gi|OfV+m1CQG zb@~3a_G1Z#pVp1HK;X3Y8K!dj!)DzWXKMD0@2OIU32v(;ECvBAFf_a_SHHko=dF{?Q=h1!V! zV6)?8fZae<*+w37jRz0hE;+Wp>rGiWBNf^x)v=voD%}j1PRwXEv`Wkn!NUF1-ai7L zcjZt#Jx%n<=BUqnHkf<>SaI>tt*vq#3}R<9cOcI}({1jK^Ft>CKg_6VH4geNfJw zRM-d5zi<3nOeJ@9lHioOqP=t(h1!jL)6bK+s`*H%vEsMzR3;5K8+*FpQaEj*l9`oq zJZ+s@5~kJOs?)(^P8u24#ta~f?VDxWCwIg7Ez_K$Tkg1bW@?r|!}cx-`v7J}d1msT zY>lO+w~wJ-I+q8C0;4bWe!Gkv%1MCS7diTSWo6}CRK{LIQb$Ke1k|x*JJdS?$Hn%# z3UsN2w|l!_^H^Um0OKD*9s3R)2df2cF-lJc82J19mv`<2Q%!me>iT5#KjmGG$t7*R zD=schZ8b@>2wCJdVS}^s3JRuFU+CCRoyU@xca+vVCydoG&E5wpuUy%ZHS08s9s255 z9kbB?<qY?0L5Mh8NV#9(#xF^LKZq4Nb zaAPAA6dg-2hMN+NuqJo{k!T3VVX$Usj2Rk>M`2A!1Plp>ga7y;Kx=%4FUi$r;}2Wl zlO@7mDCCjQ=-}XBqhP!dm+yzh5{X1K28YJsP#^*&2;~T=At;VuN03*xiB8E4SZ01IFP z9H9WjVt-+I{#+qf;LrUx)W4ShVgL*+h4RbB-)dpAf0+;nZTEt1{0PY3q6O}uJOJ$q z2)IFfI$*mOl(}-j8y?A;4^V|%zB`x8`k5%_pOWF$)(eRt!q<2(ISg*Fz~E1N02`_h zuteZ6I4lZ7Kw+@%SYr~FKr%L7hry9BnD0;um%;Q6{VNoUcL#F}Lh+`5fr3@TpbDw~ z70jTMe7Sr!74(_OruqSB9>)&>{}oA+HJ8QZgN8wM_&?7(SX(>uxxP#mxFB$~vw}O= zTAN^rCMGDH5%!y03Wemr5eTUqI^bYqi2&nc#AGr^G&3^{;7bQkW>khL3PU7-BVQr| zMKz_F5>1J88o(g@+;79B2Q5^=!v60Eg2APO9RDW|k0(+w1T!MajKDBPVX*`}%8Y16 zMG;K!zF2_hiy>ltf3i98nc$hEvi{7vpo#%9nwsKqcpA|Jg<%kJD4a0?6l7*bK>0EV zbb^T~gMh=}7b^c-F_G+<0x->?KhBaH5cp%nV#2@G4~a@&I2V=(`a(ef48)IV=HJBQ zA6fpfKiD4tN&iEYe77#(`U-=od|-ng7`uN`i0FT(UqIdapVj}fY<`#ZSM`5Wxc{U2 zAHkvfQ#pPB*lN*;1%J>BP3e1T(EmSc-`4)rz<$EPuDCG#)sDf3Ukx4LfYf}jUF!r> zPk^rj2M3!C?jhZ8ca?M0cPPKb)^e5<$z8jPa6BOUK`G_EV#R@|M|TgvkLjtVG$>nz zg+u%GTyf^HoxX+F4#jmU_u2Mdv~fRe=_At6vpNv-#0a9l!Zuagy`Al$s`YjjJFrif zH>IZ__N>m~I;>9)9oiPSIRn!ZCG{m{ptIhyuqyKF=Zea=JvY3apzC#E&9_&S@_zzK$A7m_X1fL zZoXQ(w|g5e0$rWJzdaafu=^1?L%J&K!%{Wd#T)9$(dh?<%^a>N>5}_08*3Aka`u0o z91S|(Jdcm4bL+breN$bFmGV)iewAI348F` zS4?sQ=4ETEEBSQZ41QEI=3%5n(NW#?R_ePp&u7*+abFzU9kT4?IWeN_g2fzNH}$+A zD-8xrk3Vm$JFHz)Am6trUbNi6_-K#MKxNfxKHbUzb-E>KIb6e&=*=%3~Tt% zn(3giscy>5E&?vI_NtOrI66uD@2Zv{ZJ?sUqrY~(Jp-N@cr4Xb zsESB1o!EGa()nKZCd4OTOxjJYuMHOP`V!Gy@AOGrozytR){a9S8^ewVjdcL0QmBPh z)Y|x+3feU?`YwxxwAS9iLJk@v3VvTYPh7`i&Ch++n&I|V1{smVR5U1Xb--+Ju8>}j z!#w7S`MSf=N`6v7I)5P93igF<*yoOyw1F+`l}~YaJiVPR^3LfzM|(0ZDH^BHFI+EKyEEr- zH+pDwl7YtqATfU|x-&ZQ^~E>u@`_8=m5wg4KQ=bHYvJ$dSz)t z7}<88cqWiP@#+CQqgOro;;!QJ-9xM$n(BH70-*ZyRpGO^FH$p}J0Rg=32|Ipoa;FB z>kjSVr!^|b8wXCdeH1^r>>;nxH5HTkuzfjfi8bX!?B#;uvGz~4lm~+07O#7Y8FOGW z*xWOF7;Aib`<5)T$9X&`*+gA&?)pnHa@K;i?pab&QWGOmttkaoWdK_<;oe;8*;CAP zo2cQcUK~kJZdx)EZ8di3$&K1kPSM!qos3!OgEAAQoM-l&-pXt+5UYv85oa6@cf2BO zs%bRFjMw*Dz7lUmi|+bJi_njQ4ku@AyK7<=apP+?H`XVGJa+%`%Gkw0xuP|uKCyHB z#qFN(_m}y;TU}bRi1h4;bxccDO)m;WxAY_b+SC^>=?76OvU(>qsA`ig-qqaW&E7$@ zigM`y#VG}4$2A0Oa6&VcW&oYrb3?dCs(11%F%24B)%~DZHj-dW*D{+aG?Xk{ z8LN?Tq+XTsV9j1yQpc7-vFEwwqglGi66?v1TH#EO@;k=2xxIIJMz__MA;qF?bsdLj ztDD50h?)CRV&rXv4zcQ-YVUz$+UgkH%}4w2pVbChFs)^C;exz_@I$GA8}n`-9kBJb zTJvBQqU{}#vQ!UZx}jit*+GTsl~)FyJ=%o~>3x|2|Ha`e17 zQ@T06dg0CZu0hE;{#sn`!}Jx<_sPl0T^=h3=TiNzH+AwuQgw=S4%t~S9*w#7CA|2( zs=!KN2z;Xmv(Vbq(oqt0sotZy^L9r`kc-Xl%!enoZ(PZ6-Vd8e&p=uwDXS{(eT4It zne@R)hL1^kIn9bBpQWbF<|?_JIvM9uVi2jU0)s_a(Yocex_532y3VGg%y#4N&rCzY zA|uIP8jjSDJ~8|Pzw~~1z7JB+<)Co)MZz1qc&WRsb`~%#`NNXOxz?wxL<&}ur)1$L zIxrJTn3@|E_MX*OwF8%X+cu571O_8yW^%IlQQpo$1yDGaPG23+c(8q zPBZXbtlakGL@kdj_zHZYN>z<>^O9ARJrY-kD%8vMBHkV(Y-M~N+tg)Nb^2bu#*!X* zeM7}caZ87~mFMa5eDWz;Y}15-3p%=^;~>keG+>W8?8I5mrd%hQW2iH$YyZyN+Esdt z?JK`(RCLH7FI&x}4`52r8-xI=)oH-7w4%{dw&0e0xIf>qX!o6unIu*db|iCGmSt(k ztY}T5$;8&_`*(laK0TVDH?=J>Zppc-ZvG~m315ZydQ-`ut5xZiu}>upa3PNR!pcx_urAXzg$26syhP5v(^GWA!@@-FPN^fi~Zn$5Qlb!ulzNSx>Jh6TX zUmYZyka?2tG9FBP|9QjmaFTaVLGb4)_*{(tTK4{>8C3D-d%Uo9p&T9Ei5d6sbQy! z0Efe2F&KlYXIwT(DBx;i8VfZpow7bU?e=PHRSU1@&9icR=!gD$Wg6jWeh<&=as=k} zUkU%1sHua$9+wHc&=9Yaos+{QYI& zxQP!QcHs=}4~vp_8>iQ`-wL>2bPv{|-0MU0Y1~&=SC{h2Vt?QBgYR5BJo?9CRK!ob a=A^u<6@5&E6qAJyC=Rw;Y(!Q*G5-SaF0PpX literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Minus.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Minus.png new file mode 100644 index 0000000000000000000000000000000000000000..86cc37aea80fdac8c6b54208ac3997cb6c1f2ec3 GIT binary patch literal 3592 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/N.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/N.png new file mode 100644 index 0000000000000000000000000000000000000000..34bf833f1abd8a12bbfd2800b1ba31542e7b211e GIT binary patch literal 3860 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 W5`?Zx-=X~1+r`1%zF^a?l>Y%izUI0B literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num1.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num1.png new file mode 100644 index 0000000000000000000000000000000000000000..c14017561ce8c4b472ea836b85b9fa546fc03ee6 GIT binary patch literal 3666 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 GnEwI4#g~Tw literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num2.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num2.png new file mode 100644 index 0000000000000000000000000000000000000000..29043d8d5ca2540285b0bfbda9b5d9aef13a9c2f GIT binary patch literal 3939 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 IN%x5V01j69e*gdg literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num3.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e2a4c3b31f0b894277f12ceb231930a0afa7ec GIT binary patch literal 3946 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num7.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num7.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2ef84e10af85b212f5a0e4140abeb8007c7151 GIT binary patch literal 3823 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 H9?|~?(VW6J literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num8.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Num8.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3cbb3bf2b1563b8d2074a163a05542370f5b78 GIT binary patch literal 3959 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�fdgxMQcQJRaQ={(kworsC+?T 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

o~16*UcGT=sOEvDh8p0)NOs7wxba zB@PPh`y86GDHCn31=bicTPkezrQ;8fJ;d?`2!dlvROg=d(K5tU)%=*-Uw~vU>2%oL zz~kuLm4b;09;f%j!@PwY`qZ@7p2~3R64T3tThY)rj>9QObv2P(Wo}XLT+N*DL&p&Y zRqFdQT*@^^9u8(N%UkvgBn>u47hC+=QZAv5Y_4^&bub?OZPs#E67F{oA1&pXx6e^J zAJJTxI8ZM7aMJMDO2Mh==U2}-ejS(E7z`5JC>!T@smz-|qkB^t;6(D()!yZaS*aM6 zg~GE>$s)c+9tQm|(WC86q1F?Lc<*s&ploT6#r@;uXj@gsLJ`rMpE#e#^>U@Rcim5C zzli0ja!v0~itLclkj~7a`u5SRVWW4)pFrAuPM$PUySsENSXV$dzW(FtATK9-oXzI5 zHt}~CP8#wpCne>dyw!puqH0L^aR6H3*AEQfSwxa0$CvAZ)#L>2G82an1*dzvM1}BF zOW#U-l;))_HGSrrfT^YXiPM!*IcMzs$2sRKER3;A*()Ynzg!+(SuLx4BAB^6WQBQa z)nFoIN9~s?{4;MJ4-<$dd8HR{0<4}}*JHpr#~o!R{l1(E^qFXs3Jeuv^&x@hq#Tab zriF=#Lt4?(ALYhS%QQq8D31WcoYOY&O!*13ml2fe#46w51`@J$aKmCIqe8d}{rUth(h#l6K5sstjjF*NH83=!>~(umHOAe` ztBBH94n+Cuo)s{=7HQF1R;gd#q302;#fM9jdVj0z$g+}Z$W}!Mmx?rMNUzN>kff*qU9;pChA`#w_@d#d5+xR@CIG0g<1+>4O7skO4 YI%3-=SX3fidhq+JuWh1LqH!hiKkhIWegFUf literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumEnter.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumEnter.png new file mode 100644 index 0000000000000000000000000000000000000000..505aa627516444fb810e8c0de395d09f9307f001 GIT binary patch literal 5942 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumPlus.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/NumPlus.png new file mode 100644 index 0000000000000000000000000000000000000000..268410cf2afebf2147169a3c120235e828604390 GIT binary patch literal 4636 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/O.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/O.png new file mode 100644 index 0000000000000000000000000000000000000000..31cdb61d0224c48881b812608f58882fc3a454f4 GIT binary patch literal 3967 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/P.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/P.png new file mode 100644 index 0000000000000000000000000000000000000000..b8549ee863dfb4b58c2a129c481e9729be376d6d GIT binary patch literal 3758 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageUp.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PageUp.png new file mode 100644 index 0000000000000000000000000000000000000000..7165692b81ac1247792fd006ad508cf55f162f37 GIT binary patch literal 4298 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 PcL8_C%&_$Im9YN+wSTi$ literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PauseBreak.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PauseBreak.png new file mode 100644 index 0000000000000000000000000000000000000000..0126780889847b6d7b3c2a8ce89bcde707c6e268 GIT binary patch literal 4815 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 Rdi0A4X>eJ;MAtd;{{Z@UvkCwJ literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PrintScreen.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/PrintScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..172ff12c96b1bb2100a7184f49d6aa327b316991 GIT binary patch literal 4575 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/QuestionMark_Slash.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/QuestionMark_Slash.png new file mode 100644 index 0000000000000000000000000000000000000000..96bfa9058bd366667c06508d8cb48b0a49191d9d GIT binary patch literal 4114 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 G*C#rMnM$3 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 R`+wd5V|}zvle*ir9Gk*X8 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ScrollLock.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/ScrollLock.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb90635bc6f43e9e711007a8ee1825bacc420bf GIT binary patch literal 4883 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 bpMQA2b5?9Up>nqJ>$K-8U-z>sx9<2a!(E!s literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Slash.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Slash.png new file mode 100644 index 0000000000000000000000000000000000000000..93a46e6c2a1255773c4cb01c7a4e39a41eef0dee GIT binary patch literal 3836 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 NI@mZ{*I4<+{RelG%kTgI literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Space.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Space.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5fab49a0e24e44646ec5b23298b3db6088c1bd GIT binary patch literal 16702 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 NQcmr~C)qb4{~rd0@3Q~^ literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketLeft_CurlyBracketLeft.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/SquareBracketLeft_CurlyBracketLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..f242b6896389cf05d4207828049e69159afe2941 GIT binary patch literal 3871 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/T.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/T.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3abb57b815b8d1e3240a3c5f575385c5b827ff GIT binary patch literal 3617 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 BJ|6%8 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Tab.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Tab.png new file mode 100644 index 0000000000000000000000000000000000000000..deb103414042806e2429fe48a285169aa8616a97 GIT binary patch literal 4832 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/V.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/V.png new file mode 100644 index 0000000000000000000000000000000000000000..c4aded6a2cff212e65d9c4d22ba74907e9b8b6da GIT binary patch literal 3944 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/X.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/X.png new file mode 100644 index 0000000000000000000000000000000000000000..d457eeb800f98987c724f125e428a688c02e5e13 GIT binary patch literal 4022 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Y.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/Keycaps/Y.png new file mode 100644 index 0000000000000000000000000000000000000000..f12dd786c9fbcf7effa918d6193d62ce2b574cae GIT binary patch literal 3836 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/XL.png b/src/Artemis.Core/DefaultLayouts/Artemis/Keyboard/XL.png new file mode 100644 index 0000000000000000000000000000000000000000..9f999d4070767a2d5a2d353eb53d82dcd7d3efa8 GIT binary patch literal 24099 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

a<` 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 Jd*$x^{|`Nvzy<&S literal 0 HcmV?d00001 diff --git a/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs b/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs index 41f59e4f9..b51e68547 100644 --- a/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs +++ b/src/Artemis.Core/Models/Profile/AdaptionHints/DeviceAdaptionHint.cs @@ -48,7 +48,7 @@ namespace Artemis.Core public void Apply(Layer layer, List devices) { IEnumerable matches = devices - .Where(d => DeviceType == RGBDeviceType.All || d.RgbDevice.DeviceInfo.DeviceType == DeviceType) + .Where(d => DeviceType == RGBDeviceType.All || d.DeviceType == DeviceType) .OrderBy(d => d.Rectangle.Top) .ThenBy(d => d.Rectangle.Left) .Skip(Skip); diff --git a/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs b/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs index e8c6f09ba..2a68be352 100644 --- a/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs +++ b/src/Artemis.Core/Models/Profile/AdaptionHints/KeyboardSectionAdaptionHint.cs @@ -38,7 +38,7 @@ namespace Artemis.Core public void Apply(Layer layer, List devices) { // Only keyboards should have the LEDs we care about - foreach (ArtemisDevice keyboard in devices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard)) + foreach (ArtemisDevice keyboard in devices.Where(d => d.DeviceType == RGBDeviceType.Keyboard)) { List ledIds = RegionLedIds[Section]; layer.AddLeds(keyboard.Leds.Where(l => ledIds.Contains(l.RgbLed.Id))); diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 5e910dfe9..01754e172 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -272,7 +272,7 @@ namespace Artemis.Core { DeviceIdentifier = artemisLed.Device.Identifier, LedName = artemisLed.RgbLed.Id.ToString(), - PhysicalLayout = artemisLed.Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard ? (int) artemisLed.Device.PhysicalLayout : null + PhysicalLayout = artemisLed.Device.DeviceType == RGBDeviceType.Keyboard ? (int) artemisLed.Device.PhysicalLayout : null }; LayerEntity.Leds.Add(ledEntity); } diff --git a/src/Artemis.Core/Models/Profile/LayerAdapter.cs b/src/Artemis.Core/Models/Profile/LayerAdapter.cs index 77717340f..b60d901f9 100644 --- a/src/Artemis.Core/Models/Profile/LayerAdapter.cs +++ b/src/Artemis.Core/Models/Profile/LayerAdapter.cs @@ -83,11 +83,11 @@ namespace Artemis.Core { ArtemisDevice device = deviceLeds.Key; // If there is already an adaption hint for this type, don't add another - if (AdaptionHints.Any(h => h is DeviceAdaptionHint d && d.DeviceType == device.RgbDevice.DeviceInfo.DeviceType)) + if (AdaptionHints.Any(h => h is DeviceAdaptionHint d && d.DeviceType == device.DeviceType)) continue; if (DoesLayerCoverDevice(device)) { - DeviceAdaptionHint hint = new() {DeviceType = device.RgbDevice.DeviceInfo.DeviceType}; + DeviceAdaptionHint hint = new() {DeviceType = device.DeviceType}; AdaptionHints.Add(hint); newHints.Add(hint); } diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs index 488efdd8c..7f4e8dc3d 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs @@ -6,7 +6,6 @@ using Artemis.Core.DeviceProviders; using Artemis.Core.Services; using Artemis.Storage.Entities.Surface; using RGB.NET.Core; -using RGB.NET.Layout; using SkiaSharp; namespace Artemis.Core @@ -91,6 +90,11 @@ namespace Artemis.Core /// public IRGBDevice RgbDevice { get; } + ///

+ /// Gets the device type of the ArtemisDevice + /// + public RGBDeviceType DeviceType => RgbDevice.DeviceInfo.DeviceType; + /// /// Gets the device provider that provided this device /// @@ -351,6 +355,46 @@ namespace Artemis.Core /// public event EventHandler? DeviceUpdated; + /// + /// Applies the default categories for this device to the list + /// + public void ApplyDefaultCategories() + { + switch (RgbDevice.DeviceInfo.DeviceType) + { + case RGBDeviceType.Keyboard: + case RGBDeviceType.Mouse: + case RGBDeviceType.Headset: + case RGBDeviceType.Mousepad: + case RGBDeviceType.HeadsetStand: + case RGBDeviceType.Keypad: + if (!Categories.Contains(DeviceCategory.Peripherals)) + Categories.Add(DeviceCategory.Peripherals); + break; + case RGBDeviceType.Mainboard: + case RGBDeviceType.GraphicsCard: + case RGBDeviceType.DRAM: + case RGBDeviceType.Fan: + case RGBDeviceType.LedStripe: + case RGBDeviceType.Cooler: + if (!Categories.Contains(DeviceCategory.Case)) + Categories.Add(DeviceCategory.Case); + break; + case RGBDeviceType.Speaker: + if (!Categories.Contains(DeviceCategory.Desk)) + Categories.Add(DeviceCategory.Desk); + break; + case RGBDeviceType.Monitor: + if (!Categories.Contains(DeviceCategory.Monitor)) + Categories.Add(DeviceCategory.Monitor); + break; + case RGBDeviceType.LedMatrix: + if (!Categories.Contains(DeviceCategory.Room)) + Categories.Add(DeviceCategory.Room); + break; + } + } + /// /// Invokes the event /// @@ -392,46 +436,6 @@ namespace Artemis.Core OnDeviceUpdated(); } - /// - /// Applies the default categories for this device to the list - /// - public void ApplyDefaultCategories() - { - switch (RgbDevice.DeviceInfo.DeviceType) - { - case RGBDeviceType.Keyboard: - case RGBDeviceType.Mouse: - case RGBDeviceType.Headset: - case RGBDeviceType.Mousepad: - case RGBDeviceType.HeadsetStand: - case RGBDeviceType.Keypad: - if (!Categories.Contains(DeviceCategory.Peripherals)) - Categories.Add(DeviceCategory.Peripherals); - break; - case RGBDeviceType.Mainboard: - case RGBDeviceType.GraphicsCard: - case RGBDeviceType.DRAM: - case RGBDeviceType.Fan: - case RGBDeviceType.LedStripe: - case RGBDeviceType.Cooler: - if (!Categories.Contains(DeviceCategory.Case)) - Categories.Add(DeviceCategory.Case); - break; - case RGBDeviceType.Speaker: - if (!Categories.Contains(DeviceCategory.Desk)) - Categories.Add(DeviceCategory.Desk); - break; - case RGBDeviceType.Monitor: - if (!Categories.Contains(DeviceCategory.Monitor)) - Categories.Add(DeviceCategory.Monitor); - break; - case RGBDeviceType.LedMatrix: - if (!Categories.Contains(DeviceCategory.Room)) - Categories.Add(DeviceCategory.Room); - break; - } - } - internal void ApplyToEntity() { // Other properties are computed @@ -439,13 +443,11 @@ namespace Artemis.Core DeviceEntity.InputIdentifiers.Clear(); foreach (ArtemisDeviceInputIdentifier identifier in InputIdentifiers) - { DeviceEntity.InputIdentifiers.Add(new DeviceInputIdentifierEntity { InputProvider = identifier.InputProvider, Identifier = identifier.Identifier }); - } DeviceEntity.InputMappings.Clear(); foreach (var (original, mapped) in InputMappings) @@ -472,9 +474,9 @@ namespace Artemis.Core if (!RgbDevice.ColorCorrections.Any()) RgbDevice.ColorCorrections.Add(new ScaleColorCorrection(this)); - + Categories.Clear(); - foreach (int deviceEntityCategory in DeviceEntity.Categories) + foreach (int deviceEntityCategory in DeviceEntity.Categories) Categories.Add((DeviceCategory) deviceEntityCategory); if (!Categories.Any()) ApplyDefaultCategories(); @@ -532,12 +534,34 @@ namespace Artemis.Core } } + /// + /// Represents a device category + /// public enum DeviceCategory { + /// + /// A device used to light up (part of) the desk + /// Desk, + + /// + /// A device attached or embedded into the monitor + /// Monitor, + + /// + /// A device placed or embedded into the case + /// Case, + + /// + /// A device used to light up (part of) the room + /// Room, + + /// + /// A peripheral + /// Peripherals } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs index 130b8cba7..2df270e5b 100644 --- a/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs +++ b/src/Artemis.Core/Models/Surface/Layout/ArtemisLayout.cs @@ -146,6 +146,58 @@ namespace Artemis.Core else Image = null; } + + internal static ArtemisLayout? GetDefaultLayout(ArtemisDevice device) + { + string layoutFolder = Path.Combine(Constants.ApplicationFolder, "DefaultLayouts\\Artemis"); + if (device.DeviceType == RGBDeviceType.Keyboard) + { + // XL layout is defined by its programmable macro keys + if (device.Leds.Any(l => l.RgbLed.Id >= LedId.Keyboard_Programmable1 && l.RgbLed.Id <= LedId.Keyboard_Programmable32)) + { + if (device.PhysicalLayout == KeyboardLayoutType.ANSI) + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis XL keyboard-ANSI.xml", LayoutSource.Default); + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis XL keyboard-ISO.xml", LayoutSource.Default); + } + + // L layout is defined by its numpad + if (device.Leds.Any(l => l.RgbLed.Id >= LedId.Keyboard_NumLock && l.RgbLed.Id <= LedId.Keyboard_NumPeriodAndDelete)) + { + if (device.PhysicalLayout == KeyboardLayoutType.ANSI) + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis L keyboard-ANSI.xml", LayoutSource.Default); + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis L keyboard-ISO.xml", LayoutSource.Default); + } + + // No numpad will result in TKL + if (device.PhysicalLayout == KeyboardLayoutType.ANSI) + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis TKL keyboard-ANSI.xml", LayoutSource.Default); + return new ArtemisLayout(layoutFolder + "\\Keyboard\\Artemis TKL keyboard-ISO.xml", LayoutSource.Default); + } + + // if (device.DeviceType == RGBDeviceType.Mouse) + // { + // if (device.Leds.Count == 1) + // { + // if (device.Leds.Any(l => l.RgbLed.Id == LedId.Logo)) + // return new ArtemisLayout(layoutFolder + "\\Mouse\\1 LED mouse logo.xml", LayoutSource.Default); + // return new ArtemisLayout(layoutFolder + "\\Mouse\\1 LED mouse.xml", LayoutSource.Default); + // } + // if (device.Leds.Any(l => l.RgbLed.Id == LedId.Logo)) + // return new ArtemisLayout(layoutFolder + "\\Mouse\\4 LED mouse logo.xml", LayoutSource.Default); + // return new ArtemisLayout(layoutFolder + "\\Mouse\\4 LED mouse.xml", LayoutSource.Default); + // } + + if (device.DeviceType == RGBDeviceType.Headset) + { + if (device.Leds.Count == 1) + return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 1 LED headset.xml", LayoutSource.Default); + if (device.Leds.Count == 2) + return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 2 LED headset.xml", LayoutSource.Default); + return new ArtemisLayout(layoutFolder + "\\Headset\\Artemis 4 LED headset.xml", LayoutSource.Default); + } + + return null; + } } /// diff --git a/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs b/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs index f41e9c145..fc540ff96 100644 --- a/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs +++ b/src/Artemis.Core/Plugins/DeviceProviders/DeviceProvider.cs @@ -74,7 +74,7 @@ namespace Artemis.Core.DeviceProviders string filePath = Path.Combine( layoutDir, device.RgbDevice.DeviceInfo.Manufacturer, - device.RgbDevice.DeviceInfo.DeviceType.ToString(), + device.DeviceType.ToString(), device.GetLayoutFileName() ); return new ArtemisLayout(filePath, LayoutSource.Plugin); @@ -91,7 +91,7 @@ namespace Artemis.Core.DeviceProviders string filePath = Path.Combine( layoutDir, device.RgbDevice.DeviceInfo.Manufacturer, - device.RgbDevice.DeviceInfo.DeviceType.ToString(), + device.DeviceType.ToString(), device.GetLayoutFileName() ); return new ArtemisLayout(filePath, LayoutSource.User); diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs index bed2d47de..abb7ef643 100644 --- a/src/Artemis.Core/Services/Input/InputService.cs +++ b/src/Artemis.Core/Services/Input/InputService.cs @@ -76,8 +76,8 @@ namespace Artemis.Core.Services public void IdentifyDevice(ArtemisDevice device) { - if (device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard && device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Mouse) - throw new ArtemisCoreException($"Cannot initialize input-identification for a device of type {device.RgbDevice.DeviceInfo.DeviceType}. \r\n" + + if (device.DeviceType != RGBDeviceType.Keyboard && device.DeviceType != RGBDeviceType.Mouse) + throw new ArtemisCoreException($"Cannot initialize input-identification for a device of type {device.DeviceType}. \r\n" + "Only keyboard and mouse is supported."); _identifyingDevice = device; @@ -121,7 +121,7 @@ namespace Artemis.Core.Services { if (_cachedFallbackKeyboard != null) return _cachedFallbackKeyboard; - _cachedFallbackKeyboard = _rgbService.EnabledDevices.FirstOrDefault(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard); + _cachedFallbackKeyboard = _rgbService.EnabledDevices.FirstOrDefault(d => d.DeviceType == RGBDeviceType.Keyboard); return _cachedFallbackKeyboard; } @@ -129,7 +129,7 @@ namespace Artemis.Core.Services { if (_cachedFallbackMouse != null) return _cachedFallbackMouse; - _cachedFallbackMouse = _rgbService.EnabledDevices.FirstOrDefault(d => d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse); + _cachedFallbackMouse = _rgbService.EnabledDevices.FirstOrDefault(d => d.DeviceType == RGBDeviceType.Mouse); return _cachedFallbackMouse; } @@ -165,8 +165,8 @@ namespace Artemis.Core.Services { // Don't match if there is no device or if the device type differs from the event device type if (_identifyingDevice == null || - _identifyingDevice.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard && e.DeviceType == InputDeviceType.Mouse || - _identifyingDevice.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse && e.DeviceType == InputDeviceType.Keyboard) + _identifyingDevice.DeviceType == RGBDeviceType.Keyboard && e.DeviceType == InputDeviceType.Mouse || + _identifyingDevice.DeviceType == RGBDeviceType.Mouse && e.DeviceType == InputDeviceType.Keyboard) return; if (!(sender is InputProvider inputProvider)) return; diff --git a/src/Artemis.Core/Services/Interfaces/IRgbService.cs b/src/Artemis.Core/Services/Interfaces/IRgbService.cs index cfcb5ffb0..10ec9fa1b 100644 --- a/src/Artemis.Core/Services/Interfaces/IRgbService.cs +++ b/src/Artemis.Core/Services/Interfaces/IRgbService.cs @@ -83,7 +83,7 @@ namespace Artemis.Core.Services /// /// The device to apply the best available layout to /// The layout that was applied to the device - ArtemisLayout ApplyBestDeviceLayout(ArtemisDevice device); + ArtemisLayout? ApplyBestDeviceLayout(ArtemisDevice device); /// /// Apples the provided to the provided diff --git a/src/Artemis.Core/Services/RgbService.cs b/src/Artemis.Core/Services/RgbService.cs index f5bb3fb5b..ae1ea1fc9 100644 --- a/src/Artemis.Core/Services/RgbService.cs +++ b/src/Artemis.Core/Services/RgbService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.IO; using System.Linq; using Artemis.Core.DeviceProviders; using Artemis.Core.Services.Models; @@ -149,6 +150,7 @@ namespace Artemis.Core.Services RemoveDevice(device); List providerExceptions = new(); + void DeviceProviderOnException(object? sender, ExceptionEventArgs e) { if (e.IsCritical) @@ -314,15 +316,15 @@ namespace Artemis.Core.Services { SurfaceArrangement surfaceArrangement = SurfaceArrangement.GetDefaultArrangement(); surfaceArrangement.Arrange(_devices); - foreach (ArtemisDevice artemisDevice in _devices) + foreach (ArtemisDevice artemisDevice in _devices) artemisDevice.ApplyDefaultCategories(); SaveDevices(); } - public ArtemisLayout ApplyBestDeviceLayout(ArtemisDevice device) + public ArtemisLayout? ApplyBestDeviceLayout(ArtemisDevice device) { - ArtemisLayout layout; + ArtemisLayout? layout; // Configured layout path takes precedence over all other options if (device.CustomLayoutPath != null) @@ -352,19 +354,19 @@ namespace Artemis.Core.Services } // Finally fall back to a default layout - layout = LoadDefaultLayout(device); - ApplyDeviceLayout(device, layout); + layout = ArtemisLayout.GetDefaultLayout(device); + if (layout != null) + ApplyDeviceLayout(device, layout); return layout; } - private ArtemisLayout LoadDefaultLayout(ArtemisDevice device) - { - return new("NYI", LayoutSource.Default); - } - public void ApplyDeviceLayout(ArtemisDevice device, ArtemisLayout layout) { - device.ApplyLayout(layout, device.DeviceProvider.CreateMissingLedsSupported, device.DeviceProvider.RemoveExcessiveLedsSupported); + if (layout.Source == LayoutSource.Default) + device.ApplyLayout(layout, false, false); + else + device.ApplyLayout(layout, device.DeviceProvider.CreateMissingLedsSupported, device.DeviceProvider.RemoveExcessiveLedsSupported); + UpdateLedGroup(); } diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs index 5f25fe5f2..146f89bc1 100644 --- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs +++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs @@ -23,12 +23,12 @@ namespace Artemis.Core.Services.Models public bool HasDevices(List devices) { - return devices.Any(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType); + return devices.Any(d => d.DeviceType == DeviceType); } public void Arrange(List devices) { - devices = devices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType).ToList(); + devices = devices.Where(d => d.DeviceType == DeviceType).ToList(); if (!devices.Any()) return; @@ -58,7 +58,7 @@ namespace Artemis.Core.Services.Models public Point GetEdge(HorizontalArrangementPosition horizontalPosition, VerticalArrangementPosition verticalPosition) { - List devices = SurfaceArrangement.ArrangedDevices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList(); + List devices = SurfaceArrangement.ArrangedDevices.Where(d => d.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList(); if (!devices.Any()) return new Point(); diff --git a/src/Artemis.Core/Services/Storage/ProfileService.cs b/src/Artemis.Core/Services/Storage/ProfileService.cs index e405cdfed..95b612d99 100644 --- a/src/Artemis.Core/Services/Storage/ProfileService.cs +++ b/src/Artemis.Core/Services/Storage/ProfileService.cs @@ -152,7 +152,7 @@ namespace Artemis.Core.Services Profile profile = new(profileDescriptor.ProfileModule, profileEntity); InstantiateProfile(profile); - + void ActivatingRgbServiceOnLedsChanged(object? sender, EventArgs e) { profile.PopulateLeds(_rgbService.EnabledDevices); @@ -220,12 +220,8 @@ namespace Artemis.Core.Services public void UpdateProfile(Profile profile, bool includeChildren) { - _logger.Debug("Updating profile " + profile); string memento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings); - profile.RedoStack.Clear(); - profile.UndoStack.Push(memento); - profile.IsFreshImport = false; profile.Save(); if (includeChildren) { @@ -235,6 +231,22 @@ namespace Artemis.Core.Services layer.Save(); } + // If there are no changes, don't bother saving + string updatedMemento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings); + if (memento.Equals(updatedMemento)) + { + _logger.Debug("Updating profile - Skipping save, no changes"); + return; + } + + _logger.Debug("Updating profile - Saving " + profile); + profile.RedoStack.Clear(); + profile.UndoStack.Push(memento); + + // At this point the user made actual changes, save that + profile.IsFreshImport = false; + profile.ProfileEntity.IsFreshImport = false; + _profileRepository.Save(profile.ProfileEntity); } @@ -321,9 +333,24 @@ namespace Artemis.Core.Services /// public void AdaptProfile(Profile profile) { + string memento = JsonConvert.SerializeObject(profile.ProfileEntity, MementoSettings); + List devices = _rgbService.EnabledDevices.ToList(); foreach (Layer layer in profile.GetAllLayers()) layer.Adapter.Adapt(devices); + + profile.Save(); + + foreach (Folder folder in profile.GetAllFolders()) + folder.Save(); + foreach (Layer layer in profile.GetAllLayers()) + layer.Save(); + + _logger.Debug("Adapt profile - Saving " + profile); + profile.RedoStack.Clear(); + profile.UndoStack.Push(memento); + + _profileRepository.Save(profile.ProfileEntity); } #region Event handlers diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs index 7e9662b5e..af4afaba1 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs @@ -216,7 +216,7 @@ namespace Artemis.UI.Screens.ProfileEditor if (!await DialogService.ShowConfirmDialog( "Adapt profile", "Are you sure you want to adapt the profile to your current surface? Layer assignments may change." - )) + )) return; _profileService.AdaptProfile(_profileEditorService.SelectedProfile); diff --git a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs index 62ec00072..0cd156be7 100644 --- a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs @@ -46,7 +46,7 @@ namespace Artemis.UI.Screens.Settings.Device SelectedLeds = new BindableCollection(); Items.Add(factory.DevicePropertiesTabViewModel(device)); - if (device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard) + if (device.DeviceType == RGBDeviceType.Keyboard) Items.Add(factory.InputMappingsTabViewModel(device)); Items.Add(factory.DeviceInfoTabViewModel(device)); Items.Add(factory.DeviceLedsTabViewModel(device)); @@ -178,7 +178,7 @@ namespace Artemis.UI.Screens.Settings.Device string directory = Path.Combine( dialog.SelectedPath, Device.RgbDevice.DeviceInfo.Manufacturer, - Device.RgbDevice.DeviceInfo.DeviceType.ToString() + Device.DeviceType.ToString() ); string filePath = Path.Combine(directory, Device.GetLayoutFileName()); Core.Utilities.CreateAccessibleDirectory(directory); diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml index 3f5047fb9..18362412e 100644 --- a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml +++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml @@ -40,7 +40,7 @@ + Text="{Binding Device.DeviceType}" /> diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs index bf97b4e21..1305a1d24 100644 --- a/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs @@ -15,7 +15,7 @@ namespace Artemis.UI.Screens.Settings.Device.Tabs DisplayName = "INFO"; } - public bool IsKeyboard => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard; + public bool IsKeyboard => Device.DeviceType == RGBDeviceType.Keyboard; public ArtemisDevice Device { get; } public string DefaultLayoutPath diff --git a/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs index 9ffbe769b..2935bcfe6 100644 --- a/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs @@ -17,7 +17,7 @@ namespace Artemis.UI.Screens.Settings.Device.Tabs public InputMappingsTabViewModel(ArtemisDevice device, IRgbService rgbService, IInputService inputService) { - if (device.RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard) + if (device.DeviceType != RGBDeviceType.Keyboard) throw new ArtemisUIException("The input mappings tab only supports keyboards"); _rgbService = rgbService; _inputService = inputService; diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml index e3f3676bf..018ed9f28 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml @@ -50,7 +50,7 @@ - - + diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs index 2005b6753..3b6616a35 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs @@ -35,7 +35,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Devices _rgbService = rgbService; Device = device; - Type = Device.RgbDevice.DeviceInfo.DeviceType.ToString().Humanize(); + Type = Device.DeviceType.ToString().Humanize(); Name = Device.RgbDevice.DeviceInfo.Model; Manufacturer = Device.RgbDevice.DeviceInfo.Manufacturer; } @@ -46,8 +46,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.Devices public string Name { get; } public string Manufacturer { get; } - public bool CanDetectInput => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard || - Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse; + public bool CanDetectInput => Device.DeviceType == RGBDeviceType.Keyboard || + Device.DeviceType == RGBDeviceType.Mouse; public bool IsDeviceEnabled { diff --git a/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs index cd35e79f1..13e02d9b9 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs @@ -19,7 +19,7 @@ namespace Artemis.UI.Screens.SurfaceEditor.Dialogs { Device = device; Title = $"{Device.RgbDevice.DeviceInfo.DeviceName} - Detect input"; - IsMouse = Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse; + IsMouse = Device.DeviceType == RGBDeviceType.Mouse; _inputService = inputService; _messageService = messageService; diff --git a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs index a1c31e961..50b3bcec1 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs @@ -33,8 +33,8 @@ namespace Artemis.UI.Screens.SurfaceEditor.Visualization set => SetAndNotify(ref _selectionStatus, value); } - public bool CanDetectInput => Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard || - Device.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Mouse; + public bool CanDetectInput => Device.DeviceType == RGBDeviceType.Keyboard || + Device.DeviceType == RGBDeviceType.Mouse; public Cursor Cursor { diff --git a/src/Artemis.UI/Services/DeviceLayoutService.cs b/src/Artemis.UI/Services/DeviceLayoutService.cs index d224ae36b..536763729 100644 --- a/src/Artemis.UI/Services/DeviceLayoutService.cs +++ b/src/Artemis.UI/Services/DeviceLayoutService.cs @@ -52,7 +52,7 @@ namespace Artemis.UI.Services private bool DeviceNeedsLayout(ArtemisDevice d) { - return d.RgbDevice.DeviceInfo.DeviceType == RGBDeviceType.Keyboard && + return d.DeviceType == RGBDeviceType.Keyboard && (d.LogicalLayout == null || d.PhysicalLayout == KeyboardLayoutType.Unknown) && (!d.DeviceProvider.CanDetectLogicalLayout || !d.DeviceProvider.CanDetectPhysicalLayout); } From a6602626a3486d4dd3d684b0832a2461a20bb963 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 18 May 2021 22:36:40 +0200 Subject: [PATCH 33/35] Plugins - Added author, website and repository properties to plugin info --- src/Artemis.Core/Plugins/PluginInfo.cs | 57 ++++- .../Behaviors/HighlightTermBehavior.cs | 2 +- .../Tabs/Plugins/PluginSettingsView.xaml | 200 ++++++++++-------- .../Tabs/Plugins/PluginSettingsViewModel.cs | 5 + 4 files changed, 168 insertions(+), 96 deletions(-) diff --git a/src/Artemis.Core/Plugins/PluginInfo.cs b/src/Artemis.Core/Plugins/PluginInfo.cs index 2773a51c3..5037b186b 100644 --- a/src/Artemis.Core/Plugins/PluginInfo.cs +++ b/src/Artemis.Core/Plugins/PluginInfo.cs @@ -12,15 +12,19 @@ namespace Artemis.Core [JsonObject(MemberSerialization.OptIn)] public class PluginInfo : CorePropertyChanged, IPrerequisitesSubject { - private bool _autoEnableFeatures = true; - private string? _description; private Guid _guid; + private string? _description; + private string? _author; + private Uri? _website; + private Uri? _repository; private string? _icon; private string _main = null!; + private bool _autoEnableFeatures = true; private string _name = null!; private Plugin _plugin = null!; - private bool _requiresAdmin; private Version _version = null!; + private bool _requiresAdmin; + internal PluginInfo() { @@ -56,6 +60,36 @@ namespace Artemis.Core set => SetAndNotify(ref _description, value); } + /// + /// Gets or sets the author of this plugin + /// + [JsonProperty] + public string? Author + { + get => _author; + set => SetAndNotify(ref _author, value); + } + + /// + /// Gets or sets the website of this plugin or its author + /// + [JsonProperty] + public Uri? Website + { + get => _website; + set => SetAndNotify(ref _website, value); + } + + /// + /// Gets or sets the repository of this plugin + /// + [JsonProperty] + public Uri? Repository + { + get => _repository; + set => SetAndNotify(ref _repository, value); + } + /// /// The plugins display icon that's shown in the settings see for /// available icons @@ -108,7 +142,7 @@ namespace Artemis.Core get => _requiresAdmin; internal set => SetAndNotify(ref _requiresAdmin, value); } - + /// /// Gets the plugin this info is associated with /// @@ -118,12 +152,6 @@ namespace Artemis.Core internal set => SetAndNotify(ref _plugin, value); } - /// - public List Prerequisites { get; } = new(); - - /// - public bool ArePrerequisitesMet() => Prerequisites.All(p => p.IsMet()); - internal string PreferredPluginDirectory => $"{Main.Split(".dll")[0].Replace("/", "").Replace("\\", "")}-{Guid.ToString().Substring(0, 8)}"; /// @@ -131,5 +159,14 @@ namespace Artemis.Core { return $"{Name} v{Version} - {Guid}"; } + + /// + public List Prerequisites { get; } = new(); + + /// + public bool ArePrerequisitesMet() + { + return Prerequisites.All(p => p.IsMet()); + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs b/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs index 2d30ae887..53277b426 100644 --- a/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs +++ b/src/Artemis.UI/Behaviors/HighlightTermBehavior.cs @@ -115,7 +115,7 @@ namespace Artemis.UI.Behaviors private static bool TextIsEmpty(string text) { - return text.Length == 0; + return string.IsNullOrEmpty(text); } private static bool TextIsNotContainingTermToBeHighlighted(string text, string termToBeHighlighted) diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml index 85d0783ab..82cad706c 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml @@ -15,29 +15,29 @@ - + + - - - + + - + + @@ -47,7 +47,7 @@ Height="48" Margin="0 5 0 0" Grid.Row="0" - Grid.RowSpan="2" + Grid.RowSpan="3" HorizontalAlignment="Center" VerticalAlignment="Top" /> @@ -59,6 +59,12 @@ + + + + + + + + + - - + + + + + + + + + + + + - - - - - - - - - - - - - + - - - - Plugin enabled - + - - + + + Plugin enabled + + + - + + + + diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs index cb4dcc8ab..f25606309 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs @@ -219,6 +219,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins } } + public void OpenUri(Uri uri) + { + Core.Utilities.OpenUrl(uri.ToString()); + } + private void PluginManagementServiceOnPluginToggled(object? sender, PluginEventArgs e) { NotifyOfPropertyChange(nameof(IsEnabled)); From 87dce788d7a348faebca497055dec66260532811 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 19 May 2021 17:31:36 +0200 Subject: [PATCH 34/35] UI - Added --disable-forced-shutdown which does just that UI - Don't kill new instances of Artemis launched within 8 seconds after shutdown UI - Updated About tab --- .../Services/Storage/ProfileService.cs | 7 +- .../Artemis.UI.Shared.csproj | 1 - src/Artemis.UI.Shared/packages.lock.json | 6 - src/Artemis.UI/ApplicationStateManager.cs | 17 +- src/Artemis.UI/Properties/launchSettings.json | 2 +- .../Dialogs/ProfileExportView.xaml | 69 ++- .../Dialogs/ProfileExportViewModel.cs | 18 +- .../Dialogs/LayerHintsDialogView.xaml | 175 +++---- .../Dialogs/LayerHintsDialogViewModel.cs | 13 + .../Settings/Tabs/About/AboutTabView.xaml | 446 ++++++++++++++++-- .../Settings/Tabs/About/AboutTabViewModel.cs | 11 + src/Artemis.UI/packages.lock.json | 8 +- 12 files changed, 586 insertions(+), 187 deletions(-) diff --git a/src/Artemis.Core/Services/Storage/ProfileService.cs b/src/Artemis.Core/Services/Storage/ProfileService.cs index 95b612d99..e75eec263 100644 --- a/src/Artemis.Core/Services/Storage/ProfileService.cs +++ b/src/Artemis.Core/Services/Storage/ProfileService.cs @@ -67,9 +67,12 @@ namespace Artemis.Core.Services foreach (ProfileModule profileModule in profileModules) { // Avoid race condition, make the check here - if (profileModule.ActiveProfile != null) + if (profileModule.ActiveProfile == null) + continue; + + profileModule.ActiveProfile.PopulateLeds(_rgbService.EnabledDevices); + if (profileModule.ActiveProfile.IsFreshImport) { - profileModule.ActiveProfile.PopulateLeds(_rgbService.EnabledDevices); _logger.Debug("Profile is a fresh import, adapting to surface - {profile}", profileModule.ActiveProfile); AdaptProfile(profileModule.ActiveProfile); } diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj index 893ff97d3..52563d5ef 100644 --- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj +++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj @@ -50,7 +50,6 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/src/Artemis.UI.Shared/packages.lock.json b/src/Artemis.UI.Shared/packages.lock.json index 27b93fa8d..88e8b3b52 100644 --- a/src/Artemis.UI.Shared/packages.lock.json +++ b/src/Artemis.UI.Shared/packages.lock.json @@ -113,12 +113,6 @@ "resolved": "0.4.0", "contentHash": "2Tzz6qoQNciyO4uT6wxByMiyvbve+u4eFIiDewDUbeHuxr/rKuba3/EhhXDsEH9WoKzYlpzqxDfQGPE/bIe5Rw==" }, - "WriteableBitmapEx": { - "type": "Direct", - "requested": "[1.6.7, )", - "resolved": "1.6.7", - "contentHash": "GoPhIdYzG/DWJq/MADb8gFzRN5PsxM+1DSJFS8Jzupg4DXqFSnlejYEjJw4ffPEUyELL07O4XIGUZydE4jQK0Q==" - }, "Castle.Core": { "type": "Transitive", "resolved": "4.2.0", diff --git a/src/Artemis.UI/ApplicationStateManager.cs b/src/Artemis.UI/ApplicationStateManager.cs index 1bc5d5c3a..2a08b4a3a 100644 --- a/src/Artemis.UI/ApplicationStateManager.cs +++ b/src/Artemis.UI/ApplicationStateManager.cs @@ -119,14 +119,17 @@ namespace Artemis.UI private void UtilitiesOnShutdownRequested(object sender, EventArgs e) { // Use PowerShell to kill the process after 8 sec just in case - ProcessStartInfo info = new() + if (!StartupArguments.Contains("--disable-forced-shutdown")) { - Arguments = "-Command \"& {Start-Sleep -s 8; (Get-Process 'Artemis.UI').kill()}", - WindowStyle = ProcessWindowStyle.Hidden, - CreateNoWindow = true, - FileName = "PowerShell.exe" - }; - Process.Start(info); + ProcessStartInfo info = new() + { + Arguments = "-Command \"& {Start-Sleep -s 8; (Get-Process -Id " + Process.GetCurrentProcess().Id + ").kill()}", + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + FileName = "PowerShell.exe" + }; + Process.Start(info); + } Execute.OnUIThread(() => Application.Current.Shutdown()); } diff --git a/src/Artemis.UI/Properties/launchSettings.json b/src/Artemis.UI/Properties/launchSettings.json index 1268340dc..ff7efa8ab 100644 --- a/src/Artemis.UI/Properties/launchSettings.json +++ b/src/Artemis.UI/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Artemis.UI": { "commandName": "Project", - "commandLineArgs": "--force-elevation --pcmr" + "commandLineArgs": "--force-elevation --disable-forced-shutdown --pcmr" } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml index 7e67d06c8..4db9dc873 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportView.xaml @@ -4,44 +4,41 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:s="https://github.com/canton7/Stylet" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - Export current profile - + + + + + + + + Export current profile + - - Please note that exporting profiles like this is placeholder functionality. The idea is that this will eventually happen via the workshop. - + + It looks like you have not set up any profile adaption hints. This means Artemis can't do much to make your profile look good on a different surface other than try finding the same LEDs as you have. + + To configure adaption hints, right-click on a layer and choose View Adaption Hints. + + To learn more about profile adaption, check out + + this wiki article + . + - - The workshop will include tools to make profiles convert easily and look good on different layouts. - That means right now when someone imports this export unless they have the exact same setup as - you, they'll have to select LEDs for each layer in the profile. - - - - - - - + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs index 7ab085f39..7b6758ee9 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Dialogs/ProfileExportViewModel.cs @@ -1,8 +1,8 @@ using System.Windows; +using System.Windows.Navigation; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.Shared.Services; -using MaterialDesignThemes.Wpf; namespace Artemis.UI.Screens.ProfileEditor.Dialogs { @@ -21,6 +21,22 @@ namespace Artemis.UI.Screens.ProfileEditor.Dialogs public ProfileDescriptor ProfileDescriptor { get; } + #region Overrides of Screen + + /// + protected override void OnActivate() + { + // TODO: If the profile has hints on all layers, call Accept + base.OnActivate(); + } + + #endregion + + public void OpenHyperlink(object sender, RequestNavigateEventArgs e) + { + Core.Utilities.OpenUrl(e.Uri.AbsoluteUri); + } + public void Accept() { string encoded = _profileService.ExportProfile(ProfileDescriptor); diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml index c20cb440c..2e82fc085 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml @@ -22,91 +22,104 @@ d:DesignHeight="800" d:DesignWidth="800" d:DataContext="{d:DesignInstance dialogs:LayerHintsDialogViewModel}" Icon="/Resources/Images/Logo/bow.ico"> - - - - - + + + + + - - + + - - - - - - - + + + + + + + - - - - - - - - - - Introduction - - - In this window you can tell Artemis how this layer should be adapted when the profile is applied to a different set of devices by providing so-called adaption hints. - - When sharing your profile with other people good hints help them import your profile without the need for manual adjustments. - + + + + + + + + + + Introduction + + + In this window you can tell Artemis how this layer should be adapted when the profile is applied to a different set of devices by providing so-called adaption hints. + This is useful when sharing your profile with others, avoiding the need for manual adjustments. + + To learn more about profile adaption, check out + + this wiki article + + . + - - Adaption hints - - - - - - - - - - - - + + Adaption hints + + + + You haven't set up any adaption hints + Artemis will attempt to directly map the LEDs of this layer to different surfaces but results may vary. + + + + + + + + + + + + - - - - - - - + + + + + + + - - - + + - + + + + + PolyForm Noncommercial License 1.0.0 + + + + + + + + + + + + + + + + + + + + + + + Robert 'Spoinky' Beekman + + + Project owner, main contributor + + + + + + + + + + + + + + + + + + + + + + + + + Darth Affe + + + + RGB.NET + developer, main contributor + + + + + + + + + + + + + + + + + + + + + + + + + Diogo 'DrMeteor' Trindade + + + Main contributor + + + + + + + + + + + + + + + + + + + + + + + + + Kai Werling + + + Graphics design + + + + + + + + + + + + Special thanks + + + + - The various people creating PRs to Artemis.Plugins and the main repository + - All the people on Discord providing feedback and testing + + + + + + External libraries + + + + - Ben.Demystifier + + https://github.com/benaadams/Ben.Demystifier + + - EmbedIO + + https://unosquare.github.io/embedio/ + + - FluentValidation + + https://fluentvalidation.net/ + + - Furl.Http + + https://flurl.dev/ + + - gong-wpf-dragdrop + + https://github.com/punker76/gong-wpf-dragdrop + + - Hardcodet.NotifyIcon.Wpf.NetCore + + https://github.com/HavenDV/H.NotifyIcon.WPF + + - Humanizer + + https://github.com/Humanizr/Humanizer + + - LiteDB + + https://www.litedb.org/ + + - MaterialDesignThemes + + https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit + + - MaterialDesignExtensions + + https://spiegelp.github.io/MaterialDesignExtensions/ + + - McMaster.NETCore.Plugins + + https://github.com/natemcmaster/DotNetCorePlugins + + - Newtonsoft.Json + + https://www.newtonsoft.com/json + + - Ninject + + http://www.ninject.org/ + + - Ookii.Dialogs.Wpf + + https://github.com/ookii-dialogs/ookii-dialogs-wpf + + - RawInput.Sharp + + https://github.com/mfakane/rawinput-sharp + + - RGB.NET + + https://github.com/DarthAffe/RGB.NET + + - Serilog + + https://serilog.net/ + + - SkiaSharp + + https://github.com/mono/SkiaSharp + + - Stylet + + https://github.com/canton7/Stylet + + - Unclassified.NetRevisionTask + + https://unclassified.software/en/apps/netrevisiontask + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs index cbf2c00ae..0f03ebc7d 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs @@ -1,4 +1,5 @@ using System.Reflection; +using System.Windows.Navigation; using Artemis.Core; using Stylet; @@ -19,6 +20,16 @@ namespace Artemis.UI.Screens.Settings.Tabs.About set => SetAndNotify(ref _version, value); } + public void OpenHyperlink(object sender, RequestNavigateEventArgs e) + { + Core.Utilities.OpenUrl(e.Uri.AbsoluteUri); + } + + public void OpenUrl(string url) + { + Core.Utilities.OpenUrl(url); + } + #region Overrides of Screen /// diff --git a/src/Artemis.UI/packages.lock.json b/src/Artemis.UI/packages.lock.json index 9a607f014..6df570a98 100644 --- a/src/Artemis.UI/packages.lock.json +++ b/src/Artemis.UI/packages.lock.json @@ -1448,11 +1448,6 @@ "resolved": "3.0.0", "contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw==" }, - "WriteableBitmapEx": { - "type": "Transitive", - "resolved": "1.6.7", - "contentHash": "GoPhIdYzG/DWJq/MADb8gFzRN5PsxM+1DSJFS8Jzupg4DXqFSnlejYEjJw4ffPEUyELL07O4XIGUZydE4jQK0Q==" - }, "artemis.core": { "type": "Project", "dependencies": { @@ -1503,8 +1498,7 @@ "SkiaSharp.Views.WPF": "2.80.2", "Stylet": "1.3.6", "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "WriteableBitmapEx": "1.6.7" + "System.Numerics.Vectors": "4.5.0" } } } From 3825c34be115b2eb304d4c3377a754d8e65c9864 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 21 May 2021 18:24:47 +0200 Subject: [PATCH 35/35] Layer properties - Implement INotifyPropertyChanged on BaseValue Profile editor - Don't show expand button on property groups without children Profile editor - Alert user about extra options on brushes --- .../Profile/LayerProperties/LayerProperty.cs | 3 +- .../LayerPropertyGroupViewModel.cs | 9 ++++ .../LayerProperties/Tree/TreeGroupView.xaml | 45 ++++++++++++++----- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs index e5733c8e2..d9ad40690 100644 --- a/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs +++ b/src/Artemis.Core/Models/Profile/LayerProperties/LayerProperty.cs @@ -15,7 +15,7 @@ namespace Artemis.Core /// /// /// The type of property encapsulated in this layer property - public class LayerProperty : ILayerProperty + public class LayerProperty : CorePropertyChanged, ILayerProperty { private bool _disposed; @@ -265,6 +265,7 @@ namespace Artemis.Core _baseValue = value; ReapplyUpdate(); + OnPropertyChanged(nameof(BaseValue)); } } diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs index f0cb27d88..84e28c8a3 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using Artemis.Core; using Artemis.UI.Ninject.Factories; @@ -17,6 +18,7 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties private bool _isVisible; private TreeGroupViewModel _treeGroupViewModel; private TimelineGroupViewModel _timelineGroupViewModel; + private bool _hasChildren; public LayerPropertyGroupViewModel(LayerPropertyGroup layerPropertyGroup, IProfileEditorService profileEditorService, ILayerPropertyVmFactory layerPropertyVmFactory) { @@ -62,6 +64,11 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties } } + public bool HasChildren + { + get => _hasChildren; + set => SetAndNotify(ref _hasChildren, value); + } protected override void OnInitialActivate() { @@ -169,6 +176,8 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties Items.Add(_layerPropertyVmFactory.LayerPropertyGroupViewModel(value)); } } + + HasChildren = Items.Any(i => i is LayerPropertyViewModel {IsVisible: true} || i is LayerPropertyGroupViewModel {IsVisible: true}); } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml index e80ebe39e..2ab3fc453 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml @@ -33,6 +33,7 @@ Foreground="{DynamicResource MaterialDesignBody}" Style="{StaticResource MaterialDesignExpandCollapseToggleStyle}" IsChecked="{Binding Path=LayerPropertyGroupViewModel.IsExpanded}" + Visibility="{Binding Path=LayerPropertyGroupViewModel.HasChildren, Converter={x:Static s:BoolToVisibilityConverter.Instance}, Mode=OneWay}" ClickMode="Press" /> @@ -121,17 +122,39 @@ ToolTip="{Binding LayerPropertyGroup.LayerBrush.Descriptor.Description}" Margin="0 5 0 0" /> - + + Extra options available! + + + + + + + + + + + + + + + + + + + + +