mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Implemented layer elements
Added a brush layer element Corsair - Added ST100 RGB layout
This commit is contained in:
parent
482cbe79ed
commit
9148323ad5
@ -172,11 +172,14 @@
|
||||
<Compile Include="Plugins\Abstract\ProfileModule.cs" />
|
||||
<Compile Include="Plugins\Exceptions\ArtemisPluginException.cs" />
|
||||
<Compile Include="Plugins\Abstract\DataModelExpansion.cs" />
|
||||
<Compile Include="Plugins\Abstract\Device.cs" />
|
||||
<Compile Include="Plugins\Abstract\LayerType.cs" />
|
||||
<Compile Include="Plugins\Interfaces\ILayerTypeConfiguration.cs" />
|
||||
<Compile Include="Plugins\Abstract\DeviceProvider.cs" />
|
||||
<Compile Include="Plugins\Abstract\Module.cs" />
|
||||
<Compile Include="Plugins\Abstract\Plugin.cs" />
|
||||
<Compile Include="Plugins\LayerElement\LayerElement.cs" />
|
||||
<Compile Include="Plugins\LayerElement\LayerElementDescriptor.cs" />
|
||||
<Compile Include="Plugins\LayerElement\LayerElementProvider.cs" />
|
||||
<Compile Include="Plugins\LayerElement\LayerElementSettings.cs" />
|
||||
<Compile Include="Plugins\LayerElement\LayerElementViewModel.cs" />
|
||||
<Compile Include="Plugins\Models\PluginInfo.cs" />
|
||||
<Compile Include="Plugins\Models\PluginSetting.cs" />
|
||||
<Compile Include="Plugins\Models\PluginSettings.cs" />
|
||||
@ -189,9 +192,11 @@
|
||||
<Compile Include="RGB.NET\DirectBitmap.cs" />
|
||||
<Compile Include="RGB.NET\GraphicsDecorator.cs" />
|
||||
<Compile Include="Services\DeviceService.cs" />
|
||||
<Compile Include="Services\Interfaces\ILayerService.cs" />
|
||||
<Compile Include="Services\Interfaces\IProtectedArtemisService.cs" />
|
||||
<Compile Include="Services\Interfaces\IMainDataModelService.cs" />
|
||||
<Compile Include="Services\CoreService.cs" />
|
||||
<Compile Include="Services\LayerService.cs" />
|
||||
<Compile Include="Services\MainDataModelService.cs" />
|
||||
<Compile Include="Services\RgbService.cs" />
|
||||
<Compile Include="Services\Interfaces\IRgbService.cs" />
|
||||
|
||||
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.Core.Models.Profile.Abstract
|
||||
@ -44,7 +45,7 @@ namespace Artemis.Core.Models.Profile.Abstract
|
||||
/// <summary>
|
||||
/// Renders the element
|
||||
/// </summary>
|
||||
public abstract void Render(double deltaTime, Surface.ArtemisSurface surface, Graphics graphics);
|
||||
public abstract void Render(double deltaTime, ArtemisSurface surface, Graphics graphics);
|
||||
|
||||
/// <summary>
|
||||
/// Applies the profile element's properties to the underlying storage entity
|
||||
@ -73,7 +74,7 @@ namespace Artemis.Core.Models.Profile.Abstract
|
||||
layers.AddRange(Children.Where(c => c is Layer).Cast<Layer>());
|
||||
|
||||
// Add all layers in folders inside this element
|
||||
foreach (var childFolder in Children.Where(c => c is Folder).Cast<Folder>())
|
||||
foreach (var childFolder in Children.Where(c => c is Folder).Cast<Folder>())
|
||||
layers.AddRange(childFolder.GetAllLayers());
|
||||
|
||||
return layers;
|
||||
|
||||
@ -2,7 +2,7 @@ using System;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
|
||||
namespace Artemis.Core.Models.Profile
|
||||
@ -19,7 +19,7 @@ namespace Artemis.Core.Models.Profile
|
||||
Name = name;
|
||||
}
|
||||
|
||||
public Folder(Profile profile, ProfileElement parent, FolderEntity folderEntity, IPluginService pluginService)
|
||||
internal Folder(Profile profile, ProfileElement parent, FolderEntity folderEntity)
|
||||
{
|
||||
FolderEntity = folderEntity;
|
||||
EntityId = folderEntity.Id;
|
||||
@ -33,10 +33,10 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
// Load child folders
|
||||
foreach (var childFolder in Profile.ProfileEntity.Folders.Where(f => f.ParentId == EntityId))
|
||||
_children.Add(new Folder(profile, this, childFolder, pluginService));
|
||||
_children.Add(new Folder(profile, this, childFolder));
|
||||
// Load child layers
|
||||
foreach (var childLayer in Profile.ProfileEntity.Layers.Where(f => f.ParentId == EntityId))
|
||||
_children.Add(new Layer(profile, this, childLayer, pluginService));
|
||||
_children.Add(new Layer(profile, this, childLayer));
|
||||
|
||||
// Ensure order integrity, should be unnecessary but no one is perfect specially me
|
||||
_children = _children.OrderBy(c => c.Order).ToList();
|
||||
@ -56,7 +56,7 @@ namespace Artemis.Core.Models.Profile
|
||||
profileElement.Update(deltaTime);
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, Surface.ArtemisSurface surface, Graphics graphics)
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
// Folders don't render but their children do
|
||||
foreach (var profileElement in Children)
|
||||
|
||||
@ -7,15 +7,15 @@ using System.Linq;
|
||||
using Artemis.Core.Extensions;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Plugins.Interfaces;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Artemis.Core.Models.Profile
|
||||
{
|
||||
public sealed class Layer : ProfileElement
|
||||
{
|
||||
private readonly List<LayerElement> _layerElements;
|
||||
private List<ArtemisLed> _leds;
|
||||
|
||||
public Layer(Profile profile, ProfileElement parent, string name)
|
||||
@ -26,10 +26,12 @@ namespace Artemis.Core.Models.Profile
|
||||
Profile = profile;
|
||||
Parent = parent;
|
||||
Name = name;
|
||||
|
||||
_leds = new List<ArtemisLed>();
|
||||
_layerElements = new List<LayerElement>();
|
||||
}
|
||||
|
||||
internal Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity, IPluginService pluginService)
|
||||
internal Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity)
|
||||
{
|
||||
LayerEntity = layerEntity;
|
||||
EntityId = layerEntity.Id;
|
||||
@ -39,46 +41,44 @@ namespace Artemis.Core.Models.Profile
|
||||
Name = layerEntity.Name;
|
||||
Order = layerEntity.Order;
|
||||
|
||||
LayerType = pluginService.GetLayerTypeByGuid(layerEntity.LayerTypeGuid);
|
||||
_leds = new List<ArtemisLed>();
|
||||
_layerElements = new List<LayerElement>();
|
||||
}
|
||||
|
||||
internal LayerEntity LayerEntity { get; set; }
|
||||
|
||||
public ReadOnlyCollection<ArtemisLed> Leds => _leds.AsReadOnly();
|
||||
public LayerType LayerType { get; private set; }
|
||||
public ILayerTypeConfiguration LayerTypeConfiguration { get; set; }
|
||||
public ReadOnlyCollection<LayerElement> LayerElements => _layerElements.AsReadOnly();
|
||||
|
||||
public Rectangle RenderRectangle { get; set; }
|
||||
public GraphicsPath RenderPath { get; set; }
|
||||
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
if (LayerType == null)
|
||||
return;
|
||||
|
||||
lock (LayerType)
|
||||
{
|
||||
LayerType.Update(this);
|
||||
}
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.Update(deltaTime);
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
if (LayerType == null)
|
||||
return;
|
||||
graphics.SetClip(RenderPath);
|
||||
|
||||
lock (LayerType)
|
||||
{
|
||||
LayerType.Render(this, surface, graphics);
|
||||
}
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.RenderPreProcess(surface, graphics);
|
||||
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.Render(surface, graphics);
|
||||
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.RenderPostProcess(surface, graphics);
|
||||
|
||||
graphics.ResetClip();
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
{
|
||||
LayerEntity.Id = EntityId;
|
||||
LayerEntity.ParentId = Parent?.EntityId ?? new Guid();
|
||||
LayerEntity.LayerTypeGuid = LayerType?.PluginInfo.Guid ?? new Guid();
|
||||
|
||||
LayerEntity.Order = Order;
|
||||
LayerEntity.Name = Name;
|
||||
@ -97,26 +97,18 @@ namespace Artemis.Core.Models.Profile
|
||||
}
|
||||
|
||||
LayerEntity.Condition.Clear();
|
||||
|
||||
|
||||
LayerEntity.Elements.Clear();
|
||||
}
|
||||
|
||||
public void ApplySurface(ArtemisSurface surface)
|
||||
{
|
||||
var leds = new List<ArtemisLed>();
|
||||
|
||||
// Get the surface LEDs for this layer
|
||||
var availableLeds = surface.Devices.SelectMany(d => d.Leds).ToList();
|
||||
foreach (var ledEntity in LayerEntity.Leds)
|
||||
foreach (var layerElement in LayerElements)
|
||||
{
|
||||
var match = availableLeds.FirstOrDefault(a => a.Device.RgbDevice.GetDeviceHashCode() == ledEntity.DeviceHash &&
|
||||
a.RgbLed.Id.ToString() == ledEntity.LedName);
|
||||
if (match != null)
|
||||
leds.Add(match);
|
||||
var layerElementEntity = new LayerElementEntity
|
||||
{
|
||||
PluginGuid = layerElement.Descriptor.LayerElementProvider.PluginInfo.Guid,
|
||||
LayerElementType = layerElement.GetType().Name,
|
||||
Configuration = JsonConvert.SerializeObject(layerElement.Settings)
|
||||
};
|
||||
LayerEntity.Elements.Add(layerElementEntity);
|
||||
}
|
||||
|
||||
_leds = leds;
|
||||
CalculateRenderProperties();
|
||||
}
|
||||
|
||||
public void AddLed(ArtemisLed led)
|
||||
@ -143,17 +135,27 @@ namespace Artemis.Core.Models.Profile
|
||||
CalculateRenderProperties();
|
||||
}
|
||||
|
||||
public void UpdateLayerType(LayerType layerType)
|
||||
internal void AddLayerElement(LayerElement layerElement)
|
||||
{
|
||||
if (LayerType != null)
|
||||
_layerElements.Add(layerElement);
|
||||
}
|
||||
|
||||
public void ApplySurface(ArtemisSurface surface)
|
||||
{
|
||||
var leds = new List<ArtemisLed>();
|
||||
|
||||
// Get the surface LEDs for this layer
|
||||
var availableLeds = surface.Devices.SelectMany(d => d.Leds).ToList();
|
||||
foreach (var ledEntity in LayerEntity.Leds)
|
||||
{
|
||||
lock (LayerType)
|
||||
{
|
||||
LayerType.Dispose();
|
||||
}
|
||||
var match = availableLeds.FirstOrDefault(a => a.Device.RgbDevice.GetDeviceHashCode() == ledEntity.DeviceHash &&
|
||||
a.RgbLed.Id.ToString() == ledEntity.LedName);
|
||||
if (match != null)
|
||||
leds.Add(match);
|
||||
}
|
||||
|
||||
LayerType = layerType;
|
||||
_leds = leds;
|
||||
CalculateRenderProperties();
|
||||
}
|
||||
|
||||
internal void CalculateRenderProperties()
|
||||
@ -167,8 +169,8 @@ namespace Artemis.Core.Models.Profile
|
||||
// Determine to top-left and bottom-right
|
||||
var minX = Leds.Min(l => l.AbsoluteRenderRectangle.X);
|
||||
var minY = Leds.Min(l => l.AbsoluteRenderRectangle.Y);
|
||||
var maxX = Leds.Max(l => l.AbsoluteRenderRectangle.X);
|
||||
var maxY = Leds.Max(l => l.AbsoluteRenderRectangle.Y);
|
||||
var maxX = Leds.Max(l => l.AbsoluteRenderRectangle.X + l.AbsoluteRenderRectangle.Width);
|
||||
var maxY = Leds.Max(l => l.AbsoluteRenderRectangle.Y + l.AbsoluteRenderRectangle.Height);
|
||||
|
||||
RenderRectangle = new Rectangle(minX, minY, maxX - minX, maxY - minY);
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ using System.Drawing;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Exceptions;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
|
||||
namespace Artemis.Core.Models.Profile
|
||||
@ -23,7 +23,7 @@ namespace Artemis.Core.Models.Profile
|
||||
ApplyToEntity();
|
||||
}
|
||||
|
||||
internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService)
|
||||
internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity)
|
||||
{
|
||||
ProfileEntity = profileEntity;
|
||||
EntityId = profileEntity.Id;
|
||||
@ -36,7 +36,7 @@ namespace Artemis.Core.Models.Profile
|
||||
if (rootFolder == null)
|
||||
AddChild(new Folder(this, null, "Root folder"));
|
||||
else
|
||||
AddChild(new Folder(this, null, rootFolder, pluginService));
|
||||
AddChild(new Folder(this, null, rootFolder));
|
||||
}
|
||||
|
||||
public PluginInfo PluginInfo { get; }
|
||||
@ -56,7 +56,7 @@ namespace Artemis.Core.Models.Profile
|
||||
}
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, Surface.ArtemisSurface surface, Graphics graphics)
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
@ -86,12 +86,14 @@ namespace Artemis.Core.Models.Profile
|
||||
}
|
||||
|
||||
|
||||
internal void Activate()
|
||||
internal void Activate(ArtemisSurface surface)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
if (IsActivated) return;
|
||||
if (IsActivated)
|
||||
return;
|
||||
|
||||
ApplySurface(surface);
|
||||
OnActivated();
|
||||
IsActivated = true;
|
||||
}
|
||||
@ -113,7 +115,7 @@ namespace Artemis.Core.Models.Profile
|
||||
return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}";
|
||||
}
|
||||
|
||||
public void ApplySurface(Surface.ArtemisSurface surface)
|
||||
public void ApplySurface(ArtemisSurface surface)
|
||||
{
|
||||
foreach (var layer in GetAllLayers())
|
||||
layer.ApplySurface(surface);
|
||||
@ -140,7 +142,7 @@ namespace Artemis.Core.Models.Profile
|
||||
{
|
||||
Deactivated?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@ -36,7 +36,7 @@ namespace Artemis.Core.Models.Surface
|
||||
IsActive = surfaceEntity.IsActive;
|
||||
|
||||
// Devices are not populated here but as they are detected
|
||||
Devices = new List<ArtemisDevice>();
|
||||
Devices = new List<ArtemisDevice>();
|
||||
}
|
||||
|
||||
public RGBSurface RgbSurface { get; }
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using Artemis.Core.Extensions;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
@ -8,22 +9,24 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
{
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Allows you to implement your own RGB device
|
||||
/// Allows you to implement and register your own device provider
|
||||
/// </summary>
|
||||
public abstract class Device : Plugin
|
||||
public abstract class DeviceProvider : Plugin
|
||||
{
|
||||
protected Device(PluginInfo pluginInfo, IRGBDeviceProvider deviceProvider) : base(pluginInfo)
|
||||
protected DeviceProvider(PluginInfo pluginInfo, IRGBDeviceProvider rgbDeviceProvider) : base(pluginInfo)
|
||||
{
|
||||
DeviceProvider = deviceProvider ?? throw new ArgumentNullException(nameof(deviceProvider));
|
||||
RgbDeviceProvider = rgbDeviceProvider ?? throw new ArgumentNullException(nameof(rgbDeviceProvider));
|
||||
}
|
||||
|
||||
public IRGBDeviceProvider DeviceProvider { get; }
|
||||
public IRGBDeviceProvider RgbDeviceProvider { get; }
|
||||
|
||||
|
||||
protected void ResolveAbsolutePath(Type type, object sender, ResolvePathEventArgs e)
|
||||
{
|
||||
if (sender.GetType().IsGenericType(type))
|
||||
{
|
||||
Debug.WriteLine(e.RelativePart);
|
||||
Debug.WriteLine(e.FileName);
|
||||
// Start from the plugin directory
|
||||
if (e.RelativePart != null && e.FileName != null)
|
||||
e.FinalPath = Path.Combine(PluginInfo.Directory.FullName, e.RelativePart, e.FileName);
|
||||
@ -1,29 +0,0 @@
|
||||
using System.Drawing;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
|
||||
namespace Artemis.Core.Plugins.Abstract
|
||||
{
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Allows you to create your own layer type
|
||||
/// </summary>
|
||||
public abstract class LayerType : Plugin
|
||||
{
|
||||
protected LayerType(PluginInfo pluginInfo) : base(pluginInfo)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the layer type
|
||||
/// </summary>
|
||||
/// <param name="layer"></param>
|
||||
public abstract void Update(Layer layer);
|
||||
|
||||
/// <summary>
|
||||
/// Renders the layer type
|
||||
/// </summary>
|
||||
public abstract void Render(Layer device, ArtemisSurface surface, Graphics graphics);
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
Module = module;
|
||||
DisplayName = displayName;
|
||||
}
|
||||
|
||||
|
||||
public Module Module { get; }
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using Artemis.Core.Exceptions;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
@ -34,8 +35,10 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeActiveProfile(Profile profile)
|
||||
internal void ChangeActiveProfile(Profile profile, ArtemisSurface surface)
|
||||
{
|
||||
if (profile != null && profile.PluginInfo != PluginInfo)
|
||||
throw new ArtemisCoreException($"Cannot activate a profile of plugin {profile.PluginInfo} on a module of plugin {PluginInfo}.");
|
||||
lock (this)
|
||||
{
|
||||
if (profile == ActiveProfile)
|
||||
@ -44,7 +47,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
ActiveProfile?.Deactivate();
|
||||
|
||||
ActiveProfile = profile;
|
||||
ActiveProfile?.Activate();
|
||||
ActiveProfile?.Activate(surface);
|
||||
}
|
||||
|
||||
OnActiveProfileChanged();
|
||||
@ -53,7 +56,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
#region Events
|
||||
|
||||
public event EventHandler ActiveProfileChanged;
|
||||
|
||||
|
||||
protected virtual void OnActiveProfileChanged()
|
||||
{
|
||||
ActiveProfileChanged?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
namespace Artemis.Core.Plugins.Interfaces
|
||||
{
|
||||
public interface ILayerTypeConfiguration
|
||||
{
|
||||
}
|
||||
}
|
||||
47
src/Artemis.Core/Plugins/LayerElement/LayerElement.cs
Normal file
47
src/Artemis.Core/Plugins/LayerElement/LayerElement.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System.Drawing;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
{
|
||||
public abstract class LayerElement
|
||||
{
|
||||
protected LayerElement(Layer layer, LayerElementSettings settings, LayerElementDescriptor descriptor)
|
||||
{
|
||||
Layer = layer;
|
||||
Settings = settings;
|
||||
Descriptor = descriptor;
|
||||
}
|
||||
|
||||
public Layer Layer { get; }
|
||||
public LayerElementSettings Settings { get; }
|
||||
public LayerElementDescriptor Descriptor { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Called by the profile editor to populate the layer element properties panel
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public abstract LayerElementViewModel GetViewModel();
|
||||
|
||||
/// <summary>
|
||||
/// Called before rendering every frame, write your update logic here
|
||||
/// </summary>
|
||||
/// <param name="deltaTime"></param>
|
||||
public abstract void Update(double deltaTime);
|
||||
|
||||
/// <summary>
|
||||
/// Called before rendering, in the order configured on the layer
|
||||
/// </summary>
|
||||
public abstract void RenderPreProcess(ArtemisSurface surface, Graphics graphics);
|
||||
|
||||
/// <summary>
|
||||
/// Called during rendering, in the order configured on the layer
|
||||
/// </summary>
|
||||
public abstract void Render(ArtemisSurface surface, Graphics graphics);
|
||||
|
||||
/// <summary>
|
||||
/// Called after rendering, in the order configured on the layer
|
||||
/// </summary>
|
||||
public abstract void RenderPostProcess(ArtemisSurface surface, Graphics graphics);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
{
|
||||
public class LayerElementDescriptor
|
||||
{
|
||||
internal LayerElementDescriptor(string displayName, string description, string icon, Type layerElementType, LayerElementProvider layerElementProvider)
|
||||
{
|
||||
DisplayName = displayName;
|
||||
Description = description;
|
||||
Icon = icon;
|
||||
LayerElementType = layerElementType;
|
||||
LayerElementProvider = layerElementProvider;
|
||||
}
|
||||
|
||||
public string DisplayName { get; }
|
||||
public string Description { get; }
|
||||
public string Icon { get; }
|
||||
public Type LayerElementType { get; }
|
||||
public LayerElementProvider LayerElementProvider { get; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
{
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Allows you to create one or more <see cref="LayerElement" />s usable by profile layers.
|
||||
/// </summary>
|
||||
public abstract class LayerElementProvider : Plugin
|
||||
{
|
||||
private readonly List<LayerElementDescriptor> _layerElementDescriptors;
|
||||
|
||||
protected LayerElementProvider(PluginInfo pluginInfo) : base(pluginInfo)
|
||||
{
|
||||
_layerElementDescriptors = new List<LayerElementDescriptor>();
|
||||
}
|
||||
|
||||
public ReadOnlyCollection<LayerElementDescriptor> LayerElementDescriptors => _layerElementDescriptors.AsReadOnly();
|
||||
|
||||
protected void AddLayerElementDescriptor<T>(string displayName, string description, string icon) where T : LayerElement
|
||||
{
|
||||
_layerElementDescriptors.Add(new LayerElementDescriptor(displayName, description, icon, typeof(T), this));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
{
|
||||
public abstract class LayerElementSettings : PropertyChangedBase
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
{
|
||||
public abstract class LayerElementViewModel : PropertyChangedBase
|
||||
{
|
||||
protected LayerElementViewModel(LayerElement layerElement)
|
||||
{
|
||||
LayerElement = layerElement;
|
||||
}
|
||||
|
||||
public LayerElement LayerElement { get; }
|
||||
}
|
||||
}
|
||||
@ -54,7 +54,16 @@ namespace Artemis.Core.RGB.NET
|
||||
|
||||
public Graphics GetGraphics()
|
||||
{
|
||||
return _bitmap == null ? null : Graphics.FromImage(_bitmap.Bitmap);
|
||||
try
|
||||
{
|
||||
return _bitmap == null ? null : Graphics.FromImage(_bitmap.Bitmap);
|
||||
}
|
||||
catch (AccessViolationException)
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Bitmap GetBitmap()
|
||||
|
||||
@ -5,7 +5,6 @@ using Artemis.Core.Events;
|
||||
using Artemis.Core.Exceptions;
|
||||
using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Core.Services.Storage;
|
||||
using Artemis.Core.Services.Storage.Interfaces;
|
||||
using RGB.NET.Core;
|
||||
using Serilog;
|
||||
|
||||
@ -1,8 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
using System.Threading.Tasks;
|
||||
using Artemis.Core.Events;
|
||||
using Artemis.Core.Models.Surface;
|
||||
@ -56,9 +52,9 @@ namespace Artemis.Core.Services
|
||||
public interface IDeviceService : IArtemisService
|
||||
{
|
||||
/// <summary>
|
||||
/// Identifies the device by making it blink white 5 times
|
||||
/// Identifies the device by making it blink white 5 times
|
||||
/// </summary>
|
||||
/// <param name="device"></param>
|
||||
void IdentifyDevice(ArtemisDevice device);
|
||||
}
|
||||
}
|
||||
}
|
||||
18
src/Artemis.Core/Services/Interfaces/ILayerService.cs
Normal file
18
src/Artemis.Core/Services/Interfaces/ILayerService.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.Core.Services.Interfaces
|
||||
{
|
||||
public interface ILayerService : IArtemisService
|
||||
{
|
||||
/// <summary>
|
||||
/// Instantiates and adds the <see cref="LayerElement" /> described by the provided
|
||||
/// <see cref="LayerElementDescriptor" /> to the provided <see cref="Layer" />.
|
||||
/// </summary>
|
||||
/// <param name="layer">The layer to add the new layer element to</param>
|
||||
/// <param name="layerElementDescriptor">The descriptor of the new layer element</param>
|
||||
/// <param name="settings">JSON settings to be deserialized and injected into the layer element</param>
|
||||
/// <returns></returns>
|
||||
LayerElement InstantiateLayerElement(Layer layer, LayerElementDescriptor layerElementDescriptor, string settings = null);
|
||||
}
|
||||
}
|
||||
@ -55,13 +55,6 @@ namespace Artemis.Core.Services.Interfaces
|
||||
/// <returns>A list containing all the plugin info</returns>
|
||||
List<PluginInfo> GetAllPluginInfo();
|
||||
|
||||
/// <summary>
|
||||
/// Finds an instance of the layer type matching the given GUID
|
||||
/// </summary>
|
||||
/// <param name="layerTypeGuid">The GUID of the layer type to find</param>
|
||||
/// <returns>An instance of the layer type</returns>
|
||||
LayerType GetLayerTypeByGuid(Guid layerTypeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// Finds all enabled <see cref="Plugin" /> instances of type <see cref="T" />
|
||||
/// </summary>
|
||||
|
||||
50
src/Artemis.Core/Services/LayerService.cs
Normal file
50
src/Artemis.Core/Services/LayerService.cs
Normal file
@ -0,0 +1,50 @@
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Plugins.Exceptions;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Newtonsoft.Json;
|
||||
using Ninject;
|
||||
using Ninject.Parameters;
|
||||
|
||||
namespace Artemis.Core.Services
|
||||
{
|
||||
public class LayerService : ILayerService
|
||||
{
|
||||
private readonly IKernel _kernel;
|
||||
|
||||
public LayerService(IKernel kernel)
|
||||
{
|
||||
_kernel = kernel;
|
||||
}
|
||||
|
||||
public LayerElement InstantiateLayerElement(Layer layer, LayerElementDescriptor layerElementDescriptor, string settings)
|
||||
{
|
||||
// Deserialize the settings, if provided
|
||||
object deserializedSettings = null;
|
||||
if (settings != null)
|
||||
{
|
||||
var settingsType = layerElementDescriptor.LayerElementType.GetProperty(nameof(LayerElement.Settings))?.PropertyType;
|
||||
if (settingsType == null)
|
||||
{
|
||||
throw new ArtemisPluginException(
|
||||
layerElementDescriptor.LayerElementProvider.PluginInfo,
|
||||
$"Layer element of type {layerElementDescriptor.LayerElementType} has no Settings property."
|
||||
);
|
||||
}
|
||||
|
||||
deserializedSettings = JsonConvert.DeserializeObject(settings, settingsType);
|
||||
}
|
||||
|
||||
var arguments = new IParameter[]
|
||||
{
|
||||
new ConstructorArgument("layer", layer),
|
||||
new ConstructorArgument("settings", deserializedSettings),
|
||||
new ConstructorArgument("descriptor", layerElementDescriptor)
|
||||
};
|
||||
var layerElement = (LayerElement) _kernel.Get(layerElementDescriptor.LayerElementType, arguments);
|
||||
layer.AddLayerElement(layerElement);
|
||||
|
||||
return layerElement;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -285,19 +285,6 @@ namespace Artemis.Core.Services
|
||||
return new List<PluginInfo>(_plugins);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public LayerType GetLayerTypeByGuid(Guid layerTypeGuid)
|
||||
{
|
||||
var pluginInfo = _plugins.FirstOrDefault(p => p.Guid == layerTypeGuid);
|
||||
if (pluginInfo == null)
|
||||
return null;
|
||||
|
||||
if (!(pluginInfo.Instance is LayerType layerType))
|
||||
throw new ArtemisPluginException(pluginInfo, "Plugin is expected to implement exactly one LayerType");
|
||||
|
||||
return layerType;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<T> GetPluginsOfType<T>() where T : Plugin
|
||||
{
|
||||
@ -309,7 +296,7 @@ namespace Artemis.Core.Services
|
||||
|
||||
public Plugin GetDevicePlugin(IRGBDevice rgbDevice)
|
||||
{
|
||||
return GetPluginsOfType<Device>().First(d => d.DeviceProvider.Devices.Contains(rgbDevice));
|
||||
return GetPluginsOfType<DeviceProvider>().First(d => d.RgbDeviceProvider.Devices.Contains(rgbDevice));
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
||||
@ -12,5 +12,12 @@ namespace Artemis.Core.Services.Storage.Interfaces
|
||||
Profile GetActiveProfile(ProfileModule module);
|
||||
void UpdateProfile(Profile profile, bool includeChildren);
|
||||
void DeleteProfile(Profile profile);
|
||||
|
||||
/// <summary>
|
||||
/// Activates the profile for the given <see cref="ProfileModule" /> with the currently active surface
|
||||
/// </summary>
|
||||
/// <param name="module">The module to activate the profile for</param>
|
||||
/// <param name="profile">The profile to activate</param>
|
||||
void ActivateProfile(ProfileModule module, Profile profile);
|
||||
}
|
||||
}
|
||||
@ -16,8 +16,8 @@ namespace Artemis.Core.Services.Storage
|
||||
public class ProfileService : IProfileService
|
||||
{
|
||||
private readonly IPluginService _pluginService;
|
||||
private readonly ISurfaceService _surfaceService;
|
||||
private readonly IProfileRepository _profileRepository;
|
||||
private readonly ISurfaceService _surfaceService;
|
||||
|
||||
internal ProfileService(IPluginService pluginService, ISurfaceService surfaceService, IProfileRepository profileRepository)
|
||||
{
|
||||
@ -29,6 +29,73 @@ namespace Artemis.Core.Services.Storage
|
||||
_surfaceService.SurfaceConfigurationUpdated += SurfaceServiceOnSurfaceConfigurationUpdated;
|
||||
}
|
||||
|
||||
public List<Profile> GetProfiles(ProfileModule module)
|
||||
{
|
||||
var profileEntities = _profileRepository.GetByPluginGuid(module.PluginInfo.Guid);
|
||||
var profiles = new List<Profile>();
|
||||
foreach (var profileEntity in profileEntities)
|
||||
{
|
||||
// If the profile entity matches the module's currently active profile, use that instead
|
||||
if (module.ActiveProfile != null && module.ActiveProfile.EntityId == profileEntity.Id)
|
||||
profiles.Add(module.ActiveProfile);
|
||||
else
|
||||
profiles.Add(new Profile(module.PluginInfo, profileEntity));
|
||||
}
|
||||
|
||||
return profiles;
|
||||
}
|
||||
|
||||
public Profile GetActiveProfile(ProfileModule module)
|
||||
{
|
||||
if (module.ActiveProfile != null)
|
||||
return module.ActiveProfile;
|
||||
|
||||
var moduleProfiles = _profileRepository.GetByPluginGuid(module.PluginInfo.Guid);
|
||||
var profileEntity = moduleProfiles.FirstOrDefault(p => p.IsActive) ?? moduleProfiles.FirstOrDefault();
|
||||
if (profileEntity == null)
|
||||
return null;
|
||||
|
||||
return new Profile(module.PluginInfo, profileEntity);
|
||||
}
|
||||
|
||||
public Profile CreateProfile(ProfileModule module, string name)
|
||||
{
|
||||
var profile = new Profile(module.PluginInfo, name);
|
||||
_profileRepository.Add(profile.ProfileEntity);
|
||||
|
||||
if (_surfaceService.ActiveSurface != null)
|
||||
profile.ApplySurface(_surfaceService.ActiveSurface);
|
||||
return profile;
|
||||
}
|
||||
|
||||
|
||||
public void ActivateProfile(ProfileModule module, Profile profile)
|
||||
{
|
||||
module.ChangeActiveProfile(profile, _surfaceService.ActiveSurface);
|
||||
}
|
||||
|
||||
public void DeleteProfile(Profile profile)
|
||||
{
|
||||
_profileRepository.Remove(profile.ProfileEntity);
|
||||
}
|
||||
|
||||
public void UpdateProfile(Profile profile, bool includeChildren)
|
||||
{
|
||||
profile.ApplyToEntity();
|
||||
if (includeChildren)
|
||||
{
|
||||
foreach (var folder in profile.GetAllFolders())
|
||||
folder.ApplyToEntity();
|
||||
foreach (var layer in profile.GetAllLayers())
|
||||
layer.ApplyToEntity();
|
||||
|
||||
if (_surfaceService.ActiveSurface != null)
|
||||
profile.ApplySurface(_surfaceService.ActiveSurface);
|
||||
}
|
||||
|
||||
_profileRepository.Save(profile.ProfileEntity);
|
||||
}
|
||||
|
||||
private void SurfaceServiceOnActiveSurfaceConfigurationChanged(object sender, SurfaceConfigurationEventArgs e)
|
||||
{
|
||||
ApplySurfaceToProfiles(e.Surface);
|
||||
@ -47,66 +114,5 @@ namespace Artemis.Core.Services.Storage
|
||||
foreach (var profileModule in profileModules.Where(p => p.ActiveProfile != null).ToList())
|
||||
profileModule.ActiveProfile.ApplySurface(surface);
|
||||
}
|
||||
|
||||
public List<Profile> GetProfiles(ProfileModule module)
|
||||
{
|
||||
var profileEntities = _profileRepository.GetByPluginGuid(module.PluginInfo.Guid);
|
||||
var profiles = new List<Profile>();
|
||||
foreach (var profileEntity in profileEntities)
|
||||
{
|
||||
// If the profile entity matches the module's currently active profile, use that instead
|
||||
if (module.ActiveProfile != null && module.ActiveProfile.EntityId == profileEntity.Id)
|
||||
profiles.Add(module.ActiveProfile);
|
||||
else
|
||||
profiles.Add(new Profile(module.PluginInfo, profileEntity, _pluginService));
|
||||
}
|
||||
|
||||
return profiles;
|
||||
}
|
||||
|
||||
public Profile GetActiveProfile(ProfileModule module)
|
||||
{
|
||||
if (module.ActiveProfile != null)
|
||||
return module.ActiveProfile;
|
||||
|
||||
var moduleProfiles = _profileRepository.GetByPluginGuid(module.PluginInfo.Guid);
|
||||
var profileEntity = moduleProfiles.FirstOrDefault(p => p.IsActive) ?? moduleProfiles.FirstOrDefault();
|
||||
if (profileEntity == null)
|
||||
return null;
|
||||
|
||||
return new Profile(module.PluginInfo, profileEntity, _pluginService);
|
||||
}
|
||||
|
||||
public Profile CreateProfile(ProfileModule module, string name)
|
||||
{
|
||||
var profile = new Profile(module.PluginInfo, name);
|
||||
_profileRepository.Add(profile.ProfileEntity);
|
||||
|
||||
if (_surfaceService.ActiveSurface != null)
|
||||
profile.ApplySurface(_surfaceService.ActiveSurface);
|
||||
return profile;
|
||||
}
|
||||
|
||||
public void DeleteProfile(Profile profile)
|
||||
{
|
||||
_profileRepository.Remove(profile.ProfileEntity);
|
||||
}
|
||||
|
||||
public void UpdateProfile(Profile profile, bool includeChildren)
|
||||
{
|
||||
profile.ApplyToEntity();
|
||||
if (includeChildren)
|
||||
{
|
||||
foreach (var folder in profile.GetAllFolders())
|
||||
folder.ApplyToEntity();
|
||||
foreach (var layer in profile.GetAllLayers())
|
||||
layer.ApplyToEntity();
|
||||
|
||||
if (_surfaceService.ActiveSurface != null)
|
||||
profile.ApplySurface(_surfaceService.ActiveSurface);
|
||||
}
|
||||
|
||||
_profileRepository.Save(profile.ProfileEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<packages>
|
||||
<package id="AppDomainToolkit" version="1.0.4.3" targetFramework="net461" />
|
||||
<package id="Ben.Demystifier" version="0.1.4" targetFramework="net472" />
|
||||
|
||||
@ -54,7 +54,7 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CorsairDevice.cs" />
|
||||
<Compile Include="CorsairDeviceProvider.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@ -8,11 +8,11 @@ using RGB.NET.Devices.Corsair;
|
||||
namespace Artemis.Plugins.Devices.Corsair
|
||||
{
|
||||
// ReSharper disable once UnusedMember.Global
|
||||
public class CorsairDevice : Device
|
||||
public class CorsairDeviceProvider : DeviceProvider
|
||||
{
|
||||
private readonly IRgbService _rgbService;
|
||||
|
||||
public CorsairDevice(PluginInfo pluginInfo, IRgbService rgbService) : base(pluginInfo, CorsairDeviceProvider.Instance)
|
||||
public CorsairDeviceProvider(PluginInfo pluginInfo, IRgbService rgbService) : base(pluginInfo, RGB.NET.Devices.Corsair.CorsairDeviceProvider.Instance)
|
||||
{
|
||||
_rgbService = rgbService;
|
||||
}
|
||||
@ -20,9 +20,9 @@ namespace Artemis.Plugins.Devices.Corsair
|
||||
public override void EnablePlugin()
|
||||
{
|
||||
PathHelper.ResolvingAbsolutePath += (sender, args) => ResolveAbsolutePath(typeof(CorsairRGBDevice<>), sender, args);
|
||||
CorsairDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "CUESDK.x64_2017.dll"));
|
||||
CorsairDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "CUESDK_2017.dll"));
|
||||
_rgbService.AddDeviceProvider(DeviceProvider);
|
||||
RGB.NET.Devices.Corsair.CorsairDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "CUESDK.x64_2017.dll"));
|
||||
RGB.NET.Devices.Corsair.CorsairDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "CUESDK_2017.dll"));
|
||||
_rgbService.AddDeviceProvider(RgbDeviceProvider);
|
||||
}
|
||||
|
||||
public override void DisablePlugin()
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 276 KiB |
@ -0,0 +1,138 @@
|
||||
<?xml version="1.0"?>
|
||||
<Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<Name>Corsair MM800 RGB</Name>
|
||||
<Description>Physical layout of Corsairs ST100 RGB</Description>
|
||||
<Type>HeadsetStand</Type>
|
||||
<Lighting>Key</Lighting>
|
||||
<Vendor>Corsair</Vendor>
|
||||
<Model>ST100RGB</Model>
|
||||
<Width>145</Width>
|
||||
<Height>148</Height>
|
||||
<LedUnitWidth>42</LedUnitWidth>
|
||||
<LedUnitHeight>44</LedUnitHeight>
|
||||
<ImageBasePath>Images\Corsair\HeadsetStands</ImageBasePath>
|
||||
<DeviceImage>ST100RGB.png</DeviceImage>
|
||||
<Leds>
|
||||
<Led Id="HeadsetStand9">
|
||||
<X>5</X>
|
||||
<Y>10</Y>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand8">
|
||||
<X>=</X>
|
||||
<Y>+</Y>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand7">
|
||||
<X>=</X>
|
||||
<Y>+</Y>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand6">
|
||||
<Y>~</Y>
|
||||
<Width>1.2</Width>
|
||||
<Height>1</Height>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand5">
|
||||
<Width>1</Width>
|
||||
<Height>1</Height>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand4">
|
||||
<X>~</X>
|
||||
<Y>-</Y>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand3">
|
||||
<X>~</X>
|
||||
<Y>-</Y>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand1">
|
||||
<Shape>M0.442,0.467 L0.456,0.518 L0.456,0.567 L0.446,0.62 L0.438,0.645 L0.469,0.613 L0.52,0.579 L0.564,0.569 L0.583,0.596 L0.593,0.564 L0.59,0.528 L0.566,0.474 L0.545,0.43 L0.516,0.384 L0.523,0.445 L0.521,0.491 L0.516,0.55 L0.518,0.496 L0.519,0.469 L0.501,0.447 L0.486,0.425 L0.489,0.469 L0.492,0.528 L0.484,0.564 L0.484,0.499z M0.451,0.411 L0.463,0.443 L0.464,0.467 L0.484,0.479 L0.478,0.435z M0.488,0.379 L0.497,0.43 L0.516,0.447 L0.513,0.406z M0.52,0.318 L0.528,0.37 L0.532,0.394 L0.557,0.418 L0.568,0.457 L0.572,0.425 L0.559,0.377 L0.543,0.343z</Shape>
|
||||
<X>-3.75</X>
|
||||
<Y>0</Y>
|
||||
<Height>0.45</Height>
|
||||
</Led>
|
||||
<Led Id="HeadsetStand2">
|
||||
<X>=</X>
|
||||
<Y>+</Y>
|
||||
</Led>
|
||||
</Leds>
|
||||
<LedImageLayouts>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand9" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand8" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand7" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand6" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand5" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand4" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand3" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand2" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand9" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand2" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand8" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand3" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand7" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand4" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand6" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout>
|
||||
<LedImages>
|
||||
<LedImage Id="HeadsetStand1" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
</LedImageLayouts>
|
||||
</Device>
|
||||
@ -0,0 +1,496 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<Name>Corsair K70 RGB - Physical UK</Name>
|
||||
<Description>Physical UK-Layout of Corsairs K70 RGB (Logical: BE, CH, DE, ES, EU, FR, IT, ND, MEX, RU, UK, US_Int)</Description>
|
||||
<Author>Darth Affe</Author>
|
||||
<Type>Keyboard</Type>
|
||||
<Lighting>Key</Lighting>
|
||||
<Vendor>Corsair</Vendor>
|
||||
<Model>K70 RGB</Model>
|
||||
<Width>436</Width>
|
||||
<Height>165</Height>
|
||||
<ImageBasePath>Images\Corsair\Keyboards</ImageBasePath>
|
||||
<DeviceImage>K70RGB.png</DeviceImage>
|
||||
<Leds>
|
||||
<!-- Extra-Keys: Brightness -> Mute -->
|
||||
<Led Id="Keyboard_Brightness">
|
||||
<Shape>Circle</Shape>
|
||||
<X>298</X>
|
||||
<Y>6</Y>
|
||||
<Width>10mm</Width>
|
||||
<Height>10mm</Height>
|
||||
</Led>
|
||||
<Led Id="Keyboard_WinLock">
|
||||
<Shape>Circle</Shape>
|
||||
<X>+9</X>
|
||||
<Width>10mm</Width>
|
||||
<Height>10mm</Height>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_MediaMute">
|
||||
<X>375</X>
|
||||
<Y>6</Y>
|
||||
<Height>12mm</Height>
|
||||
</Led>
|
||||
|
||||
<!-- Esc -> NextTrack -->
|
||||
<Led Id="Keyboard_Escape">
|
||||
<X>4</X>
|
||||
<Y>28</Y>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_F1">
|
||||
<X>+12.667</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_F2" />
|
||||
<Led Id="Keyboard_F3" />
|
||||
<Led Id="Keyboard_F4" />
|
||||
|
||||
<Led Id="Keyboard_F5">
|
||||
<X>+12.667</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_F6" />
|
||||
<Led Id="Keyboard_F7" />
|
||||
<Led Id="Keyboard_F8" />
|
||||
|
||||
<Led Id="Keyboard_F9">
|
||||
<X>+12.667</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_F10" />
|
||||
<Led Id="Keyboard_F11" />
|
||||
<Led Id="Keyboard_F12" />
|
||||
|
||||
<Led Id="Keyboard_PrintScreen">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_ScrollLock" />
|
||||
<Led Id="Keyboard_PauseBreak" />
|
||||
|
||||
<Led Id="Keyboard_MediaStop">
|
||||
<X>+5</X>
|
||||
<Height>12mm</Height>
|
||||
</Led>
|
||||
<Led Id="Keyboard_MediaPreviousTrack">
|
||||
<Height>12mm</Height>
|
||||
</Led>
|
||||
<Led Id="Keyboard_MediaPlay">
|
||||
<Height>12mm</Height>
|
||||
</Led>
|
||||
<Led Id="Keyboard_MediaNextTrack">
|
||||
<Height>12mm</Height>
|
||||
</Led>
|
||||
|
||||
<!-- ^ -> Num- -->
|
||||
<Led Id="Keyboard_GraveAccentAndTilde">
|
||||
<X>4</X>
|
||||
<Y>49</Y>
|
||||
</Led>
|
||||
<Led Id="Keyboard_1" />
|
||||
<Led Id="Keyboard_2" />
|
||||
<Led Id="Keyboard_3" />
|
||||
<Led Id="Keyboard_4" />
|
||||
<Led Id="Keyboard_5" />
|
||||
<Led Id="Keyboard_6" />
|
||||
<Led Id="Keyboard_7" />
|
||||
<Led Id="Keyboard_8" />
|
||||
<Led Id="Keyboard_9" />
|
||||
<Led Id="Keyboard_0" />
|
||||
<Led Id="Keyboard_MinusAndUnderscore" />
|
||||
<Led Id="Keyboard_EqualsAndPlus" />
|
||||
<Led Id="Keyboard_Backspace">
|
||||
<Width>2</Width>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_Insert">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Home" />
|
||||
<Led Id="Keyboard_PageUp" />
|
||||
|
||||
<Led Id="Keyboard_NumLock">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_NumSlash" />
|
||||
<Led Id="Keyboard_NumAsterisk" />
|
||||
<Led Id="Keyboard_NumMinus" />
|
||||
|
||||
<!-- Tab -> Num+ -->
|
||||
<Led Id="Keyboard_Tab">
|
||||
<X>4</X>
|
||||
<Y>+</Y>
|
||||
<Width>1.5</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Q" />
|
||||
<Led Id="Keyboard_W" />
|
||||
<Led Id="Keyboard_E" />
|
||||
<Led Id="Keyboard_R" />
|
||||
<Led Id="Keyboard_T" />
|
||||
<Led Id="Keyboard_Y" />
|
||||
<Led Id="Keyboard_U" />
|
||||
<Led Id="Keyboard_I" />
|
||||
<Led Id="Keyboard_O" />
|
||||
<Led Id="Keyboard_P" />
|
||||
<Led Id="Keyboard_BracketLeft" />
|
||||
<Led Id="Keyboard_BracketRight" />
|
||||
<Led Id="Keyboard_Enter">
|
||||
<Shape>M0,0 L0,0.5 L0.16666666666,0.5 L0.16666666666,1 L1,1 L1,0 Z</Shape>
|
||||
<Width>1.5</Width>
|
||||
<Height>2</Height>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_Delete">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_End" />
|
||||
<Led Id="Keyboard_PageDown" />
|
||||
|
||||
<Led Id="Keyboard_Num7">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Num8" />
|
||||
<Led Id="Keyboard_Num9" />
|
||||
<Led Id="Keyboard_NumPlus">
|
||||
<Height>2</Height>
|
||||
</Led>
|
||||
|
||||
<!-- CapsLock -> Num6 -->
|
||||
<Led Id="Keyboard_CapsLock">
|
||||
<X>4</X>
|
||||
<Y>~</Y>
|
||||
<Width>1.75</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_A" />
|
||||
<Led Id="Keyboard_S" />
|
||||
<Led Id="Keyboard_D" />
|
||||
<Led Id="Keyboard_F" />
|
||||
<Led Id="Keyboard_G" />
|
||||
<Led Id="Keyboard_H" />
|
||||
<Led Id="Keyboard_J" />
|
||||
<Led Id="Keyboard_K" />
|
||||
<Led Id="Keyboard_L" />
|
||||
<Led Id="Keyboard_SemicolonAndColon" />
|
||||
<Led Id="Keyboard_ApostropheAndDoubleQuote" />
|
||||
<Led Id="Keyboard_NonUsTilde" />
|
||||
|
||||
<Led Id="Keyboard_Num4">
|
||||
<X>+90.75</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Num5" />
|
||||
<Led Id="Keyboard_Num6" />
|
||||
|
||||
<!-- LShift -> NumEnter -->
|
||||
<Led Id="Keyboard_LeftShift">
|
||||
<X>4</X>
|
||||
<Y>+</Y>
|
||||
<Width>1.25</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_NonUsBackslash" />
|
||||
<Led Id="Keyboard_Z" />
|
||||
<Led Id="Keyboard_X" />
|
||||
<Led Id="Keyboard_C" />
|
||||
<Led Id="Keyboard_V" />
|
||||
<Led Id="Keyboard_B" />
|
||||
<Led Id="Keyboard_N" />
|
||||
<Led Id="Keyboard_M" />
|
||||
<Led Id="Keyboard_CommaAndLessThan" />
|
||||
<Led Id="Keyboard_PeriodAndBiggerThan" />
|
||||
<Led Id="Keyboard_SlashAndQuestionMark" />
|
||||
<Led Id="Keyboard_RightShift">
|
||||
<Width>2.75</Width>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_ArrowUp">
|
||||
<X>+24</X>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_Num1">
|
||||
<X>+24</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Num2" />
|
||||
<Led Id="Keyboard_Num3" />
|
||||
<Led Id="Keyboard_NumEnter">
|
||||
<Height>2</Height>
|
||||
</Led>
|
||||
|
||||
<!-- LCtrl -> NumPeriod -->
|
||||
<Led Id="Keyboard_LeftCtrl">
|
||||
<X>4</X>
|
||||
<Y>~</Y>
|
||||
<Width>1.5</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_LeftGui" />
|
||||
<Led Id="Keyboard_LeftAlt">
|
||||
<Width>1.25</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_Space">
|
||||
<Width>6.5</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_RightAlt">
|
||||
<Width>1.25</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_RightGui" />
|
||||
<Led Id="Keyboard_Application" />
|
||||
<Led Id="Keyboard_RightCtrl">
|
||||
<Width>1.5</Width>
|
||||
</Led>
|
||||
|
||||
<Led Id="Keyboard_ArrowLeft">
|
||||
<X>+5</X>
|
||||
</Led>
|
||||
<Led Id="Keyboard_ArrowDown" />
|
||||
<Led Id="Keyboard_ArrowRight" />
|
||||
|
||||
<Led Id="Keyboard_Num0">
|
||||
<X>+5</X>
|
||||
<Width>2</Width>
|
||||
</Led>
|
||||
<Led Id="Keyboard_NumPeriodAndDelete" />
|
||||
</Leds>
|
||||
|
||||
<LedImageLayouts>
|
||||
<LedImageLayout Layout="DE">
|
||||
<LedImages>
|
||||
<LedImage Id="Keyboard_Brightness" Image="K_Keys\Brightness.png" />
|
||||
<LedImage Id="Keyboard_WinLock" Image="K_Keys\WinLock.png" />
|
||||
<LedImage Id="Keyboard_MediaMute" Image="K_Keys\Mute.png" />
|
||||
|
||||
<LedImage Id="Keyboard_Escape" Image="K_Keys\Escape.png" />
|
||||
<LedImage Id="Keyboard_F1" Image="K_Keys\F1.png" />
|
||||
<LedImage Id="Keyboard_F2" Image="K_Keys\F2.png" />
|
||||
<LedImage Id="Keyboard_F3" Image="K_Keys\F3.png" />
|
||||
<LedImage Id="Keyboard_F4" Image="K_Keys\F4.png" />
|
||||
<LedImage Id="Keyboard_F5" Image="K_Keys\F5.png" />
|
||||
<LedImage Id="Keyboard_F6" Image="K_Keys\F6.png" />
|
||||
<LedImage Id="Keyboard_F7" Image="K_Keys\F7.png" />
|
||||
<LedImage Id="Keyboard_F8" Image="K_Keys\F8.png" />
|
||||
<LedImage Id="Keyboard_F9" Image="K_Keys\F9.png" />
|
||||
<LedImage Id="Keyboard_F10" Image="K_Keys\F10.png" />
|
||||
<LedImage Id="Keyboard_F11" Image="K_Keys\F11.png" />
|
||||
<LedImage Id="Keyboard_F12" Image="K_Keys\F12.png" />
|
||||
<LedImage Id="Keyboard_PrintScreen" Image="K_Keys\Drucken.png" />
|
||||
<LedImage Id="Keyboard_ScrollLock" Image="K_Keys\Rollen.png" />
|
||||
<LedImage Id="Keyboard_PauseBreak" Image="K_Keys\PauseUntbr.png" />
|
||||
<LedImage Id="Keyboard_MediaStop" Image="K_Keys\Stop.png" />
|
||||
<LedImage Id="Keyboard_MediaPreviousTrack" Image="K_Keys\PreviousTrack.png" />
|
||||
<LedImage Id="Keyboard_MediaPlay" Image="K_Keys\PlayPause.png" />
|
||||
<LedImage Id="Keyboard_MediaNextTrack" Image="K_Keys\NextTrack.png" />
|
||||
|
||||
<LedImage Id="Keyboard_GraveAccentAndTilde" Image="K_Keys\Circumflex_Degree.png" />
|
||||
<LedImage Id="Keyboard_1" Image="K_Keys\1_ExclamationMark.png" />
|
||||
<LedImage Id="Keyboard_2" Image="K_Keys\2_QuotationMark_Exponent2.png" />
|
||||
<LedImage Id="Keyboard_3" Image="K_Keys\3_SectionSign_Exponent3.png" />
|
||||
<LedImage Id="Keyboard_4" Image="K_Keys\4_Dollar.png" />
|
||||
<LedImage Id="Keyboard_5" Image="K_Keys\5_Percent.png" />
|
||||
<LedImage Id="Keyboard_6" Image="K_Keys\6_Ampersand.png" />
|
||||
<LedImage Id="Keyboard_7" Image="K_Keys\7_Slash_CurlyBracketLeft.png" />
|
||||
<LedImage Id="Keyboard_8" Image="K_Keys\8_BracketLeft_SquareBracketLeft.png" />
|
||||
<LedImage Id="Keyboard_9" Image="K_Keys\9_BracketRight_SquareBracketRight.png" />
|
||||
<LedImage Id="Keyboard_0" Image="K_Keys\0_Equals_CurlyBracketRight.png" />
|
||||
<LedImage Id="Keyboard_MinusAndUnderscore" Image="K_Keys\QuestionMark_SharpS_Backslash.png" />
|
||||
<LedImage Id="Keyboard_EqualsAndPlus" Image="K_Keys\AccentGrave_AccentAcute.png" />
|
||||
<LedImage Id="Keyboard_Backspace" Image="K_Keys\Backspace.png" />
|
||||
<LedImage Id="Keyboard_Insert" Image="K_Keys\Einfg.png" />
|
||||
<LedImage Id="Keyboard_Home" Image="K_Keys\Pos1.png" />
|
||||
<LedImage Id="Keyboard_PageUp" Image="K_Keys\BildUp.png" />
|
||||
<LedImage Id="Keyboard_NumLock" Image="K_Keys\Num.png" />
|
||||
<LedImage Id="Keyboard_NumSlash" Image="K_Keys\Slash.png" />
|
||||
<LedImage Id="Keyboard_NumAsterisk" Image="K_Keys\Asterisk.png" />
|
||||
<LedImage Id="Keyboard_NumMinus" Image="K_Keys\Minus.png" />
|
||||
|
||||
<LedImage Id="Keyboard_Tab" Image="K_Keys\Tab.png" />
|
||||
<LedImage Id="Keyboard_Q" Image="K_Keys\Q_At.png" />
|
||||
<LedImage Id="Keyboard_W" Image="K_Keys\W.png" />
|
||||
<LedImage Id="Keyboard_E" Image="K_Keys\E_Euro.png" />
|
||||
<LedImage Id="Keyboard_R" Image="K_Keys\R.png" />
|
||||
<LedImage Id="Keyboard_T" Image="K_Keys\T.png" />
|
||||
<LedImage Id="Keyboard_Y" Image="K_Keys\Z.png" />
|
||||
<LedImage Id="Keyboard_U" Image="K_Keys\U.png" />
|
||||
<LedImage Id="Keyboard_I" Image="K_Keys\I.png" />
|
||||
<LedImage Id="Keyboard_O" Image="K_Keys\O.png" />
|
||||
<LedImage Id="Keyboard_P" Image="K_Keys\P.png" />
|
||||
<LedImage Id="Keyboard_BracketLeft" Image="K_Keys\UE.png" />
|
||||
<LedImage Id="Keyboard_BracketRight" Image="K_Keys\Plus_Asterisk_Tilde.png" />
|
||||
<LedImage Id="Keyboard_Enter" Image="K_Keys\Enter.png" />
|
||||
<LedImage Id="Keyboard_Delete" Image="K_Keys\Entf.png" />
|
||||
<LedImage Id="Keyboard_End" Image="K_Keys\Ende.png" />
|
||||
<LedImage Id="Keyboard_PageDown" Image="K_Keys\BildDown.png" />
|
||||
<LedImage Id="Keyboard_Num7" Image="K_Keys\Num7_Pos1.png" />
|
||||
<LedImage Id="Keyboard_Num8" Image="K_Keys\Num8_ArrowUp.png" />
|
||||
<LedImage Id="Keyboard_Num9" Image="K_Keys\Num9_BildUp.png" />
|
||||
<LedImage Id="Keyboard_NumPlus" Image="K_Keys\NumPlus.png" />
|
||||
|
||||
<LedImage Id="Keyboard_CapsLock" Image="K_Keys\CapsLock.png" />
|
||||
<LedImage Id="Keyboard_A" Image="K_Keys\A.png" />
|
||||
<LedImage Id="Keyboard_S" Image="K_Keys\S.png" />
|
||||
<LedImage Id="Keyboard_D" Image="K_Keys\D.png" />
|
||||
<LedImage Id="Keyboard_F" Image="K_Keys\F.png" />
|
||||
<LedImage Id="Keyboard_G" Image="K_Keys\G.png" />
|
||||
<LedImage Id="Keyboard_H" Image="K_Keys\H.png" />
|
||||
<LedImage Id="Keyboard_J" Image="K_Keys\J.png" />
|
||||
<LedImage Id="Keyboard_K" Image="K_Keys\K.png" />
|
||||
<LedImage Id="Keyboard_L" Image="K_Keys\L.png" />
|
||||
<LedImage Id="Keyboard_SemicolonAndColon" Image="K_Keys\OE.png" />
|
||||
<LedImage Id="Keyboard_ApostropheAndDoubleQuote" Image="K_Keys\AE.png" />
|
||||
<LedImage Id="Keyboard_NonUsTilde" Image="K_Keys\Hash_Apostrophe.png" />
|
||||
<LedImage Id="Keyboard_Num4" Image="K_Keys\Num4_ArrowLeft.png" />
|
||||
<LedImage Id="Keyboard_Num5" Image="K_Keys\Num5.png" />
|
||||
<LedImage Id="Keyboard_Num6" Image="K_Keys\Num6_ArrowRight.png" />
|
||||
|
||||
<LedImage Id="Keyboard_LeftShift" Image="K_Keys\Shift.png" />
|
||||
<LedImage Id="Keyboard_NonUsBackslash" Image="K_Keys\LessThan_GreaterThan_Pipe.png" />
|
||||
<LedImage Id="Keyboard_Z" Image="K_Keys\Y.png" />
|
||||
<LedImage Id="Keyboard_X" Image="K_Keys\X.png" />
|
||||
<LedImage Id="Keyboard_C" Image="K_Keys\C.png" />
|
||||
<LedImage Id="Keyboard_V" Image="K_Keys\V.png" />
|
||||
<LedImage Id="Keyboard_B" Image="K_Keys\B.png" />
|
||||
<LedImage Id="Keyboard_N" Image="K_Keys\N.png" />
|
||||
<LedImage Id="Keyboard_M" Image="K_Keys\M_Mu.png" />
|
||||
<LedImage Id="Keyboard_CommaAndLessThan" Image="K_Keys\Comma_Semicolon.png" />
|
||||
<LedImage Id="Keyboard_PeriodAndBiggerThan" Image="K_Keys\Dot_Colon.png" />
|
||||
<LedImage Id="Keyboard_SlashAndQuestionMark" Image="K_Keys\Hyphen_Underscore.png" />
|
||||
<LedImage Id="Keyboard_RightShift" Image="K_Keys\ShiftBig.png" />
|
||||
<LedImage Id="Keyboard_ArrowUp" Image="K_Keys\CaretUp.png" />
|
||||
<LedImage Id="Keyboard_Num1" Image="K_Keys\Num1_Ende.png" />
|
||||
<LedImage Id="Keyboard_Num2" Image="K_Keys\Num2_ArrowDown.png" />
|
||||
<LedImage Id="Keyboard_Num3" Image="K_Keys\Num3_BildDown.png" />
|
||||
<LedImage Id="Keyboard_NumEnter" Image="K_Keys\NumEnter.png" />
|
||||
|
||||
<LedImage Id="Keyboard_LeftCtrl" Image="K_Keys\Strg.png" />
|
||||
<LedImage Id="Keyboard_LeftGui" Image="K_Keys\Windows.png" />
|
||||
<LedImage Id="Keyboard_LeftAlt" Image="K_Keys\Alt.png" />
|
||||
<LedImage Id="Keyboard_Space" Image="K_Keys\Space.png" />
|
||||
<LedImage Id="Keyboard_RightAlt" Image="K_Keys\AltGr.png" />
|
||||
<LedImage Id="Keyboard_RightGui" Image="K_Keys\Windows.png" />
|
||||
<LedImage Id="Keyboard_Application" Image="K_Keys\Menu.png" />
|
||||
<LedImage Id="Keyboard_RightCtrl" Image="K_Keys\Strg.png" />
|
||||
<LedImage Id="Keyboard_ArrowLeft" Image="K_Keys\CaretLeft.png" />
|
||||
<LedImage Id="Keyboard_ArrowDown" Image="K_Keys\CaretDown.png" />
|
||||
<LedImage Id="Keyboard_ArrowRight" Image="K_Keys\CaretRight.png" />
|
||||
<LedImage Id="Keyboard_Num0" Image="K_Keys\Num0_Einfg.png" />
|
||||
<LedImage Id="Keyboard_NumPeriodAndDelete" Image="K_Keys\Comma_Entf.png" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
<LedImageLayout Layout="EU">
|
||||
<LedImages>
|
||||
<LedImage Id="Keyboard_Brightness" Image="K_Keys\Brightness.png" />
|
||||
<LedImage Id="Keyboard_WinLock" Image="K_Keys\WinLock.png" />
|
||||
<LedImage Id="Keyboard_MediaMute" Image="K_Keys\Mute.png" />
|
||||
|
||||
<LedImage Id="Keyboard_Escape" Image="K_Keys\Escape.png" />
|
||||
<LedImage Id="Keyboard_F1" Image="K_Keys\F1.png" />
|
||||
<LedImage Id="Keyboard_F2" Image="K_Keys\F2.png" />
|
||||
<LedImage Id="Keyboard_F3" Image="K_Keys\F3.png" />
|
||||
<LedImage Id="Keyboard_F4" Image="K_Keys\F4.png" />
|
||||
<LedImage Id="Keyboard_F5" Image="K_Keys\F5.png" />
|
||||
<LedImage Id="Keyboard_F6" Image="K_Keys\F6.png" />
|
||||
<LedImage Id="Keyboard_F7" Image="K_Keys\F7.png" />
|
||||
<LedImage Id="Keyboard_F8" Image="K_Keys\F8.png" />
|
||||
<LedImage Id="Keyboard_F9" Image="K_Keys\F9.png" />
|
||||
<LedImage Id="Keyboard_F10" Image="K_Keys\F10.png" />
|
||||
<LedImage Id="Keyboard_F11" Image="K_Keys\F11.png" />
|
||||
<LedImage Id="Keyboard_F12" Image="K_Keys\F12.png" />
|
||||
<LedImage Id="Keyboard_PrintScreen" Image="K_Keys\PrtScnSysRq.png" />
|
||||
<LedImage Id="Keyboard_ScrollLock" Image="K_Keys\ScrollLock.png" />
|
||||
<LedImage Id="Keyboard_PauseBreak" Image="K_Keys\PauseBreak.png" />
|
||||
<LedImage Id="Keyboard_MediaStop" Image="K_Keys\Stop.png" />
|
||||
<LedImage Id="Keyboard_MediaPreviousTrack" Image="K_Keys\PreviousTrack.png" />
|
||||
<LedImage Id="Keyboard_MediaPlay" Image="K_Keys\PlayPause.png" />
|
||||
<LedImage Id="Keyboard_MediaNextTrack" Image="K_Keys\NextTrack.png" />
|
||||
|
||||
<LedImage Id="Keyboard_GraveAccentAndTilde" Image="K_Keys\AccentGrave_Tilde.png" />
|
||||
<LedImage Id="Keyboard_1" Image="K_Keys\1_ExclamationMark.png" />
|
||||
<LedImage Id="Keyboard_2" Image="K_Keys\2_At.png" />
|
||||
<LedImage Id="Keyboard_3" Image="K_Keys\3_Hash.png" />
|
||||
<LedImage Id="Keyboard_4" Image="K_Keys\4_Dollar.png" />
|
||||
<LedImage Id="Keyboard_5" Image="K_Keys\5_Percent_Euro.png" />
|
||||
<LedImage Id="Keyboard_6" Image="K_Keys\6_Circumflex.png" />
|
||||
<LedImage Id="Keyboard_7" Image="K_Keys\7_Ampersand.png" />
|
||||
<LedImage Id="Keyboard_8" Image="K_Keys\8_Asterisk.png" />
|
||||
<LedImage Id="Keyboard_9" Image="K_Keys\9_BracketRight.png" />
|
||||
<LedImage Id="Keyboard_0" Image="K_Keys\0_BracketRight.png" />
|
||||
<LedImage Id="Keyboard_MinusAndUnderscore" Image="K_Keys\Hyphen_Underscore.png" />
|
||||
<LedImage Id="Keyboard_EqualsAndPlus" Image="K_Keys\Equals_Plus.png" />
|
||||
<LedImage Id="Keyboard_Backspace" Image="K_Keys\Backspace.png" />
|
||||
<LedImage Id="Keyboard_Insert" Image="K_Keys\Insert.png" />
|
||||
<LedImage Id="Keyboard_Home" Image="K_Keys\Home.png" />
|
||||
<LedImage Id="Keyboard_PageUp" Image="K_Keys\PageUp.png" />
|
||||
<LedImage Id="Keyboard_NumLock" Image="K_Keys\NumLock.png" />
|
||||
<LedImage Id="Keyboard_NumSlash" Image="K_Keys\Slash.png" />
|
||||
<LedImage Id="Keyboard_NumAsterisk" Image="K_Keys\Asterisk.png" />
|
||||
<LedImage Id="Keyboard_NumMinus" Image="K_Keys\Minus.png" />
|
||||
|
||||
<LedImage Id="Keyboard_Tab" Image="K_Keys\TabWText.png" />
|
||||
<LedImage Id="Keyboard_Q" Image="K_Keys\Q.png" />
|
||||
<LedImage Id="Keyboard_W" Image="K_Keys\W.png" />
|
||||
<LedImage Id="Keyboard_E" Image="K_Keys\E.png" />
|
||||
<LedImage Id="Keyboard_R" Image="K_Keys\R.png" />
|
||||
<LedImage Id="Keyboard_T" Image="K_Keys\T.png" />
|
||||
<LedImage Id="Keyboard_Y" Image="K_Keys\Y.png" />
|
||||
<LedImage Id="Keyboard_U" Image="K_Keys\U.png" />
|
||||
<LedImage Id="Keyboard_I" Image="K_Keys\I.png" />
|
||||
<LedImage Id="Keyboard_O" Image="K_Keys\O.png" />
|
||||
<LedImage Id="Keyboard_P" Image="K_Keys\P.png" />
|
||||
<LedImage Id="Keyboard_BracketLeft" Image="K_Keys\SquareBracketLeft_CurlyBracketLeft.png" />
|
||||
<LedImage Id="Keyboard_BracketRight" Image="K_Keys\SquareBracketRight_CurlyBracketRight.png" />
|
||||
<LedImage Id="Keyboard_Enter" Image="K_Keys\EnterWText.png" />
|
||||
<LedImage Id="Keyboard_Delete" Image="K_Keys\Delete.png" />
|
||||
<LedImage Id="Keyboard_End" Image="K_Keys\End.png" />
|
||||
<LedImage Id="Keyboard_PageDown" Image="K_Keys\PageDown.png" />
|
||||
<LedImage Id="Keyboard_Num7" Image="K_Keys\Num7_Home.png" />
|
||||
<LedImage Id="Keyboard_Num8" Image="K_Keys\Num8_ArrowUp.png" />
|
||||
<LedImage Id="Keyboard_Num9" Image="K_Keys\Num9_PgUp.png" />
|
||||
<LedImage Id="Keyboard_NumPlus" Image="K_Keys\NumPlus.png" />
|
||||
|
||||
<LedImage Id="Keyboard_CapsLock" Image="K_Keys\CapsLockText.png" />
|
||||
<LedImage Id="Keyboard_A" Image="K_Keys\A.png" />
|
||||
<LedImage Id="Keyboard_S" Image="K_Keys\S.png" />
|
||||
<LedImage Id="Keyboard_D" Image="K_Keys\D.png" />
|
||||
<LedImage Id="Keyboard_F" Image="K_Keys\F.png" />
|
||||
<LedImage Id="Keyboard_G" Image="K_Keys\G.png" />
|
||||
<LedImage Id="Keyboard_H" Image="K_Keys\H.png" />
|
||||
<LedImage Id="Keyboard_J" Image="K_Keys\J.png" />
|
||||
<LedImage Id="Keyboard_K" Image="K_Keys\K.png" />
|
||||
<LedImage Id="Keyboard_L" Image="K_Keys\L.png" />
|
||||
<LedImage Id="Keyboard_SemicolonAndColon" Image="K_Keys\Semicolon_Colon.png" />
|
||||
<LedImage Id="Keyboard_ApostropheAndDoubleQuote" Image="K_Keys\Apostrophe_QuotationMark.png" />
|
||||
<LedImage Id="Keyboard_NonUsTilde" Image="K_Keys\Blackslash_Pipe.png" />
|
||||
<LedImage Id="Keyboard_Num4" Image="K_Keys\Num4_ArrowLeft.png" />
|
||||
<LedImage Id="Keyboard_Num5" Image="K_Keys\Num5.png" />
|
||||
<LedImage Id="Keyboard_Num6" Image="K_Keys\Num6_ArrowRight.png" />
|
||||
|
||||
<LedImage Id="Keyboard_LeftShift" Image="K_Keys\ShiftWText.png" />
|
||||
<LedImage Id="Keyboard_NonUsBackslash" Image="K_Keys\Blackslash_Pipe.png" />
|
||||
<LedImage Id="Keyboard_Z" Image="K_Keys\Z.png" />
|
||||
<LedImage Id="Keyboard_X" Image="K_Keys\X.png" />
|
||||
<LedImage Id="Keyboard_C" Image="K_Keys\C.png" />
|
||||
<LedImage Id="Keyboard_V" Image="K_Keys\V.png" />
|
||||
<LedImage Id="Keyboard_B" Image="K_Keys\B.png" />
|
||||
<LedImage Id="Keyboard_N" Image="K_Keys\N.png" />
|
||||
<LedImage Id="Keyboard_M" Image="K_Keys\M.png" />
|
||||
<LedImage Id="Keyboard_CommaAndLessThan" Image="K_Keys\LessThan_Comma.png" />
|
||||
<LedImage Id="Keyboard_PeriodAndBiggerThan" Image="K_Keys\GreaterThan_Dot.png" />
|
||||
<LedImage Id="Keyboard_SlashAndQuestionMark" Image="K_Keys\QuestionMark_Slash.png" />
|
||||
<LedImage Id="Keyboard_RightShift" Image="K_Keys\ShiftWTextBig.png" />
|
||||
<LedImage Id="Keyboard_ArrowUp" Image="K_Keys\CaretUp.png" />
|
||||
<LedImage Id="Keyboard_Num1" Image="K_Keys\Num1_End.png" />
|
||||
<LedImage Id="Keyboard_Num2" Image="K_Keys\Num2_ArrowDown.png" />
|
||||
<LedImage Id="Keyboard_Num3" Image="K_Keys\Num3_PgDn.png" />
|
||||
<LedImage Id="Keyboard_NumEnter" Image="K_Keys\NumEnter.png" />
|
||||
|
||||
<LedImage Id="Keyboard_LeftCtrl" Image="K_Keys\Ctrl.png" />
|
||||
<LedImage Id="Keyboard_LeftGui" Image="K_Keys\Windows.png" />
|
||||
<LedImage Id="Keyboard_LeftAlt" Image="K_Keys\Alt.png" />
|
||||
<LedImage Id="Keyboard_Space" Image="K_Keys\Space.png" />
|
||||
<LedImage Id="Keyboard_RightAlt" Image="K_Keys\AltGr.png" />
|
||||
<LedImage Id="Keyboard_RightGui" Image="K_Keys\Windows.png" />
|
||||
<LedImage Id="Keyboard_Application" Image="K_Keys\Menu.png" />
|
||||
<LedImage Id="Keyboard_RightCtrl" Image="K_Keys\Ctrl.png" />
|
||||
<LedImage Id="Keyboard_ArrowLeft" Image="K_Keys\CaretLeft.png" />
|
||||
<LedImage Id="Keyboard_ArrowDown" Image="K_Keys\CaretDown.png" />
|
||||
<LedImage Id="Keyboard_ArrowRight" Image="K_Keys\CaretRight.png" />
|
||||
<LedImage Id="Keyboard_Num0" Image="K_Keys\Num0_Ins.png" />
|
||||
<LedImage Id="Keyboard_NumPeriodAndDelete" Image="K_Keys\Comma_Del.png" />
|
||||
</LedImages>
|
||||
</LedImageLayout>
|
||||
</LedImageLayouts>
|
||||
</Device>
|
||||
@ -47,7 +47,7 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="LogitechDevice.cs" />
|
||||
<Compile Include="LogitechDeviceProvider.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@ -7,11 +7,11 @@ using RGB.NET.Devices.Logitech;
|
||||
|
||||
namespace Artemis.Plugins.Devices.Logitech
|
||||
{
|
||||
public class LogitechDevice : Device
|
||||
public class LogitechDeviceProvider : DeviceProvider
|
||||
{
|
||||
private readonly IRgbService _rgbService;
|
||||
|
||||
public LogitechDevice(PluginInfo pluginInfo, IRgbService rgbService) : base(pluginInfo, LogitechDeviceProvider.Instance)
|
||||
public LogitechDeviceProvider(PluginInfo pluginInfo, IRgbService rgbService) : base(pluginInfo, RGB.NET.Devices.Logitech.LogitechDeviceProvider.Instance)
|
||||
{
|
||||
_rgbService = rgbService;
|
||||
}
|
||||
@ -19,9 +19,9 @@ namespace Artemis.Plugins.Devices.Logitech
|
||||
public override void EnablePlugin()
|
||||
{
|
||||
PathHelper.ResolvingAbsolutePath += (sender, args) => ResolveAbsolutePath(typeof(LogitechRGBDevice<>), sender, args);
|
||||
LogitechDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "LogitechLedEnginesWrapper.dll"));
|
||||
LogitechDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "LogitechLedEnginesWrapper.dll"));
|
||||
_rgbService.AddDeviceProvider(DeviceProvider);
|
||||
RGB.NET.Devices.Logitech.LogitechDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "LogitechLedEnginesWrapper.dll"));
|
||||
RGB.NET.Devices.Logitech.LogitechDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "LogitechLedEnginesWrapper.dll"));
|
||||
_rgbService.AddDeviceProvider(RgbDeviceProvider);
|
||||
}
|
||||
|
||||
public override void DisablePlugin()
|
||||
@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
|
||||
@ -7,8 +7,8 @@
|
||||
<ProjectGuid>{0F288A66-6EB0-4589-8595-E33A3A3EAEA2}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Artemis.Plugins.LayerTypes.Brush</RootNamespace>
|
||||
<AssemblyName>Artemis.Plugins.LayerTypes.Brush</AssemblyName>
|
||||
<RootNamespace>Artemis.Plugins.LayerElements.Brush</RootNamespace>
|
||||
<AssemblyName>Artemis.Plugins.LayerElements.Brush</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
@ -33,14 +33,20 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="MaterialDesignColors, Version=1.2.0.325, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MaterialDesignColors.1.2.0\lib\net45\MaterialDesignColors.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="MaterialDesignThemes.Wpf">
|
||||
<HintPath>..\packages\MaterialDesignThemes.2.6.0\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="QRCoder, Version=1.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.2.5\lib\net40\QRCoder.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="RGB.NET.Core, Version=0.1.25.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\RGB.NET\bin\net45\RGB.NET.Core.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Stylet, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Stylet.1.2.0\lib\net45\Stylet.dll</HintPath>
|
||||
@ -52,6 +58,7 @@
|
||||
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
@ -59,14 +66,13 @@
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.2.5\lib\net40\UnityEngine.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BrushConfiguration.cs" />
|
||||
<Compile Include="BrushLayerType.cs" />
|
||||
<Compile Include="BrushLayerElementSettings.cs" />
|
||||
<Compile Include="BrushLayerElementViewModel.cs" />
|
||||
<Compile Include="BrushLayerElement.cs" />
|
||||
<Compile Include="BrushLayerElementProvider.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -83,6 +89,12 @@
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Page Include="BrushLayerElementView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>echo Copying plugin to Artemis.UI output directory
|
||||
@ -1,9 +0,0 @@
|
||||
using Artemis.Core.Plugins.Interfaces;
|
||||
|
||||
namespace Artemis.Plugins.LayerTypes.Brush
|
||||
{
|
||||
public class BrushConfiguration : ILayerTypeConfiguration
|
||||
{
|
||||
public System.Windows.Media.Brush Brush { get; set; }
|
||||
}
|
||||
}
|
||||
40
src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs
Normal file
40
src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs
Normal file
@ -0,0 +1,40 @@
|
||||
using System.Drawing;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.Plugins.LayerElements.Brush
|
||||
{
|
||||
public class BrushLayerElement : LayerElement
|
||||
{
|
||||
public BrushLayerElement(Layer layer, BrushLayerElementSettings settings, LayerElementDescriptor descriptor) : base(layer, settings, descriptor)
|
||||
{
|
||||
Settings = settings ?? new BrushLayerElementSettings {Brush = new SolidBrush(Color.Red)};
|
||||
}
|
||||
|
||||
public new BrushLayerElementSettings Settings { get; }
|
||||
|
||||
public override LayerElementViewModel GetViewModel()
|
||||
{
|
||||
return new BrushLayerElementViewModel(this);
|
||||
}
|
||||
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
}
|
||||
|
||||
public override void RenderPreProcess(ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Render(ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
if (Settings?.Brush != null)
|
||||
graphics.FillRectangle(Settings.Brush, Layer.RenderRectangle);
|
||||
}
|
||||
|
||||
public override void RenderPostProcess(ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
|
||||
namespace Artemis.Plugins.LayerElements.Brush
|
||||
{
|
||||
public class BrushLayerElementProvider : LayerElementProvider
|
||||
{
|
||||
public BrushLayerElementProvider(PluginInfo pluginInfo) : base(pluginInfo)
|
||||
{
|
||||
AddLayerElementDescriptor<BrushLayerElement>("Brush", "A brush of a specific type and colors", "Brush");
|
||||
}
|
||||
|
||||
public override void EnablePlugin()
|
||||
{
|
||||
}
|
||||
|
||||
public override void DisablePlugin()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.Plugins.LayerElements.Brush
|
||||
{
|
||||
public class BrushLayerElementSettings : LayerElementSettings
|
||||
{
|
||||
public System.Drawing.Brush Brush { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
<UserControl x:Class="Artemis.Plugins.LayerElements.Brush.BrushLayerElementView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:brushLayer="clr-namespace:Artemis.Plugins.LayerElements.Brush"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
d:DataContext="{d:DesignInstance {x:Type brushLayer:BrushLayerElementViewModel}}">
|
||||
<UserControl.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Teal.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Teal.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</UserControl.Resources>
|
||||
|
||||
<Grid Margin="12">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Setting 1 -->
|
||||
<StackPanel Grid.Row="0" Grid.Column="0">
|
||||
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}">Setting title</TextBlock>
|
||||
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" Foreground="{DynamicResource MaterialDesignCheckBoxDisabled}">Setting subtitle</TextBlock>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Row="0" Grid.Column="1" VerticalAlignment="Center">
|
||||
<ToggleButton Style="{StaticResource MaterialDesignSwitchToggleButton}" ToolTip="Default ToggleButton Style" />
|
||||
</StackPanel>
|
||||
<Separator Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource MaterialDesignSeparator}" />
|
||||
|
||||
<!-- Setting 2 -->
|
||||
<StackPanel Grid.Row="2" Grid.Column="0">
|
||||
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}">Setting title</TextBlock>
|
||||
<TextBlock Style="{StaticResource MaterialDesignBody1TextBlock}" Foreground="{DynamicResource MaterialDesignCheckBoxDisabled}">Setting subtitle</TextBlock>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Row="2" Grid.Column="1" VerticalAlignment="Center">
|
||||
<ToggleButton Style="{StaticResource MaterialDesignSwitchToggleButton}" ToolTip="Default ToggleButton Style" />
|
||||
</StackPanel>
|
||||
<Separator Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource MaterialDesignLightSeparator}" />
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@ -0,0 +1,14 @@
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.Plugins.LayerElements.Brush
|
||||
{
|
||||
public class BrushLayerElementViewModel : LayerElementViewModel
|
||||
{
|
||||
public BrushLayerElementViewModel(BrushLayerElement layerElement) : base(layerElement)
|
||||
{
|
||||
LayerElement = layerElement;
|
||||
}
|
||||
|
||||
public new BrushLayerElement LayerElement { get; }
|
||||
}
|
||||
}
|
||||
@ -1,42 +0,0 @@
|
||||
using System.Drawing;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
using QRCoder;
|
||||
|
||||
namespace Artemis.Plugins.LayerTypes.Brush
|
||||
{
|
||||
public class BrushLayerType : LayerType
|
||||
{
|
||||
public BrushLayerType(PluginInfo pluginInfo) : base(pluginInfo)
|
||||
{
|
||||
}
|
||||
|
||||
public override void EnablePlugin()
|
||||
{
|
||||
var qrGenerator = new QRCodeGenerator();
|
||||
}
|
||||
|
||||
public override void DisablePlugin()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Update(Layer layer)
|
||||
{
|
||||
var config = layer.LayerTypeConfiguration as BrushConfiguration;
|
||||
if (config == null)
|
||||
return;
|
||||
|
||||
// Update the brush
|
||||
}
|
||||
|
||||
public override void Render(Layer device, ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4,7 +4,7 @@ using System.Runtime.InteropServices;
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Artemis.Plugins.LayerTypes.Brush")]
|
||||
[assembly: AssemblyTitle("Artemis.Plugins.LayerElements.Brush")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<packages>
|
||||
<package id="QRCoder" version="1.2.5" targetFramework="net461" />
|
||||
<package id="MaterialDesignColors" version="1.2.0" targetFramework="net472" />
|
||||
<package id="Stylet" version="1.2.0" targetFramework="net472" />
|
||||
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
|
||||
</packages>
|
||||
@ -1,10 +1,10 @@
|
||||
{
|
||||
"Guid": "92a9d6ba-6f7a-4937-94d5-c1d715b4141a",
|
||||
"Name": "Brush layer",
|
||||
"Name": "Brush layer elements",
|
||||
"Version": {
|
||||
"Major": 1,
|
||||
"Minor": 0,
|
||||
"Build": 0
|
||||
},
|
||||
"Main": "Artemis.Plugins.LayerTypes.Brush.dll"
|
||||
"Main": "Artemis.Plugins.LayerElements.Brush.dll"
|
||||
}
|
||||
@ -8,6 +8,8 @@ using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
using Artemis.Core.Services.Storage.Interfaces;
|
||||
using Artemis.Plugins.Modules.General.ViewModels;
|
||||
using RGB.NET.Core;
|
||||
using Color = System.Drawing.Color;
|
||||
|
||||
namespace Artemis.Plugins.Modules.General
|
||||
{
|
||||
@ -45,6 +47,8 @@ namespace Artemis.Plugins.Modules.General
|
||||
public int[] Hues { get; set; }
|
||||
public int MovePercentage { get; set; }
|
||||
|
||||
public Dictionary<ArtemisDevice, TextureBrush> DeviceBrushes { get; set; }
|
||||
|
||||
public override void EnablePlugin()
|
||||
{
|
||||
}
|
||||
@ -65,16 +69,20 @@ namespace Artemis.Plugins.Modules.General
|
||||
MovePercentage++;
|
||||
if (MovePercentage > 100)
|
||||
MovePercentage = 0;
|
||||
|
||||
base.Update(deltaTime);
|
||||
}
|
||||
|
||||
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, Graphics graphics)
|
||||
{
|
||||
// Per-device coloring, slower
|
||||
RenderPerDevice(surface, graphics);
|
||||
// RenderPerDevice(surface, graphics);
|
||||
|
||||
// Per-LED coloring, slowest
|
||||
// RenderPerLed(surface, graphics);
|
||||
|
||||
base.Render(deltaTime, surface, graphics);
|
||||
}
|
||||
|
||||
public void RenderFullSurface(ArtemisSurface surface, Graphics graphics)
|
||||
@ -97,8 +105,6 @@ namespace Artemis.Plugins.Modules.General
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<ArtemisDevice, TextureBrush> DeviceBrushes { get; set; }
|
||||
|
||||
private Image RenderGradientForDevice(ArtemisDevice device)
|
||||
{
|
||||
var brush = new LinearGradientBrush(device.RenderRectangle, Color.Black, Color.Black, 0, false)
|
||||
@ -119,7 +125,10 @@ namespace Artemis.Plugins.Modules.General
|
||||
var index = 0;
|
||||
foreach (var led in surface.Devices.SelectMany(d => d.Leds))
|
||||
{
|
||||
graphics.FillRectangle(new SolidBrush(ColorHelpers.ColorFromHSV(Hues[index], 1, 1)), led.AbsoluteRenderRectangle);
|
||||
if (led.RgbLed.Id == LedId.HeadsetStand1)
|
||||
graphics.FillRectangle(new SolidBrush(Color.Red), led.AbsoluteRenderRectangle);
|
||||
else
|
||||
graphics.FillRectangle(new SolidBrush(ColorHelpers.ColorFromHSV(Hues[index], 1, 1)), led.AbsoluteRenderRectangle);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,8 @@ namespace Artemis.Storage.Entities.Profile
|
||||
{
|
||||
public class LayerElementEntity
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid PluginGuid { get; set; }
|
||||
public string LayerElementType { get; set; }
|
||||
public string Configuration { get; set; }
|
||||
}
|
||||
}
|
||||
@ -15,7 +15,6 @@ namespace Artemis.Storage.Entities.Profile
|
||||
|
||||
public Guid Id { get; set; }
|
||||
public Guid ParentId { get; set; }
|
||||
public Guid LayerTypeGuid { get; set; }
|
||||
|
||||
public int Order { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Artemis.Storage.Entities;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
|
||||
namespace Artemis.Storage.Repositories.Interfaces
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using Artemis.Storage.Entities;
|
||||
using Artemis.Storage.Entities.Surface;
|
||||
|
||||
namespace Artemis.Storage.Repositories.Interfaces
|
||||
|
||||
@ -31,7 +31,7 @@ namespace Artemis.Storage.Repositories
|
||||
{
|
||||
return _repository.FirstOrDefault<PluginSettingEntity>(p => p.Name == name && p.PluginGuid == pluginGuid);
|
||||
}
|
||||
|
||||
|
||||
public void Save(PluginSettingEntity pluginSettingEntity)
|
||||
{
|
||||
_repository.Upsert(pluginSettingEntity);
|
||||
|
||||
@ -27,11 +27,11 @@
|
||||
|
||||
<!-- Material Design: MahApps Compatibility -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.MahApps;component/Themes/MaterialDesignTheme.MahApps.NumericUpDown.xaml" />
|
||||
|
||||
|
||||
<!-- Include the Dragablz Material Design style -->
|
||||
<ResourceDictionary Source="pack://application:,,,/Dragablz;component/Themes/materialdesign.xaml" />
|
||||
|
||||
<ResourceDictionary Source="ResourceDictionaries/Scrollbar.xaml"/>
|
||||
<ResourceDictionary Source="ResourceDictionaries/Scrollbar.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
|
||||
<!-- MahApps Brushes -->
|
||||
|
||||
@ -148,11 +148,14 @@
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="Bootstrapper.cs" />
|
||||
<Compile Include="Converters\ColorToDrawingColorConverter.cs" />
|
||||
<Compile Include="Converters\ColorToSolidColorBrushConverter.cs" />
|
||||
<Compile Include="Converters\InverseBooleanConverter.cs" />
|
||||
<Compile Include="Converters\NullToImageConverter.cs" />
|
||||
<Compile Include="Converters\NullToVisibilityConverter.cs" />
|
||||
<Compile Include="Events\MainWindowFocusChangedEvent.cs" />
|
||||
<Compile Include="Screens\GradientEditor\GradientEditorViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\LayerElements\Dialogs\AddLayerElementViewModel.cs" />
|
||||
<Compile Include="Services\Interfaces\IProfileEditorService.cs" />
|
||||
<Compile Include="Services\ProfileEditorService.cs" />
|
||||
<Compile Include="Utilities\BindableSelectedItemBehavior.cs" />
|
||||
@ -179,7 +182,6 @@
|
||||
<Compile Include="Screens\Module\ProfileEditor\DisplayConditions\DisplayConditionsViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\DisplayConditions\DisplayConditionViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\ElementProperties\ElementPropertiesViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\ElementProperties\ElementPropertyViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\LayerElements\LayerElementsViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\LayerElements\LayerElementViewModel.cs" />
|
||||
<Compile Include="Screens\Module\ProfileEditor\ProfileTree\TreeItem\FolderViewModel.cs" />
|
||||
@ -226,6 +228,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Screens\GradientEditor\GradientEditorView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Screens\Module\ProfileEditor\Dialogs\ProfileCreateView.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
@ -246,7 +252,7 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Screens\Module\ProfileEditor\ElementProperties\ElementPropertyView.xaml">
|
||||
<Page Include="Screens\Module\ProfileEditor\LayerElements\Dialogs\AddLayerElementView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
@ -254,10 +260,6 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Screens\Module\ProfileEditor\LayerElements\LayerElementView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Screens\Module\ProfileEditor\ProfileTree\TreeItem\FolderView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
||||
33
src/Artemis.UI/Converters/ColorToDrawingColorConverter.cs
Normal file
33
src/Artemis.UI/Converters/ColorToDrawingColorConverter.cs
Normal file
@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Artemis.UI.Converters
|
||||
{
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Converts <see cref="T:System.Drawing.Color" /> into <see cref="T:System.Windows.Media.Color" />.
|
||||
/// </summary>
|
||||
[ValueConversion(typeof(Color), typeof(System.Windows.Media.Color))]
|
||||
public class ColorToDrawingColorConverter : IValueConverter
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is Color drawingColor)
|
||||
return System.Windows.Media.Color.FromArgb(drawingColor.A, drawingColor.R, drawingColor.G, drawingColor.B);
|
||||
|
||||
return default(System.Windows.Media.Color);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is System.Windows.Media.Color mediaColor)
|
||||
return Color.FromArgb(mediaColor.A, mediaColor.R, mediaColor.G, mediaColor.B);
|
||||
|
||||
return default(Color);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -20,7 +20,7 @@ namespace Artemis.UI.Ninject
|
||||
{
|
||||
if (Kernel == null)
|
||||
throw new ArgumentNullException("Kernel shouldn't be null here.");
|
||||
|
||||
|
||||
// Bind all built-in VMs
|
||||
Kernel.Bind(x =>
|
||||
{
|
||||
@ -51,7 +51,7 @@ namespace Artemis.UI.Ninject
|
||||
Kernel.Bind<IDeviceSettingsViewModelFactory>().ToFactory();
|
||||
Kernel.Bind<IModuleViewModelFactory>().ToFactory();
|
||||
Kernel.Bind<IProfileEditorViewModelFactory>().ToFactory();
|
||||
|
||||
|
||||
// Bind profile editor VMs
|
||||
Kernel.Bind(x =>
|
||||
{
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
<mah:MetroWindow x:Class="Artemis.UI.Screens.GradientEditor.GradientEditorView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:gradientEditor="clr-namespace:Artemis.UI.Screens.GradientEditor"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
mc:Ignorable="d"
|
||||
Title="Gradient Editor"
|
||||
Height="450" Width="800"
|
||||
d:DataContext="{d:DesignInstance {x:Type gradientEditor:GradientEditorViewModel}}">
|
||||
<Grid>
|
||||
<materialDesign:ColorPicker Color="{Binding CurrentColor}" />
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
@ -0,0 +1,10 @@
|
||||
using System.Windows.Media;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens.GradientEditor
|
||||
{
|
||||
public class GradientEditorViewModel : Screen
|
||||
{
|
||||
public Color CurrentColor { get; set; }
|
||||
}
|
||||
}
|
||||
@ -16,7 +16,7 @@
|
||||
Margin="0 8 0 16"
|
||||
Style="{StaticResource MaterialDesignFloatingHintTextBox}"
|
||||
Text="{Binding ElementName, UpdateSourceTrigger=PropertyChanged}"
|
||||
Loaded="FrameworkElement_OnLoaded"/>
|
||||
Loaded="FrameworkElement_OnLoaded" />
|
||||
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
|
||||
<Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="True" Margin="0 8 8 0" Command="{s:Action Cancel}">
|
||||
|
||||
@ -3,15 +3,23 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.ElementProperties"
|
||||
xmlns:elementProperties="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.ElementProperties"
|
||||
xmlns:s="https://github.com/canton7/Stylet"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
d:DataContext="{d:DesignInstance {x:Type elementProperties:ElementPropertiesViewModel}}">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel Grid.Row="0">
|
||||
<TextBlock Style="{StaticResource MaterialDesignSubheadingTextBlock}" Margin="10 5 0 -4">
|
||||
Layer element properties
|
||||
</TextBlock>
|
||||
<Separator Style="{StaticResource MaterialDesignDarkSeparator}" Margin="8 0" />
|
||||
</StackPanel>
|
||||
<ContentControl Grid.Row="1" s:View.Model="{Binding LayerElementViewModel}" />
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
||||
@ -1,6 +1,25 @@
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.ElementProperties
|
||||
using System;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.UI.Services.Interfaces;
|
||||
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.ElementProperties
|
||||
{
|
||||
public class ElementPropertiesViewModel : ProfileEditorPanelViewModel
|
||||
{
|
||||
private readonly IProfileEditorService _profileEditorService;
|
||||
|
||||
public ElementPropertiesViewModel(IProfileEditorService profileEditorService)
|
||||
{
|
||||
_profileEditorService = profileEditorService;
|
||||
|
||||
_profileEditorService.SelectedLayerElementChanged += OnSelectedLayerElementChanged;
|
||||
}
|
||||
|
||||
public LayerElementViewModel LayerElementViewModel { get; set; }
|
||||
|
||||
private void OnSelectedLayerElementChanged(object sender, EventArgs e)
|
||||
{
|
||||
LayerElementViewModel = _profileEditorService.SelectedLayerElement?.GetViewModel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
<UserControl x:Class="Artemis.UI.Screens.Module.ProfileEditor.ElementProperties.ElementPropertyView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.ElementProperties"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<Grid />
|
||||
</UserControl>
|
||||
@ -1,6 +0,0 @@
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.ElementProperties
|
||||
{
|
||||
public class ElementPropertyViewModel
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
<UserControl x:Class="Artemis.UI.Screens.Module.ProfileEditor.LayerElements.Dialogs.AddLayerElementView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:layerElement="clr-namespace:Artemis.Core.Plugins.LayerElement;assembly=Artemis.Core"
|
||||
xmlns:layerElements="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.LayerElements.Dialogs"
|
||||
xmlns:s="https://github.com/canton7/Stylet"
|
||||
mc:Ignorable="d"
|
||||
d:DataContext="{d:DesignInstance {x:Type layerElements:AddLayerElementViewModel}}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Margin="15">Select a new layer element below</TextBlock>
|
||||
<ListBox Grid.Row="1" ItemsSource="{Binding LayerElementDescriptors}" SelectedItem="{Binding SelectedLayerElementDescriptor}" HorizontalContentAlignment="Stretch">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="{x:Type layerElement:LayerElementDescriptor}">
|
||||
<Border Padding="8" BorderThickness="0 0 0 1" BorderBrush="{DynamicResource MaterialDesignDivider}" VerticalAlignment="Stretch" MouseDown="{s:Action ListBoxItemMouseClick}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<materialDesign:PackIcon Kind="{Binding Icon}" Width="20" Height="20" VerticalAlignment="Center" />
|
||||
<StackPanel Margin="8 0 0 0" Grid.Column="1" VerticalAlignment="Stretch">
|
||||
<TextBlock FontWeight="Bold" Text="{Binding DisplayName}" />
|
||||
<TextBlock Text="{Binding Description}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
|
||||
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="10 15">
|
||||
<Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="True" Margin="0 8 8 0" Command="{s:Action Cancel}">CANCEL</Button>
|
||||
<Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 8 8 0" Command="{s:Action Accept}">ACCEPT</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@ -0,0 +1,53 @@
|
||||
using System.Windows.Input;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.UI.ViewModels.Dialogs;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.LayerElements.Dialogs
|
||||
{
|
||||
public class AddLayerElementViewModel : DialogViewModelBase
|
||||
{
|
||||
private readonly ILayerService _layerService;
|
||||
|
||||
|
||||
public AddLayerElementViewModel(IPluginService pluginService, ILayerService layerService, Layer layer)
|
||||
{
|
||||
_layerService = layerService;
|
||||
Layer = layer;
|
||||
|
||||
LayerElementDescriptors = new BindableCollection<LayerElementDescriptor>();
|
||||
var layerElementProviders = pluginService.GetPluginsOfType<LayerElementProvider>();
|
||||
foreach (var layerElementProvider in layerElementProviders)
|
||||
LayerElementDescriptors.AddRange(layerElementProvider.LayerElementDescriptors);
|
||||
}
|
||||
|
||||
public Layer Layer { get; }
|
||||
|
||||
public LayerElementDescriptor SelectedLayerElementDescriptor { get; set; }
|
||||
public BindableCollection<LayerElementDescriptor> LayerElementDescriptors { get; set; }
|
||||
public bool CanAccept => SelectedLayerElementDescriptor != null;
|
||||
|
||||
public void Accept()
|
||||
{
|
||||
var layerElement = _layerService.InstantiateLayerElement(Layer, SelectedLayerElementDescriptor);
|
||||
Session.Close(layerElement);
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
Session.Close();
|
||||
}
|
||||
|
||||
#region View event handlers
|
||||
|
||||
public void ListBoxItemMouseClick(object sender, MouseButtonEventArgs args)
|
||||
{
|
||||
if (args.ClickCount > 1 && SelectedLayerElementDescriptor != null)
|
||||
Accept();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
<UserControl x:Class="Artemis.UI.Screens.Module.ProfileEditor.LayerElements.LayerElementView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.LayerElements"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<Grid />
|
||||
</UserControl>
|
||||
@ -1,6 +1,19 @@
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.LayerElements
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.LayerElements
|
||||
{
|
||||
public class LayerElementViewModel
|
||||
{
|
||||
public LayerElementViewModel(LayerElement layerElement)
|
||||
{
|
||||
Layer = layerElement.Layer;
|
||||
LayerElement = layerElement;
|
||||
LayerElementDescriptor = layerElement.Descriptor;
|
||||
}
|
||||
|
||||
public Layer Layer { get; set; }
|
||||
public LayerElement LayerElement { get; set; }
|
||||
public LayerElementDescriptor LayerElementDescriptor { get; set; }
|
||||
}
|
||||
}
|
||||
@ -3,15 +3,69 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.LayerElements"
|
||||
xmlns:layerElements="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.LayerElements"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:s="https://github.com/canton7/Stylet"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<TextBlock Style="{StaticResource MaterialDesignSubheadingTextBlock}" Margin="10 5 0 -4">
|
||||
Layer elements
|
||||
</TextBlock>
|
||||
<Separator Style="{StaticResource MaterialDesignDarkSeparator}" Margin="8 0" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
d:DataContext="{d:DesignInstance {x:Type layerElements:LayerElementsViewModel}}">
|
||||
|
||||
<materialDesign:DialogHost Identifier="LayerElementsDialogHost" CloseOnClickAway="True">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel Grid.Row="0">
|
||||
<TextBlock Style="{StaticResource MaterialDesignSubheadingTextBlock}" Margin="10 5 0 -4">
|
||||
Layer elements
|
||||
</TextBlock>
|
||||
<Separator Style="{StaticResource MaterialDesignDarkSeparator}" Margin="8 0" />
|
||||
</StackPanel>
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<ListBox ItemsSource="{Binding LayerElements}" SelectedItem="{Binding SelectedLayerElement}" HorizontalContentAlignment="Stretch">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="{x:Type layerElements:LayerElementViewModel}">
|
||||
<Border Padding="8" BorderThickness="0 0 0 1" BorderBrush="{DynamicResource MaterialDesignDivider}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<materialDesign:PackIcon Kind="{Binding LayerElementDescriptor.Icon}" Width="20" Height="20" VerticalAlignment="Center" />
|
||||
<StackPanel Margin="8 0 0 0" Grid.Column="1">
|
||||
<TextBlock FontWeight="Bold" Text="{Binding LayerElementDescriptor.DisplayName}" />
|
||||
<TextBlock Text="{Binding LayerElementDescriptor.Description}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
<StackPanel VerticalAlignment="Bottom" Grid.Column="1" Orientation="Vertical" Margin="8">
|
||||
<Button Style="{StaticResource MaterialDesignToolButton}"
|
||||
Width="30"
|
||||
Padding="2 0 2 0"
|
||||
materialDesign:RippleAssist.IsCentered="True"
|
||||
ToolTip="Add a new layer element"
|
||||
Command="{s:Action AddLayerElement}">
|
||||
<materialDesign:PackIcon Kind="LibraryAdd" />
|
||||
</Button>
|
||||
<Button Style="{StaticResource MaterialDesignToolButton}"
|
||||
Width="30"
|
||||
Padding="2 0 2 0"
|
||||
materialDesign:RippleAssist.IsCentered="True"
|
||||
ToolTip="Delete selected layer element"
|
||||
Command="{s:Action DeleteSelectedLayerElement}">
|
||||
<materialDesign:PackIcon Kind="Delete" />
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</materialDesign:DialogHost>
|
||||
|
||||
</UserControl>
|
||||
@ -1,6 +1,95 @@
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.LayerElements
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.UI.Screens.Module.ProfileEditor.LayerElements.Dialogs;
|
||||
using Artemis.UI.Services.Interfaces;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens.Module.ProfileEditor.LayerElements
|
||||
{
|
||||
public class LayerElementsViewModel : ProfileEditorPanelViewModel
|
||||
{
|
||||
private readonly IDialogService _dialogService;
|
||||
private readonly IProfileEditorService _profileEditorService;
|
||||
private LayerElementViewModel _selectedLayerElement;
|
||||
|
||||
public LayerElementsViewModel(IProfileEditorService profileEditorService, IDialogService dialogService)
|
||||
{
|
||||
_profileEditorService = profileEditorService;
|
||||
_dialogService = dialogService;
|
||||
|
||||
LayerElements = new BindableCollection<LayerElementViewModel>();
|
||||
SelectedProfileElement = _profileEditorService.SelectedProfileElement;
|
||||
PopulateLayerElements();
|
||||
|
||||
_profileEditorService.SelectedProfileElementChanged += OnSelectedProfileElementChanged;
|
||||
_profileEditorService.SelectedLayerElementChanged += OnSelectedLayerElementChanged;
|
||||
}
|
||||
|
||||
public ProfileElement SelectedProfileElement { get; private set; }
|
||||
public BindableCollection<LayerElementViewModel> LayerElements { get; set; }
|
||||
|
||||
public LayerElementViewModel SelectedLayerElement
|
||||
{
|
||||
get => _selectedLayerElement;
|
||||
set
|
||||
{
|
||||
_selectedLayerElement = value;
|
||||
_profileEditorService.ChangeSelectedLayerElement(value?.LayerElement);
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanAddLayerElement => SelectedProfileElement is Layer;
|
||||
public bool CanDeleteSelectedLayerElement => SelectedLayerElement != null;
|
||||
|
||||
private void OnSelectedLayerElementChanged(object sender, EventArgs e)
|
||||
{
|
||||
_selectedLayerElement = LayerElements.FirstOrDefault(l => l.LayerElement == _profileEditorService.SelectedLayerElement);
|
||||
NotifyOfPropertyChange(() => SelectedLayerElement);
|
||||
}
|
||||
|
||||
private void OnSelectedProfileElementChanged(object sender, EventArgs e)
|
||||
{
|
||||
SelectedProfileElement = _profileEditorService.SelectedProfileElement;
|
||||
PopulateLayerElements();
|
||||
}
|
||||
|
||||
private void PopulateLayerElements()
|
||||
{
|
||||
LayerElements.Clear();
|
||||
if (SelectedProfileElement is Layer layer)
|
||||
{
|
||||
foreach (var layerElement in layer.LayerElements)
|
||||
LayerElements.Add(new LayerElementViewModel(layerElement));
|
||||
}
|
||||
}
|
||||
|
||||
public async void AddLayerElement()
|
||||
{
|
||||
var result = await _dialogService.ShowDialogAt<AddLayerElementViewModel>(
|
||||
"LayerElementsDialogHost",
|
||||
new Dictionary<string, object> {{"layer", (Layer) SelectedProfileElement}}
|
||||
);
|
||||
|
||||
if (result is LayerElement layerElement)
|
||||
LayerElements.Add(new LayerElementViewModel(layerElement));
|
||||
}
|
||||
|
||||
public async void DeleteSelectedLayerElement()
|
||||
{
|
||||
if (SelectedLayerElement == null)
|
||||
return;
|
||||
|
||||
var result = await _dialogService.ShowConfirmDialogAt(
|
||||
"LayerElementsDialogHost",
|
||||
"Delete layer element",
|
||||
"Are you sure you want to delete the selected layer element?"
|
||||
);
|
||||
if (!result)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -8,7 +8,6 @@ using Artemis.Core.Plugins.Abstract;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
using Artemis.Core.Services;
|
||||
using Artemis.Core.Services.Storage.Interfaces;
|
||||
using Artemis.UI.Events;
|
||||
using Artemis.UI.Screens.Module.ProfileEditor.Dialogs;
|
||||
using Artemis.UI.Screens.Module.ProfileEditor.DisplayConditions;
|
||||
using Artemis.UI.Screens.Module.ProfileEditor.ElementProperties;
|
||||
@ -29,8 +28,8 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
|
||||
public ProfileEditorViewModel(ProfileModule module,
|
||||
ICollection<ProfileEditorPanelViewModel> viewModels,
|
||||
IProfileEditorService profileEditorService,
|
||||
IProfileService profileService,
|
||||
IDialogService dialogService,
|
||||
IProfileService profileService,
|
||||
IDialogService dialogService,
|
||||
ISettingsService settingsService)
|
||||
{
|
||||
_profileEditorService = profileEditorService;
|
||||
@ -81,8 +80,8 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
|
||||
return;
|
||||
|
||||
var oldProfile = Module.ActiveProfile;
|
||||
Module.ChangeActiveProfile(profile);
|
||||
|
||||
_profileService.ActivateProfile(Module, profile);
|
||||
|
||||
if (oldProfile != null)
|
||||
_profileService.UpdateProfile(oldProfile, false);
|
||||
if (profile != null)
|
||||
@ -186,7 +185,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
|
||||
_profileEditorService.ChangeSelectedProfile(SelectedProfile);
|
||||
|
||||
if (!activeProfile.IsActivated)
|
||||
Module.ChangeActiveProfile(activeProfile);
|
||||
_profileService.ActivateProfile(Module, activeProfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -25,7 +25,7 @@
|
||||
</TextBlock>
|
||||
<Separator Style="{StaticResource MaterialDesignDarkSeparator}" Margin="8 0" />
|
||||
</StackPanel>
|
||||
|
||||
|
||||
<TreeView Grid.Row="1"
|
||||
ItemsSource="{Binding RootFolder.Children}"
|
||||
HorizontalContentAlignment="Stretch"
|
||||
|
||||
@ -132,10 +132,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree
|
||||
|
||||
private void OnSelectedElementChanged(object sender, EventArgs e)
|
||||
{
|
||||
var vms = RootFolder.GetAllChildren();
|
||||
var vms = RootFolder?.GetAllChildren();
|
||||
|
||||
// Don't set it using the setter or that will trigger the event again
|
||||
_selectedTreeItem = vms.FirstOrDefault(vm => vm.ProfileElement == _profileEditorService.SelectedProfileElement);
|
||||
_selectedTreeItem = vms?.FirstOrDefault(vm => vm.ProfileElement == _profileEditorService.SelectedProfileElement);
|
||||
NotifyOfPropertyChange(() => SelectedTreeItem);
|
||||
}
|
||||
|
||||
|
||||
@ -37,9 +37,11 @@
|
||||
</ContextMenu>
|
||||
</StackPanel.ContextMenu>
|
||||
<StackPanel Orientation="Horizontal" Margin="10">
|
||||
<materialDesign:PackIcon Kind="Folder" Visibility="{Binding IsExpanded, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}"/>
|
||||
<materialDesign:PackIcon Kind="FolderOpen" Visibility="{Binding IsExpanded, Converter={x:Static s:BoolToVisibilityConverter.Instance}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}"/>
|
||||
|
||||
<materialDesign:PackIcon Kind="Folder"
|
||||
Visibility="{Binding IsExpanded, Converter={x:Static s:BoolToVisibilityConverter.InverseInstance}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}" />
|
||||
<materialDesign:PackIcon Kind="FolderOpen"
|
||||
Visibility="{Binding IsExpanded, Converter={x:Static s:BoolToVisibilityConverter.Instance}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}" />
|
||||
|
||||
<TextBlock Text="{Binding ProfileElement.Name}" Margin="10 0 0 0" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
@ -38,7 +38,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization
|
||||
public Geometry StrokeGeometry { get; private set; }
|
||||
public Color DisplayColor { get; private set; }
|
||||
|
||||
|
||||
private void CreateLedGeometry()
|
||||
{
|
||||
switch (Led.RgbLed.Shape)
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
@ -15,7 +13,6 @@ using Artemis.UI.Screens.News;
|
||||
using Artemis.UI.Screens.Settings;
|
||||
using Artemis.UI.Screens.SurfaceEditor;
|
||||
using Artemis.UI.Screens.Workshop;
|
||||
using MahApps.Metro.Controls;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.UI.Screens
|
||||
@ -23,8 +20,8 @@ namespace Artemis.UI.Screens
|
||||
public class RootViewModel : Conductor<IScreen>
|
||||
{
|
||||
private readonly ICollection<IScreenViewModel> _artemisViewModels;
|
||||
private readonly IModuleViewModelFactory _moduleViewModelFactory;
|
||||
private readonly IEventAggregator _eventAggregator;
|
||||
private readonly IModuleViewModelFactory _moduleViewModelFactory;
|
||||
private readonly IPluginService _pluginService;
|
||||
private bool _lostFocus;
|
||||
|
||||
|
||||
@ -332,7 +332,7 @@ namespace Artemis.UI.Screens.SurfaceEditor
|
||||
{
|
||||
if (IsPanKeyDown())
|
||||
return;
|
||||
|
||||
|
||||
var selectedRect = new Rect(_mouseDragStartPoint, position);
|
||||
SelectionRectangle.Rect = selectedRect;
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Artemis.UI.Screens.Workshop"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<Grid>
|
||||
|
||||
@ -29,8 +29,8 @@ namespace Artemis.UI.Services.Dialog
|
||||
{
|
||||
new ConstructorArgument("header", header),
|
||||
new ConstructorArgument("text", text),
|
||||
new ConstructorArgument("confirmText", confirmText),
|
||||
new ConstructorArgument("cancelText", cancelText)
|
||||
new ConstructorArgument("confirmText", confirmText.ToUpper()),
|
||||
new ConstructorArgument("cancelText", cancelText.ToUpper())
|
||||
};
|
||||
var result = await ShowDialog<ConfirmDialogViewModel>(arguments);
|
||||
return (bool) result;
|
||||
@ -42,8 +42,8 @@ namespace Artemis.UI.Services.Dialog
|
||||
{
|
||||
new ConstructorArgument("header", header),
|
||||
new ConstructorArgument("text", text),
|
||||
new ConstructorArgument("confirmText", confirmText),
|
||||
new ConstructorArgument("cancelText", cancelText)
|
||||
new ConstructorArgument("confirmText", confirmText.ToUpper()),
|
||||
new ConstructorArgument("cancelText", cancelText.ToUpper())
|
||||
};
|
||||
var result = await ShowDialogAt<ConfirmDialogViewModel>(identifier, arguments);
|
||||
return (bool) result;
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
|
||||
namespace Artemis.UI.Services.Interfaces
|
||||
{
|
||||
@ -8,15 +9,18 @@ namespace Artemis.UI.Services.Interfaces
|
||||
{
|
||||
Profile SelectedProfile { get; }
|
||||
ProfileElement SelectedProfileElement { get; }
|
||||
LayerElement SelectedLayerElement { get; }
|
||||
|
||||
void ChangeSelectedProfile(Profile profile);
|
||||
void UpdateSelectedProfile();
|
||||
void ChangeSelectedProfileElement(ProfileElement profileElement);
|
||||
void UpdateSelectedProfileElement();
|
||||
void ChangeSelectedLayerElement(LayerElement layerElement);
|
||||
|
||||
event EventHandler SelectedProfileChanged;
|
||||
event EventHandler SelectedProfileUpdated;
|
||||
event EventHandler SelectedProfileElementChanged;
|
||||
event EventHandler SelectedProfileElementUpdated;
|
||||
event EventHandler SelectedLayerElementChanged;
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Core.Services.Storage.Interfaces;
|
||||
using Artemis.UI.Services.Interfaces;
|
||||
|
||||
@ -17,6 +18,7 @@ namespace Artemis.UI.Services
|
||||
|
||||
public Profile SelectedProfile { get; private set; }
|
||||
public ProfileElement SelectedProfileElement { get; private set; }
|
||||
public LayerElement SelectedLayerElement { get; private set; }
|
||||
|
||||
public void ChangeSelectedProfile(Profile profile)
|
||||
{
|
||||
@ -42,10 +44,17 @@ namespace Artemis.UI.Services
|
||||
OnSelectedProfileElementUpdated();
|
||||
}
|
||||
|
||||
public void ChangeSelectedLayerElement(LayerElement layerElement)
|
||||
{
|
||||
SelectedLayerElement = layerElement;
|
||||
OnSelectedLayerElementChanged();
|
||||
}
|
||||
|
||||
public event EventHandler SelectedProfileChanged;
|
||||
public event EventHandler SelectedProfileUpdated;
|
||||
public event EventHandler SelectedProfileElementChanged;
|
||||
public event EventHandler SelectedProfileElementUpdated;
|
||||
public event EventHandler SelectedLayerElementChanged;
|
||||
|
||||
protected virtual void OnSelectedProfileElementUpdated()
|
||||
{
|
||||
@ -66,5 +75,10 @@ namespace Artemis.UI.Services
|
||||
{
|
||||
SelectedProfileChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
protected virtual void OnSelectedLayerElementChanged()
|
||||
{
|
||||
SelectedLayerElementChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<packages>
|
||||
<package id="Castle.Core" version="4.4.0" targetFramework="net461" />
|
||||
<package id="ControlzEx" version="3.0.2.4" targetFramework="net472" />
|
||||
|
||||
@ -19,7 +19,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{E830
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.Modules.General", "Artemis.Plugins.Modules.General\Artemis.Plugins.Modules.General.csproj", "{E592F239-FAA0-4840-9C85-46E5867D06D5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.LayerTypes.Brush", "Artemis.Plugins.LayerTypes.Brush\Artemis.Plugins.LayerTypes.Brush.csproj", "{0F288A66-6EB0-4589-8595-E33A3A3EAEA2}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.LayerElements.Brush", "Artemis.Plugins.LayerTypes.Brush\Artemis.Plugins.LayerElements.Brush.csproj", "{0F288A66-6EB0-4589-8595-E33A3A3EAEA2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.Devices.Corsair", "Artemis.Plugins.Devices.Corsair\Artemis.Plugins.Devices.Corsair.csproj", "{A779B2F8-C253-4C4B-8634-6EB8F594E96D}"
|
||||
EndProject
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user