1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Revert "Unified line endings"

This reverts commit bca680f1357556b2f499e37c6c69df90571f9b38.
This commit is contained in:
SpoinkyNL 2016-03-27 15:07:19 +02:00
parent 958c98dad5
commit 303133fcef
91 changed files with 6296 additions and 6296 deletions

View File

@ -1,60 +1,60 @@
using System; using System;
using System.Windows; using System.Windows;
using System.Windows.Threading; using System.Windows.Threading;
using Artemis.Utilities; using Artemis.Utilities;
using WpfExceptionViewer; using WpfExceptionViewer;
namespace Artemis namespace Artemis
{ {
/// <summary> /// <summary>
/// Interaction logic for App.xaml /// Interaction logic for App.xaml
/// </summary> /// </summary>
public partial class App : Application public partial class App : Application
{ {
public App() public App()
{ {
if (!GeneralHelpers.IsRunAsAdministrator()) if (!GeneralHelpers.IsRunAsAdministrator())
GeneralHelpers.RunAsAdministrator(); GeneralHelpers.RunAsAdministrator();
InitializeComponent(); InitializeComponent();
} }
public bool DoHandle { get; set; } public bool DoHandle { get; set; }
private void Application_Startup(object sender, StartupEventArgs e) private void Application_Startup(object sender, StartupEventArgs e)
{ {
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
} }
private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{ {
if (DoHandle) if (DoHandle)
{ {
GetArtemisExceptionViewer(e.Exception).ShowDialog(); GetArtemisExceptionViewer(e.Exception).ShowDialog();
e.Handled = true; e.Handled = true;
} }
else else
{ {
GetArtemisExceptionViewer(e.Exception).ShowDialog(); GetArtemisExceptionViewer(e.Exception).ShowDialog();
e.Handled = false; e.Handled = false;
} }
} }
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{ {
var ex = e.ExceptionObject as Exception; var ex = e.ExceptionObject as Exception;
GetArtemisExceptionViewer(ex).ShowDialog(); GetArtemisExceptionViewer(ex).ShowDialog();
} }
private static ExceptionViewer GetArtemisExceptionViewer(Exception e) private static ExceptionViewer GetArtemisExceptionViewer(Exception e)
{ {
return new ExceptionViewer("An unexpected error occurred in Artemis.", e) return new ExceptionViewer("An unexpected error occurred in Artemis.", e)
{ {
Title = "Artemis - Exception :c", Title = "Artemis - Exception :c",
Height = 400, Height = 400,
Width = 800 Width = 800
}; };
} }
} }
} }

View File

@ -1,51 +1,51 @@
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.LogitechDll; using Artemis.Utilities.LogitechDll;
using Artemis.ViewModels; using Artemis.ViewModels;
using Autofac; using Autofac;
using Caliburn.Micro; using Caliburn.Micro;
using Caliburn.Micro.Autofac; using Caliburn.Micro.Autofac;
using Application = System.Windows.Application; using Application = System.Windows.Application;
using MessageBox = System.Windows.Forms.MessageBox; using MessageBox = System.Windows.Forms.MessageBox;
namespace Artemis namespace Artemis
{ {
public class ArtemisBootstrapper : AutofacBootstrapper<SystemTrayViewModel> public class ArtemisBootstrapper : AutofacBootstrapper<SystemTrayViewModel>
{ {
public ArtemisBootstrapper() public ArtemisBootstrapper()
{ {
CheckDuplicateInstances(); CheckDuplicateInstances();
Initialize(); Initialize();
} }
protected override void ConfigureContainer(ContainerBuilder builder) protected override void ConfigureContainer(ContainerBuilder builder)
{ {
base.ConfigureContainer(builder); base.ConfigureContainer(builder);
// create a window manager instance to be used by everyone asking for one (including Caliburn.Micro) // create a window manager instance to be used by everyone asking for one (including Caliburn.Micro)
builder.RegisterInstance<IWindowManager>(new WindowManager()); builder.RegisterInstance<IWindowManager>(new WindowManager());
builder.RegisterType<SystemTrayViewModel>(); builder.RegisterType<SystemTrayViewModel>();
builder.RegisterType<ShellViewModel>(); builder.RegisterType<ShellViewModel>();
} }
protected override void OnStartup(object sender, StartupEventArgs e) protected override void OnStartup(object sender, StartupEventArgs e)
{ {
DisplayRootViewFor<SystemTrayViewModel>(); DisplayRootViewFor<SystemTrayViewModel>();
} }
private void CheckDuplicateInstances() private void CheckDuplicateInstances()
{ {
var processes = Process.GetProcesses(); var processes = Process.GetProcesses();
if (processes.Count(p => p.ProcessName == "Artemis") < 2) if (processes.Count(p => p.ProcessName == "Artemis") < 2)
return; return;
MessageBox.Show("An instance of Artemis is already running (check your system tray).", MessageBox.Show("An instance of Artemis is already running (check your system tray).",
"Artemis (╯°□°)╯︵ ┻━┻", MessageBoxButtons.OK, MessageBoxIcon.Warning); "Artemis (╯°□°)╯︵ ┻━┻", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Current.Shutdown(); Application.Current.Shutdown();
} }
} }
} }

View File

@ -1,12 +1,12 @@
namespace Artemis.Events namespace Artemis.Events
{ {
public class ActiveEffectChanged public class ActiveEffectChanged
{ {
public ActiveEffectChanged(string activeEffect) public ActiveEffectChanged(string activeEffect)
{ {
ActiveEffect = activeEffect; ActiveEffect = activeEffect;
} }
public string ActiveEffect { get; set; } public string ActiveEffect { get; set; }
} }
} }

View File

@ -1,19 +1,19 @@
using System.Drawing; using System.Drawing;
namespace Artemis.Events namespace Artemis.Events
{ {
public class ChangeBitmap public class ChangeBitmap
{ {
public ChangeBitmap(Bitmap bitmap) public ChangeBitmap(Bitmap bitmap)
{ {
Bitmap = bitmap; Bitmap = bitmap;
} }
public Bitmap Bitmap { get; private set; } public Bitmap Bitmap { get; private set; }
public void ChangeTextMessage(Bitmap bitmap) public void ChangeTextMessage(Bitmap bitmap)
{ {
Bitmap = bitmap; Bitmap = bitmap;
} }
} }
} }

View File

@ -1,12 +1,12 @@
namespace Artemis.Events namespace Artemis.Events
{ {
public class ToggleEnabled public class ToggleEnabled
{ {
public ToggleEnabled(bool enabled) public ToggleEnabled(bool enabled)
{ {
Enabled = enabled; Enabled = enabled;
} }
public bool Enabled { get; set; } public bool Enabled { get; set; }
} }
} }

View File

@ -1,32 +1,32 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
namespace Artemis.KeyboardProviders namespace Artemis.KeyboardProviders
{ {
public abstract class KeyboardProvider public abstract class KeyboardProvider
{ {
public string Name { get; set; } public string Name { get; set; }
public int Height { get; set; } public int Height { get; set; }
public int Width { get; set; } public int Width { get; set; }
public string CantEnableText { get; set; } public string CantEnableText { get; set; }
public List<KeyboardRegion> KeyboardRegions { get; set; } public List<KeyboardRegion> KeyboardRegions { get; set; }
public abstract bool CanEnable(); public abstract bool CanEnable();
public abstract void Enable(); public abstract void Enable();
public abstract void Disable(); public abstract void Disable();
public abstract void DrawBitmap(Bitmap bitmap); public abstract void DrawBitmap(Bitmap bitmap);
/// <summary> /// <summary>
/// Returns a bitmap matching the keyboard's dimensions /// Returns a bitmap matching the keyboard's dimensions
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public Bitmap KeyboardBitmap() => new Bitmap(Width, Height); public Bitmap KeyboardBitmap() => new Bitmap(Width, Height);
/// <summary> /// <summary>
/// Returns a bitmap matching the keyboard's dimensions using the provided scale /// Returns a bitmap matching the keyboard's dimensions using the provided scale
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public Bitmap KeyboardBitmap(int scale) => new Bitmap(Width*scale, Height*scale); public Bitmap KeyboardBitmap(int scale) => new Bitmap(Width*scale, Height*scale);
} }
} }

View File

@ -1,20 +1,20 @@
using System.Drawing; using System.Drawing;
namespace Artemis.KeyboardProviders namespace Artemis.KeyboardProviders
{ {
public class KeyboardRegion public class KeyboardRegion
{ {
public KeyboardRegion(string regionName, Point topLeft, Point bottomRight) public KeyboardRegion(string regionName, Point topLeft, Point bottomRight)
{ {
RegionName = regionName; RegionName = regionName;
TopLeft = topLeft; TopLeft = topLeft;
BottomRight = bottomRight; BottomRight = bottomRight;
} }
public string RegionName { get; set; } public string RegionName { get; set; }
public Point TopLeft { get; set; } public Point TopLeft { get; set; }
public Point BottomRight { get; set; } public Point BottomRight { get; set; }
public Rectangle GetRectangle() => new Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X - TopLeft.X, BottomRight.Y - TopLeft.Y); public Rectangle GetRectangle() => new Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X - TopLeft.X, BottomRight.Y - TopLeft.Y);
} }
} }

View File

@ -1,137 +1,137 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.KeyboardProviders.Logitech.Utilities
{ {
public static class KeyMap public static class KeyMap
{ {
static KeyMap() static KeyMap()
{ {
// There are several keyboard layouts // There are several keyboard layouts
// TODO: Implemented more layouts and an option to select them // TODO: Implemented more layouts and an option to select them
UsEnglishOrionKeys = new List<Key> UsEnglishOrionKeys = new List<Key>
{ {
// Row 1 // Row 1
new Key(Keys.Escape, 0, 0), new Key(Keys.Escape, 0, 0),
new Key(Keys.F1, 1, 0), new Key(Keys.F1, 1, 0),
new Key(Keys.F2, 2, 0), new Key(Keys.F2, 2, 0),
new Key(Keys.F3, 3, 0), new Key(Keys.F3, 3, 0),
new Key(Keys.F4, 4, 0), new Key(Keys.F4, 4, 0),
new Key(Keys.F5, 5, 0), new Key(Keys.F5, 5, 0),
new Key(Keys.F6, 6, 0), new Key(Keys.F6, 6, 0),
new Key(Keys.F7, 7, 0), new Key(Keys.F7, 7, 0),
new Key(Keys.F8, 8, 0), new Key(Keys.F8, 8, 0),
new Key(Keys.F9, 9, 0), new Key(Keys.F9, 9, 0),
new Key(Keys.F10, 10, 0), new Key(Keys.F10, 10, 0),
new Key(Keys.F11, 11, 0), new Key(Keys.F11, 11, 0),
new Key(Keys.F12, 12, 0), new Key(Keys.F12, 12, 0),
new Key(Keys.PrintScreen, 13, 0), new Key(Keys.PrintScreen, 13, 0),
new Key(Keys.Scroll, 14, 0), new Key(Keys.Scroll, 14, 0),
new Key(Keys.Pause, 15, 0), new Key(Keys.Pause, 15, 0),
// Row 2 // Row 2
new Key(Keys.Oemtilde, 0, 1), new Key(Keys.Oemtilde, 0, 1),
new Key(Keys.D1, 1, 1), new Key(Keys.D1, 1, 1),
new Key(Keys.D2, 2, 1), new Key(Keys.D2, 2, 1),
new Key(Keys.D3, 3, 1), new Key(Keys.D3, 3, 1),
new Key(Keys.D4, 4, 1), new Key(Keys.D4, 4, 1),
new Key(Keys.D5, 5, 1), new Key(Keys.D5, 5, 1),
new Key(Keys.D6, 6, 1), new Key(Keys.D6, 6, 1),
new Key(Keys.D7, 7, 1), new Key(Keys.D7, 7, 1),
new Key(Keys.D8, 8, 1), new Key(Keys.D8, 8, 1),
new Key(Keys.D9, 9, 1), new Key(Keys.D9, 9, 1),
new Key(Keys.D0, 10, 1), new Key(Keys.D0, 10, 1),
new Key(Keys.OemMinus, 11, 1), new Key(Keys.OemMinus, 11, 1),
new Key(Keys.Oemplus, 12, 1), new Key(Keys.Oemplus, 12, 1),
new Key(Keys.Back, 13, 1), new Key(Keys.Back, 13, 1),
new Key(Keys.Insert, 14, 1), new Key(Keys.Insert, 14, 1),
new Key(Keys.Home, 15, 1), new Key(Keys.Home, 15, 1),
new Key(Keys.PageUp, 16, 1), new Key(Keys.PageUp, 16, 1),
new Key(Keys.NumLock, 17, 1), new Key(Keys.NumLock, 17, 1),
new Key(Keys.Divide, 18, 1), new Key(Keys.Divide, 18, 1),
new Key(Keys.Multiply, 19, 1), new Key(Keys.Multiply, 19, 1),
new Key(Keys.Subtract, 20, 1), new Key(Keys.Subtract, 20, 1),
// Row 3 // Row 3
new Key(Keys.Tab, 0, 2), new Key(Keys.Tab, 0, 2),
new Key(Keys.Q, 1, 2), new Key(Keys.Q, 1, 2),
new Key(Keys.W, 2, 2), new Key(Keys.W, 2, 2),
new Key(Keys.E, 3, 2), new Key(Keys.E, 3, 2),
new Key(Keys.R, 4, 2), new Key(Keys.R, 4, 2),
new Key(Keys.T, 5, 2), new Key(Keys.T, 5, 2),
new Key(Keys.Y, 6, 2), new Key(Keys.Y, 6, 2),
new Key(Keys.U, 7, 2), new Key(Keys.U, 7, 2),
new Key(Keys.I, 8, 2), new Key(Keys.I, 8, 2),
new Key(Keys.O, 9, 2), new Key(Keys.O, 9, 2),
new Key(Keys.P, 10, 2), new Key(Keys.P, 10, 2),
new Key(Keys.OemOpenBrackets, 11, 2), new Key(Keys.OemOpenBrackets, 11, 2),
new Key(Keys.Oem6, 12, 2), new Key(Keys.Oem6, 12, 2),
new Key(Keys.Delete, 14, 2), new Key(Keys.Delete, 14, 2),
new Key(Keys.End, 15, 2), new Key(Keys.End, 15, 2),
new Key(Keys.Next, 16, 2), new Key(Keys.Next, 16, 2),
new Key(Keys.NumPad7, 17, 2), new Key(Keys.NumPad7, 17, 2),
new Key(Keys.NumPad8, 18, 2), new Key(Keys.NumPad8, 18, 2),
new Key(Keys.NumPad9, 19, 2), new Key(Keys.NumPad9, 19, 2),
new Key(Keys.Add, 20, 2), new Key(Keys.Add, 20, 2),
// Row 4 // Row 4
new Key(Keys.Capital, 0, 3), new Key(Keys.Capital, 0, 3),
new Key(Keys.A, 1, 3), new Key(Keys.A, 1, 3),
new Key(Keys.S, 2, 3), new Key(Keys.S, 2, 3),
new Key(Keys.D, 3, 3), new Key(Keys.D, 3, 3),
new Key(Keys.F, 4, 3), new Key(Keys.F, 4, 3),
new Key(Keys.G, 5, 3), new Key(Keys.G, 5, 3),
new Key(Keys.H, 6, 3), new Key(Keys.H, 6, 3),
new Key(Keys.J, 7, 3), new Key(Keys.J, 7, 3),
new Key(Keys.K, 8, 3), new Key(Keys.K, 8, 3),
new Key(Keys.L, 9, 3), new Key(Keys.L, 9, 3),
new Key(Keys.Oem1, 10, 3), new Key(Keys.Oem1, 10, 3),
new Key(Keys.Oem7, 11, 3), new Key(Keys.Oem7, 11, 3),
new Key(Keys.Oem5, 12, 3), new Key(Keys.Oem5, 12, 3),
new Key(Keys.Return, 13, 3), new Key(Keys.Return, 13, 3),
new Key(Keys.NumPad4, 17, 3), new Key(Keys.NumPad4, 17, 3),
new Key(Keys.NumPad5, 18, 3), new Key(Keys.NumPad5, 18, 3),
new Key(Keys.NumPad6, 19, 3), new Key(Keys.NumPad6, 19, 3),
// Row 5 // Row 5
new Key(Keys.LShiftKey, 1, 4), new Key(Keys.LShiftKey, 1, 4),
new Key(Keys.OemBackslash, 2, 4), new Key(Keys.OemBackslash, 2, 4),
new Key(Keys.Z, 2, 4), new Key(Keys.Z, 2, 4),
new Key(Keys.X, 3, 4), new Key(Keys.X, 3, 4),
new Key(Keys.C, 4, 4), new Key(Keys.C, 4, 4),
new Key(Keys.V, 5, 4), new Key(Keys.V, 5, 4),
new Key(Keys.B, 6, 4), new Key(Keys.B, 6, 4),
new Key(Keys.N, 7, 4), new Key(Keys.N, 7, 4),
new Key(Keys.M, 8, 4), new Key(Keys.M, 8, 4),
new Key(Keys.Oemcomma, 9, 4), new Key(Keys.Oemcomma, 9, 4),
new Key(Keys.OemPeriod, 10, 4), new Key(Keys.OemPeriod, 10, 4),
new Key(Keys.OemQuestion, 11, 4), new Key(Keys.OemQuestion, 11, 4),
new Key(Keys.RShiftKey, 13, 4), new Key(Keys.RShiftKey, 13, 4),
new Key(Keys.Up, 15, 4), new Key(Keys.Up, 15, 4),
new Key(Keys.NumPad1, 17, 4), new Key(Keys.NumPad1, 17, 4),
new Key(Keys.NumPad2, 18, 4), new Key(Keys.NumPad2, 18, 4),
new Key(Keys.NumPad3, 19, 4), new Key(Keys.NumPad3, 19, 4),
// Both returns return "Return" (Yes...) // Both returns return "Return" (Yes...)
// new OrionKey(System.Windows.Forms.Keys.Return, 20, 4), // new OrionKey(System.Windows.Forms.Keys.Return, 20, 4),
// Row 6 // Row 6
new Key(Keys.LControlKey, 0, 5), new Key(Keys.LControlKey, 0, 5),
new Key(Keys.LWin, 1, 5), new Key(Keys.LWin, 1, 5),
new Key(Keys.LMenu, 2, 5), new Key(Keys.LMenu, 2, 5),
new Key(Keys.Space, 5, 5), new Key(Keys.Space, 5, 5),
new Key(Keys.RMenu, 11, 5), new Key(Keys.RMenu, 11, 5),
new Key(Keys.RWin, 12, 5), new Key(Keys.RWin, 12, 5),
new Key(Keys.Apps, 13, 5), new Key(Keys.Apps, 13, 5),
new Key(Keys.RControlKey, 14, 5), new Key(Keys.RControlKey, 14, 5),
new Key(Keys.Left, 15, 5), new Key(Keys.Left, 15, 5),
new Key(Keys.Down, 16, 5), new Key(Keys.Down, 16, 5),
new Key(Keys.Right, 17, 5), new Key(Keys.Right, 17, 5),
new Key(Keys.NumPad0, 18, 5), new Key(Keys.NumPad0, 18, 5),
new Key(Keys.Decimal, 19, 5) new Key(Keys.Decimal, 19, 5)
}; };
} }
public static List<Key> UsEnglishOrionKeys { get; set; } public static List<Key> UsEnglishOrionKeys { get; set; }
} }
} }

View File

@ -1,111 +1,111 @@
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.KeyboardProviders.Logitech.Utilities
{ {
public enum KeyboardNames public enum KeyboardNames
{ {
ESC = 0x01, ESC = 0x01,
F1 = 0x3b, F1 = 0x3b,
F2 = 0x3c, F2 = 0x3c,
F3 = 0x3d, F3 = 0x3d,
F4 = 0x3e, F4 = 0x3e,
F5 = 0x3f, F5 = 0x3f,
F6 = 0x40, F6 = 0x40,
F7 = 0x41, F7 = 0x41,
F8 = 0x42, F8 = 0x42,
F9 = 0x43, F9 = 0x43,
F10 = 0x44, F10 = 0x44,
F11 = 0x57, F11 = 0x57,
F12 = 0x58, F12 = 0x58,
PRINT_SCREEN = 0x137, PRINT_SCREEN = 0x137,
SCROLL_LOCK = 0x46, SCROLL_LOCK = 0x46,
PAUSE_BREAK = 0x45, PAUSE_BREAK = 0x45,
TILDE = 0x29, TILDE = 0x29,
ONE = 0x02, ONE = 0x02,
TWO = 0x03, TWO = 0x03,
THREE = 0x04, THREE = 0x04,
FOUR = 0x05, FOUR = 0x05,
FIVE = 0x06, FIVE = 0x06,
SIX = 0x07, SIX = 0x07,
SEVEN = 0x08, SEVEN = 0x08,
EIGHT = 0x09, EIGHT = 0x09,
NINE = 0x0A, NINE = 0x0A,
ZERO = 0x0B, ZERO = 0x0B,
MINUS = 0x0C, MINUS = 0x0C,
EQUALS = 0x0D, EQUALS = 0x0D,
BACKSPACE = 0x0E, BACKSPACE = 0x0E,
INSERT = 0x152, INSERT = 0x152,
HOME = 0x147, HOME = 0x147,
PAGE_UP = 0x149, PAGE_UP = 0x149,
NUM_LOCK = 0x145, NUM_LOCK = 0x145,
NUM_SLASH = 0x135, NUM_SLASH = 0x135,
NUM_ASTERISK = 0x37, NUM_ASTERISK = 0x37,
NUM_MINUS = 0x4A, NUM_MINUS = 0x4A,
TAB = 0x0F, TAB = 0x0F,
Q = 0x10, Q = 0x10,
W = 0x11, W = 0x11,
E = 0x12, E = 0x12,
R = 0x13, R = 0x13,
T = 0x14, T = 0x14,
Y = 0x15, Y = 0x15,
U = 0x16, U = 0x16,
I = 0x17, I = 0x17,
O = 0x18, O = 0x18,
P = 0x19, P = 0x19,
OPEN_BRACKET = 0x1A, OPEN_BRACKET = 0x1A,
CLOSE_BRACKET = 0x1B, CLOSE_BRACKET = 0x1B,
BACKSLASH = 0x2B, BACKSLASH = 0x2B,
KEYBOARD_DELETE = 0x153, KEYBOARD_DELETE = 0x153,
END = 0x14F, END = 0x14F,
PAGE_DOWN = 0x151, PAGE_DOWN = 0x151,
NUM_SEVEN = 0x47, NUM_SEVEN = 0x47,
NUM_EIGHT = 0x48, NUM_EIGHT = 0x48,
NUM_NINE = 0x49, NUM_NINE = 0x49,
NUM_PLUS = 0x4E, NUM_PLUS = 0x4E,
CAPS_LOCK = 0x3A, CAPS_LOCK = 0x3A,
A = 0x1E, A = 0x1E,
S = 0x1F, S = 0x1F,
D = 0x20, D = 0x20,
F = 0x21, F = 0x21,
G = 0x22, G = 0x22,
H = 0x23, H = 0x23,
J = 0x24, J = 0x24,
K = 0x25, K = 0x25,
L = 0x26, L = 0x26,
SEMICOLON = 0x27, SEMICOLON = 0x27,
APOSTROPHE = 0x28, APOSTROPHE = 0x28,
ENTER = 0x1C, ENTER = 0x1C,
NUM_FOUR = 0x4B, NUM_FOUR = 0x4B,
NUM_FIVE = 0x4C, NUM_FIVE = 0x4C,
NUM_SIX = 0x4D, NUM_SIX = 0x4D,
LEFT_SHIFT = 0x2A, LEFT_SHIFT = 0x2A,
Z = 0x2C, Z = 0x2C,
X = 0x2D, X = 0x2D,
C = 0x2E, C = 0x2E,
V = 0x2F, V = 0x2F,
B = 0x30, B = 0x30,
N = 0x31, N = 0x31,
M = 0x32, M = 0x32,
COMMA = 0x33, COMMA = 0x33,
PERIOD = 0x34, PERIOD = 0x34,
FORWARD_SLASH = 0x35, FORWARD_SLASH = 0x35,
RIGHT_SHIFT = 0x36, RIGHT_SHIFT = 0x36,
ARROW_UP = 0x148, ARROW_UP = 0x148,
NUM_ONE = 0x4F, NUM_ONE = 0x4F,
NUM_TWO = 0x50, NUM_TWO = 0x50,
NUM_THREE = 0x51, NUM_THREE = 0x51,
NUM_ENTER = 0x11C, NUM_ENTER = 0x11C,
LEFT_CONTROL = 0x1D, LEFT_CONTROL = 0x1D,
LEFT_WINDOWS = 0x15B, LEFT_WINDOWS = 0x15B,
LEFT_ALT = 0x38, LEFT_ALT = 0x38,
SPACE = 0x39, SPACE = 0x39,
RIGHT_ALT = 0x138, RIGHT_ALT = 0x138,
RIGHT_WINDOWS = 0x15C, RIGHT_WINDOWS = 0x15C,
APPLICATION_SELECT = 0x15D, APPLICATION_SELECT = 0x15D,
RIGHT_CONTROL = 0x11D, RIGHT_CONTROL = 0x11D,
ARROW_LEFT = 0x14B, ARROW_LEFT = 0x14B,
ARROW_DOWN = 0x150, ARROW_DOWN = 0x150,
ARROW_RIGHT = 0x14D, ARROW_RIGHT = 0x14D,
NUM_ZERO = 0x52, NUM_ZERO = 0x52,
NUM_PERIOD = 0x53, NUM_PERIOD = 0x53,
TEST = 0x1 TEST = 0x1
} }
} }

View File

@ -1,95 +1,95 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.KeyboardProviders.Logitech.Utilities
{ {
public class LogitechGSDK public class LogitechGSDK
{ {
//LED SDK //LED SDK
private const int LOGI_DEVICETYPE_MONOCHROME_ORD = 0; private const int LOGI_DEVICETYPE_MONOCHROME_ORD = 0;
private const int LOGI_DEVICETYPE_RGB_ORD = 1; private const int LOGI_DEVICETYPE_RGB_ORD = 1;
private const int LOGI_DEVICETYPE_PERKEY_RGB_ORD = 2; private const int LOGI_DEVICETYPE_PERKEY_RGB_ORD = 2;
public const int LOGI_DEVICETYPE_MONOCHROME = 1 << LOGI_DEVICETYPE_MONOCHROME_ORD; public const int LOGI_DEVICETYPE_MONOCHROME = 1 << LOGI_DEVICETYPE_MONOCHROME_ORD;
public const int LOGI_DEVICETYPE_RGB = 1 << LOGI_DEVICETYPE_RGB_ORD; public const int LOGI_DEVICETYPE_RGB = 1 << LOGI_DEVICETYPE_RGB_ORD;
public const int LOGI_DEVICETYPE_PERKEY_RGB = 1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD; public const int LOGI_DEVICETYPE_PERKEY_RGB = 1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD;
public const int LOGI_LED_BITMAP_WIDTH = 21; public const int LOGI_LED_BITMAP_WIDTH = 21;
public const int LOGI_LED_BITMAP_HEIGHT = 6; public const int LOGI_LED_BITMAP_HEIGHT = 6;
public const int LOGI_LED_BITMAP_BYTES_PER_KEY = 4; public const int LOGI_LED_BITMAP_BYTES_PER_KEY = 4;
public const int LOGI_LED_BITMAP_SIZE = public const int LOGI_LED_BITMAP_SIZE =
LOGI_LED_BITMAP_WIDTH*LOGI_LED_BITMAP_HEIGHT*LOGI_LED_BITMAP_BYTES_PER_KEY; LOGI_LED_BITMAP_WIDTH*LOGI_LED_BITMAP_HEIGHT*LOGI_LED_BITMAP_BYTES_PER_KEY;
public const int LOGI_LED_DURATION_INFINITE = 0; public const int LOGI_LED_DURATION_INFINITE = 0;
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedInit(); public static extern bool LogiLedInit();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetTargetDevice(int targetDevice); public static extern bool LogiLedSetTargetDevice(int targetDevice);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedGetSdkVersion(ref int majorNum, ref int minorNum, ref int buildNum); public static extern bool LogiLedGetSdkVersion(ref int majorNum, ref int minorNum, ref int buildNum);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSaveCurrentLighting(); public static extern bool LogiLedSaveCurrentLighting();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage); public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedRestoreLighting(); public static extern bool LogiLedRestoreLighting();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedFlashLighting(int redPercentage, int greenPercentage, int bluePercentage, public static extern bool LogiLedFlashLighting(int redPercentage, int greenPercentage, int bluePercentage,
int milliSecondsDuration, int milliSecondsInterval); int milliSecondsDuration, int milliSecondsInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedPulseLighting(int redPercentage, int greenPercentage, int bluePercentage, public static extern bool LogiLedPulseLighting(int redPercentage, int greenPercentage, int bluePercentage,
int milliSecondsDuration, int milliSecondsInterval); int milliSecondsDuration, int milliSecondsInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedStopEffects(); public static extern bool LogiLedStopEffects();
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingFromBitmap(byte[] bitmap); public static extern bool LogiLedSetLightingFromBitmap(byte[] bitmap);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithScanCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithScanCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithHidCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithHidCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithQuartzCode(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithQuartzCode(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSetLightingForKeyWithKeyName(int keyCode, int redPercentage, public static extern bool LogiLedSetLightingForKeyWithKeyName(int keyCode, int redPercentage,
int greenPercentage, int bluePercentage); int greenPercentage, int bluePercentage);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedSaveLightingForKey(KeyboardNames keyName); public static extern bool LogiLedSaveLightingForKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedRestoreLightingForKey(KeyboardNames keyName); public static extern bool LogiLedRestoreLightingForKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedFlashSingleKey(KeyboardNames keyName, int redPercentage, int greenPercentage, public static extern bool LogiLedFlashSingleKey(KeyboardNames keyName, int redPercentage, int greenPercentage,
int bluePercentage, int msDuration, int msInterval); int bluePercentage, int msDuration, int msInterval);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedPulseSingleKey(KeyboardNames keyName, int startRedPercentage, public static extern bool LogiLedPulseSingleKey(KeyboardNames keyName, int startRedPercentage,
int startGreenPercentage, int startBluePercentage, int finishRedPercentage, int finishGreenPercentage, int startGreenPercentage, int startBluePercentage, int finishRedPercentage, int finishGreenPercentage,
int finishBluePercentage, int msDuration, bool isInfinite); int finishBluePercentage, int msDuration, bool isInfinite);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern bool LogiLedStopEffectsOnKey(KeyboardNames keyName); public static extern bool LogiLedStopEffectsOnKey(KeyboardNames keyName);
[DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)] [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
public static extern void LogiLedShutdown(); public static extern void LogiLedShutdown();
} }
} }

View File

@ -1,230 +1,230 @@
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Artemis.KeyboardProviders.Logitech.Utilities namespace Artemis.KeyboardProviders.Logitech.Utilities
{ {
public static class OrionUtilities public static class OrionUtilities
{ {
public static KeyMapping[] Keymappings = public static KeyMapping[] Keymappings =
{ {
// First row // First row
new KeyMapping(0, 0), new KeyMapping(0, 0),
new KeyMapping(1, 1), new KeyMapping(1, 1),
new KeyMapping(2, 1), new KeyMapping(2, 1),
new KeyMapping(3, 2), new KeyMapping(3, 2),
new KeyMapping(4, 3), new KeyMapping(4, 3),
new KeyMapping(5, 4), new KeyMapping(5, 4),
new KeyMapping(6, 5), new KeyMapping(6, 5),
new KeyMapping(7, 6), new KeyMapping(7, 6),
new KeyMapping(8, 7), new KeyMapping(8, 7),
new KeyMapping(9, 8), new KeyMapping(9, 8),
new KeyMapping(10, 9), new KeyMapping(10, 9),
new KeyMapping(11, 9), new KeyMapping(11, 9),
new KeyMapping(12, 10), new KeyMapping(12, 10),
new KeyMapping(13, 11), new KeyMapping(13, 11),
new KeyMapping(13, 12), new KeyMapping(13, 12),
new KeyMapping(14, 13), new KeyMapping(14, 13),
new KeyMapping(15, 14), new KeyMapping(15, 14),
new KeyMapping(16, 15), new KeyMapping(16, 15),
new KeyMapping(17, 16), new KeyMapping(17, 16),
new KeyMapping(18, 17), new KeyMapping(18, 17),
new KeyMapping(19, 18), new KeyMapping(19, 18),
// Second row // Second row
new KeyMapping(21, 21), new KeyMapping(21, 21),
new KeyMapping(22, 22), new KeyMapping(22, 22),
new KeyMapping(23, 23), new KeyMapping(23, 23),
new KeyMapping(24, 24), new KeyMapping(24, 24),
new KeyMapping(25, 25), new KeyMapping(25, 25),
new KeyMapping(26, 26), new KeyMapping(26, 26),
new KeyMapping(27, 27), new KeyMapping(27, 27),
new KeyMapping(28, 28), new KeyMapping(28, 28),
new KeyMapping(29, 29), new KeyMapping(29, 29),
new KeyMapping(30, 30), new KeyMapping(30, 30),
new KeyMapping(31, 31), new KeyMapping(31, 31),
new KeyMapping(32, 32), new KeyMapping(32, 32),
new KeyMapping(33, 33), new KeyMapping(33, 33),
new KeyMapping(34, 34), new KeyMapping(34, 34),
new KeyMapping(35, 35), new KeyMapping(35, 35),
new KeyMapping(36, 36), new KeyMapping(36, 36),
new KeyMapping(37, 37), new KeyMapping(37, 37),
new KeyMapping(38, 38), new KeyMapping(38, 38),
new KeyMapping(39, 39), new KeyMapping(39, 39),
new KeyMapping(40, 40), new KeyMapping(40, 40),
new KeyMapping(41, 41), new KeyMapping(41, 41),
// Third row // Third row
new KeyMapping(42, 42), new KeyMapping(42, 42),
new KeyMapping(43, 43), new KeyMapping(43, 43),
new KeyMapping(44, 44), new KeyMapping(44, 44),
new KeyMapping(45, 45), new KeyMapping(45, 45),
new KeyMapping(46, 46), new KeyMapping(46, 46),
new KeyMapping(47, 46), new KeyMapping(47, 46),
new KeyMapping(48, 47), new KeyMapping(48, 47),
new KeyMapping(49, 48), new KeyMapping(49, 48),
new KeyMapping(50, 49), new KeyMapping(50, 49),
new KeyMapping(51, 50), new KeyMapping(51, 50),
new KeyMapping(52, 51), new KeyMapping(52, 51),
new KeyMapping(53, 52), new KeyMapping(53, 52),
new KeyMapping(54, 53), new KeyMapping(54, 53),
new KeyMapping(54, 54), new KeyMapping(54, 54),
new KeyMapping(55, 55), new KeyMapping(55, 55),
new KeyMapping(56, 56), new KeyMapping(56, 56),
new KeyMapping(57, 57), new KeyMapping(57, 57),
new KeyMapping(58, 58), new KeyMapping(58, 58),
new KeyMapping(59, 59), new KeyMapping(59, 59),
new KeyMapping(60, 60), new KeyMapping(60, 60),
new KeyMapping(61, 61), new KeyMapping(61, 61),
new KeyMapping(62, 62), new KeyMapping(62, 62),
// Fourth row // Fourth row
new KeyMapping(63, 63), new KeyMapping(63, 63),
new KeyMapping(64, 64), new KeyMapping(64, 64),
new KeyMapping(65, 65), new KeyMapping(65, 65),
new KeyMapping(66, 65), new KeyMapping(66, 65),
new KeyMapping(67, 66), new KeyMapping(67, 66),
new KeyMapping(68, 67), new KeyMapping(68, 67),
new KeyMapping(69, 68), new KeyMapping(69, 68),
new KeyMapping(70, 69), new KeyMapping(70, 69),
new KeyMapping(71, 70), new KeyMapping(71, 70),
new KeyMapping(72, 71), new KeyMapping(72, 71),
new KeyMapping(73, 72), new KeyMapping(73, 72),
new KeyMapping(74, 73), new KeyMapping(74, 73),
new KeyMapping(75, 74), new KeyMapping(75, 74),
new KeyMapping(76, 75), new KeyMapping(76, 75),
new KeyMapping(76, 76), new KeyMapping(76, 76),
new KeyMapping(78, 77), new KeyMapping(78, 77),
new KeyMapping(79, 78), new KeyMapping(79, 78),
new KeyMapping(79, 79), new KeyMapping(79, 79),
new KeyMapping(80, 80), new KeyMapping(80, 80),
new KeyMapping(81, 81), new KeyMapping(81, 81),
new KeyMapping(82, 82), new KeyMapping(82, 82),
// Fifth row // Fifth row
new KeyMapping(84, 84), new KeyMapping(84, 84),
new KeyMapping(85, 85), new KeyMapping(85, 85),
new KeyMapping(86, 86), new KeyMapping(86, 86),
new KeyMapping(87, 87), new KeyMapping(87, 87),
new KeyMapping(88, 88), new KeyMapping(88, 88),
new KeyMapping(89, 89), new KeyMapping(89, 89),
new KeyMapping(90, 90), new KeyMapping(90, 90),
new KeyMapping(91, 91), new KeyMapping(91, 91),
new KeyMapping(92, 92), new KeyMapping(92, 92),
new KeyMapping(93, 93), new KeyMapping(93, 93),
new KeyMapping(94, 94), new KeyMapping(94, 94),
new KeyMapping(95, 95), new KeyMapping(95, 95),
new KeyMapping(96, 96), new KeyMapping(96, 96),
new KeyMapping(97, 97), new KeyMapping(97, 97),
new KeyMapping(98, 98), new KeyMapping(98, 98),
new KeyMapping(99, 99), new KeyMapping(99, 99),
new KeyMapping(100, 100), new KeyMapping(100, 100),
new KeyMapping(101, 101), new KeyMapping(101, 101),
new KeyMapping(102, 102), new KeyMapping(102, 102),
new KeyMapping(103, 103), new KeyMapping(103, 103),
new KeyMapping(104, 104), new KeyMapping(104, 104),
// Sixth row // Sixth row
new KeyMapping(105, 105), new KeyMapping(105, 105),
new KeyMapping(106, 106), new KeyMapping(106, 106),
new KeyMapping(107, 107), new KeyMapping(107, 107),
new KeyMapping(108, 107), new KeyMapping(108, 107),
new KeyMapping(109, 109), new KeyMapping(109, 109),
new KeyMapping(110, 110), new KeyMapping(110, 110),
new KeyMapping(111, 110), new KeyMapping(111, 110),
new KeyMapping(112, 111), new KeyMapping(112, 111),
new KeyMapping(113, 112), new KeyMapping(113, 112),
new KeyMapping(114, 113), new KeyMapping(114, 113),
new KeyMapping(115, 114), new KeyMapping(115, 114),
new KeyMapping(116, 115), new KeyMapping(116, 115),
new KeyMapping(115, 116), // ALTGR new KeyMapping(115, 116), // ALTGR
new KeyMapping(116, 117), new KeyMapping(116, 117),
new KeyMapping(117, 118), new KeyMapping(117, 118),
new KeyMapping(118, 119), new KeyMapping(118, 119),
new KeyMapping(119, 120), new KeyMapping(119, 120),
new KeyMapping(120, 121), new KeyMapping(120, 121),
new KeyMapping(121, 122), new KeyMapping(121, 122),
new KeyMapping(122, 123), new KeyMapping(122, 123),
new KeyMapping(124, 124), new KeyMapping(124, 124),
}; };
public static byte[] BitmapToByteArray(Bitmap b, bool remap = true) public static byte[] BitmapToByteArray(Bitmap b, bool remap = true)
{ {
if (b.Width > 21 || b.Height > 6) if (b.Width > 21 || b.Height > 6)
b = ResizeImage(b, 21, 6); b = ResizeImage(b, 21, 6);
var rect = new Rectangle(0, 0, b.Width, b.Height); var rect = new Rectangle(0, 0, b.Width, b.Height);
var bitmapData = b.LockBits(rect, ImageLockMode.ReadWrite, b.PixelFormat); var bitmapData = b.LockBits(rect, ImageLockMode.ReadWrite, b.PixelFormat);
var depth = Image.GetPixelFormatSize(b.PixelFormat); var depth = Image.GetPixelFormatSize(b.PixelFormat);
var step = depth/8; var step = depth/8;
var pixels = new byte[21*6*step]; var pixels = new byte[21*6*step];
var iptr = bitmapData.Scan0; var iptr = bitmapData.Scan0;
// Copy data from pointer to array // Copy data from pointer to array
Marshal.Copy(iptr, pixels, 0, pixels.Length); Marshal.Copy(iptr, pixels, 0, pixels.Length);
if (!remap) if (!remap)
return pixels; return pixels;
var remapped = new byte[pixels.Length]; var remapped = new byte[pixels.Length];
// Every key is 4 bytes // Every key is 4 bytes
for (var i = 0; i <= pixels.Length /4; i++) for (var i = 0; i <= pixels.Length /4; i++)
{ {
var firstSByte = Keymappings[i].Source * 4; var firstSByte = Keymappings[i].Source * 4;
var firstTByte = Keymappings[i].Target * 4; var firstTByte = Keymappings[i].Target * 4;
for (var j = 0; j < 4; j++) for (var j = 0; j < 4; j++)
remapped[firstTByte + j] = pixels[firstSByte + j]; remapped[firstTByte + j] = pixels[firstSByte + j];
} }
return remapped; return remapped;
} }
/// <summary> /// <summary>
/// Resize the image to the specified width and height. /// Resize the image to the specified width and height.
/// </summary> /// </summary>
/// <param name="image">The image to resize.</param> /// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param> /// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param> /// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns> /// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height) public static Bitmap ResizeImage(Image image, int width, int height)
{ {
var destRect = new Rectangle(0, 0, width, height); var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height); var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage)) using (var graphics = Graphics.FromImage(destImage))
{ {
graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes()) using (var wrapMode = new ImageAttributes())
{ {
wrapMode.SetWrapMode(WrapMode.TileFlipXY); wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
} }
} }
return destImage; return destImage;
} }
public struct KeyMapping public struct KeyMapping
{ {
public KeyMapping(int source, int target) public KeyMapping(int source, int target)
{ {
Source = source; Source = source;
Target = target; Target = target;
} }
public int Source { get; set; } public int Source { get; set; }
public int Target { get; set; } public int Target { get; set; }
} }
} }
} }

View File

@ -1,20 +1,20 @@
using System.Collections.Generic; using System.Collections.Generic;
using Artemis.KeyboardProviders.Corsair; using Artemis.KeyboardProviders.Corsair;
using Artemis.KeyboardProviders.Logitech; using Artemis.KeyboardProviders.Logitech;
using Artemis.KeyboardProviders.Razer; using Artemis.KeyboardProviders.Razer;
namespace Artemis.KeyboardProviders namespace Artemis.KeyboardProviders
{ {
public static class ProviderHelper public static class ProviderHelper
{ {
public static List<KeyboardProvider> GetKeyboardProviders() public static List<KeyboardProvider> GetKeyboardProviders()
{ {
return new List<KeyboardProvider> return new List<KeyboardProvider>
{ {
new CorsairRGB(), new CorsairRGB(),
new Orion(), new Orion(),
new BlackWidow() new BlackWidow()
}; };
} }
} }
} }

View File

@ -1,55 +1,55 @@
using System; using System;
using System.Drawing; using System.Drawing;
using Artemis.KeyboardProviders.Razer.Utilities; using Artemis.KeyboardProviders.Razer.Utilities;
using Corale.Colore.Core; using Corale.Colore.Core;
using Corale.Colore.Razer.Keyboard; using Corale.Colore.Razer.Keyboard;
using ColoreColor = Corale.Colore.Core.Color; using ColoreColor = Corale.Colore.Core.Color;
using KeyboardCustom = Corale.Colore.Razer.Keyboard.Effects.Custom; using KeyboardCustom = Corale.Colore.Razer.Keyboard.Effects.Custom;
namespace Artemis.KeyboardProviders.Razer namespace Artemis.KeyboardProviders.Razer
{ {
public class BlackWidow : KeyboardProvider public class BlackWidow : KeyboardProvider
{ {
public BlackWidow() public BlackWidow()
{ {
Name = "Razer BlackWidow Chroma"; Name = "Razer BlackWidow Chroma";
CantEnableText = "Couldn't connect to your Razer BlackWidow Chroma.\n " + CantEnableText = "Couldn't connect to your Razer BlackWidow Chroma.\n " +
"Please check your cables and try updating Razer Synapse.\n\n " + "Please check your cables and try updating Razer Synapse.\n\n " +
"If needed, you can select a different keyboard in Artemis under settings."; "If needed, you can select a different keyboard in Artemis under settings.";
} }
public override bool CanEnable() public override bool CanEnable()
{ {
if (!Chroma.IsSdkAvailable()) if (!Chroma.IsSdkAvailable())
return false; return false;
// Some people have Synapse installed, but not a Chroma keyboard, deal with this // Some people have Synapse installed, but not a Chroma keyboard, deal with this
var blackWidowFound = Chroma.Instance.Query(Corale.Colore.Razer.Devices.Blackwidow).Connected; var blackWidowFound = Chroma.Instance.Query(Corale.Colore.Razer.Devices.Blackwidow).Connected;
var blackWidowTeFound = Chroma.Instance.Query(Corale.Colore.Razer.Devices.BlackwidowTe).Connected; var blackWidowTeFound = Chroma.Instance.Query(Corale.Colore.Razer.Devices.BlackwidowTe).Connected;
return (blackWidowFound || blackWidowTeFound); return (blackWidowFound || blackWidowTeFound);
} }
public override void Enable() public override void Enable()
{ {
Chroma.Instance.Initialize(); Chroma.Instance.Initialize();
Height = Constants.MaxRows; Height = Constants.MaxRows;
Width = Constants.MaxColumns; Width = Constants.MaxColumns;
KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 0), new Point(19, 0))); KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 0), new Point(19, 0)));
KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(20, 1), new Point(23, 6))); KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(20, 1), new Point(23, 6)));
KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(2, 2), new Point(5, 2))); KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(2, 2), new Point(5, 2)));
} }
public override void Disable() public override void Disable()
{ {
Chroma.Instance.Uninitialize(); Chroma.Instance.Uninitialize();
} }
public override void DrawBitmap(Bitmap bitmap) public override void DrawBitmap(Bitmap bitmap)
{ {
var razerArray = RazerUtilities.BitmapColorArray(bitmap, Height, Width); var razerArray = RazerUtilities.BitmapColorArray(bitmap, Height, Width);
Chroma.Instance.Keyboard.SetCustom(razerArray); Chroma.Instance.Keyboard.SetCustom(razerArray);
} }
} }
} }

View File

@ -1,24 +1,24 @@
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using Artemis.Utilities; using Artemis.Utilities;
using Corale.Colore.Razer.Keyboard.Effects; using Corale.Colore.Razer.Keyboard.Effects;
namespace Artemis.KeyboardProviders.Razer.Utilities namespace Artemis.KeyboardProviders.Razer.Utilities
{ {
public static class RazerUtilities public static class RazerUtilities
{ {
public static Custom BitmapColorArray(Bitmap b, int height, int width) public static Custom BitmapColorArray(Bitmap b, int height, int width)
{ {
var keyboardGrid = Custom.Create(); var keyboardGrid = Custom.Create();
if (b.Width > width || b.Height > height) if (b.Width > width || b.Height > height)
b = ImageUtilities.ResizeImage(b, width, height); b = ImageUtilities.ResizeImage(b, width, height);
for (var y = 0; y < b.Height; y++) for (var y = 0; y < b.Height; y++)
for (var x = 0; x < b.Width; x++) for (var x = 0; x < b.Width; x++)
keyboardGrid[y, x] = b.GetPixel(x, y); keyboardGrid[y, x] = b.GetPixel(x, y);
return keyboardGrid; return keyboardGrid;
} }
} }
} }

View File

@ -1,20 +1,20 @@
namespace Artemis.Models namespace Artemis.Models
{ {
public abstract class EffectSettings public abstract class EffectSettings
{ {
/// <summary> /// <summary>
/// Loads the settings from the settings file /// Loads the settings from the settings file
/// </summary> /// </summary>
public abstract void Load(); public abstract void Load();
/// <summary> /// <summary>
/// Saves the settings to the settings file /// Saves the settings to the settings file
/// </summary> /// </summary>
public abstract void Save(); public abstract void Save();
/// <summary> /// <summary>
/// Returns the settings to their default value /// Returns the settings to their default value
/// </summary> /// </summary>
public abstract void ToDefault(); public abstract void ToDefault();
} }
} }

View File

@ -1,14 +1,14 @@
using Artemis.Managers; using Artemis.Managers;
namespace Artemis.Models namespace Artemis.Models
{ {
public abstract class GameModel : EffectModel public abstract class GameModel : EffectModel
{ {
public bool Enabled; public bool Enabled;
public string ProcessName; public string ProcessName;
protected GameModel(MainManager mainManager) : base(mainManager) protected GameModel(MainManager mainManager) : base(mainManager)
{ {
} }
} }
} }

View File

@ -1,46 +1,46 @@
using System.Drawing; using System.Drawing;
using Artemis.Managers; using Artemis.Managers;
namespace Artemis.Models namespace Artemis.Models
{ {
public abstract class OverlayModel : EffectModel public abstract class OverlayModel : EffectModel
{ {
private bool _enabled; private bool _enabled;
public string ProcessName; public string ProcessName;
protected OverlayModel(MainManager mainManager) : base(mainManager) protected OverlayModel(MainManager mainManager) : base(mainManager)
{ {
} }
public bool Enabled public bool Enabled
{ {
get { return _enabled; } get { return _enabled; }
set set
{ {
if (_enabled == value) if (_enabled == value)
return; return;
if (value) if (value)
Enable(); Enable();
else else
Dispose(); Dispose();
_enabled = value; _enabled = value;
} }
} }
public void SetEnabled(bool enabled) public void SetEnabled(bool enabled)
{ {
if (Enabled == enabled) if (Enabled == enabled)
return; return;
if (enabled) if (enabled)
Enable(); Enable();
else else
Dispose(); Dispose();
Enabled = enabled; Enabled = enabled;
} }
public abstract Bitmap GenerateBitmap(Bitmap bitmap); public abstract Bitmap GenerateBitmap(Bitmap bitmap);
} }
} }

View File

@ -1,37 +1,37 @@
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Effects.AmbientLightning namespace Artemis.Modules.Effects.AmbientLightning
{ {
internal class AmbientLightningEffectSettings : EffectSettings internal class AmbientLightningEffectSettings : EffectSettings
{ {
public AmbientLightningEffectSettings() public AmbientLightningEffectSettings()
{ {
Load(); Load();
} }
public int Width { get; set; } public int Width { get; set; }
public int Height { get; set; } public int Height { get; set; }
public bool Rotate { get; set; } public bool Rotate { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public LinearGradientMode Type { get; set; } public LinearGradientMode Type { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
ToDefault(); ToDefault();
} }
public sealed override void Save() public sealed override void Save()
{ {
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Width = 84; Width = 84;
Height = 24; Height = 24;
Scale = 4; Scale = 4;
Type = LinearGradientMode.Horizontal; Type = LinearGradientMode.Horizontal;
Rotate = true; Rotate = true;
} }
} }
} }

View File

@ -1,32 +1,32 @@
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Effects.AmbientLightning namespace Artemis.Modules.Effects.AmbientLightning
{ {
internal class AmbientLightningEffectViewModel : EffectViewModel, IHandle<ActiveEffectChanged> internal class AmbientLightningEffectViewModel : EffectViewModel, IHandle<ActiveEffectChanged>
{ {
public AmbientLightningEffectViewModel(MainManager mainManager) public AmbientLightningEffectViewModel(MainManager mainManager)
{ {
// Subscribe to main model // Subscribe to main model
MainManager = mainManager; MainManager = mainManager;
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
// Settings are loaded from file by class // Settings are loaded from file by class
EffectSettings = new AmbientLightningEffectSettings(); EffectSettings = new AmbientLightningEffectSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
EffectModel = new AmbientLightningEffectModel(mainManager, (AmbientLightningEffectSettings) EffectSettings); EffectModel = new AmbientLightningEffectModel(mainManager, (AmbientLightningEffectSettings) EffectSettings);
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
public static string Name => "Ambient Lightning"; public static string Name => "Ambient Lightning";
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
NotifyOfPropertyChange(() => EffectEnabled); NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -1,110 +1,110 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.42000 // Runtime Version:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace Artemis.Modules.Effects.AudioVisualizer { namespace Artemis.Modules.Effects.AudioVisualizer {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class AudioVisualization : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class AudioVisualization : global::System.Configuration.ApplicationSettingsBase {
private static AudioVisualization defaultInstance = ((AudioVisualization)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AudioVisualization()))); private static AudioVisualization defaultInstance = ((AudioVisualization)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AudioVisualization())));
public static AudioVisualization Default { public static AudioVisualization Default {
get { get {
return defaultInstance; return defaultInstance;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("4")] [global::System.Configuration.DefaultSettingValueAttribute("4")]
public int Sensitivity { public int Sensitivity {
get { get {
return ((int)(this["Sensitivity"])); return ((int)(this["Sensitivity"]));
} }
set { set {
this["Sensitivity"] = value; this["Sensitivity"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("21")] [global::System.Configuration.DefaultSettingValueAttribute("21")]
public int Bars { public int Bars {
get { get {
return ((int)(this["Bars"])); return ((int)(this["Bars"]));
} }
set { set {
this["Bars"] = value; this["Bars"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")] [global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool FromBottom { public bool FromBottom {
get { get {
return ((bool)(this["FromBottom"])); return ((bool)(this["FromBottom"]));
} }
set { set {
this["FromBottom"] = value; this["FromBottom"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("3")] [global::System.Configuration.DefaultSettingValueAttribute("3")]
public int FadeSpeed { public int FadeSpeed {
get { get {
return ((int)(this["FadeSpeed"])); return ((int)(this["FadeSpeed"]));
} }
set { set {
this["FadeSpeed"] = value; this["FadeSpeed"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("#FFF90000")] [global::System.Configuration.DefaultSettingValueAttribute("#FFF90000")]
public global::System.Windows.Media.Color TopColor { public global::System.Windows.Media.Color TopColor {
get { get {
return ((global::System.Windows.Media.Color)(this["TopColor"])); return ((global::System.Windows.Media.Color)(this["TopColor"]));
} }
set { set {
this["TopColor"] = value; this["TopColor"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("#FFFF761E")] [global::System.Configuration.DefaultSettingValueAttribute("#FFFF761E")]
public global::System.Windows.Media.Color MiddleColor { public global::System.Windows.Media.Color MiddleColor {
get { get {
return ((global::System.Windows.Media.Color)(this["MiddleColor"])); return ((global::System.Windows.Media.Color)(this["MiddleColor"]));
} }
set { set {
this["MiddleColor"] = value; this["MiddleColor"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("#FF00DF00")] [global::System.Configuration.DefaultSettingValueAttribute("#FF00DF00")]
public global::System.Windows.Media.Color BottomColor { public global::System.Windows.Media.Color BottomColor {
get { get {
return ((global::System.Windows.Media.Color)(this["BottomColor"])); return ((global::System.Windows.Media.Color)(this["BottomColor"]));
} }
set { set {
this["BottomColor"] = value; this["BottomColor"] = value;
} }
} }
} }
} }

View File

@ -1,203 +1,203 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Modules.Effects.AudioVisualizer.Utilities; using Artemis.Modules.Effects.AudioVisualizer.Utilities;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using NAudio.CoreAudioApi; using NAudio.CoreAudioApi;
using NAudio.Wave; using NAudio.Wave;
namespace Artemis.Modules.Effects.AudioVisualizer namespace Artemis.Modules.Effects.AudioVisualizer
{ {
public class AudioVisualizerModel : EffectModel public class AudioVisualizerModel : EffectModel
{ {
private const int FftLength = 2048; private const int FftLength = 2048;
private readonly SampleAggregator _sampleAggregator = new SampleAggregator(FftLength); private readonly SampleAggregator _sampleAggregator = new SampleAggregator(FftLength);
private bool _fromBottom; private bool _fromBottom;
private bool _generating; private bool _generating;
private int _sensitivity; private int _sensitivity;
private IWaveIn _waveIn; private IWaveIn _waveIn;
public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager) public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "Audiovisualizer"; Name = "Audiovisualizer";
DeviceIds = new List<string>(); DeviceIds = new List<string>();
SpectrumData = new List<byte>(); SpectrumData = new List<byte>();
Scale = 4; Scale = 4;
Initialized = false; Initialized = false;
} }
public int Lines { get; set; } public int Lines { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public AudioVisualizerSettings Settings { get; set; } public AudioVisualizerSettings Settings { get; set; }
public List<byte> SpectrumData { get; set; } public List<byte> SpectrumData { get; set; }
public List<KeyboardRectangle> SoundRectangles { get; set; } public List<KeyboardRectangle> SoundRectangles { get; set; }
public List<string> DeviceIds { get; set; } public List<string> DeviceIds { get; set; }
public string SelectedDeviceId { get; set; } public string SelectedDeviceId { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
_sampleAggregator.PerformFFT = false; _sampleAggregator.PerformFFT = false;
_sampleAggregator.FftCalculated -= FftCalculated; _sampleAggregator.FftCalculated -= FftCalculated;
_waveIn.StopRecording(); _waveIn.StopRecording();
_waveIn.DataAvailable -= OnDataAvailable; _waveIn.DataAvailable -= OnDataAvailable;
_waveIn = null; _waveIn = null;
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
Lines = MainManager.KeyboardManager.ActiveKeyboard.Width; Lines = MainManager.KeyboardManager.ActiveKeyboard.Width;
// TODO: Device selection // TODO: Device selection
SelectedDeviceId = new MMDeviceEnumerator() SelectedDeviceId = new MMDeviceEnumerator()
.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active) .EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active)
.FirstOrDefault()?.ID; .FirstOrDefault()?.ID;
// Apply settings // Apply settings
SoundRectangles = new List<KeyboardRectangle>(); SoundRectangles = new List<KeyboardRectangle>();
for (var i = 0; i < Lines; i++) for (var i = 0; i < Lines; i++)
{ {
SoundRectangles.Add(new KeyboardRectangle( SoundRectangles.Add(new KeyboardRectangle(
MainManager.KeyboardManager.ActiveKeyboard, MainManager.KeyboardManager.ActiveKeyboard,
0, 0, new List<Color> 0, 0, new List<Color>
{ {
ColorHelpers.ToDrawingColor(Settings.TopColor), ColorHelpers.ToDrawingColor(Settings.TopColor),
ColorHelpers.ToDrawingColor(Settings.MiddleColor), ColorHelpers.ToDrawingColor(Settings.MiddleColor),
ColorHelpers.ToDrawingColor(Settings.BottomColor) ColorHelpers.ToDrawingColor(Settings.BottomColor)
}, },
LinearGradientMode.Vertical) {ContainedBrush = false, Height = 0}); LinearGradientMode.Vertical) {ContainedBrush = false, Height = 0});
} }
_sensitivity = Settings.Sensitivity; _sensitivity = Settings.Sensitivity;
_fromBottom = Settings.FromBottom; _fromBottom = Settings.FromBottom;
_sampleAggregator.FftCalculated += FftCalculated; _sampleAggregator.FftCalculated += FftCalculated;
_sampleAggregator.PerformFFT = true; _sampleAggregator.PerformFFT = true;
// Start listening for sound data // Start listening for sound data
_waveIn = new WasapiLoopbackCapture(); _waveIn = new WasapiLoopbackCapture();
_waveIn.DataAvailable += OnDataAvailable; _waveIn.DataAvailable += OnDataAvailable;
_waveIn.StartRecording(); _waveIn.StartRecording();
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
// TODO: Use lock instead of a bool // TODO: Use lock instead of a bool
// Start filling the model // Start filling the model
_generating = true; _generating = true;
if (SelectedDeviceId == null) if (SelectedDeviceId == null)
return; return;
var device = new MMDeviceEnumerator() var device = new MMDeviceEnumerator()
.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active) .EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active)
.FirstOrDefault(d => d.ID == SelectedDeviceId); .FirstOrDefault(d => d.ID == SelectedDeviceId);
if (device == null || SpectrumData == null) if (device == null || SpectrumData == null)
return; return;
if (!SpectrumData.Any()) if (!SpectrumData.Any())
return; return;
// Parse spectrum data // Parse spectrum data
for (var i = 0; i < Lines; i++) for (var i = 0; i < Lines; i++)
{ {
int height; int height;
if (SpectrumData.Count - 1 < i || SpectrumData[i] == 0) if (SpectrumData.Count - 1 < i || SpectrumData[i] == 0)
height = 0; height = 0;
else else
height = (int) Math.Round(SpectrumData[i]/2.55); height = (int) Math.Round(SpectrumData[i]/2.55);
// Apply Sensitivity setting // Apply Sensitivity setting
height = height*_sensitivity; height = height*_sensitivity;
var keyboardHeight = var keyboardHeight =
(int) Math.Round(MainManager.KeyboardManager.ActiveKeyboard.Height/100.00*height*Scale); (int) Math.Round(MainManager.KeyboardManager.ActiveKeyboard.Height/100.00*height*Scale);
if (keyboardHeight > SoundRectangles[i].Height) if (keyboardHeight > SoundRectangles[i].Height)
SoundRectangles[i].Height = keyboardHeight; SoundRectangles[i].Height = keyboardHeight;
else else
SoundRectangles[i].Height = SoundRectangles[i].Height - Settings.FadeSpeed; SoundRectangles[i].Height = SoundRectangles[i].Height - Settings.FadeSpeed;
// Apply Bars setting // Apply Bars setting
SoundRectangles[i].X = i*Scale; SoundRectangles[i].X = i*Scale;
SoundRectangles[i].Width = Scale; SoundRectangles[i].Width = Scale;
if (_fromBottom) if (_fromBottom)
SoundRectangles[i].Y = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale - SoundRectangles[i].Y = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale -
SoundRectangles[i].Height; SoundRectangles[i].Height;
} }
_generating = false; _generating = false;
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
if (SpectrumData == null || SoundRectangles == null) if (SpectrumData == null || SoundRectangles == null)
return null; return null;
// Lock the _spectrumData array while busy with it // Lock the _spectrumData array while busy with it
_generating = true; _generating = true;
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
foreach (var soundRectangle in SoundRectangles) foreach (var soundRectangle in SoundRectangles)
soundRectangle.Draw(g); soundRectangle.Draw(g);
} }
_generating = false; _generating = false;
return bitmap; return bitmap;
} }
private void OnDataAvailable(object sender, WaveInEventArgs e) private void OnDataAvailable(object sender, WaveInEventArgs e)
{ {
var buffer = e.Buffer; var buffer = e.Buffer;
var bytesRecorded = e.BytesRecorded; var bytesRecorded = e.BytesRecorded;
var bufferIncrement = _waveIn.WaveFormat.BlockAlign; var bufferIncrement = _waveIn.WaveFormat.BlockAlign;
for (var index = 0; index < bytesRecorded; index += bufferIncrement) for (var index = 0; index < bytesRecorded; index += bufferIncrement)
{ {
var sample32 = BitConverter.ToSingle(buffer, index); var sample32 = BitConverter.ToSingle(buffer, index);
_sampleAggregator.Add(sample32); _sampleAggregator.Add(sample32);
} }
} }
private void FftCalculated(object sender, FftEventArgs e) private void FftCalculated(object sender, FftEventArgs e)
{ {
if (_generating) if (_generating)
return; return;
int x; int x;
var b0 = 0; var b0 = 0;
SpectrumData.Clear(); SpectrumData.Clear();
for (x = 0; x < Lines; x++) for (x = 0; x < Lines; x++)
{ {
float peak = 0; float peak = 0;
var b1 = (int) Math.Pow(2, x*10.0/(Lines - 1)); var b1 = (int) Math.Pow(2, x*10.0/(Lines - 1));
if (b1 > 2047) if (b1 > 2047)
b1 = 2047; b1 = 2047;
if (b1 <= b0) if (b1 <= b0)
b1 = b0 + 1; b1 = b0 + 1;
for (; b0 < b1; b0++) for (; b0 < b1; b0++)
{ {
if (peak < e.Result[1 + b0].X) if (peak < e.Result[1 + b0].X)
peak = e.Result[1 + b0].X; peak = e.Result[1 + b0].X;
} }
var y = (int) (Math.Sqrt(peak)*3*255 - 4); var y = (int) (Math.Sqrt(peak)*3*255 - 4);
if (y > 255) if (y > 255)
y = 255; y = 255;
if (y < 0) if (y < 0)
y = 0; y = 0;
SpectrumData.Add((byte) y); SpectrumData.Add((byte) y);
} }
} }
} }
} }

View File

@ -1,56 +1,56 @@
using System.Windows.Media; using System.Windows.Media;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Effects.AudioVisualizer namespace Artemis.Modules.Effects.AudioVisualizer
{ {
public class AudioVisualizerSettings : EffectSettings public class AudioVisualizerSettings : EffectSettings
{ {
public AudioVisualizerSettings() public AudioVisualizerSettings()
{ {
Load(); Load();
} }
public int Sensitivity { get; set; } public int Sensitivity { get; set; }
public int Bars { get; set; } public int Bars { get; set; }
public bool FromBottom { get; set; } public bool FromBottom { get; set; }
public int FadeSpeed { get; set; } public int FadeSpeed { get; set; }
public Color TopColor { get; set; } public Color TopColor { get; set; }
public Color MiddleColor { get; set; } public Color MiddleColor { get; set; }
public Color BottomColor { get; set; } public Color BottomColor { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
Sensitivity = AudioVisualization.Default.Sensitivity; Sensitivity = AudioVisualization.Default.Sensitivity;
Bars = AudioVisualization.Default.Bars; Bars = AudioVisualization.Default.Bars;
FromBottom = AudioVisualization.Default.FromBottom; FromBottom = AudioVisualization.Default.FromBottom;
FadeSpeed = AudioVisualization.Default.FadeSpeed; FadeSpeed = AudioVisualization.Default.FadeSpeed;
TopColor = AudioVisualization.Default.TopColor; TopColor = AudioVisualization.Default.TopColor;
MiddleColor = AudioVisualization.Default.MiddleColor; MiddleColor = AudioVisualization.Default.MiddleColor;
BottomColor = AudioVisualization.Default.BottomColor; BottomColor = AudioVisualization.Default.BottomColor;
} }
public sealed override void Save() public sealed override void Save()
{ {
AudioVisualization.Default.Sensitivity = Sensitivity; AudioVisualization.Default.Sensitivity = Sensitivity;
AudioVisualization.Default.Bars = Bars; AudioVisualization.Default.Bars = Bars;
AudioVisualization.Default.FromBottom = FromBottom; AudioVisualization.Default.FromBottom = FromBottom;
AudioVisualization.Default.FadeSpeed = FadeSpeed; AudioVisualization.Default.FadeSpeed = FadeSpeed;
AudioVisualization.Default.TopColor = TopColor; AudioVisualization.Default.TopColor = TopColor;
AudioVisualization.Default.MiddleColor = MiddleColor; AudioVisualization.Default.MiddleColor = MiddleColor;
AudioVisualization.Default.BottomColor = BottomColor; AudioVisualization.Default.BottomColor = BottomColor;
AudioVisualization.Default.Save(); AudioVisualization.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Sensitivity = 4; Sensitivity = 4;
Bars = 21; Bars = 21;
FromBottom = true; FromBottom = true;
FadeSpeed = 3; FadeSpeed = 3;
TopColor = Color.FromArgb(255, 249, 0, 0); TopColor = Color.FromArgb(255, 249, 0, 0);
MiddleColor = Color.FromArgb(255, 255, 118, 30); MiddleColor = Color.FromArgb(255, 255, 118, 30);
BottomColor = Color.FromArgb(255, 0, 223, 0); BottomColor = Color.FromArgb(255, 0, 223, 0);
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Effects.AudioVisualizer namespace Artemis.Modules.Effects.AudioVisualizer
{ {
/// <summary> /// <summary>
/// Interaction logic for AudioVisualizerView.xaml /// Interaction logic for AudioVisualizerView.xaml
/// </summary> /// </summary>
public partial class AudioVisualizerView : UserControl public partial class AudioVisualizerView : UserControl
{ {
public AudioVisualizerView() public AudioVisualizerView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,31 +1,31 @@
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Effects.AudioVisualizer namespace Artemis.Modules.Effects.AudioVisualizer
{ {
public class AudioVisualizerViewModel : EffectViewModel, IHandle<ActiveEffectChanged> public class AudioVisualizerViewModel : EffectViewModel, IHandle<ActiveEffectChanged>
{ {
public AudioVisualizerViewModel(MainManager mainManager) public AudioVisualizerViewModel(MainManager mainManager)
{ {
// Subscribe to main model // Subscribe to main model
MainManager = mainManager; MainManager = mainManager;
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
// Settings are loaded from file by class // Settings are loaded from file by class
EffectSettings = new AudioVisualizerSettings(); EffectSettings = new AudioVisualizerSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
EffectModel = new AudioVisualizerModel(mainManager, (AudioVisualizerSettings) EffectSettings); EffectModel = new AudioVisualizerModel(mainManager, (AudioVisualizerSettings) EffectSettings);
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
public static string Name => "Audio Visualizer"; public static string Name => "Audio Visualizer";
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
NotifyOfPropertyChange(() => EffectEnabled); NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -2,16 +2,16 @@ using System;
using System.Diagnostics; using System.Diagnostics;
using NAudio.Dsp; using NAudio.Dsp;
namespace Artemis.Modules.Effects.AudioVisualizer.Utilities namespace Artemis.Modules.Effects.AudioVisualizer.Utilities
{ {
public class FftEventArgs : EventArgs public class FftEventArgs : EventArgs
{ {
[DebuggerStepThrough] [DebuggerStepThrough]
public FftEventArgs(Complex[] result) public FftEventArgs(Complex[] result)
{ {
Result = result; Result = result;
} }
public Complex[] Result { get; private set; } public Complex[] Result { get; private set; }
} }
} }

View File

@ -1,55 +1,55 @@
using System; using System;
using NAudio.Dsp; using NAudio.Dsp;
namespace Artemis.Modules.Effects.AudioVisualizer.Utilities namespace Artemis.Modules.Effects.AudioVisualizer.Utilities
{ // The Complex and FFT are here! { // The Complex and FFT are here!
public class SampleAggregator public class SampleAggregator
{ {
private readonly FftEventArgs fftArgs; private readonly FftEventArgs fftArgs;
// This Complex is NAudio's own! // This Complex is NAudio's own!
private readonly Complex[] fftBuffer; private readonly Complex[] fftBuffer;
private readonly int fftLength; private readonly int fftLength;
private readonly int m; private readonly int m;
private int fftPos; private int fftPos;
public SampleAggregator(int fftLength) public SampleAggregator(int fftLength)
{ {
if (!IsPowerOfTwo(fftLength)) if (!IsPowerOfTwo(fftLength))
{ {
throw new ArgumentException("FFT Length must be a power of two"); throw new ArgumentException("FFT Length must be a power of two");
} }
m = (int) Math.Log(fftLength, 2.0); m = (int) Math.Log(fftLength, 2.0);
this.fftLength = fftLength; this.fftLength = fftLength;
fftBuffer = new Complex[fftLength]; fftBuffer = new Complex[fftLength];
fftArgs = new FftEventArgs(fftBuffer); fftArgs = new FftEventArgs(fftBuffer);
} }
public bool PerformFFT { get; set; } public bool PerformFFT { get; set; }
// FFT // FFT
public event EventHandler<FftEventArgs> FftCalculated; public event EventHandler<FftEventArgs> FftCalculated;
private bool IsPowerOfTwo(int x) private bool IsPowerOfTwo(int x)
{ {
return (x & (x - 1)) == 0; return (x & (x - 1)) == 0;
} }
public void Add(float value) public void Add(float value)
{ {
if (PerformFFT && FftCalculated != null) if (PerformFFT && FftCalculated != null)
{ {
// Remember the window function! There are many others as well. // Remember the window function! There are many others as well.
fftBuffer[fftPos].X = (float) (value*FastFourierTransform.HammingWindow(fftPos, fftLength)); fftBuffer[fftPos].X = (float) (value*FastFourierTransform.HammingWindow(fftPos, fftLength));
fftBuffer[fftPos].Y = 0; // This is always zero with audio. fftBuffer[fftPos].Y = 0; // This is always zero with audio.
fftPos++; fftPos++;
if (fftPos >= fftLength) if (fftPos >= fftLength)
{ {
fftPos = 0; fftPos = 0;
FastFourierTransform.FFT(true, m, fftBuffer); FastFourierTransform.FFT(true, m, fftBuffer);
FftCalculated(this, fftArgs); FftCalculated(this, fftArgs);
} }
} }
} }
} }
} }

View File

@ -1,71 +1,71 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
namespace Artemis.Modules.Effects.Debug namespace Artemis.Modules.Effects.Debug
{ {
internal class DebugEffectModel : EffectModel internal class DebugEffectModel : EffectModel
{ {
public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager) public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager)
{ {
Name = "Debug Effect"; Name = "Debug Effect";
Settings = settings; Settings = settings;
Scale = 4; Scale = 4;
Initialized = false; Initialized = false;
} }
public int Scale { get; set; } public int Scale { get; set; }
public DebugEffectSettings Settings { get; set; } public DebugEffectSettings Settings { get; set; }
public KeyboardRectangle KeyboardRectangle { get; set; } public KeyboardRectangle KeyboardRectangle { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
KeyboardRectangle = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color> KeyboardRectangle = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color>
{ {
Color.Red, Color.Red,
Color.OrangeRed, Color.OrangeRed,
Color.Yellow, Color.Yellow,
Color.Green, Color.Green,
Color.Blue, Color.Blue,
Color.Purple, Color.Purple,
Color.DeepPink Color.DeepPink
}, LinearGradientMode.Horizontal); }, LinearGradientMode.Horizontal);
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
KeyboardRectangle.Height = Settings.Height; KeyboardRectangle.Height = Settings.Height;
KeyboardRectangle.Width = Settings.Width; KeyboardRectangle.Width = Settings.Width;
KeyboardRectangle.GradientMode = Settings.Type; KeyboardRectangle.GradientMode = Settings.Type;
KeyboardRectangle.Rotate = Settings.Rotate; KeyboardRectangle.Rotate = Settings.Rotate;
KeyboardRectangle.Scale = Settings.Scale; KeyboardRectangle.Scale = Settings.Scale;
Scale = Settings.Scale; Scale = Settings.Scale;
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
var bitmap = new Bitmap(21*Scale, 6*Scale); var bitmap = new Bitmap(21*Scale, 6*Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
KeyboardRectangle.Draw(g); KeyboardRectangle.Draw(g);
} }
return bitmap; return bitmap;
} }
} }
} }

View File

@ -1,37 +1,37 @@
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Effects.Debug namespace Artemis.Modules.Effects.Debug
{ {
internal class DebugEffectSettings : EffectSettings internal class DebugEffectSettings : EffectSettings
{ {
public DebugEffectSettings() public DebugEffectSettings()
{ {
Load(); Load();
} }
public int Width { get; set; } public int Width { get; set; }
public int Height { get; set; } public int Height { get; set; }
public bool Rotate { get; set; } public bool Rotate { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public LinearGradientMode Type { get; set; } public LinearGradientMode Type { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
ToDefault(); ToDefault();
} }
public sealed override void Save() public sealed override void Save()
{ {
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Width = 84; Width = 84;
Height = 24; Height = 24;
Scale = 4; Scale = 4;
Type = LinearGradientMode.Horizontal; Type = LinearGradientMode.Horizontal;
Rotate = true; Rotate = true;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Effects.Debug namespace Artemis.Modules.Effects.Debug
{ {
/// <summary> /// <summary>
/// Interaction logic for DebugEffectView.xaml /// Interaction logic for DebugEffectView.xaml
/// </summary> /// </summary>
public partial class DebugEffectView : UserControl public partial class DebugEffectView : UserControl
{ {
public DebugEffectView() public DebugEffectView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,85 +1,85 @@
using System; using System;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Effects.Debug namespace Artemis.Modules.Effects.Debug
{ {
internal class DebugEffectViewModel : EffectViewModel, IHandle<ChangeBitmap>, IHandle<ActiveEffectChanged> internal class DebugEffectViewModel : EffectViewModel, IHandle<ChangeBitmap>, IHandle<ActiveEffectChanged>
{ {
private ImageSource _imageSource; private ImageSource _imageSource;
private string _selectedRectangleType; private string _selectedRectangleType;
public DebugEffectViewModel(MainManager mainManager) public DebugEffectViewModel(MainManager mainManager)
{ {
// Subscribe to main model // Subscribe to main model
MainManager = mainManager; MainManager = mainManager;
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
// Settings are loaded from file by class // Settings are loaded from file by class
EffectSettings = new DebugEffectSettings(); EffectSettings = new DebugEffectSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
EffectModel = new DebugEffectModel(mainManager, (DebugEffectSettings) EffectSettings); EffectModel = new DebugEffectModel(mainManager, (DebugEffectSettings) EffectSettings);
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
public static string Name => "Debug Effect"; public static string Name => "Debug Effect";
public BindableCollection<string> RectangleTypes public BindableCollection<string> RectangleTypes
=> new BindableCollection<string>(Enum.GetNames(typeof (LinearGradientMode))); => new BindableCollection<string>(Enum.GetNames(typeof (LinearGradientMode)));
public string SelectedRectangleType public string SelectedRectangleType
{ {
get { return _selectedRectangleType; } get { return _selectedRectangleType; }
set set
{ {
if (value == _selectedRectangleType) return; if (value == _selectedRectangleType) return;
_selectedRectangleType = value; _selectedRectangleType = value;
NotifyOfPropertyChange(() => SelectedRectangleType); NotifyOfPropertyChange(() => SelectedRectangleType);
((DebugEffectSettings) EffectSettings).Type = ((DebugEffectSettings) EffectSettings).Type =
(LinearGradientMode) Enum.Parse(typeof (LinearGradientMode), value); (LinearGradientMode) Enum.Parse(typeof (LinearGradientMode), value);
} }
} }
public ImageSource ImageSource public ImageSource ImageSource
{ {
get { return _imageSource; } get { return _imageSource; }
set set
{ {
_imageSource = value; _imageSource = value;
NotifyOfPropertyChange(() => ImageSource); NotifyOfPropertyChange(() => ImageSource);
} }
} }
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
NotifyOfPropertyChange(() => EffectEnabled); NotifyOfPropertyChange(() => EffectEnabled);
} }
public void Handle(ChangeBitmap message) public void Handle(ChangeBitmap message)
{ {
using (var memory = new MemoryStream()) using (var memory = new MemoryStream())
{ {
message.Bitmap.Save(memory, ImageFormat.Png); message.Bitmap.Save(memory, ImageFormat.Png);
memory.Position = 0; memory.Position = 0;
var bitmapImage = new BitmapImage(); var bitmapImage = new BitmapImage();
bitmapImage.BeginInit(); bitmapImage.BeginInit();
bitmapImage.StreamSource = memory; bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit(); bitmapImage.EndInit();
ImageSource = bitmapImage; ImageSource = bitmapImage;
} }
} }
} }
} }

View File

@ -1,40 +1,40 @@
using System.Drawing; using System.Drawing;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Effects.TypeHole namespace Artemis.Modules.Effects.TypeHole
{ {
public class TypeHoleModel : EffectModel public class TypeHoleModel : EffectModel
{ {
public TypeHoleModel(MainManager mainManager) : base(mainManager) public TypeHoleModel(MainManager mainManager) : base(mainManager)
{ {
Name = "TypeHole"; Name = "TypeHole";
Initialized = false; Initialized = false;
} }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
// Disable logic // Disable logic
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
// Enable logic // Enable logic
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
return null; return null;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Effects.TypeHole namespace Artemis.Modules.Effects.TypeHole
{ {
/// <summary> /// <summary>
/// Interaction logic for TypeHoleView.xaml /// Interaction logic for TypeHoleView.xaml
/// </summary> /// </summary>
public partial class TypeHoleView : UserControl public partial class TypeHoleView : UserControl
{ {
public TypeHoleView() public TypeHoleView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,28 +1,28 @@
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Effects.TypeHole namespace Artemis.Modules.Effects.TypeHole
{ {
public class TypeHoleViewModel : EffectViewModel, IHandle<ActiveEffectChanged> public class TypeHoleViewModel : EffectViewModel, IHandle<ActiveEffectChanged>
{ {
public TypeHoleViewModel(MainManager mainManager) public TypeHoleViewModel(MainManager mainManager)
{ {
// Subscribe to main model // Subscribe to main model
MainManager = mainManager; MainManager = mainManager;
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
EffectModel = new TypeHoleModel(mainManager); EffectModel = new TypeHoleModel(mainManager);
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
public static string Name => "Type Holes (NYI)"; public static string Name => "Type Holes (NYI)";
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
NotifyOfPropertyChange(() => EffectEnabled); NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -1,98 +1,98 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.42000 // Runtime Version:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace Artemis.Settings { namespace Artemis.Settings {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class TypeWave : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class TypeWave : global::System.Configuration.ApplicationSettingsBase {
private static TypeWave defaultInstance = ((TypeWave)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new TypeWave()))); private static TypeWave defaultInstance = ((TypeWave)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new TypeWave())));
public static TypeWave Default { public static TypeWave Default {
get { get {
return defaultInstance; return defaultInstance;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")] [global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool IsRandomColors { public bool IsRandomColors {
get { get {
return ((bool)(this["IsRandomColors"])); return ((bool)(this["IsRandomColors"]));
} }
set { set {
this["IsRandomColors"] = value; this["IsRandomColors"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("#FFFF0000")] [global::System.Configuration.DefaultSettingValueAttribute("#FFFF0000")]
public global::System.Windows.Media.Color WaveColor { public global::System.Windows.Media.Color WaveColor {
get { get {
return ((global::System.Windows.Media.Color)(this["WaveColor"])); return ((global::System.Windows.Media.Color)(this["WaveColor"]));
} }
set { set {
this["WaveColor"] = value; this["WaveColor"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")] [global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool IsShiftColors { public bool IsShiftColors {
get { get {
return ((bool)(this["IsShiftColors"])); return ((bool)(this["IsShiftColors"]));
} }
set { set {
this["IsShiftColors"] = value; this["IsShiftColors"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("20")] [global::System.Configuration.DefaultSettingValueAttribute("20")]
public int ShiftColorSpeed { public int ShiftColorSpeed {
get { get {
return ((int)(this["ShiftColorSpeed"])); return ((int)(this["ShiftColorSpeed"]));
} }
set { set {
this["ShiftColorSpeed"] = value; this["ShiftColorSpeed"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("500")] [global::System.Configuration.DefaultSettingValueAttribute("500")]
public int TimeToLive { public int TimeToLive {
get { get {
return ((int)(this["TimeToLive"])); return ((int)(this["TimeToLive"]));
} }
set { set {
this["TimeToLive"] = value; this["TimeToLive"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("4")] [global::System.Configuration.DefaultSettingValueAttribute("4")]
public int SpreadSpeed { public int SpreadSpeed {
get { get {
return ((int)(this["SpreadSpeed"])); return ((int)(this["SpreadSpeed"]));
} }
set { set {
this["SpreadSpeed"] = value; this["SpreadSpeed"] = value;
} }
} }
} }
} }

View File

@ -1,152 +1,152 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.KeyboardProviders.Corsair; using Artemis.KeyboardProviders.Corsair;
using Artemis.KeyboardProviders.Logitech.Utilities; using Artemis.KeyboardProviders.Logitech.Utilities;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Utilities; using Artemis.Utilities;
namespace Artemis.Modules.Effects.TypeWave namespace Artemis.Modules.Effects.TypeWave
{ {
public class TypeWaveModel : EffectModel public class TypeWaveModel : EffectModel
{ {
private readonly List<Wave> _waves; private readonly List<Wave> _waves;
private Color _randomColor; private Color _randomColor;
public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager) public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager)
{ {
Name = "TypeWave"; Name = "TypeWave";
_waves = new List<Wave>(); _waves = new List<Wave>();
_randomColor = Color.Red; _randomColor = Color.Red;
Settings = settings; Settings = settings;
Initialized = false; Initialized = false;
Scale = 4; Scale = 4;
} }
public int Scale { get; set; } public int Scale { get; set; }
public TypeWaveSettings Settings { get; set; } public TypeWaveSettings Settings { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
MainManager.KeyboardHook.KeyDownCallback -= KeyboardHookOnKeyDownCallback; MainManager.KeyboardHook.KeyDownCallback -= KeyboardHookOnKeyDownCallback;
} }
private void KeyboardHookOnKeyDownCallback(KeyEventArgs e) private void KeyboardHookOnKeyDownCallback(KeyEventArgs e)
{ {
// More than 25 waves is pointless // More than 25 waves is pointless
if (_waves.Count >= 25) if (_waves.Count >= 25)
return; return;
var keyMatch = KeyMap.UsEnglishOrionKeys.FirstOrDefault(k => k.KeyCode == e.KeyCode); var keyMatch = KeyMap.UsEnglishOrionKeys.FirstOrDefault(k => k.KeyCode == e.KeyCode);
if (keyMatch == null) if (keyMatch == null)
return; return;
_waves.Add(Settings.IsRandomColors _waves.Add(Settings.IsRandomColors
? new Wave(new Point(keyMatch.PosX * Scale, keyMatch.PosY * Scale), 0, _randomColor) ? new Wave(new Point(keyMatch.PosX * Scale, keyMatch.PosY * Scale), 0, _randomColor)
: new Wave(new Point(keyMatch.PosX * Scale, keyMatch.PosY * Scale), 0, : new Wave(new Point(keyMatch.PosX * Scale, keyMatch.PosY * Scale), 0,
ColorHelpers.ToDrawingColor(Settings.WaveColor))); ColorHelpers.ToDrawingColor(Settings.WaveColor)));
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
// Listener won't start unless the effect is active // Listener won't start unless the effect is active
MainManager.KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback; MainManager.KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback;
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
if (Settings.IsRandomColors) if (Settings.IsRandomColors)
_randomColor = ColorHelpers.ShiftColor(_randomColor, 25); _randomColor = ColorHelpers.ShiftColor(_randomColor, 25);
for (var i = 0; i < _waves.Count; i++) for (var i = 0; i < _waves.Count; i++)
{ {
// TODO: Get from settings // TODO: Get from settings
var fps = 25; var fps = 25;
_waves[i].Size += Settings.SpreadSpeed * Scale; _waves[i].Size += Settings.SpreadSpeed * Scale;
if (Settings.IsShiftColors) if (Settings.IsShiftColors)
_waves[i].Color = ColorHelpers.ShiftColor(_waves[i].Color, Settings.ShiftColorSpeed); _waves[i].Color = ColorHelpers.ShiftColor(_waves[i].Color, Settings.ShiftColorSpeed);
var decreaseAmount = 255/(Settings.TimeToLive/fps); var decreaseAmount = 255/(Settings.TimeToLive/fps);
_waves[i].Color = Color.FromArgb( _waves[i].Color = Color.FromArgb(
_waves[i].Color.A - decreaseAmount, _waves[i].Color.R, _waves[i].Color.A - decreaseAmount, _waves[i].Color.R,
_waves[i].Color.G, _waves[i].Color.G,
_waves[i].Color.B); _waves[i].Color.B);
if (_waves[i].Color.A >= decreaseAmount) if (_waves[i].Color.A >= decreaseAmount)
continue; continue;
_waves.RemoveAt(i); _waves.RemoveAt(i);
i--; i--;
} }
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
if (_waves.Count == 0) if (_waves.Count == 0)
return null; return null;
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
g.SmoothingMode = SmoothingMode.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality;
// Don't want a for-each, collection is changed in different thread // Don't want a for-each, collection is changed in different thread
// ReSharper disable once ForCanBeConvertedToForeach // ReSharper disable once ForCanBeConvertedToForeach
for (var i = 0; i < _waves.Count; i++) for (var i = 0; i < _waves.Count; i++)
{ {
if (_waves[i].Size == 0) if (_waves[i].Size == 0)
continue; continue;
var path = new GraphicsPath(); var path = new GraphicsPath();
path.AddEllipse(_waves[i].Point.X - _waves[i].Size/2, _waves[i].Point.Y - _waves[i].Size/2, path.AddEllipse(_waves[i].Point.X - _waves[i].Size/2, _waves[i].Point.Y - _waves[i].Size/2,
_waves[i].Size, _waves[i].Size); _waves[i].Size, _waves[i].Size);
Color fillColor; Color fillColor;
if (MainManager.KeyboardManager.ActiveKeyboard is CorsairRGB) if (MainManager.KeyboardManager.ActiveKeyboard is CorsairRGB)
fillColor = Color.Black; fillColor = Color.Black;
else else
fillColor = Color.Transparent; fillColor = Color.Transparent;
var pthGrBrush = new PathGradientBrush(path) var pthGrBrush = new PathGradientBrush(path)
{ {
SurroundColors = new[] {_waves[i].Color}, SurroundColors = new[] {_waves[i].Color},
CenterColor = fillColor CenterColor = fillColor
}; };
g.FillPath(pthGrBrush, path); g.FillPath(pthGrBrush, path);
pthGrBrush.FocusScales = new PointF(0.3f, 0.8f); pthGrBrush.FocusScales = new PointF(0.3f, 0.8f);
g.FillPath(pthGrBrush, path); g.FillPath(pthGrBrush, path);
g.DrawEllipse(new Pen(pthGrBrush, 1), _waves[i].Point.X - _waves[i].Size/2, g.DrawEllipse(new Pen(pthGrBrush, 1), _waves[i].Point.X - _waves[i].Size/2,
_waves[i].Point.Y - _waves[i].Size/2, _waves[i].Size, _waves[i].Size); _waves[i].Point.Y - _waves[i].Size/2, _waves[i].Size, _waves[i].Size);
} }
} }
return bitmap; return bitmap;
} }
} }
public class Wave public class Wave
{ {
public Wave(Point point, int size, Color color) public Wave(Point point, int size, Color color)
{ {
Point = point; Point = point;
Size = size; Size = size;
Color = color; Color = color;
} }
public Point Point { get; set; } public Point Point { get; set; }
public int Size { get; set; } public int Size { get; set; }
public Color Color { get; set; } public Color Color { get; set; }
} }
} }

View File

@ -1,52 +1,52 @@
using System.Windows.Media; using System.Windows.Media;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Effects.TypeWave namespace Artemis.Modules.Effects.TypeWave
{ {
public class TypeWaveSettings : EffectSettings public class TypeWaveSettings : EffectSettings
{ {
public TypeWaveSettings() public TypeWaveSettings()
{ {
Load(); Load();
} }
public bool IsRandomColors { get; set; } public bool IsRandomColors { get; set; }
public Color WaveColor { get; set; } public Color WaveColor { get; set; }
public bool IsShiftColors { get; set; } public bool IsShiftColors { get; set; }
public int ShiftColorSpeed { get; set; } public int ShiftColorSpeed { get; set; }
public int TimeToLive { get; set; } public int TimeToLive { get; set; }
public int SpreadSpeed { get; set; } public int SpreadSpeed { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
IsRandomColors = Settings.TypeWave.Default.IsRandomColors; IsRandomColors = Settings.TypeWave.Default.IsRandomColors;
WaveColor = Settings.TypeWave.Default.WaveColor; WaveColor = Settings.TypeWave.Default.WaveColor;
IsShiftColors = Settings.TypeWave.Default.IsShiftColors; IsShiftColors = Settings.TypeWave.Default.IsShiftColors;
ShiftColorSpeed = Settings.TypeWave.Default.ShiftColorSpeed; ShiftColorSpeed = Settings.TypeWave.Default.ShiftColorSpeed;
TimeToLive = Settings.TypeWave.Default.TimeToLive; TimeToLive = Settings.TypeWave.Default.TimeToLive;
SpreadSpeed = Settings.TypeWave.Default.SpreadSpeed; SpreadSpeed = Settings.TypeWave.Default.SpreadSpeed;
} }
public sealed override void Save() public sealed override void Save()
{ {
Settings.TypeWave.Default.IsRandomColors = IsRandomColors; Settings.TypeWave.Default.IsRandomColors = IsRandomColors;
Settings.TypeWave.Default.WaveColor = WaveColor; Settings.TypeWave.Default.WaveColor = WaveColor;
Settings.TypeWave.Default.IsShiftColors = IsShiftColors; Settings.TypeWave.Default.IsShiftColors = IsShiftColors;
Settings.TypeWave.Default.ShiftColorSpeed = ShiftColorSpeed; Settings.TypeWave.Default.ShiftColorSpeed = ShiftColorSpeed;
Settings.TypeWave.Default.TimeToLive = TimeToLive; Settings.TypeWave.Default.TimeToLive = TimeToLive;
Settings.TypeWave.Default.SpreadSpeed = SpreadSpeed; Settings.TypeWave.Default.SpreadSpeed = SpreadSpeed;
Settings.TypeWave.Default.Save(); Settings.TypeWave.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
IsRandomColors = true; IsRandomColors = true;
WaveColor = Color.FromArgb(255, 255, 0, 0); WaveColor = Color.FromArgb(255, 255, 0, 0);
IsShiftColors = true; IsShiftColors = true;
ShiftColorSpeed = 20; ShiftColorSpeed = 20;
TimeToLive = 500; TimeToLive = 500;
SpreadSpeed = 4; SpreadSpeed = 4;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Effects.TypeWave namespace Artemis.Modules.Effects.TypeWave
{ {
/// <summary> /// <summary>
/// Interaction logic for TypeWaveView.xaml /// Interaction logic for TypeWaveView.xaml
/// </summary> /// </summary>
public partial class TypeWaveView : UserControl public partial class TypeWaveView : UserControl
{ {
public TypeWaveView() public TypeWaveView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,31 +1,31 @@
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Effects.TypeWave namespace Artemis.Modules.Effects.TypeWave
{ {
public class TypeWaveViewModel : EffectViewModel, IHandle<ActiveEffectChanged> public class TypeWaveViewModel : EffectViewModel, IHandle<ActiveEffectChanged>
{ {
public TypeWaveViewModel(MainManager mainManager) public TypeWaveViewModel(MainManager mainManager)
{ {
// Subscribe to main model // Subscribe to main model
MainManager = mainManager; MainManager = mainManager;
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
// Settings are loaded from file by class // Settings are loaded from file by class
EffectSettings = new TypeWaveSettings(); EffectSettings = new TypeWaveSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
EffectModel = new TypeWaveModel(mainManager, (TypeWaveSettings) EffectSettings); EffectModel = new TypeWaveModel(mainManager, (TypeWaveSettings) EffectSettings);
MainManager.EffectManager.EffectModels.Add(EffectModel); MainManager.EffectManager.EffectModels.Add(EffectModel);
} }
public static string Name => "Type Waves"; public static string Name => "Type Waves";
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
NotifyOfPropertyChange(() => EffectEnabled); NotifyOfPropertyChange(() => EffectEnabled);
} }
} }
} }

View File

@ -1,209 +1,209 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using Artemis.KeyboardProviders; using Artemis.KeyboardProviders;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.GameState; using Artemis.Utilities.GameState;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
public class CounterStrikeModel : GameModel public class CounterStrikeModel : GameModel
{ {
private KeyboardRegion _topRow; private KeyboardRegion _topRow;
public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) : base(mainManager) public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "CounterStrike"; Name = "CounterStrike";
ProcessName = "csgo"; ProcessName = "csgo";
Scale = 4; Scale = 4;
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
Initialized = false; Initialized = false;
} }
public CounterStrikeSettings Settings { get; set; } public CounterStrikeSettings Settings { get; set; }
public KeyboardRectangle EventRect { get; set; } public KeyboardRectangle EventRect { get; set; }
public KeyboardRectangle TeamRect { get; set; } public KeyboardRectangle TeamRect { get; set; }
public KeyboardRectangle AmmoRect { get; set; } public KeyboardRectangle AmmoRect { get; set; }
public JObject CsJson { get; set; } public JObject CsJson { get; set; }
public bool DrawingSmoke { get; set; } public bool DrawingSmoke { get; set; }
public bool DrawingFlash { get; set; } public bool DrawingFlash { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
MainManager.GameStateWebServer.GameDataReceived -= HandleGameData; MainManager.GameStateWebServer.GameDataReceived -= HandleGameData;
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
// Some keyboards have a different baseline, Corsair F-keys start at row 1 // Some keyboards have a different baseline, Corsair F-keys start at row 1
_topRow = MainManager.KeyboardManager.ActiveKeyboard.KeyboardRegions.First(r => r.RegionName == "TopRow"); _topRow = MainManager.KeyboardManager.ActiveKeyboard.KeyboardRegions.First(r => r.RegionName == "TopRow");
AmmoRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X, AmmoRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) {Height = Scale, ContainedBrush = false}; LinearGradientMode.Horizontal) {Height = Scale, ContainedBrush = false};
TeamRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X + 1, TeamRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X + 1,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale - Scale Height = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale - Scale
}; };
EventRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X + 1, EventRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, _topRow.TopLeft.X + 1,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale - Scale Height = MainManager.KeyboardManager.ActiveKeyboard.Height*Scale - Scale
}; };
MainManager.GameStateWebServer.GameDataReceived += HandleGameData; MainManager.GameStateWebServer.GameDataReceived += HandleGameData;
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
if (CsJson == null) if (CsJson == null)
return; return;
if (Settings.AmmoEnabled) if (Settings.AmmoEnabled)
UpdateAmmo(); UpdateAmmo();
if (Settings.TeamColorEnabled) if (Settings.TeamColorEnabled)
UpdateTeam(); UpdateTeam();
if (Settings.LowHpEnabled) if (Settings.LowHpEnabled)
UpdateHealth(); UpdateHealth();
if (Settings.FlashEnabled) if (Settings.FlashEnabled)
UpdateFlash(); UpdateFlash();
if (Settings.SmokeEnabled) if (Settings.SmokeEnabled)
UpdateSmoke(); UpdateSmoke();
} }
private void UpdateHealth() private void UpdateHealth()
{ {
if (CsJson["player"]?["state"]?["health"] == null) if (CsJson["player"]?["state"]?["health"] == null)
return; return;
var health = CsJson["player"]["state"]["health"].Value<int>(); var health = CsJson["player"]["state"]["health"].Value<int>();
if (health > 25 || health < 1) if (health > 25 || health < 1)
return; return;
TeamRect.Colors = new List<Color> {Color.Red, Color.OrangeRed, Color.Red, Color.OrangeRed}; TeamRect.Colors = new List<Color> {Color.Red, Color.OrangeRed, Color.Red, Color.OrangeRed};
} }
private void UpdateSmoke() private void UpdateSmoke()
{ {
if (CsJson["player"]?["state"]?["smoked"] == null) if (CsJson["player"]?["state"]?["smoked"] == null)
return; return;
var smoked = CsJson["player"]["state"]["smoked"].Value<int>(); var smoked = CsJson["player"]["state"]["smoked"].Value<int>();
if (smoked == 0 && !DrawingSmoke) if (smoked == 0 && !DrawingSmoke)
return; return;
EventRect.Colors = new List<Color> {Color.FromArgb(smoked, 255, 255, 255)}; EventRect.Colors = new List<Color> {Color.FromArgb(smoked, 255, 255, 255)};
DrawingSmoke = smoked != 0; DrawingSmoke = smoked != 0;
} }
private void UpdateFlash() private void UpdateFlash()
{ {
if (CsJson["player"]?["state"]?["flashed"] == null) if (CsJson["player"]?["state"]?["flashed"] == null)
return; return;
var flashed = CsJson["player"]["state"]["flashed"].Value<int>(); var flashed = CsJson["player"]["state"]["flashed"].Value<int>();
if (flashed == 0 && !DrawingFlash) if (flashed == 0 && !DrawingFlash)
return; return;
EventRect.Colors = new List<Color> {Color.FromArgb(flashed, 255, 255, 255)}; EventRect.Colors = new List<Color> {Color.FromArgb(flashed, 255, 255, 255)};
DrawingFlash = flashed != 0; DrawingFlash = flashed != 0;
} }
private void UpdateTeam() private void UpdateTeam()
{ {
var currentTeam = CsJson["player"]?["team"]; var currentTeam = CsJson["player"]?["team"];
if (currentTeam == null) if (currentTeam == null)
return; return;
var t1 = Color.FromArgb(255, 255, 129, 0); var t1 = Color.FromArgb(255, 255, 129, 0);
var t2 = Color.FromArgb(255, 255, 170, 125); var t2 = Color.FromArgb(255, 255, 170, 125);
var ct1 = Color.FromArgb(255, 203, 238, 255); var ct1 = Color.FromArgb(255, 203, 238, 255);
var ct2 = Color.FromArgb(255, 0, 173, 255); var ct2 = Color.FromArgb(255, 0, 173, 255);
TeamRect.Colors = currentTeam.Value<string>() == "T" TeamRect.Colors = currentTeam.Value<string>() == "T"
? new List<Color> {t1, t2, t1, t2} ? new List<Color> {t1, t2, t1, t2}
: new List<Color> {ct1, ct2, ct1, ct2}; : new List<Color> {ct1, ct2, ct1, ct2};
TeamRect.Rotate = true; TeamRect.Rotate = true;
} }
private void UpdateAmmo() private void UpdateAmmo()
{ {
if (CsJson["player"]["weapons"] == null) if (CsJson["player"]["weapons"] == null)
return; return;
var activeWeapon = var activeWeapon =
CsJson["player"]["weapons"].Children() CsJson["player"]["weapons"].Children()
.Select(c => c.First) .Select(c => c.First)
.FirstOrDefault(w => w["state"]?.Value<string>() == "active"); .FirstOrDefault(w => w["state"]?.Value<string>() == "active");
// Update the ammo display // Update the ammo display
if (activeWeapon?["ammo_clip_max"] == null || activeWeapon["ammo_clip"] == null) if (activeWeapon?["ammo_clip_max"] == null || activeWeapon["ammo_clip"] == null)
return; return;
var maxAmmo = activeWeapon["ammo_clip_max"].Value<int>(); var maxAmmo = activeWeapon["ammo_clip_max"].Value<int>();
var ammo = activeWeapon["ammo_clip"].Value<int>(); var ammo = activeWeapon["ammo_clip"].Value<int>();
if (maxAmmo < 0) if (maxAmmo < 0)
return; return;
var ammoPercentage = (int) Math.Ceiling(100.00/maxAmmo)*ammo; var ammoPercentage = (int) Math.Ceiling(100.00/maxAmmo)*ammo;
AmmoRect.Width = (int) Math.Floor(_topRow.BottomRight.Y/100.00*ammoPercentage)*Scale; AmmoRect.Width = (int) Math.Floor(_topRow.BottomRight.Y/100.00*ammoPercentage)*Scale;
AmmoRect.Colors = new List<Color> AmmoRect.Colors = new List<Color>
{ {
ColorHelpers.ToDrawingColor(Settings.AmmoMainColor), ColorHelpers.ToDrawingColor(Settings.AmmoMainColor),
ColorHelpers.ToDrawingColor(Settings.AmmoSecondaryColor) ColorHelpers.ToDrawingColor(Settings.AmmoSecondaryColor)
}; };
// Low ammo indicator // Low ammo indicator
if (ammoPercentage < 37) if (ammoPercentage < 37)
AmmoRect.StartBlink(1000); AmmoRect.StartBlink(1000);
else else
AmmoRect.StopBlink(); AmmoRect.StopBlink();
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
AmmoRect.Draw(g); AmmoRect.Draw(g);
TeamRect.Draw(g); TeamRect.Draw(g);
EventRect.Draw(g); EventRect.Draw(g);
} }
return bitmap; return bitmap;
} }
public void HandleGameData(object sender, GameDataReceivedEventArgs e) public void HandleGameData(object sender, GameDataReceivedEventArgs e)
{ {
var jsonString = e.Json.ToString(); var jsonString = e.Json.ToString();
// Ensure it's CS:GO JSON // Ensure it's CS:GO JSON
if (!jsonString.Contains("Counter-Strike: Global Offensive")) if (!jsonString.Contains("Counter-Strike: Global Offensive"))
return; return;
// Parse the JSON // Parse the JSON
CsJson = JsonConvert.DeserializeObject<JObject>(jsonString); CsJson = JsonConvert.DeserializeObject<JObject>(jsonString);
} }
} }
} }

View File

@ -1,71 +1,71 @@
using System.Windows.Media; using System.Windows.Media;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
public class CounterStrikeSettings : GameSettings public class CounterStrikeSettings : GameSettings
{ {
public CounterStrikeSettings() public CounterStrikeSettings()
{ {
Load(); Load();
} }
public string GameDirectory { get; set; } public string GameDirectory { get; set; }
public bool AmmoEnabled { get; set; } public bool AmmoEnabled { get; set; }
public Color AmmoMainColor { get; set; } public Color AmmoMainColor { get; set; }
public Color AmmoSecondaryColor { get; set; } public Color AmmoSecondaryColor { get; set; }
public bool TeamColorEnabled { get; set; } public bool TeamColorEnabled { get; set; }
public bool FlashEnabled { get; set; } public bool FlashEnabled { get; set; }
public bool SmokeEnabled { get; set; } public bool SmokeEnabled { get; set; }
public bool LowHpEnabled { get; set; } public bool LowHpEnabled { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
Enabled = CounterStrike.Default.Enabled; Enabled = CounterStrike.Default.Enabled;
GameDirectory = CounterStrike.Default.GameDirectory; GameDirectory = CounterStrike.Default.GameDirectory;
AmmoEnabled = CounterStrike.Default.AmmoEnabled; AmmoEnabled = CounterStrike.Default.AmmoEnabled;
AmmoMainColor = CounterStrike.Default.AmmoMainColor; AmmoMainColor = CounterStrike.Default.AmmoMainColor;
AmmoSecondaryColor = CounterStrike.Default.AmmoSecondaryColor; AmmoSecondaryColor = CounterStrike.Default.AmmoSecondaryColor;
TeamColorEnabled = CounterStrike.Default.TeamColorEnabled; TeamColorEnabled = CounterStrike.Default.TeamColorEnabled;
FlashEnabled = CounterStrike.Default.FlashEnabled; FlashEnabled = CounterStrike.Default.FlashEnabled;
SmokeEnabled = CounterStrike.Default.SmokeEnabled; SmokeEnabled = CounterStrike.Default.SmokeEnabled;
LowHpEnabled = CounterStrike.Default.LowHpEnabled; LowHpEnabled = CounterStrike.Default.LowHpEnabled;
} }
public sealed override void Save() public sealed override void Save()
{ {
CounterStrike.Default.Enabled = Enabled; CounterStrike.Default.Enabled = Enabled;
CounterStrike.Default.GameDirectory = GameDirectory; CounterStrike.Default.GameDirectory = GameDirectory;
CounterStrike.Default.AmmoEnabled = AmmoEnabled; CounterStrike.Default.AmmoEnabled = AmmoEnabled;
CounterStrike.Default.AmmoMainColor = AmmoMainColor; CounterStrike.Default.AmmoMainColor = AmmoMainColor;
CounterStrike.Default.AmmoSecondaryColor = AmmoSecondaryColor; CounterStrike.Default.AmmoSecondaryColor = AmmoSecondaryColor;
CounterStrike.Default.TeamColorEnabled = TeamColorEnabled; CounterStrike.Default.TeamColorEnabled = TeamColorEnabled;
CounterStrike.Default.FlashEnabled = FlashEnabled; CounterStrike.Default.FlashEnabled = FlashEnabled;
CounterStrike.Default.SmokeEnabled = SmokeEnabled; CounterStrike.Default.SmokeEnabled = SmokeEnabled;
CounterStrike.Default.LowHpEnabled = LowHpEnabled; CounterStrike.Default.LowHpEnabled = LowHpEnabled;
CounterStrike.Default.Save(); CounterStrike.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Enabled = true; Enabled = true;
GameDirectory = string.Empty; GameDirectory = string.Empty;
AmmoEnabled = true; AmmoEnabled = true;
AmmoMainColor = Color.FromArgb(255, 38, 246, 0); AmmoMainColor = Color.FromArgb(255, 38, 246, 0);
AmmoSecondaryColor = Color.FromArgb(255, 255, 41, 0); AmmoSecondaryColor = Color.FromArgb(255, 255, 41, 0);
TeamColorEnabled = true; TeamColorEnabled = true;
FlashEnabled = true; FlashEnabled = true;
SmokeEnabled = true; SmokeEnabled = true;
LowHpEnabled = true; LowHpEnabled = true;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
/// <summary> /// <summary>
/// Interaction logic for CounterStrikeView.xaml /// Interaction logic for CounterStrikeView.xaml
/// </summary> /// </summary>
public partial class CounterStrikeView : UserControl public partial class CounterStrikeView : UserControl
{ {
public CounterStrikeView() public CounterStrikeView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,64 +1,64 @@
using System.IO; using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Properties; using Artemis.Properties;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
public class CounterStrikeViewModel : GameViewModel public class CounterStrikeViewModel : GameViewModel
{ {
public CounterStrikeViewModel(MainManager mainManager) public CounterStrikeViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
// Settings are loaded from file by class // Settings are loaded from file by class
GameSettings = new CounterStrikeSettings(); GameSettings = new CounterStrikeSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
GameModel = new CounterStrikeModel(mainManager, (CounterStrikeSettings) GameSettings); GameModel = new CounterStrikeModel(mainManager, (CounterStrikeSettings) GameSettings);
MainManager.EffectManager.EffectModels.Add(GameModel); MainManager.EffectManager.EffectModels.Add(GameModel);
PlaceConfigFile(); PlaceConfigFile();
} }
public static string Name => "CS:GO"; public static string Name => "CS:GO";
public string Content => "Counter-Strike: GO Content"; public string Content => "Counter-Strike: GO Content";
public void BrowseDirectory() public void BrowseDirectory()
{ {
var dialog = new FolderBrowserDialog {SelectedPath = ((CounterStrikeSettings) GameSettings).GameDirectory}; var dialog = new FolderBrowserDialog {SelectedPath = ((CounterStrikeSettings) GameSettings).GameDirectory};
var result = dialog.ShowDialog(); var result = dialog.ShowDialog();
if (result != DialogResult.OK) if (result != DialogResult.OK)
return; return;
((CounterStrikeSettings) GameSettings).GameDirectory = dialog.SelectedPath; ((CounterStrikeSettings) GameSettings).GameDirectory = dialog.SelectedPath;
NotifyOfPropertyChange(() => GameSettings); NotifyOfPropertyChange(() => GameSettings);
GameSettings.Save(); GameSettings.Save();
PlaceConfigFile(); PlaceConfigFile();
} }
public void PlaceConfigFile() public void PlaceConfigFile()
{ {
if (((CounterStrikeSettings) GameSettings).GameDirectory == string.Empty) if (((CounterStrikeSettings) GameSettings).GameDirectory == string.Empty)
return; return;
if (Directory.Exists(((CounterStrikeSettings) GameSettings).GameDirectory + "/csgo/cfg")) if (Directory.Exists(((CounterStrikeSettings) GameSettings).GameDirectory + "/csgo/cfg"))
{ {
var cfgFile = Resources.csgoGamestateConfiguration.Replace("{{port}}", var cfgFile = Resources.csgoGamestateConfiguration.Replace("{{port}}",
MainManager.GameStateWebServer.Port.ToString()); MainManager.GameStateWebServer.Port.ToString());
File.WriteAllText( File.WriteAllText(
((CounterStrikeSettings) GameSettings).GameDirectory + "/csgo/cfg/gamestate_integration_artemis.cfg", ((CounterStrikeSettings) GameSettings).GameDirectory + "/csgo/cfg/gamestate_integration_artemis.cfg",
cfgFile); cfgFile);
return; return;
} }
MainManager.DialogService.ShowErrorMessageBox("Please select a valid CS:GO directory\n\n" + MainManager.DialogService.ShowErrorMessageBox("Please select a valid CS:GO directory\n\n" +
@"By default CS:GO is in \SteamApps\common\Counter-Strike Global Offensive"); @"By default CS:GO is in \SteamApps\common\Counter-Strike Global Offensive");
((CounterStrikeSettings) GameSettings).GameDirectory = string.Empty; ((CounterStrikeSettings) GameSettings).GameDirectory = string.Empty;
NotifyOfPropertyChange(() => GameSettings); NotifyOfPropertyChange(() => GameSettings);
GameSettings.Save(); GameSettings.Save();
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Games.Dota2 namespace Artemis.Modules.Games.Dota2
{ {
/// <summary> /// <summary>
/// Interaction logic for Dota2View.xaml /// Interaction logic for Dota2View.xaml
/// </summary> /// </summary>
public partial class Dota2View : UserControl public partial class Dota2View : UserControl
{ {
public Dota2View() public Dota2View()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,43 +1,43 @@
using System.Windows.Media; using System.Windows.Media;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
public class RocketLeagueSettings : GameSettings public class RocketLeagueSettings : GameSettings
{ {
public RocketLeagueSettings() public RocketLeagueSettings()
{ {
Load(); Load();
} }
public Color MainColor { get; set; } public Color MainColor { get; set; }
public Color SecondaryColor { get; set; } public Color SecondaryColor { get; set; }
public bool ContextualColor { get; set; } public bool ContextualColor { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
Enabled = RocketLeague.Default.Enabled; Enabled = RocketLeague.Default.Enabled;
MainColor = RocketLeague.Default.MainColor; MainColor = RocketLeague.Default.MainColor;
SecondaryColor = RocketLeague.Default.SecondaryColor; SecondaryColor = RocketLeague.Default.SecondaryColor;
ContextualColor = RocketLeague.Default.ContextualColor; ContextualColor = RocketLeague.Default.ContextualColor;
} }
public sealed override void Save() public sealed override void Save()
{ {
RocketLeague.Default.Enabled = Enabled; RocketLeague.Default.Enabled = Enabled;
RocketLeague.Default.MainColor = MainColor; RocketLeague.Default.MainColor = MainColor;
RocketLeague.Default.SecondaryColor = SecondaryColor; RocketLeague.Default.SecondaryColor = SecondaryColor;
RocketLeague.Default.ContextualColor = ContextualColor; RocketLeague.Default.ContextualColor = ContextualColor;
RocketLeague.Default.Save(); RocketLeague.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Enabled = true; Enabled = true;
MainColor = Color.FromArgb(255, 255, 80, 0); MainColor = Color.FromArgb(255, 255, 80, 0);
SecondaryColor = Color.FromArgb(255, 255, 0, 0); SecondaryColor = Color.FromArgb(255, 255, 0, 0);
ContextualColor = false; ContextualColor = false;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
/// <summary> /// <summary>
/// Interaction logic for RocketLeagueView.xaml /// Interaction logic for RocketLeagueView.xaml
/// </summary> /// </summary>
public partial class RocketLeagueView : UserControl public partial class RocketLeagueView : UserControl
{ {
public RocketLeagueView() public RocketLeagueView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,60 +1,60 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Settings; using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Memory; using Artemis.Utilities.Memory;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
public class RocketLeagueViewModel : GameViewModel public class RocketLeagueViewModel : GameViewModel
{ {
private string _versionText; private string _versionText;
public RocketLeagueViewModel(MainManager mainManager) public RocketLeagueViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
// Settings are loaded from file by class // Settings are loaded from file by class
GameSettings = new RocketLeagueSettings(); GameSettings = new RocketLeagueSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
GameModel = new RocketLeagueModel(mainManager, (RocketLeagueSettings) GameSettings); GameModel = new RocketLeagueModel(mainManager, (RocketLeagueSettings) GameSettings);
MainManager.EffectManager.EffectModels.Add(GameModel); MainManager.EffectManager.EffectModels.Add(GameModel);
SetVersionText(); SetVersionText();
} }
public static string Name => "Rocket League"; public static string Name => "Rocket League";
public string VersionText public string VersionText
{ {
get { return _versionText; } get { return _versionText; }
set set
{ {
if (value == _versionText) return; if (value == _versionText) return;
_versionText = value; _versionText = value;
NotifyOfPropertyChange(() => VersionText); NotifyOfPropertyChange(() => VersionText);
} }
} }
public RocketLeagueModel RocketLeagueModel { get; set; } public RocketLeagueModel RocketLeagueModel { get; set; }
private void SetVersionText() private void SetVersionText()
{ {
if (!General.Default.EnablePointersUpdate) if (!General.Default.EnablePointersUpdate)
{ {
VersionText = "Note: You disabled pointer updates, this could result in the " + VersionText = "Note: You disabled pointer updates, this could result in the " +
"Rocket League effect not working after a game update."; "Rocket League effect not working after a game update.";
return; return;
} }
Updater.GetPointers(); Updater.GetPointers();
var version = JsonConvert var version = JsonConvert
.DeserializeObject<GamePointersCollection>(Offsets.Default.RocketLeague) .DeserializeObject<GamePointersCollection>(Offsets.Default.RocketLeague)
.GameVersion; .GameVersion;
VersionText = $"Note: Requires patch {version}. When a new patch is released Artemis downloads " + VersionText = $"Note: Requires patch {version}. When a new patch is released Artemis downloads " +
"new pointers for the latest version (unless disabled in settings)."; "new pointers for the latest version (unless disabled in settings).";
} }
} }
} }

View File

@ -1,257 +1,257 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Modules.Effects.TypeWave; using Artemis.Modules.Effects.TypeWave;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Artemis.Utilities.LogitechDll; using Artemis.Utilities.LogitechDll;
using CUE.NET; using CUE.NET;
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
public class TheDivisionModel : GameModel public class TheDivisionModel : GameModel
{ {
private Wave _ammoWave; private Wave _ammoWave;
private TheDivisionDataModel _dataModel; private TheDivisionDataModel _dataModel;
private KeyboardRectangle _hpRect; private KeyboardRectangle _hpRect;
private KeyboardRectangle _p2; private KeyboardRectangle _p2;
private KeyboardRectangle _p3; private KeyboardRectangle _p3;
private KeyboardRectangle _p4; private KeyboardRectangle _p4;
private StickyValue<bool> _stickyAmmo; private StickyValue<bool> _stickyAmmo;
private StickyValue<bool> _stickyHp; private StickyValue<bool> _stickyHp;
private int _trans; private int _trans;
public TheDivisionModel(MainManager mainManager, TheDivisionSettings settings) : base(mainManager) public TheDivisionModel(MainManager mainManager, TheDivisionSettings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "TheDivision"; Name = "TheDivision";
ProcessName = "TheDivision"; ProcessName = "TheDivision";
Scale = 4; Scale = 4;
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
Initialized = false; Initialized = false;
} }
public TheDivisionSettings Settings { get; set; } public TheDivisionSettings Settings { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
DllManager.RestoreDll(); DllManager.RestoreDll();
_stickyAmmo.Dispose(); _stickyAmmo.Dispose();
_stickyHp.Dispose(); _stickyHp.Dispose();
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
_ammoWave = new Wave(new Point(30, 14), 0, Color.Transparent); _ammoWave = new Wave(new Point(30, 14), 0, Color.Transparent);
_hpRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 3*Scale, 0*Scale, _hpRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 3*Scale, 0*Scale,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = 7*Scale, Height = 7*Scale,
Width = 21*Scale, Width = 21*Scale,
Rotate = true, Rotate = true,
ContainedBrush = false ContainedBrush = false
}; };
_p2 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 1*Scale, _p2 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 1*Scale,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = 2*Scale, Height = 2*Scale,
Width = 3*Scale, Width = 3*Scale,
Rotate = true, Rotate = true,
ContainedBrush = false ContainedBrush = false
}; };
_p3 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 3*Scale, _p3 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 3*Scale,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = 2*Scale, Height = 2*Scale,
Width = 3*Scale, Width = 3*Scale,
Rotate = true, Rotate = true,
ContainedBrush = false ContainedBrush = false
}; };
_p4 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 5*Scale, _p4 = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0*Scale, 5*Scale,
new List<Color>(), new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Height = 2*Scale, Height = 2*Scale,
Width = 3*Scale, Width = 3*Scale,
Rotate = true, Rotate = true,
ContainedBrush = false ContainedBrush = false
}; };
_stickyAmmo = new StickyValue<bool>(200); _stickyAmmo = new StickyValue<bool>(200);
_stickyHp = new StickyValue<bool>(200); _stickyHp = new StickyValue<bool>(200);
DllManager.PlaceDll(); DllManager.PlaceDll();
_dataModel = new TheDivisionDataModel(); _dataModel = new TheDivisionDataModel();
for (var i = 1; i < 5; i++) for (var i = 1; i < 5; i++)
_dataModel.DivisionPlayers.Add(new DivisionPlayer(i)); _dataModel.DivisionPlayers.Add(new DivisionPlayer(i));
MainManager.PipeServer.PipeMessage += PipeServerOnPipeMessage; MainManager.PipeServer.PipeMessage += PipeServerOnPipeMessage;
Initialized = true; Initialized = true;
} }
private void PipeServerOnPipeMessage(string reply) private void PipeServerOnPipeMessage(string reply)
{ {
if (!Initialized) if (!Initialized)
return; return;
// Convert the given string to a list of ints // Convert the given string to a list of ints
var stringParts = reply.Split(' '); var stringParts = reply.Split(' ');
var parts = new int[stringParts.Length]; var parts = new int[stringParts.Length];
for (var i = 0; i < stringParts.Length; i++) for (var i = 0; i < stringParts.Length; i++)
parts[i] = int.Parse(stringParts[i]); parts[i] = int.Parse(stringParts[i]);
if (parts[0] == 1) if (parts[0] == 1)
InterpertrateDivisionKey(parts); InterpertrateDivisionKey(parts);
} }
// Parses Division key data to game data // Parses Division key data to game data
private void InterpertrateDivisionKey(int[] parts) private void InterpertrateDivisionKey(int[] parts)
{ {
var keyCode = parts[1]; var keyCode = parts[1];
var rPer = parts[2]; var rPer = parts[2];
var gPer = parts[3]; var gPer = parts[3];
var bPer = parts[4]; var bPer = parts[4];
// F1 to F4 indicate the player and his party. Blinks red on damage taken // F1 to F4 indicate the player and his party. Blinks red on damage taken
if (keyCode >= 59 && keyCode <= 62) if (keyCode >= 59 && keyCode <= 62)
{ {
var playerId = keyCode - 58; var playerId = keyCode - 58;
var playerDataModel = _dataModel.DivisionPlayers.FirstOrDefault(p => p.Id == playerId); var playerDataModel = _dataModel.DivisionPlayers.FirstOrDefault(p => p.Id == playerId);
if (playerDataModel == null) if (playerDataModel == null)
return; return;
if (gPer > 10) if (gPer > 10)
playerDataModel.PlayerState = PlayerState.Online; playerDataModel.PlayerState = PlayerState.Online;
else if (rPer > 10) else if (rPer > 10)
playerDataModel.PlayerState = PlayerState.Hit; playerDataModel.PlayerState = PlayerState.Hit;
else else
playerDataModel.PlayerState = PlayerState.Offline; playerDataModel.PlayerState = PlayerState.Offline;
} }
// R blinks white when low on ammo // R blinks white when low on ammo
else if (keyCode == 19) else if (keyCode == 19)
{ {
_stickyAmmo.Value = rPer == 100 && gPer > 1 && bPer > 1; _stickyAmmo.Value = rPer == 100 && gPer > 1 && bPer > 1;
_dataModel.LowAmmo = _stickyAmmo.Value; _dataModel.LowAmmo = _stickyAmmo.Value;
} }
// G turns white when holding a grenade, turns off when out of grenades // G turns white when holding a grenade, turns off when out of grenades
else if (keyCode == 34) else if (keyCode == 34)
{ {
if (rPer == 100 && gPer < 10 && bPer < 10) if (rPer == 100 && gPer < 10 && bPer < 10)
_dataModel.GrenadeState = GrenadeState.HasGrenade; _dataModel.GrenadeState = GrenadeState.HasGrenade;
else if (rPer == 100 && gPer > 10 && bPer > 10) else if (rPer == 100 && gPer > 10 && bPer > 10)
_dataModel.GrenadeState = GrenadeState.GrenadeEquipped; _dataModel.GrenadeState = GrenadeState.GrenadeEquipped;
else else
_dataModel.GrenadeState = GrenadeState.HasNoGrenade; _dataModel.GrenadeState = GrenadeState.HasNoGrenade;
} }
// V blinks on low HP // V blinks on low HP
else if (keyCode == 47) else if (keyCode == 47)
{ {
_stickyHp.Value = rPer == 100 && gPer > 1 && bPer > 1; _stickyHp.Value = rPer == 100 && gPer > 1 && bPer > 1;
_dataModel.LowHp = _stickyHp.Value; _dataModel.LowHp = _stickyHp.Value;
} }
} }
public override void Update() public override void Update()
{ {
if (_dataModel.LowAmmo) if (_dataModel.LowAmmo)
{ {
_ammoWave.Size++; _ammoWave.Size++;
if (_ammoWave.Size > 30) if (_ammoWave.Size > 30)
{ {
_ammoWave.Size = 0; _ammoWave.Size = 0;
_trans = 255; _trans = 255;
} }
} }
else else
_ammoWave.Size = 0; _ammoWave.Size = 0;
_hpRect.Colors = _dataModel.LowHp _hpRect.Colors = _dataModel.LowHp
? new List<Color> {Color.Red, Color.Orange} ? new List<Color> {Color.Red, Color.Orange}
: new List<Color> {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; : new List<Color> {Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) };
if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Offline) if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Offline)
_p2.Colors = new List<Color> {Color.Gray, Color.White}; _p2.Colors = new List<Color> {Color.Gray, Color.White};
else if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Online) else if (_dataModel.DivisionPlayers[1].PlayerState == PlayerState.Online)
_p2.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; _p2.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) };
else else
_p2.Colors = new List<Color> {Color.Red, Color.Orange}; _p2.Colors = new List<Color> {Color.Red, Color.Orange};
if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Offline) if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Offline)
_p3.Colors = new List<Color> {Color.Gray, Color.White}; _p3.Colors = new List<Color> {Color.Gray, Color.White};
else if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Online) else if (_dataModel.DivisionPlayers[2].PlayerState == PlayerState.Online)
_p3.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; _p3.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) };
else else
_p3.Colors = new List<Color> {Color.Red, Color.Orange}; _p3.Colors = new List<Color> {Color.Red, Color.Orange};
if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Offline) if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Offline)
_p4.Colors = new List<Color> {Color.Gray, Color.White}; _p4.Colors = new List<Color> {Color.Gray, Color.White};
else if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Online) else if (_dataModel.DivisionPlayers[3].PlayerState == PlayerState.Online)
_p4.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) }; _p4.Colors = new List<Color> { Color.FromArgb(10, 255, 0), Color.FromArgb(80, 255, 45) };
else else
_p4.Colors = new List<Color> {Color.Red, Color.Orange}; _p4.Colors = new List<Color> {Color.Red, Color.Orange};
if (!_dataModel.LowAmmo) if (!_dataModel.LowAmmo)
{ {
foreach (var corsairLed in CueSDK.MouseSDK.Leds) foreach (var corsairLed in CueSDK.MouseSDK.Leds)
corsairLed.Color = Color.Green; corsairLed.Color = Color.Green;
} }
else else
{ {
foreach (var corsairLed in CueSDK.MouseSDK.Leds) foreach (var corsairLed in CueSDK.MouseSDK.Leds)
corsairLed.Color = Color.Red; corsairLed.Color = Color.Red;
} }
CueSDK.MouseSDK.Update(); CueSDK.MouseSDK.Update();
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
_hpRect.Draw(g); _hpRect.Draw(g);
_p2.Draw(g); _p2.Draw(g);
_p3.Draw(g); _p3.Draw(g);
_p4.Draw(g); _p4.Draw(g);
// Very, very PH // Very, very PH
if (_ammoWave.Size != 0) if (_ammoWave.Size != 0)
{ {
var path = new GraphicsPath(); var path = new GraphicsPath();
path.AddEllipse(_ammoWave.Point.X - _ammoWave.Size/2, _ammoWave.Point.Y - _ammoWave.Size/2, path.AddEllipse(_ammoWave.Point.X - _ammoWave.Size/2, _ammoWave.Point.Y - _ammoWave.Size/2,
_ammoWave.Size, _ammoWave.Size); _ammoWave.Size, _ammoWave.Size);
if (_ammoWave.Size > 15) if (_ammoWave.Size > 15)
_trans = _trans - 16; _trans = _trans - 16;
if (_trans < 1) if (_trans < 1)
_trans = 255; _trans = 255;
var pthGrBrush = new PathGradientBrush(path) var pthGrBrush = new PathGradientBrush(path)
{ {
SurroundColors = new[] {_ammoWave.Color}, SurroundColors = new[] {_ammoWave.Color},
CenterColor = Color.FromArgb(_trans, 255, 0, 0) CenterColor = Color.FromArgb(_trans, 255, 0, 0)
}; };
g.FillPath(pthGrBrush, path); g.FillPath(pthGrBrush, path);
pthGrBrush.FocusScales = new PointF(0.3f, 0.8f); pthGrBrush.FocusScales = new PointF(0.3f, 0.8f);
g.FillPath(pthGrBrush, path); g.FillPath(pthGrBrush, path);
g.DrawEllipse(new Pen(pthGrBrush, 1), _ammoWave.Point.X - _ammoWave.Size/2, g.DrawEllipse(new Pen(pthGrBrush, 1), _ammoWave.Point.X - _ammoWave.Size/2,
_ammoWave.Point.Y - _ammoWave.Size/2, _ammoWave.Size, _ammoWave.Size); _ammoWave.Point.Y - _ammoWave.Size/2, _ammoWave.Size, _ammoWave.Size);
} }
} }
return bitmap; return bitmap;
} }
} }
} }

View File

@ -1,29 +1,29 @@
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
public class TheDivisionSettings : GameSettings public class TheDivisionSettings : GameSettings
{ {
public TheDivisionSettings() public TheDivisionSettings()
{ {
Load(); Load();
} }
public sealed override void Load() public sealed override void Load()
{ {
Enabled = TheDivision.Default.Enabled; Enabled = TheDivision.Default.Enabled;
} }
public sealed override void Save() public sealed override void Save()
{ {
TheDivision.Default.Enabled = Enabled; TheDivision.Default.Enabled = Enabled;
TheDivision.Default.Save(); TheDivision.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Enabled = true; Enabled = true;
} }
} }
} }

View File

@ -1,22 +1,22 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
public class TheDivisionViewModel : GameViewModel public class TheDivisionViewModel : GameViewModel
{ {
public TheDivisionViewModel(MainManager mainManager) public TheDivisionViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
// Settings are loaded from file by class // Settings are loaded from file by class
GameSettings = new TheDivisionSettings(); GameSettings = new TheDivisionSettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
GameModel = new TheDivisionModel(mainManager, (TheDivisionSettings) GameSettings); GameModel = new TheDivisionModel(mainManager, (TheDivisionSettings) GameSettings);
MainManager.EffectManager.EffectModels.Add(GameModel); MainManager.EffectManager.EffectModels.Add(GameModel);
} }
public static string Name => "The Division"; public static string Name => "The Division";
} }
} }

View File

@ -1,121 +1,121 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.IO; using System.IO;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
public class Witcher3Model : GameModel public class Witcher3Model : GameModel
{ {
private readonly Regex _signRegex; private readonly Regex _signRegex;
private readonly Stopwatch _updateSw; private readonly Stopwatch _updateSw;
private KeyboardRectangle _signRect; private KeyboardRectangle _signRect;
private string _witcherSettings; private string _witcherSettings;
public Witcher3Model(MainManager mainManager, Witcher3Settings settings) : base(mainManager) public Witcher3Model(MainManager mainManager, Witcher3Settings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "Witcher3"; Name = "Witcher3";
ProcessName = "witcher3"; ProcessName = "witcher3";
Scale = 4; Scale = 4;
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
Initialized = false; Initialized = false;
_updateSw = new Stopwatch(); _updateSw = new Stopwatch();
_signRegex = new Regex("ActiveSign=(.*)", RegexOptions.Compiled); _signRegex = new Regex("ActiveSign=(.*)", RegexOptions.Compiled);
} }
public Witcher3Settings Settings { get; set; } public Witcher3Settings Settings { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
_witcherSettings = null; _witcherSettings = null;
_updateSw.Reset(); _updateSw.Reset();
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
_signRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color>(), _signRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color>(),
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Rotate = true, Rotate = true,
LoopSpeed = 0.5 LoopSpeed = 0.5
}; };
// Ensure the config file is found // Ensure the config file is found
var witcherSettings = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + var witcherSettings = Environment.GetFolderPath(Environment.SpecialFolder.Personal) +
@"\The Witcher 3\user.settings"; @"\The Witcher 3\user.settings";
if (File.Exists(witcherSettings)) if (File.Exists(witcherSettings))
_witcherSettings = witcherSettings; _witcherSettings = witcherSettings;
_updateSw.Start(); _updateSw.Start();
Initialized = true; Initialized = true;
} }
public override void Update() public override void Update()
{ {
// Witcher effect is very static and reads from disk, don't want to update too often. // Witcher effect is very static and reads from disk, don't want to update too often.
if (_updateSw.ElapsedMilliseconds < 500) if (_updateSw.ElapsedMilliseconds < 500)
return; return;
_updateSw.Restart(); _updateSw.Restart();
if (_witcherSettings == null) if (_witcherSettings == null)
return; return;
var reader = new StreamReader(File.Open(_witcherSettings, var reader = new StreamReader(File.Open(_witcherSettings,
FileMode.Open, FileMode.Open,
FileAccess.Read, FileAccess.Read,
FileShare.ReadWrite)); FileShare.ReadWrite));
var configContent = reader.ReadToEnd(); var configContent = reader.ReadToEnd();
reader.Close(); reader.Close();
var signRes = _signRegex.Match(configContent); var signRes = _signRegex.Match(configContent);
if (signRes.Groups.Count < 2) if (signRes.Groups.Count < 2)
return; return;
var sign = signRes.Groups[1].Value; var sign = signRes.Groups[1].Value;
switch (sign) switch (sign)
{ {
case "ST_Aard\r": case "ST_Aard\r":
_signRect.Colors = new List<Color> {Color.DeepSkyBlue, Color.Blue}; _signRect.Colors = new List<Color> {Color.DeepSkyBlue, Color.Blue};
break; break;
case "ST_Yrden\r": case "ST_Yrden\r":
_signRect.Colors = new List<Color> {Color.Purple, Color.DeepPink}; _signRect.Colors = new List<Color> {Color.Purple, Color.DeepPink};
break; break;
case "ST_Igni\r": case "ST_Igni\r":
_signRect.Colors = new List<Color> {Color.DarkOrange, Color.Red}; _signRect.Colors = new List<Color> {Color.DarkOrange, Color.Red};
break; break;
case "ST_Quen\r": case "ST_Quen\r":
_signRect.Colors = new List<Color> {Color.DarkOrange, Color.FromArgb(232, 193, 0)}; _signRect.Colors = new List<Color> {Color.DarkOrange, Color.FromArgb(232, 193, 0)};
break; break;
case "ST_Axii\r": case "ST_Axii\r":
_signRect.Colors = new List<Color> {Color.LawnGreen, Color.DarkGreen}; _signRect.Colors = new List<Color> {Color.LawnGreen, Color.DarkGreen};
break; break;
} }
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
_signRect.Draw(g); _signRect.Draw(g);
} }
return bitmap; return bitmap;
} }
} }
} }

View File

@ -1,29 +1,29 @@
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
public class Witcher3Settings : GameSettings public class Witcher3Settings : GameSettings
{ {
public Witcher3Settings() public Witcher3Settings()
{ {
Load(); Load();
} }
public sealed override void Load() public sealed override void Load()
{ {
Enabled = Witcher3.Default.Enabled; Enabled = Witcher3.Default.Enabled;
} }
public sealed override void Save() public sealed override void Save()
{ {
Witcher3.Default.Enabled = Enabled; Witcher3.Default.Enabled = Enabled;
Witcher3.Default.Save(); Witcher3.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Enabled = true; Enabled = true;
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
/// <summary> /// <summary>
/// Interaction logic for Witcher3View.xaml /// Interaction logic for Witcher3View.xaml
/// </summary> /// </summary>
public partial class Witcher3View : UserControl public partial class Witcher3View : UserControl
{ {
public Witcher3View() public Witcher3View()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,112 +1,112 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Properties; using Artemis.Properties;
using Artemis.ViewModels.Abstract; using Artemis.ViewModels.Abstract;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
public class Witcher3ViewModel : GameViewModel public class Witcher3ViewModel : GameViewModel
{ {
public Witcher3ViewModel(MainManager mainManager) public Witcher3ViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
// Settings are loaded from file by class // Settings are loaded from file by class
GameSettings = new Witcher3Settings(); GameSettings = new Witcher3Settings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
GameModel = new Witcher3Model(mainManager, (Witcher3Settings) GameSettings); GameModel = new Witcher3Model(mainManager, (Witcher3Settings) GameSettings);
MainManager.EffectManager.EffectModels.Add(GameModel); MainManager.EffectManager.EffectModels.Add(GameModel);
} }
public static string Name => "The Witcher 3"; public static string Name => "The Witcher 3";
public async void AutoInstall() public async void AutoInstall()
{ {
// Request The Witcher 3 folder // Request The Witcher 3 folder
var dialog = new FolderBrowserDialog var dialog = new FolderBrowserDialog
{ {
Description = "Please select your Witcher 3 install path (root directory)." Description = "Please select your Witcher 3 install path (root directory)."
}; };
var result = dialog.ShowDialog(); var result = dialog.ShowDialog();
if (result != DialogResult.OK) if (result != DialogResult.OK)
return; return;
// If the subfolder doesn't contain witcher3.exe, it's the wrong folder. // If the subfolder doesn't contain witcher3.exe, it's the wrong folder.
if (!File.Exists(dialog.SelectedPath + @"\bin\x64\witcher3.exe")) if (!File.Exists(dialog.SelectedPath + @"\bin\x64\witcher3.exe"))
{ {
var retry = await var retry = await
MainManager.DialogService.ShowQuestionMessageBox("Installation error", MainManager.DialogService.ShowQuestionMessageBox("Installation error",
"That's not a valid Witcher 3 directory\n\n" + "That's not a valid Witcher 3 directory\n\n" +
"Default directories:\n" + "Default directories:\n" +
"Steam: \\SteamApps\\common\\The Witcher 3\n" + "Steam: \\SteamApps\\common\\The Witcher 3\n" +
"GOG: C:\\GOG Games\\The Witcher 3 Wild Hunt\n\n" + "GOG: C:\\GOG Games\\The Witcher 3 Wild Hunt\n\n" +
"Retry?"); "Retry?");
if (retry.Value) if (retry.Value)
AutoInstall(); AutoInstall();
return; return;
} }
// Look for any conflicting mods // Look for any conflicting mods
if (Directory.Exists(dialog.SelectedPath + @"\mods")) if (Directory.Exists(dialog.SelectedPath + @"\mods"))
{ {
var file = var file =
Directory.GetFiles(dialog.SelectedPath + @"\mods", "playerWitcher.ws", SearchOption.AllDirectories) Directory.GetFiles(dialog.SelectedPath + @"\mods", "playerWitcher.ws", SearchOption.AllDirectories)
.FirstOrDefault(); .FirstOrDefault();
if (file != null) if (file != null)
{ {
// Don't trip over our own mod // Don't trip over our own mod
if (!file.Contains("modArtemis")) if (!file.Contains("modArtemis"))
{ {
var viewHelp = await var viewHelp = await
MainManager.DialogService.ShowQuestionMessageBox("Conflicting mod found", MainManager.DialogService.ShowQuestionMessageBox("Conflicting mod found",
"Oh no, you have a conflicting mod!\n\n" + "Oh no, you have a conflicting mod!\n\n" +
"Conflicting file: " + file.Remove(0, dialog.SelectedPath.Length) + "Conflicting file: " + file.Remove(0, dialog.SelectedPath.Length) +
"\n\nWould you like to view instructions on how to manually install the mod?"); "\n\nWould you like to view instructions on how to manually install the mod?");
if (!viewHelp.Value) if (!viewHelp.Value)
return; return;
// Put the mod in the documents folder instead // Put the mod in the documents folder instead
// Create the directory structure // Create the directory structure
var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis"; var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis";
if ( if (
!Directory.Exists(folder + @"\Witcher3\mods\modArtemis\content\scripts\game\player")) !Directory.Exists(folder + @"\Witcher3\mods\modArtemis\content\scripts\game\player"))
Directory.CreateDirectory(folder + Directory.CreateDirectory(folder +
@"\Witcher3\mods\modArtemis\content\scripts\game\player"); @"\Witcher3\mods\modArtemis\content\scripts\game\player");
if ( if (
!Directory.Exists(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc")) !Directory.Exists(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc"))
Directory.CreateDirectory(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc"); Directory.CreateDirectory(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc");
// Install the mod files // Install the mod files
File.WriteAllText(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc\artemis.xml", File.WriteAllText(folder + @"\Witcher3\bin\config\r4game\user_config_matrix\pc\artemis.xml",
Resources.artemisXml); Resources.artemisXml);
File.WriteAllText( File.WriteAllText(
folder + @"\Witcher3\mods\modArtemis\content\scripts\game\player\playerWitcher.ws", folder + @"\Witcher3\mods\modArtemis\content\scripts\game\player\playerWitcher.ws",
Resources.playerWitcherWs); Resources.playerWitcherWs);
Process.Start(new ProcessStartInfo("https://github.com/SpoinkyNL/Artemis/wiki/The-Witcher-3")); Process.Start(new ProcessStartInfo("https://github.com/SpoinkyNL/Artemis/wiki/The-Witcher-3"));
return; return;
} }
} }
} }
// Create the directory structure // Create the directory structure
if (!Directory.Exists(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player")) if (!Directory.Exists(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player"))
Directory.CreateDirectory(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player"); Directory.CreateDirectory(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player");
if (!Directory.Exists(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc")) if (!Directory.Exists(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc"))
Directory.CreateDirectory(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc"); Directory.CreateDirectory(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc");
// Install the mod files // Install the mod files
File.WriteAllText(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc\artemis.xml", File.WriteAllText(dialog.SelectedPath + @"\bin\config\r4game\user_config_matrix\pc\artemis.xml",
Resources.artemisXml); Resources.artemisXml);
File.WriteAllText(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player\playerWitcher.ws", File.WriteAllText(dialog.SelectedPath + @"\mods\modArtemis\content\scripts\game\player\playerWitcher.ws",
Resources.playerWitcherWs); Resources.playerWitcherWs);
MainManager.DialogService.ShowMessageBox("Success", "The mod was successfully installed!"); MainManager.DialogService.ShowMessageBox("Success", "The mod was successfully installed!");
} }
} }
} }

View File

@ -1,46 +1,46 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
namespace Artemis.Modules.Overlays.VolumeDisplay namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public class VolumeBar public class VolumeBar
{ {
public VolumeBar(MainManager mainManager, VolumeDisplaySettings settings) public VolumeBar(MainManager mainManager, VolumeDisplaySettings settings)
{ {
MainManager = mainManager; MainManager = mainManager;
Settings = settings; Settings = settings;
Transparancy = 255; Transparancy = 255;
Scale = 4; Scale = 4;
} }
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
public VolumeDisplaySettings Settings { get; set; } public VolumeDisplaySettings Settings { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public int Ttl { get; set; } public int Ttl { get; set; }
public byte Transparancy { get; set; } public byte Transparancy { get; set; }
public int Volume { get; set; } public int Volume { get; set; }
public void Draw(Graphics g) public void Draw(Graphics g)
{ {
var volumeRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color> var volumeRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color>
{ {
ColorHelpers.ToDrawingColor(Settings.MainColor), ColorHelpers.ToDrawingColor(Settings.MainColor),
ColorHelpers.ToDrawingColor(Settings.SecondaryColor) ColorHelpers.ToDrawingColor(Settings.SecondaryColor)
}, },
LinearGradientMode.Horizontal) LinearGradientMode.Horizontal)
{ {
Width = (int) (MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*Volume), Width = (int) (MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*Volume),
ContainedBrush = false ContainedBrush = false
}; };
volumeRect.Draw(g); volumeRect.Draw(g);
} }
} }
} }

View File

@ -1,91 +1,91 @@
using System.Drawing; using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using NAudio.CoreAudioApi; using NAudio.CoreAudioApi;
namespace Artemis.Modules.Overlays.VolumeDisplay namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public class VolumeDisplayModel : OverlayModel public class VolumeDisplayModel : OverlayModel
{ {
public VolumeDisplayModel(MainManager mainManager, VolumeDisplaySettings settings) : base(mainManager) public VolumeDisplayModel(MainManager mainManager, VolumeDisplaySettings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "VolumeDisplay"; Name = "VolumeDisplay";
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
VolumeDisplay = new VolumeBar(mainManager, settings); VolumeDisplay = new VolumeBar(mainManager, settings);
} }
public VolumeBar VolumeDisplay { get; set; } public VolumeBar VolumeDisplay { get; set; }
public VolumeDisplaySettings Settings { get; set; } public VolumeDisplaySettings Settings { get; set; }
public override void Dispose() public override void Dispose()
{ {
MainManager.KeyboardHook.KeyDownCallback -= KeyPressTask; MainManager.KeyboardHook.KeyDownCallback -= KeyPressTask;
} }
public override void Enable() public override void Enable()
{ {
// Listener won't start unless the effect is active // Listener won't start unless the effect is active
MainManager.KeyboardHook.KeyDownCallback += KeyPressTask; MainManager.KeyboardHook.KeyDownCallback += KeyPressTask;
} }
public override void Update() public override void Update()
{ {
// TODO: Get from settings // TODO: Get from settings
var fps = 25; var fps = 25;
if (VolumeDisplay == null) if (VolumeDisplay == null)
return; return;
if (VolumeDisplay.Ttl < 1) if (VolumeDisplay.Ttl < 1)
return; return;
var decreaseAmount = 500/fps; var decreaseAmount = 500/fps;
VolumeDisplay.Ttl = VolumeDisplay.Ttl - decreaseAmount; VolumeDisplay.Ttl = VolumeDisplay.Ttl - decreaseAmount;
if (VolumeDisplay.Ttl < 128) if (VolumeDisplay.Ttl < 128)
VolumeDisplay.Transparancy = (byte) (VolumeDisplay.Transparancy - 20); VolumeDisplay.Transparancy = (byte) (VolumeDisplay.Transparancy - 20);
try try
{ {
var enumerator = new MMDeviceEnumerator(); var enumerator = new MMDeviceEnumerator();
var volumeFloat = var volumeFloat =
enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console) enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console)
.AudioEndpointVolume.MasterVolumeLevelScalar; .AudioEndpointVolume.MasterVolumeLevelScalar;
VolumeDisplay.Volume = (int) (volumeFloat*100); VolumeDisplay.Volume = (int) (volumeFloat*100);
} }
catch (COMException) catch (COMException)
{ {
} }
} }
public override Bitmap GenerateBitmap() public override Bitmap GenerateBitmap()
{ {
return GenerateBitmap(MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(4)); return GenerateBitmap(MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(4));
} }
public override Bitmap GenerateBitmap(Bitmap bitmap) public override Bitmap GenerateBitmap(Bitmap bitmap)
{ {
if (VolumeDisplay == null) if (VolumeDisplay == null)
return bitmap; return bitmap;
if (VolumeDisplay.Ttl < 1) if (VolumeDisplay.Ttl < 1)
return bitmap; return bitmap;
using (var g = Graphics.FromImage(bitmap)) using (var g = Graphics.FromImage(bitmap))
VolumeDisplay.Draw(g); VolumeDisplay.Draw(g);
return bitmap; return bitmap;
} }
private void KeyPressTask(KeyEventArgs e) private void KeyPressTask(KeyEventArgs e)
{ {
if (e.KeyCode != Keys.VolumeUp && e.KeyCode != Keys.VolumeDown) if (e.KeyCode != Keys.VolumeUp && e.KeyCode != Keys.VolumeDown)
return; return;
VolumeDisplay.Ttl = 1000; VolumeDisplay.Ttl = 1000;
VolumeDisplay.Transparancy = 255; VolumeDisplay.Transparancy = 255;
} }
} }
} }

View File

@ -1,40 +1,40 @@
using System.Windows.Media; using System.Windows.Media;
using Artemis.Models; using Artemis.Models;
namespace Artemis.Modules.Overlays.VolumeDisplay namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public class VolumeDisplaySettings : EffectSettings public class VolumeDisplaySettings : EffectSettings
{ {
public VolumeDisplaySettings() public VolumeDisplaySettings()
{ {
Load(); Load();
} }
public bool Enabled { get; set; } public bool Enabled { get; set; }
public Color MainColor { get; set; } public Color MainColor { get; set; }
public Color SecondaryColor { get; set; } public Color SecondaryColor { get; set; }
public sealed override void Load() public sealed override void Load()
{ {
Enabled = VolumeDisplay.Default.Enabled; Enabled = VolumeDisplay.Default.Enabled;
MainColor = VolumeDisplay.Default.MainColor; MainColor = VolumeDisplay.Default.MainColor;
SecondaryColor = VolumeDisplay.Default.SecondaryColor; SecondaryColor = VolumeDisplay.Default.SecondaryColor;
} }
public sealed override void Save() public sealed override void Save()
{ {
VolumeDisplay.Default.Enabled = Enabled; VolumeDisplay.Default.Enabled = Enabled;
VolumeDisplay.Default.MainColor = MainColor; VolumeDisplay.Default.MainColor = MainColor;
VolumeDisplay.Default.SecondaryColor = SecondaryColor; VolumeDisplay.Default.SecondaryColor = SecondaryColor;
VolumeDisplay.Default.Save(); VolumeDisplay.Default.Save();
} }
public sealed override void ToDefault() public sealed override void ToDefault()
{ {
Enabled = true; Enabled = true;
MainColor = Color.FromArgb(255, 38, 246, 0); MainColor = Color.FromArgb(255, 38, 246, 0);
SecondaryColor = Color.FromArgb(255, 255, 41, 0); SecondaryColor = Color.FromArgb(255, 255, 41, 0);
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Modules.Overlays.VolumeDisplay namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
/// <summary> /// <summary>
/// Interaction logic for MediaKeysDisplayView.xaml /// Interaction logic for MediaKeysDisplayView.xaml
/// </summary> /// </summary>
public partial class VolumeDisplayView : UserControl public partial class VolumeDisplayView : UserControl
{ {
public VolumeDisplayView() public VolumeDisplayView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,60 +1,60 @@
using Artemis.Managers; using Artemis.Managers;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.Modules.Overlays.VolumeDisplay namespace Artemis.Modules.Overlays.VolumeDisplay
{ {
public class VolumeDisplayViewModel : Screen public class VolumeDisplayViewModel : Screen
{ {
private VolumeDisplaySettings _volumeDisplaySettings; private VolumeDisplaySettings _volumeDisplaySettings;
public VolumeDisplayViewModel(MainManager mainManager) public VolumeDisplayViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
// Settings are loaded from file by class // Settings are loaded from file by class
VolumeDisplaySettings = new VolumeDisplaySettings(); VolumeDisplaySettings = new VolumeDisplaySettings();
// Create effect model and add it to MainManager // Create effect model and add it to MainManager
VolumeDisplayModel = new VolumeDisplayModel(mainManager, VolumeDisplaySettings); VolumeDisplayModel = new VolumeDisplayModel(mainManager, VolumeDisplaySettings);
MainManager.EffectManager.EffectModels.Add(VolumeDisplayModel); MainManager.EffectManager.EffectModels.Add(VolumeDisplayModel);
} }
public static string Name => "Volume Display"; public static string Name => "Volume Display";
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
public VolumeDisplayModel VolumeDisplayModel { get; set; } public VolumeDisplayModel VolumeDisplayModel { get; set; }
public VolumeDisplaySettings VolumeDisplaySettings public VolumeDisplaySettings VolumeDisplaySettings
{ {
get { return _volumeDisplaySettings; } get { return _volumeDisplaySettings; }
set set
{ {
if (Equals(value, _volumeDisplaySettings)) return; if (Equals(value, _volumeDisplaySettings)) return;
_volumeDisplaySettings = value; _volumeDisplaySettings = value;
NotifyOfPropertyChange(() => VolumeDisplaySettings); NotifyOfPropertyChange(() => VolumeDisplaySettings);
} }
} }
public void ToggleEffect() public void ToggleEffect()
{ {
VolumeDisplayModel.Enabled = _volumeDisplaySettings.Enabled; VolumeDisplayModel.Enabled = _volumeDisplaySettings.Enabled;
} }
public void SaveSettings() public void SaveSettings()
{ {
if (VolumeDisplayModel == null) if (VolumeDisplayModel == null)
return; return;
VolumeDisplaySettings.Save(); VolumeDisplaySettings.Save();
} }
public void ResetSettings() public void ResetSettings()
{ {
// TODO: Confirmation dialog (Generic MVVM approach) // TODO: Confirmation dialog (Generic MVVM approach)
VolumeDisplaySettings.ToDefault(); VolumeDisplaySettings.ToDefault();
NotifyOfPropertyChange(() => VolumeDisplaySettings); NotifyOfPropertyChange(() => VolumeDisplaySettings);
SaveSettings(); SaveSettings();
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +1,56 @@
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("Artemis")] [assembly: AssemblyTitle("Artemis")]
[assembly: AssemblyDescription("Adds third-party support for RGB keyboards to games")] [assembly: AssemblyDescription("Adds third-party support for RGB keyboards to games")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Artemis developers")] [assembly: AssemblyCompany("Artemis developers")]
[assembly: AssemblyProduct("Artemis")] [assembly: AssemblyProduct("Artemis")]
[assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
//In order to begin building localizable applications, set //In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file //<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english //inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment //in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in //the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file. //the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo( [assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, //(used if a resource is not found in the page,
// or application resource dictionaries) // or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, //(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries) // app, or any theme specific resource dictionaries)
)] )]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
// Major Version // Major Version
// Minor Version // Minor Version
// Build Number // Build Number
// Revision // Revision
// //
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,18 +1,18 @@
"Artemis" "Artemis"
{ {
"uri" "http://localhost:{{port}}/csgo_game_event" "uri" "http://localhost:{{port}}/csgo_game_event"
"timeout" "5.0" "timeout" "5.0"
"buffer" "0.1" "buffer" "0.1"
"throttle" "0.1" "throttle" "0.1"
"heartbeat" "30.0" "heartbeat" "30.0"
"data" "data"
{ {
"provider" "1" "provider" "1"
"map" "1" "map" "1"
"round" "1" "round" "1"
"player_id" "1" "player_id" "1"
"player_state" "1" "player_state" "1"
"player_weapons" "1" "player_weapons" "1"
"player_match_stats" "1" "player_match_stats" "1"
} }
} }

View File

@ -1,3 +1,3 @@
Entypo (http://www.entypo.com/) is created by Daniel Bruce and released under the Creative Commons, Share Alike/Attribution license. Entypo (http://www.entypo.com/) is created by Daniel Bruce and released under the Creative Commons, Share Alike/Attribution license.
http://creativecommons.org/licenses/by-sa/3.0/ http://creativecommons.org/licenses/by-sa/3.0/

View File

@ -1,62 +1,62 @@
# License # License
Please carefully understand the license and download the latest icons at ModernUIIcons.com. Please carefully understand the license and download the latest icons at ModernUIIcons.com.
## Understand Your Rights ## Understand Your Rights
No Attribution and No Derived Works No Attribution and No Derived Works
http://creativecommons.org/licenses/by-nd/3.0/ * http://creativecommons.org/licenses/by-nd/3.0/ *
- If your project is open source include this license file in the source. - If your project is open source include this license file in the source.
- Nothing is needed in the front facing project (UNLESS you - Nothing is needed in the front facing project (UNLESS you
are using any of the icons listed below in the attribution section). are using any of the icons listed below in the attribution section).
- Commercial use is not only allowed but encouraged. If it is an icon - Commercial use is not only allowed but encouraged. If it is an icon
in the attribution list below, you still need to attribute those! in the attribution list below, you still need to attribute those!
- Do not distribute the entire package (I've allowed this dozens of - Do not distribute the entire package (I've allowed this dozens of
times for open source projects, but email me first). times for open source projects, but email me first).
## Creator ## Creator
- Austin Andrews (@templarian) - Austin Andrews (@templarian)
## Contributor** ## Contributor**
- Jay Zawrotny (@JayZawrotny) - Jay Zawrotny (@JayZawrotny)
- A Bunch - A Bunch
- Oren Nachman - Oren Nachman
- appbar.chevron.down - appbar.chevron.down
- appbar.chevron.up - appbar.chevron.up
- appbar.chevron.left - appbar.chevron.left
- appbar.chevron.right - appbar.chevron.right
## Derived Works ## Derived Works
- Alex Peattie - Alex Peattie
- Social: http://www.alexpeattie.com/projects/justvector_icons/ - Social: http://www.alexpeattie.com/projects/justvector_icons/
## Attribution*** ## Attribution***
- Kris Vandermotten (@kvandermotten) - Kris Vandermotten (@kvandermotten)
- appbar.medical.pulse - appbar.medical.pulse
- Constantin Kichinsky (@kichinsky) - Constantin Kichinsky (@kichinsky)
- appbar.currency.rubles - appbar.currency.rubles
- appbar.currency.grivna - appbar.currency.grivna
- Massimo Savazzi (@msavazzi) - Massimo Savazzi (@msavazzi)
- List of missing exported icons - List of missing exported icons
- Proletkult Graphik, from The Noun Project - Proletkult Graphik, from The Noun Project
- appbar.draw.pen (inspired) - appbar.draw.pen (inspired)
- Olivier Guin, from The Noun Project - Olivier Guin, from The Noun Project
- appbar.draw.marker - appbar.draw.marker
- Gibran Bisio, from The Noun Project - Gibran Bisio, from The Noun Project
- appbar.draw.bucket - appbar.draw.bucket
Andrew Forrester, from The Noun Project Andrew Forrester, from The Noun Project
- appbar.fingerprint - appbar.fingerprint
* The license is for attribution, but this is not required. * The license is for attribution, but this is not required.
** Developers and designers that emailed Templarian the source .design icons to be added into the package. PNGs also accepted, but may take longer to be added. ** Developers and designers that emailed Templarian the source .design icons to be added into the package. PNGs also accepted, but may take longer to be added.
*** Icons I've copied so closely you want to attribute them and are also under the CC license. *** Icons I've copied so closely you want to attribute them and are also under the CC license.
Contact Contact
- http://templarian.com/ - http://templarian.com/
- admin[@]templarian[.]com - admin[@]templarian[.]com
* Does not apply to copyrighted logos * Does not apply to copyrighted logos
- Skype - Skype
- Facebook - Facebook
- Twitter - Twitter
- etc... - etc...

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-16"?> <?xml version="1.0" encoding="UTF-16"?>
<!-- Used by Artemis to get the active Sign --> <!-- Used by Artemis to get the active Sign -->
<UserConfig> <UserConfig>
<Group id="Artemis" displayName="Artemis"> <Group id="Artemis" displayName="Artemis">
<VisibleVars> <VisibleVars>
<Var id="ActiveSign" displayName="ActiveSign" displayType="SLIDER:0:1:1000000"/> <Var id="ActiveSign" displayName="ActiveSign" displayType="SLIDER:0:1:1000000"/>
</VisibleVars> </VisibleVars>
</Group> </Group>
</UserConfig> </UserConfig>

View File

@ -1,100 +1,100 @@
using System; using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices.ComTypes; using System.Runtime.InteropServices.ComTypes;
using Artemis.Utilities; using Artemis.Utilities;
namespace Artemis.Settings namespace Artemis.Settings
{ {
public class GeneralSettings public class GeneralSettings
{ {
public int GamestatePort public int GamestatePort
{ {
get { return General.Default.GamestatePort; } get { return General.Default.GamestatePort; }
set set
{ {
if (General.Default.GamestatePort == value) return; if (General.Default.GamestatePort == value) return;
General.Default.GamestatePort = value; General.Default.GamestatePort = value;
} }
} }
public bool EnablePointersUpdate public bool EnablePointersUpdate
{ {
get { return General.Default.EnablePointersUpdate; } get { return General.Default.EnablePointersUpdate; }
set set
{ {
if (General.Default.EnablePointersUpdate == value) return; if (General.Default.EnablePointersUpdate == value) return;
General.Default.EnablePointersUpdate = value; General.Default.EnablePointersUpdate = value;
} }
} }
public bool Autorun public bool Autorun
{ {
get { return General.Default.Autorun; } get { return General.Default.Autorun; }
set set
{ {
if (General.Default.Autorun == value) return; if (General.Default.Autorun == value) return;
General.Default.Autorun = value; General.Default.Autorun = value;
} }
} }
public bool CheckForUpdates public bool CheckForUpdates
{ {
get { return General.Default.CheckForUpdates; } get { return General.Default.CheckForUpdates; }
set set
{ {
if (General.Default.CheckForUpdates == value) return; if (General.Default.CheckForUpdates == value) return;
General.Default.CheckForUpdates = value; General.Default.CheckForUpdates = value;
} }
} }
public bool ShowOnStartup public bool ShowOnStartup
{ {
get { return General.Default.ShowOnStartup; } get { return General.Default.ShowOnStartup; }
set set
{ {
if (General.Default.ShowOnStartup == value) return; if (General.Default.ShowOnStartup == value) return;
General.Default.ShowOnStartup = value; General.Default.ShowOnStartup = value;
} }
} }
private void ApplyGamestatePort() private void ApplyGamestatePort()
{ {
// TODO: Restart Gamestate server with new port // TODO: Restart Gamestate server with new port
} }
private void ApplyAutorun() private void ApplyAutorun()
{ {
var startupFolder = Environment.GetFolderPath(Environment.SpecialFolder.Startup); var startupFolder = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
if (Autorun) if (Autorun)
{ {
var link = (IShellLink) new ShellLink(); var link = (IShellLink) new ShellLink();
link.SetPath(Assembly.GetExecutingAssembly().Location); link.SetPath(Assembly.GetExecutingAssembly().Location);
var file = (IPersistFile) link; var file = (IPersistFile) link;
file.Save(startupFolder + @"\Artemis.lnk", false); file.Save(startupFolder + @"\Artemis.lnk", false);
} }
else if (File.Exists(startupFolder + @"\Artemis.lnk")) else if (File.Exists(startupFolder + @"\Artemis.lnk"))
File.Delete(startupFolder + @"\Artemis.lnk"); File.Delete(startupFolder + @"\Artemis.lnk");
} }
public void SaveSettings() public void SaveSettings()
{ {
General.Default.Save(); General.Default.Save();
ApplyAutorun(); ApplyAutorun();
ApplyGamestatePort(); ApplyGamestatePort();
} }
public void ResetSettings() public void ResetSettings()
{ {
GamestatePort = 51364; GamestatePort = 51364;
EnablePointersUpdate = true; EnablePointersUpdate = true;
Autorun = true; Autorun = true;
CheckForUpdates = true; CheckForUpdates = true;
ShowOnStartup = true; ShowOnStartup = true;
SaveSettings(); SaveSettings();
} }
} }
} }

View File

@ -1,52 +1,52 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.42000 // Runtime Version:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace Artemis.Settings { namespace Artemis.Settings {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class Offsets : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Offsets : global::System.Configuration.ApplicationSettingsBase {
private static Offsets defaultInstance = ((Offsets)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Offsets()))); private static Offsets defaultInstance = ((Offsets)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Offsets())));
public static Offsets Default { public static Offsets Default {
get { get {
return defaultInstance; return defaultInstance;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("{\"Game\":\"RocketLeague\",\"GameVersion\":\"1.10\",\"GameAddresses\":[{\"Description\":\"Boos" + [global::System.Configuration.DefaultSettingValueAttribute("{\"Game\":\"RocketLeague\",\"GameVersion\":\"1.10\",\"GameAddresses\":[{\"Description\":\"Boos" +
"t\",\"BasePointer\":{\"value\":21998084},\"Offsets\":[88,1452,1780,540]}]}")] "t\",\"BasePointer\":{\"value\":21998084},\"Offsets\":[88,1452,1780,540]}]}")]
public string RocketLeague { public string RocketLeague {
get { get {
return ((string)(this["RocketLeague"])); return ((string)(this["RocketLeague"]));
} }
set { set {
this["RocketLeague"] = value; this["RocketLeague"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("{\"Game\":\"Witcher3\",\"GameVersion\":\"1.11\",\"GameAddresses\":[{\"Description\":\"Sign\",\"B" + [global::System.Configuration.DefaultSettingValueAttribute("{\"Game\":\"Witcher3\",\"GameVersion\":\"1.11\",\"GameAddresses\":[{\"Description\":\"Sign\",\"B" +
"asePointer\":{\"value\":42942304},\"Offsets\":[40,16,32,3008]}]}")] "asePointer\":{\"value\":42942304},\"Offsets\":[40,16,32,3008]}]}")]
public string Witcher3 { public string Witcher3 {
get { get {
return ((string)(this["Witcher3"])); return ((string)(this["Witcher3"]));
} }
set { set {
this["Witcher3"] = value; this["Witcher3"] = value;
} }
} }
} }
} }

View File

@ -1,83 +1,83 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
namespace Artemis.Utilities namespace Artemis.Utilities
{ {
public static class ColorHelpers public static class ColorHelpers
{ {
/// <summary> /// <summary>
/// Comes up with a 'pure' psuedo-random color /// Comes up with a 'pure' psuedo-random color
/// </summary> /// </summary>
/// <returns>The color</returns> /// <returns>The color</returns>
public static Color GetRandomRainbowColor() public static Color GetRandomRainbowColor()
{ {
var colors = new List<int>(); var colors = new List<int>();
var rand = new Random(); var rand = new Random();
for (var i = 0; i < 3; i++) for (var i = 0; i < 3; i++)
colors.Add(rand.Next(0, 256)); colors.Add(rand.Next(0, 256));
var highest = colors.Max(); var highest = colors.Max();
var lowest = colors.Min(); var lowest = colors.Min();
colors[colors.FindIndex(c => c == highest)] = 255; colors[colors.FindIndex(c => c == highest)] = 255;
colors[colors.FindIndex(c => c == lowest)] = 0; colors[colors.FindIndex(c => c == lowest)] = 0;
var returnColor = Color.FromArgb(255, colors[0], colors[1], colors[2]); var returnColor = Color.FromArgb(255, colors[0], colors[1], colors[2]);
return returnColor; return returnColor;
} }
public static Color ShiftColor(Color c, int shiftAmount) public static Color ShiftColor(Color c, int shiftAmount)
{ {
int newRed = c.R; int newRed = c.R;
int newGreen = c.G; int newGreen = c.G;
int newBlue = c.B; int newBlue = c.B;
// Red to purple // Red to purple
if (c.R == 255 && c.B < 255 && c.G == 0) if (c.R == 255 && c.B < 255 && c.G == 0)
newBlue = newBlue + shiftAmount; newBlue = newBlue + shiftAmount;
// Purple to blue // Purple to blue
else if (c.B == 255 && c.R > 0) else if (c.B == 255 && c.R > 0)
newRed = newRed - shiftAmount; newRed = newRed - shiftAmount;
// Blue to light-blue // Blue to light-blue
else if (c.B == 255 && c.G < 255) else if (c.B == 255 && c.G < 255)
newGreen = newGreen + shiftAmount; newGreen = newGreen + shiftAmount;
// Light-blue to green // Light-blue to green
else if (c.G == 255 && c.B > 0) else if (c.G == 255 && c.B > 0)
newBlue = newBlue - shiftAmount; newBlue = newBlue - shiftAmount;
// Green to yellow // Green to yellow
else if (c.G == 255 && c.R < 255) else if (c.G == 255 && c.R < 255)
newRed = newRed + shiftAmount; newRed = newRed + shiftAmount;
// Yellow to red // Yellow to red
else if (c.R == 255 && c.G > 0) else if (c.R == 255 && c.G > 0)
newGreen = newGreen - shiftAmount; newGreen = newGreen - shiftAmount;
newRed = BringIntInColorRange(newRed); newRed = BringIntInColorRange(newRed);
newGreen = BringIntInColorRange(newGreen); newGreen = BringIntInColorRange(newGreen);
newBlue = BringIntInColorRange(newBlue); newBlue = BringIntInColorRange(newBlue);
return Color.FromArgb(c.A, newRed, newGreen, newBlue); return Color.FromArgb(c.A, newRed, newGreen, newBlue);
} }
private static int BringIntInColorRange(int i) private static int BringIntInColorRange(int i)
{ {
if (i < 0) if (i < 0)
return 0; return 0;
if (i > 255) if (i > 255)
return 255; return 255;
return i; return i;
} }
public static Color ToDrawingColor(System.Windows.Media.Color mColor) public static Color ToDrawingColor(System.Windows.Media.Color mColor)
{ {
return Color.FromArgb(mColor.A, mColor.R, mColor.G, mColor.B); return Color.FromArgb(mColor.A, mColor.R, mColor.G, mColor.B);
} }
public static System.Windows.Media.Color ToMediaColor(Color dColor) public static System.Windows.Media.Color ToMediaColor(Color dColor)
{ {
return System.Windows.Media.Color.FromArgb(dColor.A, dColor.R, dColor.G, dColor.B); return System.Windows.Media.Color.FromArgb(dColor.A, dColor.R, dColor.G, dColor.B);
} }
} }
} }

View File

@ -1,14 +1,14 @@
using System; using System;
namespace Artemis.Utilities.GameState namespace Artemis.Utilities.GameState
{ {
public class GameDataReceivedEventArgs : EventArgs public class GameDataReceivedEventArgs : EventArgs
{ {
public GameDataReceivedEventArgs(object json) public GameDataReceivedEventArgs(object json)
{ {
Json = json; Json = json;
} }
public object Json { get; set; } public object Json { get; set; }
} }
} }

View File

@ -37,12 +37,12 @@ namespace Artemis.Utilities
Environment.Exit(0); Environment.Exit(0);
} }
public static bool IsRunAsAdministrator() public static bool IsRunAsAdministrator()
{ {
var wi = WindowsIdentity.GetCurrent(); var wi = WindowsIdentity.GetCurrent();
var wp = new WindowsPrincipal(wi); var wp = new WindowsPrincipal(wi);
return wp.IsInRole(WindowsBuiltInRole.Administrator); return wp.IsInRole(WindowsBuiltInRole.Administrator);
} }
} }
} }

View File

@ -1,18 +1,18 @@
using System.Windows.Forms; using System.Windows.Forms;
namespace Artemis.Utilities.Keyboard namespace Artemis.Utilities.Keyboard
{ {
public class Key public class Key
{ {
public Key(Keys keyCode, int posX, int posY) public Key(Keys keyCode, int posX, int posY)
{ {
KeyCode = keyCode; KeyCode = keyCode;
PosX = posX; PosX = posX;
PosY = posY; PosY = posY;
} }
public Keys KeyCode { get; set; } public Keys KeyCode { get; set; }
public int PosX { get; set; } public int PosX { get; set; }
public int PosY { get; set; } public int PosY { get; set; }
} }
} }

View File

@ -1,24 +1,24 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using VirtualInput; using VirtualInput;
namespace Artemis.Utilities.Keyboard namespace Artemis.Utilities.Keyboard
{ {
public class KeyboardHook public class KeyboardHook
{ {
public delegate void KeyDownCallbackHandler(KeyEventArgs e); public delegate void KeyDownCallbackHandler(KeyEventArgs e);
public KeyboardHook() public KeyboardHook()
{ {
VirtualKeyboard.KeyDown += VirtualKeyboardOnKeyDown; VirtualKeyboard.KeyDown += VirtualKeyboardOnKeyDown;
VirtualKeyboard.StartInterceptor(); VirtualKeyboard.StartInterceptor();
} }
private void VirtualKeyboardOnKeyDown(object sender, KeyEventArgs keyEventArgs) private void VirtualKeyboardOnKeyDown(object sender, KeyEventArgs keyEventArgs)
{ {
Task.Factory.StartNew(() => { KeyDownCallback?.Invoke(keyEventArgs); }); Task.Factory.StartNew(() => { KeyDownCallback?.Invoke(keyEventArgs); });
} }
public event KeyDownCallbackHandler KeyDownCallback; public event KeyDownCallbackHandler KeyDownCallback;
} }
} }

View File

@ -1,194 +1,194 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Artemis.KeyboardProviders; using Artemis.KeyboardProviders;
namespace Artemis.Utilities.Keyboard namespace Artemis.Utilities.Keyboard
{ {
public class KeyboardRectangle public class KeyboardRectangle
{ {
private readonly BackgroundWorker _blinkWorker = new BackgroundWorker {WorkerSupportsCancellation = true}; private readonly BackgroundWorker _blinkWorker = new BackgroundWorker {WorkerSupportsCancellation = true};
private readonly KeyboardProvider _keyboard; private readonly KeyboardProvider _keyboard;
private int _blinkDelay; private int _blinkDelay;
private double _rotationProgress; private double _rotationProgress;
/// <summary> /// <summary>
/// Represents a Rectangle on the keyboard which can be drawn to a Bitmap. /// Represents a Rectangle on the keyboard which can be drawn to a Bitmap.
/// By default, a rectangle is the entire keyboard's size. /// By default, a rectangle is the entire keyboard's size.
/// </summary> /// </summary>
/// <param name="keyboard">The keyboard this rectangle will be used for</param> /// <param name="keyboard">The keyboard this rectangle will be used for</param>
/// <param name="x"></param> /// <param name="x"></param>
/// <param name="y"></param> /// <param name="y"></param>
/// <param name="colors">An array of colors the ColorBlend will use</param> /// <param name="colors">An array of colors the ColorBlend will use</param>
/// <param name="gradientMode"></param> /// <param name="gradientMode"></param>
public KeyboardRectangle(KeyboardProvider keyboard, int x, int y, List<Color> colors, public KeyboardRectangle(KeyboardProvider keyboard, int x, int y, List<Color> colors,
LinearGradientMode gradientMode) LinearGradientMode gradientMode)
{ {
_keyboard = keyboard; _keyboard = keyboard;
_rotationProgress = 0; _rotationProgress = 0;
_blinkWorker.DoWork += BlinkWorker_DoWork; _blinkWorker.DoWork += BlinkWorker_DoWork;
Scale = 4; Scale = 4;
X = x; X = x;
Y = y; Y = y;
Width = keyboard.Width*Scale; Width = keyboard.Width*Scale;
Height = keyboard.Height*Scale; Height = keyboard.Height*Scale;
Visible = true; Visible = true;
Opacity = 255; Opacity = 255;
ContainedBrush = true; ContainedBrush = true;
GradientMode = gradientMode; GradientMode = gradientMode;
Rotate = false; Rotate = false;
LoopSpeed = 1; LoopSpeed = 1;
Colors = colors; Colors = colors;
} }
public int X { get; set; } public int X { get; set; }
public int Y { get; set; } public int Y { get; set; }
public int Width { get; set; } public int Width { get; set; }
public int Height { get; set; } public int Height { get; set; }
public bool Visible { get; set; } public bool Visible { get; set; }
public byte Opacity { get; set; } // TODO: Remove public byte Opacity { get; set; } // TODO: Remove
/// <summary> /// <summary>
/// Sets wether or not the colors should be contained within the rectangle, or span the entire keyboard. /// Sets wether or not the colors should be contained within the rectangle, or span the entire keyboard.
/// </summary> /// </summary>
public bool ContainedBrush { get; set; } public bool ContainedBrush { get; set; }
/// <summary> /// <summary>
/// Used when ContainedBrush is set to false to make sure the colors span the entire keyboard on a higher scale. /// Used when ContainedBrush is set to false to make sure the colors span the entire keyboard on a higher scale.
/// </summary> /// </summary>
public int Scale { get; set; } public int Scale { get; set; }
/// <summary> /// <summary>
/// Determines what grientmode to use in the LinearGradientBrush. /// Determines what grientmode to use in the LinearGradientBrush.
/// </summary> /// </summary>
public LinearGradientMode GradientMode { get; set; } public LinearGradientMode GradientMode { get; set; }
/// <summary> /// <summary>
/// Wether or not to rotate the colors over the brush. /// Wether or not to rotate the colors over the brush.
/// </summary> /// </summary>
public bool Rotate { get; set; } public bool Rotate { get; set; }
/// <summary> /// <summary>
/// What speed to ratate the colors on. /// What speed to ratate the colors on.
/// </summary> /// </summary>
public double LoopSpeed { get; set; } public double LoopSpeed { get; set; }
/// <summary> /// <summary>
/// Colors used on the brush. /// Colors used on the brush.
/// </summary> /// </summary>
public List<Color> Colors { get; set; } public List<Color> Colors { get; set; }
public void StartBlink(int delay) public void StartBlink(int delay)
{ {
_blinkDelay = delay; _blinkDelay = delay;
if (!_blinkWorker.IsBusy) if (!_blinkWorker.IsBusy)
_blinkWorker.RunWorkerAsync(); _blinkWorker.RunWorkerAsync();
} }
public void StartBlink(int delay, int time) public void StartBlink(int delay, int time)
{ {
StartBlink(delay); StartBlink(delay);
Task.Factory.StartNew(() => Task.Factory.StartNew(() =>
{ {
Thread.Sleep(delay); Thread.Sleep(delay);
StopBlink(); StopBlink();
}); });
} }
public void StopBlink() public void StopBlink()
{ {
if (_blinkWorker.IsBusy) if (_blinkWorker.IsBusy)
_blinkWorker.CancelAsync(); _blinkWorker.CancelAsync();
} }
private void BlinkWorker_DoWork(object sender, DoWorkEventArgs e) private void BlinkWorker_DoWork(object sender, DoWorkEventArgs e)
{ {
while (!_blinkWorker.CancellationPending) while (!_blinkWorker.CancellationPending)
{ {
Thread.Sleep(_blinkDelay); Thread.Sleep(_blinkDelay);
Visible = !Visible; Visible = !Visible;
} }
Visible = true; Visible = true;
} }
public void Draw(Graphics g) public void Draw(Graphics g)
{ {
if (!Visible || Height < 1 || Width < 1 || !Colors.Any()) if (!Visible || Height < 1 || Width < 1 || !Colors.Any())
return; return;
var brush = CreateBrush(); var brush = CreateBrush();
var baseRect = new Rectangle(X, Y, Width, Height); var baseRect = new Rectangle(X, Y, Width, Height);
g.FillRectangle(brush, baseRect); g.FillRectangle(brush, baseRect);
if (!Rotate) if (!Rotate)
return; return;
_rotationProgress = _rotationProgress + LoopSpeed; _rotationProgress = _rotationProgress + LoopSpeed;
if (ContainedBrush && _rotationProgress > Width) if (ContainedBrush && _rotationProgress > Width)
_rotationProgress = LoopSpeed; _rotationProgress = LoopSpeed;
else if (!ContainedBrush && _rotationProgress > _keyboard.Width*Scale) else if (!ContainedBrush && _rotationProgress > _keyboard.Width*Scale)
_rotationProgress = LoopSpeed; _rotationProgress = LoopSpeed;
} }
private LinearGradientBrush CreateBrush() private LinearGradientBrush CreateBrush()
{ {
var colorBlend = CreateColorBlend(); var colorBlend = CreateColorBlend();
RectangleF rect; RectangleF rect;
if (Rotate) if (Rotate)
rect = ContainedBrush rect = ContainedBrush
? new Rectangle((int) _rotationProgress, Y, Width*2, Height*2) ? new Rectangle((int) _rotationProgress, Y, Width*2, Height*2)
: new Rectangle((int) _rotationProgress, 0, _keyboard.Width*Scale*2, _keyboard.Height*Scale*2); : new Rectangle((int) _rotationProgress, 0, _keyboard.Width*Scale*2, _keyboard.Height*Scale*2);
else else
rect = ContainedBrush rect = ContainedBrush
? new Rectangle(X, Y, Width, Height) ? new Rectangle(X, Y, Width, Height)
: new Rectangle(0, 0, _keyboard.Width*Scale, _keyboard.Height*Scale); : new Rectangle(0, 0, _keyboard.Width*Scale, _keyboard.Height*Scale);
return new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, GradientMode) return new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, GradientMode)
{ {
InterpolationColors = colorBlend InterpolationColors = colorBlend
}; };
} }
private ColorBlend CreateColorBlend() private ColorBlend CreateColorBlend()
{ {
if (Colors.Count == 1) if (Colors.Count == 1)
return new ColorBlend {Colors = new[] {Colors[0], Colors[0]}, Positions = new[] {0F, 1F}}; return new ColorBlend {Colors = new[] {Colors[0], Colors[0]}, Positions = new[] {0F, 1F}};
var colorBlend = Rotate var colorBlend = Rotate
? new ColorBlend {Colors = CreateTilebleColors(Colors).ToArray()} ? new ColorBlend {Colors = CreateTilebleColors(Colors).ToArray()}
: new ColorBlend {Colors = Colors.ToArray()}; : new ColorBlend {Colors = Colors.ToArray()};
// If needed, apply opacity to the colors in the blend // If needed, apply opacity to the colors in the blend
if (Opacity < 255) if (Opacity < 255)
for (var i = 0; i < colorBlend.Colors.Length; i++) for (var i = 0; i < colorBlend.Colors.Length; i++)
colorBlend.Colors[i] = Color.FromArgb(Opacity, colorBlend.Colors[i]); colorBlend.Colors[i] = Color.FromArgb(Opacity, colorBlend.Colors[i]);
// Devide the colors over the colorblend // Devide the colors over the colorblend
var devider = (float) colorBlend.Colors.Length - 1; var devider = (float) colorBlend.Colors.Length - 1;
var positions = new List<float>(); var positions = new List<float>();
for (var i = 0; i < colorBlend.Colors.Length; i++) for (var i = 0; i < colorBlend.Colors.Length; i++)
positions.Add(i/devider); positions.Add(i/devider);
// Apply the devided positions // Apply the devided positions
colorBlend.Positions = positions.ToArray(); colorBlend.Positions = positions.ToArray();
return colorBlend; return colorBlend;
} }
private List<Color> CreateTilebleColors(List<Color> sourceColors) private List<Color> CreateTilebleColors(List<Color> sourceColors)
{ {
// Create a list using the original colors // Create a list using the original colors
var tilebleColors = new List<Color>(sourceColors); var tilebleColors = new List<Color>(sourceColors);
// Add the original colors again // Add the original colors again
tilebleColors.AddRange(sourceColors); tilebleColors.AddRange(sourceColors);
// Add the first color, smoothing the transition // Add the first color, smoothing the transition
tilebleColors.Add(sourceColors.FirstOrDefault()); tilebleColors.Add(sourceColors.FirstOrDefault());
return tilebleColors; return tilebleColors;
} }
} }
} }

View File

@ -1,425 +1,425 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace Artemis.Utilities.Memory namespace Artemis.Utilities.Memory
{ {
/// <summary> /// <summary>
/// Represents an access to a remote process memory /// Represents an access to a remote process memory
/// </summary> /// </summary>
public class Memory : IDisposable public class Memory : IDisposable
{ {
public const string OffsetPattern = "(\\+|\\-){0,1}(0x){0,1}[a-fA-F0-9]{1,}"; public const string OffsetPattern = "(\\+|\\-){0,1}(0x){0,1}[a-fA-F0-9]{1,}";
private bool isDisposed; private bool isDisposed;
private IntPtr processHandle; private IntPtr processHandle;
/// <summary> /// <summary>
/// Initializes a new instance of the Memory /// Initializes a new instance of the Memory
/// </summary> /// </summary>
/// <param name="process">Remote process</param> /// <param name="process">Remote process</param>
public Memory(Process process) public Memory(Process process)
{ {
if (process == null) if (process == null)
throw new ArgumentNullException("process"); throw new ArgumentNullException("process");
Process = process; Process = process;
processHandle = Win32.OpenProcess( processHandle = Win32.OpenProcess(
Win32.ProcessAccessType.PROCESS_VM_READ | Win32.ProcessAccessType.PROCESS_VM_WRITE | Win32.ProcessAccessType.PROCESS_VM_READ | Win32.ProcessAccessType.PROCESS_VM_WRITE |
Win32.ProcessAccessType.PROCESS_VM_OPERATION, true, (uint) process.Id); Win32.ProcessAccessType.PROCESS_VM_OPERATION, true, (uint) process.Id);
if (processHandle == IntPtr.Zero) if (processHandle == IntPtr.Zero)
throw new InvalidOperationException("Could not open the process"); throw new InvalidOperationException("Could not open the process");
} }
#region Properties #region Properties
/// <summary> /// <summary>
/// Gets the process to which this memory is attached to /// Gets the process to which this memory is attached to
/// </summary> /// </summary>
public Process Process { get; private set; } public Process Process { get; private set; }
#endregion #endregion
/// <summary> /// <summary>
/// Finds module with the given name /// Finds module with the given name
/// </summary> /// </summary>
/// <param name="name">Module name</param> /// <param name="name">Module name</param>
/// <returns></returns> /// <returns></returns>
protected ProcessModule FindModule(string name) protected ProcessModule FindModule(string name)
{ {
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
throw new ArgumentNullException("name"); throw new ArgumentNullException("name");
foreach (ProcessModule module in Process.Modules) foreach (ProcessModule module in Process.Modules)
{ {
if (module.ModuleName.ToLower() == name.ToLower()) if (module.ModuleName.ToLower() == name.ToLower())
return module; return module;
} }
return null; return null;
} }
/// <summary> /// <summary>
/// Gets module based address /// Gets module based address
/// </summary> /// </summary>
/// <param name="moduleName">Module name</param> /// <param name="moduleName">Module name</param>
/// <param name="baseAddress">Base address</param> /// <param name="baseAddress">Base address</param>
/// <param name="offsets">Collection of offsets</param> /// <param name="offsets">Collection of offsets</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddress(string moduleName, IntPtr baseAddress, int[] offsets) public IntPtr GetAddress(string moduleName, IntPtr baseAddress, int[] offsets)
{ {
if (string.IsNullOrEmpty(moduleName)) if (string.IsNullOrEmpty(moduleName))
throw new ArgumentNullException("moduleName"); throw new ArgumentNullException("moduleName");
var module = FindModule(moduleName); var module = FindModule(moduleName);
if (module == null) if (module == null)
return IntPtr.Zero; return IntPtr.Zero;
var address = module.BaseAddress.ToInt32() + baseAddress.ToInt32(); var address = module.BaseAddress.ToInt32() + baseAddress.ToInt32();
return GetAddress((IntPtr) address, offsets); return GetAddress((IntPtr) address, offsets);
} }
/// <summary> /// <summary>
/// Gets module based address /// Gets module based address
/// </summary> /// </summary>
/// <param name="moduleName">Module name</param> /// <param name="moduleName">Module name</param>
/// <param name="baseAddress">Base address</param> /// <param name="baseAddress">Base address</param>
/// <param name="offsets">Collection of offsets</param> /// <param name="offsets">Collection of offsets</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddressX64(string moduleName, IntPtr baseAddress, int[] offsets) public IntPtr GetAddressX64(string moduleName, IntPtr baseAddress, int[] offsets)
{ {
if (string.IsNullOrEmpty(moduleName)) if (string.IsNullOrEmpty(moduleName))
throw new ArgumentNullException("moduleName"); throw new ArgumentNullException("moduleName");
var module = FindModule(moduleName); var module = FindModule(moduleName);
if (module == null) if (module == null)
return IntPtr.Zero; return IntPtr.Zero;
var address = module.BaseAddress.ToInt64() + baseAddress.ToInt64(); var address = module.BaseAddress.ToInt64() + baseAddress.ToInt64();
return GetAddressX64((IntPtr) address, offsets); return GetAddressX64((IntPtr) address, offsets);
} }
/// <summary> /// <summary>
/// Gets address /// Gets address
/// </summary> /// </summary>
/// <param name="baseAddress">Base address</param> /// <param name="baseAddress">Base address</param>
/// <param name="offsets">Collection of offsets</param> /// <param name="offsets">Collection of offsets</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddress(IntPtr baseAddress, int[] offsets) public IntPtr GetAddress(IntPtr baseAddress, int[] offsets)
{ {
if (baseAddress == IntPtr.Zero) if (baseAddress == IntPtr.Zero)
throw new ArgumentException("Invalid base address"); throw new ArgumentException("Invalid base address");
var address = baseAddress.ToInt32(); var address = baseAddress.ToInt32();
if (offsets != null && offsets.Length > 0) if (offsets != null && offsets.Length > 0)
{ {
var buffer = new byte[4]; var buffer = new byte[4];
foreach (var offset in offsets) foreach (var offset in offsets)
address = ReadInt32((IntPtr) address) + offset; address = ReadInt32((IntPtr) address) + offset;
} }
return (IntPtr) address; return (IntPtr) address;
} }
/// <summary> /// <summary>
/// Gets address /// Gets address
/// </summary> /// </summary>
/// <param name="baseAddress">Base address</param> /// <param name="baseAddress">Base address</param>
/// <param name="offsets">Collection of offsets</param> /// <param name="offsets">Collection of offsets</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddressX64(IntPtr baseAddress, int[] offsets) public IntPtr GetAddressX64(IntPtr baseAddress, int[] offsets)
{ {
if (baseAddress == IntPtr.Zero) if (baseAddress == IntPtr.Zero)
throw new ArgumentException("Invalid base address"); throw new ArgumentException("Invalid base address");
var address = baseAddress.ToInt64(); var address = baseAddress.ToInt64();
if (offsets != null && offsets.Length > 0) if (offsets != null && offsets.Length > 0)
{ {
var buffer = new byte[4]; var buffer = new byte[4];
foreach (var offset in offsets) foreach (var offset in offsets)
address = ReadInt32((IntPtr) address) + offset; address = ReadInt32((IntPtr) address) + offset;
} }
return (IntPtr) address; return (IntPtr) address;
} }
/// <summary> /// <summary>
/// Gets address pointer /// Gets address pointer
/// </summary> /// </summary>
/// <param name="address">Address</param> /// <param name="address">Address</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddressX64(string address) public IntPtr GetAddressX64(string address)
{ {
if (string.IsNullOrEmpty(address)) if (string.IsNullOrEmpty(address))
throw new ArgumentNullException("address"); throw new ArgumentNullException("address");
string moduleName = null; string moduleName = null;
var index = address.IndexOf('"'); var index = address.IndexOf('"');
if (index != -1) if (index != -1)
{ {
// Module name at the beginning // Module name at the beginning
var endIndex = address.IndexOf('"', index + 1); var endIndex = address.IndexOf('"', index + 1);
if (endIndex == -1) if (endIndex == -1)
throw new ArgumentException("Invalid module name. Could not find matching \""); throw new ArgumentException("Invalid module name. Could not find matching \"");
moduleName = address.Substring(index + 1, endIndex - 1); moduleName = address.Substring(index + 1, endIndex - 1);
address = address.Substring(endIndex + 1); address = address.Substring(endIndex + 1);
} }
var offsets = GetAddressOffsets(address); var offsets = GetAddressOffsets(address);
int[] _offsets = null; int[] _offsets = null;
var baseAddress = offsets != null && offsets.Length > 0 var baseAddress = offsets != null && offsets.Length > 0
? (IntPtr) offsets[0] ? (IntPtr) offsets[0]
: IntPtr.Zero; : IntPtr.Zero;
if (offsets != null && offsets.Length > 1) if (offsets != null && offsets.Length > 1)
{ {
_offsets = new int[offsets.Length - 1]; _offsets = new int[offsets.Length - 1];
for (var i = 0; i < offsets.Length - 1; i++) for (var i = 0; i < offsets.Length - 1; i++)
_offsets[i] = offsets[i + 1]; _offsets[i] = offsets[i + 1];
} }
if (moduleName != null) if (moduleName != null)
return GetAddressX64(moduleName, baseAddress, _offsets); return GetAddressX64(moduleName, baseAddress, _offsets);
return GetAddressX64(baseAddress, _offsets); return GetAddressX64(baseAddress, _offsets);
} }
/// <summary> /// <summary>
/// Gets address pointer /// Gets address pointer
/// </summary> /// </summary>
/// <param name="address">Address</param> /// <param name="address">Address</param>
/// <returns></returns> /// <returns></returns>
public IntPtr GetAddress(string address) public IntPtr GetAddress(string address)
{ {
if (string.IsNullOrEmpty(address)) if (string.IsNullOrEmpty(address))
throw new ArgumentNullException("address"); throw new ArgumentNullException("address");
string moduleName = null; string moduleName = null;
var index = address.IndexOf('"'); var index = address.IndexOf('"');
if (index != -1) if (index != -1)
{ {
// Module name at the beginning // Module name at the beginning
var endIndex = address.IndexOf('"', index + 1); var endIndex = address.IndexOf('"', index + 1);
if (endIndex == -1) if (endIndex == -1)
throw new ArgumentException("Invalid module name. Could not find matching \""); throw new ArgumentException("Invalid module name. Could not find matching \"");
moduleName = address.Substring(index + 1, endIndex - 1); moduleName = address.Substring(index + 1, endIndex - 1);
address = address.Substring(endIndex + 1); address = address.Substring(endIndex + 1);
} }
var offsets = GetAddressOffsets(address); var offsets = GetAddressOffsets(address);
int[] _offsets = null; int[] _offsets = null;
var baseAddress = offsets != null && offsets.Length > 0 var baseAddress = offsets != null && offsets.Length > 0
? (IntPtr) offsets[0] ? (IntPtr) offsets[0]
: IntPtr.Zero; : IntPtr.Zero;
if (offsets != null && offsets.Length > 1) if (offsets != null && offsets.Length > 1)
{ {
_offsets = new int[offsets.Length - 1]; _offsets = new int[offsets.Length - 1];
for (var i = 0; i < offsets.Length - 1; i++) for (var i = 0; i < offsets.Length - 1; i++)
_offsets[i] = offsets[i + 1]; _offsets[i] = offsets[i + 1];
} }
if (moduleName != null) if (moduleName != null)
return GetAddress(moduleName, baseAddress, _offsets); return GetAddress(moduleName, baseAddress, _offsets);
return GetAddress(baseAddress, _offsets); return GetAddress(baseAddress, _offsets);
} }
/// <summary> /// <summary>
/// Gets address offsets /// Gets address offsets
/// </summary> /// </summary>
/// <param name="address">Address</param> /// <param name="address">Address</param>
/// <returns></returns> /// <returns></returns>
protected static int[] GetAddressOffsets(string address) protected static int[] GetAddressOffsets(string address)
{ {
if (string.IsNullOrEmpty(address)) if (string.IsNullOrEmpty(address))
return new int[0]; return new int[0];
var matches = Regex.Matches(address, OffsetPattern); var matches = Regex.Matches(address, OffsetPattern);
var offsets = new int[matches.Count]; var offsets = new int[matches.Count];
string value; string value;
char ch; char ch;
for (var i = 0; i < matches.Count; i++) for (var i = 0; i < matches.Count; i++)
{ {
ch = matches[i].Value[0]; ch = matches[i].Value[0];
if (ch == '+' || ch == '-') if (ch == '+' || ch == '-')
value = matches[i].Value.Substring(1); value = matches[i].Value.Substring(1);
else else
value = matches[i].Value; value = matches[i].Value;
offsets[i] = Convert.ToInt32(value, 16); offsets[i] = Convert.ToInt32(value, 16);
if (ch == '-') if (ch == '-')
offsets[i] = -offsets[i]; offsets[i] = -offsets[i];
} }
return offsets; return offsets;
} }
/// <summary> /// <summary>
/// Reads memory at the address /// Reads memory at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="buffer">Buffer</param> /// <param name="buffer">Buffer</param>
/// <param name="size">Size in bytes</param> /// <param name="size">Size in bytes</param>
public void ReadMemory(IntPtr address, byte[] buffer, int size) public void ReadMemory(IntPtr address, byte[] buffer, int size)
{ {
if (isDisposed) if (isDisposed)
throw new ObjectDisposedException("Memory"); throw new ObjectDisposedException("Memory");
if (buffer == null) if (buffer == null)
throw new ArgumentNullException("buffer"); throw new ArgumentNullException("buffer");
if (size <= 0) if (size <= 0)
throw new ArgumentException("Size must be greater than zero"); throw new ArgumentException("Size must be greater than zero");
if (address == IntPtr.Zero) if (address == IntPtr.Zero)
throw new ArgumentException("Invalid address"); throw new ArgumentException("Invalid address");
uint read = 0; uint read = 0;
Win32.ReadProcessMemory(processHandle, address, buffer, (uint) size, ref read); Win32.ReadProcessMemory(processHandle, address, buffer, (uint) size, ref read);
} }
/// <summary> /// <summary>
/// Writes memory at the address /// Writes memory at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="buffer">Buffer</param> /// <param name="buffer">Buffer</param>
/// <param name="size">Size in bytes</param> /// <param name="size">Size in bytes</param>
public void WriteMemory(IntPtr address, byte[] buffer, int size) public void WriteMemory(IntPtr address, byte[] buffer, int size)
{ {
if (isDisposed) if (isDisposed)
throw new ObjectDisposedException("Memory"); throw new ObjectDisposedException("Memory");
if (buffer == null) if (buffer == null)
throw new ArgumentNullException("buffer"); throw new ArgumentNullException("buffer");
if (size <= 0) if (size <= 0)
throw new ArgumentException("Size must be greater than zero"); throw new ArgumentException("Size must be greater than zero");
if (address == IntPtr.Zero) if (address == IntPtr.Zero)
throw new ArgumentException("Invalid address"); throw new ArgumentException("Invalid address");
uint write = 0; uint write = 0;
if (!Win32.WriteProcessMemory(processHandle, address, buffer, (uint) size, ref write) || if (!Win32.WriteProcessMemory(processHandle, address, buffer, (uint) size, ref write) ||
write != size) write != size)
throw new AccessViolationException(); throw new AccessViolationException();
} }
/// <summary> /// <summary>
/// Reads 32 bit signed integer at the address /// Reads 32 bit signed integer at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <returns></returns> /// <returns></returns>
public int ReadInt32(IntPtr address) public int ReadInt32(IntPtr address)
{ {
var buffer = new byte[4]; var buffer = new byte[4];
ReadMemory(address, buffer, 4); ReadMemory(address, buffer, 4);
return BitConverter.ToInt32(buffer, 0); return BitConverter.ToInt32(buffer, 0);
} }
/// <summary> /// <summary>
/// Reads 32 bit signed integer at the address /// Reads 32 bit signed integer at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <returns></returns> /// <returns></returns>
public long ReadInt64(IntPtr address) public long ReadInt64(IntPtr address)
{ {
var buffer = new byte[8]; var buffer = new byte[8];
ReadMemory(address, buffer, 8); ReadMemory(address, buffer, 8);
return BitConverter.ToInt64(buffer, 0); return BitConverter.ToInt64(buffer, 0);
} }
/// <summary> /// <summary>
/// Reads 32 bit unsigned integer at the address /// Reads 32 bit unsigned integer at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <returns></returns> /// <returns></returns>
public uint ReadUInt32(IntPtr address) public uint ReadUInt32(IntPtr address)
{ {
var buffer = new byte[4]; var buffer = new byte[4];
ReadMemory(address, buffer, 4); ReadMemory(address, buffer, 4);
return BitConverter.ToUInt32(buffer, 0); return BitConverter.ToUInt32(buffer, 0);
} }
/// <summary> /// <summary>
/// Reads single precision value at the address /// Reads single precision value at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <returns></returns> /// <returns></returns>
public float ReadFloat(IntPtr address) public float ReadFloat(IntPtr address)
{ {
var buffer = new byte[4]; var buffer = new byte[4];
ReadMemory(address, buffer, 4); ReadMemory(address, buffer, 4);
return BitConverter.ToSingle(buffer, 0); return BitConverter.ToSingle(buffer, 0);
} }
/// <summary> /// <summary>
/// Reads double precision value at the address /// Reads double precision value at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <returns></returns> /// <returns></returns>
public double ReadDouble(IntPtr address) public double ReadDouble(IntPtr address)
{ {
var buffer = new byte[8]; var buffer = new byte[8];
ReadMemory(address, buffer, 8); ReadMemory(address, buffer, 8);
return BitConverter.ToDouble(buffer, 0); return BitConverter.ToDouble(buffer, 0);
} }
/// <summary> /// <summary>
/// Writes 32 bit unsigned integer at the address /// Writes 32 bit unsigned integer at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="value">Value</param> /// <param name="value">Value</param>
/// <returns></returns> /// <returns></returns>
public void WriteUInt32(IntPtr address, uint value) public void WriteUInt32(IntPtr address, uint value)
{ {
var buffer = BitConverter.GetBytes(value); var buffer = BitConverter.GetBytes(value);
WriteMemory(address, buffer, 4); WriteMemory(address, buffer, 4);
} }
/// <summary> /// <summary>
/// Writes 32 bit signed integer at the address /// Writes 32 bit signed integer at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="value">Value</param> /// <param name="value">Value</param>
/// <returns></returns> /// <returns></returns>
public void WriteInt32(IntPtr address, int value) public void WriteInt32(IntPtr address, int value)
{ {
var buffer = BitConverter.GetBytes(value); var buffer = BitConverter.GetBytes(value);
WriteMemory(address, buffer, 4); WriteMemory(address, buffer, 4);
} }
/// <summary> /// <summary>
/// Writes single precision value at the address /// Writes single precision value at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="value">Value</param> /// <param name="value">Value</param>
/// <returns></returns> /// <returns></returns>
public void WriteFloat(IntPtr address, float value) public void WriteFloat(IntPtr address, float value)
{ {
var buffer = BitConverter.GetBytes(value); var buffer = BitConverter.GetBytes(value);
WriteMemory(address, buffer, 4); WriteMemory(address, buffer, 4);
} }
/// <summary> /// <summary>
/// Writes double precision value at the address /// Writes double precision value at the address
/// </summary> /// </summary>
/// <param name="address">Memory address</param> /// <param name="address">Memory address</param>
/// <param name="value">Value</param> /// <param name="value">Value</param>
/// <returns></returns> /// <returns></returns>
public void WriteDouble(IntPtr address, double value) public void WriteDouble(IntPtr address, double value)
{ {
var buffer = BitConverter.GetBytes(value); var buffer = BitConverter.GetBytes(value);
WriteMemory(address, buffer, 8); WriteMemory(address, buffer, 8);
} }
#region IDisposable #region IDisposable
~Memory() ~Memory()
{ {
Dispose(false); Dispose(false);
} }
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
private void Dispose(bool disposing) private void Dispose(bool disposing)
{ {
if (isDisposed) if (isDisposed)
return; return;
Win32.CloseHandle(processHandle); Win32.CloseHandle(processHandle);
Process = null; Process = null;
processHandle = IntPtr.Zero; processHandle = IntPtr.Zero;
isDisposed = true; isDisposed = true;
} }
#endregion #endregion
} }
} }

View File

@ -1,41 +1,41 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Artemis.Utilities.Memory namespace Artemis.Utilities.Memory
{ {
public static class MemoryHelpers public static class MemoryHelpers
{ {
[DllImport("kernel32.dll", SetLastError = true)] [DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer,
int dwSize, ref int lpNumberOfBytesRead); int dwSize, ref int lpNumberOfBytesRead);
public static Process GetProcessIfRunning(string processName) public static Process GetProcessIfRunning(string processName)
{ {
var processes = Process.GetProcessesByName(processName); var processes = Process.GetProcessesByName(processName);
return processes.Length >= 1 ? processes[0] : null; return processes.Length >= 1 ? processes[0] : null;
} }
public static IntPtr FindAddress(IntPtr pHandle, IntPtr baseAddress, IntPtr staticPointer, int[] offsets) public static IntPtr FindAddress(IntPtr pHandle, IntPtr baseAddress, IntPtr staticPointer, int[] offsets)
{ {
// Create a buffer that is 4 bytes on a 32-bit system or 8 bytes on a 64-bit system. // Create a buffer that is 4 bytes on a 32-bit system or 8 bytes on a 64-bit system.
var tmp = new byte[IntPtr.Size]; var tmp = new byte[IntPtr.Size];
var address = baseAddress; var address = baseAddress;
// We must check for 32-bit vs 64-bit. // We must check for 32-bit vs 64-bit.
address = IntPtr.Size == 4 address = IntPtr.Size == 4
? new IntPtr(address.ToInt32() + staticPointer.ToInt32()) ? new IntPtr(address.ToInt32() + staticPointer.ToInt32())
: new IntPtr(address.ToInt64() + staticPointer.ToInt64()); : new IntPtr(address.ToInt64() + staticPointer.ToInt64());
// Loop through each offset to find the address // Loop through each offset to find the address
foreach (IntPtr t in offsets) foreach (IntPtr t in offsets)
{ {
var lpNumberOfBytesRead = 0; var lpNumberOfBytesRead = 0;
ReadProcessMemory(pHandle, address, tmp, IntPtr.Size, ref lpNumberOfBytesRead); ReadProcessMemory(pHandle, address, tmp, IntPtr.Size, ref lpNumberOfBytesRead);
address = IntPtr.Size == 4 address = IntPtr.Size == 4
? new IntPtr(BitConverter.ToInt32(tmp, 0) + t.ToInt32()) ? new IntPtr(BitConverter.ToInt32(tmp, 0) + t.ToInt32())
: new IntPtr(BitConverter.ToInt64(tmp, 0) + t.ToInt64()); : new IntPtr(BitConverter.ToInt64(tmp, 0) + t.ToInt64());
} }
return address; return address;
} }
} }
} }

View File

@ -1,43 +1,43 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Artemis.Utilities.Memory namespace Artemis.Utilities.Memory
{ {
/// <summary> /// <summary>
/// Win32 methods /// Win32 methods
/// </summary> /// </summary>
public static class Win32 public static class Win32
{ {
[Flags] [Flags]
public enum ProcessAccessType public enum ProcessAccessType
{ {
PROCESS_TERMINATE = 0x0001, PROCESS_TERMINATE = 0x0001,
PROCESS_CREATE_THREAD = 0x0002, PROCESS_CREATE_THREAD = 0x0002,
PROCESS_SET_SESSIONID = 0x0004, PROCESS_SET_SESSIONID = 0x0004,
PROCESS_VM_OPERATION = 0x0008, PROCESS_VM_OPERATION = 0x0008,
PROCESS_VM_READ = 0x0010, PROCESS_VM_READ = 0x0010,
PROCESS_VM_WRITE = 0x0020, PROCESS_VM_WRITE = 0x0020,
PROCESS_DUP_HANDLE = 0x0040, PROCESS_DUP_HANDLE = 0x0040,
PROCESS_CREATE_PROCESS = 0x0080, PROCESS_CREATE_PROCESS = 0x0080,
PROCESS_SET_QUOTA = 0x0100, PROCESS_SET_QUOTA = 0x0100,
PROCESS_SET_INFORMATION = 0x0200, PROCESS_SET_INFORMATION = 0x0200,
PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_QUERY_INFORMATION = 0x0400
} }
[DllImport("kernel32.dll", SetLastError = true)] [DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteProcessMemory( public static extern bool WriteProcessMemory(
IntPtr process, IntPtr address, byte[] buffer, uint size, ref uint written); IntPtr process, IntPtr address, byte[] buffer, uint size, ref uint written);
[DllImport("Kernel32.dll", SetLastError = true)] [DllImport("Kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory( public static extern bool ReadProcessMemory(
IntPtr process, IntPtr address, byte[] buffer, uint size, ref uint read); IntPtr process, IntPtr address, byte[] buffer, uint size, ref uint read);
[DllImport("kernel32.dll")] [DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess( public static extern IntPtr OpenProcess(
[MarshalAs(UnmanagedType.U4)] ProcessAccessType access, [MarshalAs(UnmanagedType.U4)] ProcessAccessType access,
[MarshalAs(UnmanagedType.Bool)] bool inheritHandler, uint processId); [MarshalAs(UnmanagedType.Bool)] bool inheritHandler, uint processId);
[DllImport("kernel32.dll")] [DllImport("kernel32.dll")]
public static extern int CloseHandle(IntPtr objectHandle); public static extern int CloseHandle(IntPtr objectHandle);
} }
} }

View File

@ -1,46 +1,46 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
namespace Artemis.Utilities namespace Artemis.Utilities
{ {
/// <summary> /// <summary>
/// Creates a shortcut (.lnk) file. /// Creates a shortcut (.lnk) file.
/// Source: http://stackoverflow.com/a/14632782/5015269 /// Source: http://stackoverflow.com/a/14632782/5015269
/// </summary> /// </summary>
[ComImport] [ComImport]
[Guid("00021401-0000-0000-C000-000000000046")] [Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink internal class ShellLink
{ {
} }
[ComImport] [ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")] [Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink internal interface IShellLink
{ {
void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd,
int fFlags); int fFlags);
void GetIDList(out IntPtr ppidl); void GetIDList(out IntPtr ppidl);
void SetIDList(IntPtr pidl); void SetIDList(IntPtr pidl);
void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName); void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath); void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
void GetHotkey(out short pwHotkey); void GetHotkey(out short pwHotkey);
void SetHotkey(short wHotkey); void SetHotkey(short wHotkey);
void GetShowCmd(out int piShowCmd); void GetShowCmd(out int piShowCmd);
void SetShowCmd(int iShowCmd); void SetShowCmd(int iShowCmd);
void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath,
out int piIcon); out int piIcon);
void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved); void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
void Resolve(IntPtr hwnd, int fFlags); void Resolve(IntPtr hwnd, int fFlags);
void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
} }
} }

View File

@ -1,39 +1,39 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Modules.Effects.AmbientLightning; using Artemis.Modules.Effects.AmbientLightning;
using Artemis.Modules.Effects.AudioVisualizer; using Artemis.Modules.Effects.AudioVisualizer;
using Artemis.Modules.Effects.Debug; using Artemis.Modules.Effects.Debug;
using Artemis.Modules.Effects.TypeHole; using Artemis.Modules.Effects.TypeHole;
using Artemis.Modules.Effects.TypeWave; using Artemis.Modules.Effects.TypeWave;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class EffectsViewModel : Conductor<IScreen>.Collection.OneActive public class EffectsViewModel : Conductor<IScreen>.Collection.OneActive
{ {
private readonly AudioVisualizerViewModel _audioVisualizerVm; private readonly AudioVisualizerViewModel _audioVisualizerVm;
private readonly DebugEffectViewModel _debugVm; private readonly DebugEffectViewModel _debugVm;
private readonly TypeHoleViewModel _typeHoleVm; private readonly TypeHoleViewModel _typeHoleVm;
private readonly TypeWaveViewModel _typeWaveVm; private readonly TypeWaveViewModel _typeWaveVm;
//private readonly AmbientLightningEffectViewModel _ambientLightningVm; //private readonly AmbientLightningEffectViewModel _ambientLightningVm;
public EffectsViewModel(MainManager mainManager) public EffectsViewModel(MainManager mainManager)
{ {
_typeWaveVm = new TypeWaveViewModel(mainManager) {DisplayName = "Type Waves"}; _typeWaveVm = new TypeWaveViewModel(mainManager) {DisplayName = "Type Waves"};
//_typeHoleVm = new TypeHoleViewModel(MainManager) {DisplayName = "Type Holes (NYI)"}; //_typeHoleVm = new TypeHoleViewModel(MainManager) {DisplayName = "Type Holes (NYI)"};
_audioVisualizerVm = new AudioVisualizerViewModel(mainManager) {DisplayName = "Audio Visualization"}; _audioVisualizerVm = new AudioVisualizerViewModel(mainManager) {DisplayName = "Audio Visualization"};
//_ambientLightningVm = new AmbientLightningEffectViewModel(mainManager) {DisplayName = "Ambient Lightning"}; //_ambientLightningVm = new AmbientLightningEffectViewModel(mainManager) {DisplayName = "Ambient Lightning"};
_debugVm = new DebugEffectViewModel(mainManager) {DisplayName = "Debug Effect"}; _debugVm = new DebugEffectViewModel(mainManager) {DisplayName = "Debug Effect"};
} }
protected override void OnActivate() protected override void OnActivate()
{ {
base.OnActivate(); base.OnActivate();
ActivateItem(_typeWaveVm); ActivateItem(_typeWaveVm);
//ActivateItem(_typeHoleVm); //ActivateItem(_typeHoleVm);
ActivateItem(_audioVisualizerVm); ActivateItem(_audioVisualizerVm);
//ActivateItem(_ambientLightningVm); //ActivateItem(_ambientLightningVm);
ActivateItem(_debugVm); ActivateItem(_debugVm);
} }
} }
} }

View File

@ -1,57 +1,57 @@
using Caliburn.Micro; using Caliburn.Micro;
using MahApps.Metro.Controls; using MahApps.Metro.Controls;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public abstract class FlyoutBaseViewModel : PropertyChangedBase public abstract class FlyoutBaseViewModel : PropertyChangedBase
{ {
private string _header; private string _header;
private bool _isOpen; private bool _isOpen;
private Position _position; private Position _position;
public string Header public string Header
{ {
get { return _header; } get { return _header; }
set set
{ {
if (value == _header) if (value == _header)
return; return;
_header = value; _header = value;
NotifyOfPropertyChange(() => Header); NotifyOfPropertyChange(() => Header);
} }
} }
public bool IsOpen public bool IsOpen
{ {
get { return _isOpen; } get { return _isOpen; }
set set
{ {
if (value.Equals(_isOpen)) if (value.Equals(_isOpen))
return; return;
_isOpen = value; _isOpen = value;
HandleOpen(); HandleOpen();
NotifyOfPropertyChange(() => IsOpen); NotifyOfPropertyChange(() => IsOpen);
} }
} }
public Position Position public Position Position
{ {
get { return _position; } get { return _position; }
set set
{ {
if (value == _position) if (value == _position)
return; return;
_position = value; _position = value;
NotifyOfPropertyChange(() => Position); NotifyOfPropertyChange(() => Position);
} }
} }
protected abstract void HandleOpen(); protected abstract void HandleOpen();
} }
} }

View File

@ -1,134 +1,134 @@
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Settings; using Artemis.Settings;
using Caliburn.Micro; using Caliburn.Micro;
using MahApps.Metro.Controls; using MahApps.Metro.Controls;
namespace Artemis.ViewModels.Flyouts namespace Artemis.ViewModels.Flyouts
{ {
public class FlyoutSettingsViewModel : FlyoutBaseViewModel, IHandle<ToggleEnabled>, IHandle<ActiveEffectChanged> public class FlyoutSettingsViewModel : FlyoutBaseViewModel, IHandle<ToggleEnabled>, IHandle<ActiveEffectChanged>
{ {
private string _activeEffectName; private string _activeEffectName;
private bool _enabled; private bool _enabled;
private GeneralSettings _generalSettings; private GeneralSettings _generalSettings;
private string _selectedKeyboardProvider; private string _selectedKeyboardProvider;
public FlyoutSettingsViewModel(MainManager mainManager) public FlyoutSettingsViewModel(MainManager mainManager)
{ {
MainManager = mainManager; MainManager = mainManager;
Header = "Settings"; Header = "Settings";
Position = Position.Right; Position = Position.Right;
GeneralSettings = new GeneralSettings(); GeneralSettings = new GeneralSettings();
MainManager.Events.Subscribe(this); MainManager.Events.Subscribe(this);
} }
public GeneralSettings GeneralSettings public GeneralSettings GeneralSettings
{ {
get { return _generalSettings; } get { return _generalSettings; }
set set
{ {
if (Equals(value, _generalSettings)) return; if (Equals(value, _generalSettings)) return;
_generalSettings = value; _generalSettings = value;
NotifyOfPropertyChange(() => GeneralSettings); NotifyOfPropertyChange(() => GeneralSettings);
} }
} }
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
public BindableCollection<string> KeyboardProviders public BindableCollection<string> KeyboardProviders
{ {
get get
{ {
var collection = new BindableCollection<string>(MainManager.KeyboardManager.KeyboardProviders var collection = new BindableCollection<string>(MainManager.KeyboardManager.KeyboardProviders
.Select(k => k.Name)); .Select(k => k.Name));
collection.Insert(0, "None"); collection.Insert(0, "None");
return collection; return collection;
} }
} }
public string SelectedKeyboardProvider public string SelectedKeyboardProvider
{ {
get { return _selectedKeyboardProvider; } get { return _selectedKeyboardProvider; }
set set
{ {
if (value == _selectedKeyboardProvider) return; if (value == _selectedKeyboardProvider) return;
_selectedKeyboardProvider = value; _selectedKeyboardProvider = value;
NotifyOfPropertyChange(() => SelectedKeyboardProvider); NotifyOfPropertyChange(() => SelectedKeyboardProvider);
if (value == null) if (value == null)
return; return;
MainManager.KeyboardManager.ChangeKeyboard( MainManager.KeyboardManager.ChangeKeyboard(
MainManager.KeyboardManager.KeyboardProviders.FirstOrDefault( MainManager.KeyboardManager.KeyboardProviders.FirstOrDefault(
k => k.Name == _selectedKeyboardProvider)); k => k.Name == _selectedKeyboardProvider));
} }
} }
public bool Enabled public bool Enabled
{ {
get { return MainManager.ProgramEnabled; } get { return MainManager.ProgramEnabled; }
set set
{ {
if (value) if (value)
MainManager.EnableProgram(); MainManager.EnableProgram();
else else
MainManager.DisableProgram(); MainManager.DisableProgram();
} }
} }
public string ActiveEffectName public string ActiveEffectName
{ {
get { return _activeEffectName; } get { return _activeEffectName; }
set set
{ {
if (value == _activeEffectName) return; if (value == _activeEffectName) return;
_activeEffectName = value; _activeEffectName = value;
NotifyOfPropertyChange(() => ActiveEffectName); NotifyOfPropertyChange(() => ActiveEffectName);
} }
} }
public void Handle(ActiveEffectChanged message) public void Handle(ActiveEffectChanged message)
{ {
var effectDisplay = message.ActiveEffect.Length > 0 ? message.ActiveEffect : "none"; var effectDisplay = message.ActiveEffect.Length > 0 ? message.ActiveEffect : "none";
ActiveEffectName = $"Active effect: {effectDisplay}"; ActiveEffectName = $"Active effect: {effectDisplay}";
} }
public void Handle(ToggleEnabled message) public void Handle(ToggleEnabled message)
{ {
NotifyOfPropertyChange(() => Enabled); NotifyOfPropertyChange(() => Enabled);
} }
public void ToggleEnabled() public void ToggleEnabled()
{ {
if (Enabled) if (Enabled)
MainManager.DisableProgram(); MainManager.DisableProgram();
else else
MainManager.EnableProgram(); MainManager.EnableProgram();
} }
public void ResetSettings() public void ResetSettings()
{ {
GeneralSettings.ResetSettings(); GeneralSettings.ResetSettings();
NotifyOfPropertyChange(() => GeneralSettings); NotifyOfPropertyChange(() => GeneralSettings);
} }
public void SaveSettings() public void SaveSettings()
{ {
GeneralSettings.SaveSettings(); GeneralSettings.SaveSettings();
} }
public void NavigateTo(string url) public void NavigateTo(string url)
{ {
Process.Start(new ProcessStartInfo(url)); Process.Start(new ProcessStartInfo(url));
} }
protected override void HandleOpen() protected override void HandleOpen()
{ {
SelectedKeyboardProvider = General.Default.LastKeyboard.Length > 0 SelectedKeyboardProvider = General.Default.LastKeyboard.Length > 0
? General.Default.LastKeyboard ? General.Default.LastKeyboard
: "None"; : "None";
} }
} }
} }

View File

@ -1,39 +1,39 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Modules.Games.CounterStrike; using Artemis.Modules.Games.CounterStrike;
using Artemis.Modules.Games.Dota2; using Artemis.Modules.Games.Dota2;
using Artemis.Modules.Games.RocketLeague; using Artemis.Modules.Games.RocketLeague;
using Artemis.Modules.Games.TheDivision; using Artemis.Modules.Games.TheDivision;
using Artemis.Modules.Games.Witcher3; using Artemis.Modules.Games.Witcher3;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class GamesViewModel : Conductor<IScreen>.Collection.OneActive public class GamesViewModel : Conductor<IScreen>.Collection.OneActive
{ {
private readonly CounterStrikeViewModel _counterStrikeVm; private readonly CounterStrikeViewModel _counterStrikeVm;
private readonly Dota2ViewModel _dota2Vm; private readonly Dota2ViewModel _dota2Vm;
private readonly RocketLeagueViewModel _rocketLeagueVm; private readonly RocketLeagueViewModel _rocketLeagueVm;
private readonly Witcher3ViewModel _witcher3Vm; private readonly Witcher3ViewModel _witcher3Vm;
private readonly TheDivisionViewModel _divisionVm; private readonly TheDivisionViewModel _divisionVm;
public GamesViewModel(MainManager mainManager) public GamesViewModel(MainManager mainManager)
{ {
_rocketLeagueVm = new RocketLeagueViewModel(mainManager) {DisplayName = "Rocket League"}; _rocketLeagueVm = new RocketLeagueViewModel(mainManager) {DisplayName = "Rocket League"};
_counterStrikeVm = new CounterStrikeViewModel(mainManager) {DisplayName = "CS:GO"}; _counterStrikeVm = new CounterStrikeViewModel(mainManager) {DisplayName = "CS:GO"};
_dota2Vm = new Dota2ViewModel(mainManager) {DisplayName = "Dota 2"}; _dota2Vm = new Dota2ViewModel(mainManager) {DisplayName = "Dota 2"};
_witcher3Vm = new Witcher3ViewModel(mainManager) {DisplayName = "The Witcher 3"}; _witcher3Vm = new Witcher3ViewModel(mainManager) {DisplayName = "The Witcher 3"};
// _divisionVm = new TheDivisionViewModel(mainManager) {DisplayName = "The Division"}; // _divisionVm = new TheDivisionViewModel(mainManager) {DisplayName = "The Division"};
} }
protected override void OnActivate() protected override void OnActivate()
{ {
base.OnActivate(); base.OnActivate();
ActivateItem(_rocketLeagueVm); ActivateItem(_rocketLeagueVm);
ActivateItem(_counterStrikeVm); ActivateItem(_counterStrikeVm);
ActivateItem(_dota2Vm); ActivateItem(_dota2Vm);
ActivateItem(_witcher3Vm); ActivateItem(_witcher3Vm);
// ActivateItem(_divisionVm); // ActivateItem(_divisionVm);
} }
} }
} }

View File

@ -1,29 +1,29 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Modules.Overlays.VolumeDisplay; using Artemis.Modules.Overlays.VolumeDisplay;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class OverlaysViewModel : Conductor<IScreen>.Collection.OneActive public class OverlaysViewModel : Conductor<IScreen>.Collection.OneActive
{ {
private readonly MainManager _mainManager; private readonly MainManager _mainManager;
private VolumeDisplayViewModel _volumeDisplayVm; private VolumeDisplayViewModel _volumeDisplayVm;
public OverlaysViewModel(MainManager mainManager) public OverlaysViewModel(MainManager mainManager)
{ {
_mainManager = mainManager; _mainManager = mainManager;
} }
protected override void OnActivate() protected override void OnActivate()
{ {
base.OnActivate(); base.OnActivate();
Items.Clear(); Items.Clear();
// This VM appears to be going out of scope, so recreating it every time just to be sure. // This VM appears to be going out of scope, so recreating it every time just to be sure.
_volumeDisplayVm = new VolumeDisplayViewModel(_mainManager) {DisplayName = "Volume Display"}; _volumeDisplayVm = new VolumeDisplayViewModel(_mainManager) {DisplayName = "Volume Display"};
ActivateItem(_volumeDisplayVm); ActivateItem(_volumeDisplayVm);
ActiveItem = _volumeDisplayVm; ActiveItem = _volumeDisplayVm;
} }
} }
} }

View File

@ -1,59 +1,59 @@
using System.Linq; using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Services; using Artemis.Services;
using Artemis.ViewModels.Flyouts; using Artemis.ViewModels.Flyouts;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public sealed class ShellViewModel : Conductor<IScreen>.Collection.OneActive public sealed class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{ {
private readonly EffectsViewModel _effectsVm; private readonly EffectsViewModel _effectsVm;
private readonly GamesViewModel _gamesVm; private readonly GamesViewModel _gamesVm;
private readonly OverlaysViewModel _overlaysVm; private readonly OverlaysViewModel _overlaysVm;
private readonly WelcomeViewModel _welcomeVm; private readonly WelcomeViewModel _welcomeVm;
public ShellViewModel() public ShellViewModel()
{ {
var dialogService = new MetroDialogService(this); var dialogService = new MetroDialogService(this);
IEventAggregator events = new EventAggregator(); IEventAggregator events = new EventAggregator();
MainManager = new MainManager(events, dialogService); MainManager = new MainManager(events, dialogService);
DisplayName = "Artemis"; DisplayName = "Artemis";
_welcomeVm = new WelcomeViewModel {DisplayName = "Welcome"}; _welcomeVm = new WelcomeViewModel {DisplayName = "Welcome"};
_effectsVm = new EffectsViewModel(MainManager) {DisplayName = "Effects"}; _effectsVm = new EffectsViewModel(MainManager) {DisplayName = "Effects"};
_gamesVm = new GamesViewModel(MainManager) {DisplayName = "Games"}; _gamesVm = new GamesViewModel(MainManager) {DisplayName = "Games"};
_overlaysVm = new OverlaysViewModel(MainManager) {DisplayName = "Overlays"}; _overlaysVm = new OverlaysViewModel(MainManager) {DisplayName = "Overlays"};
Flyouts.Add(new FlyoutSettingsViewModel(MainManager)); Flyouts.Add(new FlyoutSettingsViewModel(MainManager));
} }
public IObservableCollection<FlyoutBaseViewModel> Flyouts { get; set; } = public IObservableCollection<FlyoutBaseViewModel> Flyouts { get; set; } =
new BindableCollection<FlyoutBaseViewModel>(); new BindableCollection<FlyoutBaseViewModel>();
public MainManager MainManager { get; set; } public MainManager MainManager { get; set; }
protected override void OnActivate() protected override void OnActivate()
{ {
base.OnActivate(); base.OnActivate();
ActivateItem(_welcomeVm); ActivateItem(_welcomeVm);
ActivateItem(_effectsVm); ActivateItem(_effectsVm);
ActivateItem(_gamesVm); ActivateItem(_gamesVm);
ActivateItem(_overlaysVm); ActivateItem(_overlaysVm);
ActiveItem = _welcomeVm; ActiveItem = _welcomeVm;
} }
public void Settings() public void Settings()
{ {
Flyouts.First().IsOpen = !Flyouts.First().IsOpen; Flyouts.First().IsOpen = !Flyouts.First().IsOpen;
} }
public void CloseSettings() public void CloseSettings()
{ {
Flyouts.First().IsOpen = false; Flyouts.First().IsOpen = false;
} }
} }
} }

View File

@ -1,54 +1,54 @@
using System; using System;
using System.Windows; using System.Windows;
using Artemis.Events; using Artemis.Events;
using Artemis.Properties; using Artemis.Properties;
using Artemis.Settings; using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class SystemTrayViewModel : Screen, IHandle<ToggleEnabled> public class SystemTrayViewModel : Screen, IHandle<ToggleEnabled>
{ {
private readonly ShellViewModel _shellViewModel; private readonly ShellViewModel _shellViewModel;
private readonly IWindowManager _windowManager; private readonly IWindowManager _windowManager;
private string _activeIcon; private string _activeIcon;
private bool _checkedForUpdate; private bool _checkedForUpdate;
private bool _enabled; private bool _enabled;
private string _toggleText; private string _toggleText;
public SystemTrayViewModel(IWindowManager windowManager, ShellViewModel shellViewModel) public SystemTrayViewModel(IWindowManager windowManager, ShellViewModel shellViewModel)
{ {
_windowManager = windowManager; _windowManager = windowManager;
_shellViewModel = shellViewModel; _shellViewModel = shellViewModel;
_shellViewModel.MainManager.Events.Subscribe(this); _shellViewModel.MainManager.Events.Subscribe(this);
_shellViewModel.MainManager.EnableProgram(); _shellViewModel.MainManager.EnableProgram();
_checkedForUpdate = false; _checkedForUpdate = false;
//ActiveIcon = "../logo.ico"; //ActiveIcon = "../logo.ico";
if (General.Default.ShowOnStartup) if (General.Default.ShowOnStartup)
ShowWindow(); ShowWindow();
} }
public bool CanShowWindow => !_shellViewModel.IsActive; public bool CanShowWindow => !_shellViewModel.IsActive;
public bool CanHideWindow => _shellViewModel.IsActive; public bool CanHideWindow => _shellViewModel.IsActive;
public bool Enabled public bool Enabled
{ {
get { return _enabled; } get { return _enabled; }
set set
{ {
if (value == _enabled) return; if (value == _enabled) return;
_enabled = value; _enabled = value;
ToggleText = _enabled ? "Disable Artemis" : "Enable Artemis"; ToggleText = _enabled ? "Disable Artemis" : "Enable Artemis";
ActiveIcon = _enabled ? "../Resources/logo.ico" : "../Resources/logo-disabled.ico"; ActiveIcon = _enabled ? "../Resources/logo.ico" : "../Resources/logo-disabled.ico";
NotifyOfPropertyChange(() => Enabled); NotifyOfPropertyChange(() => Enabled);
} }
} }
public string ActiveIcon public string ActiveIcon
{ {
get { return _activeIcon; } get { return _activeIcon; }
@ -57,77 +57,77 @@ namespace Artemis.ViewModels
_activeIcon = value; _activeIcon = value;
NotifyOfPropertyChange(); NotifyOfPropertyChange();
} }
} }
public string ToggleText public string ToggleText
{ {
get { return _toggleText; } get { return _toggleText; }
set set
{ {
if (value == _toggleText) return; if (value == _toggleText) return;
_toggleText = value; _toggleText = value;
NotifyOfPropertyChange(() => ToggleText); NotifyOfPropertyChange(() => ToggleText);
} }
} }
public void Handle(ToggleEnabled message) public void Handle(ToggleEnabled message)
{ {
Enabled = message.Enabled; Enabled = message.Enabled;
} }
public void ToggleEnabled() public void ToggleEnabled()
{ {
if (Enabled) if (Enabled)
_shellViewModel.MainManager.DisableProgram(); _shellViewModel.MainManager.DisableProgram();
else else
_shellViewModel.MainManager.EnableProgram(); _shellViewModel.MainManager.EnableProgram();
} }
protected override void OnActivate() protected override void OnActivate()
{ {
base.OnActivate(); base.OnActivate();
NotifyOfPropertyChange(() => CanShowWindow); NotifyOfPropertyChange(() => CanShowWindow);
NotifyOfPropertyChange(() => CanHideWindow); NotifyOfPropertyChange(() => CanHideWindow);
} }
public void ShowWindow() public void ShowWindow()
{ {
if (!CanShowWindow) if (!CanShowWindow)
return; return;
// manually show the next window view-model // manually show the next window view-model
_windowManager.ShowWindow(_shellViewModel); _windowManager.ShowWindow(_shellViewModel);
NotifyOfPropertyChange(() => CanShowWindow); NotifyOfPropertyChange(() => CanShowWindow);
NotifyOfPropertyChange(() => CanHideWindow); NotifyOfPropertyChange(() => CanHideWindow);
if (_checkedForUpdate) if (_checkedForUpdate)
return; return;
_checkedForUpdate = true; _checkedForUpdate = true;
Updater.CheckForUpdate(_shellViewModel.MainManager.DialogService); Updater.CheckForUpdate(_shellViewModel.MainManager.DialogService);
} }
public void HideWindow() public void HideWindow()
{ {
if (!CanHideWindow) if (!CanHideWindow)
return; return;
_shellViewModel.TryClose(); _shellViewModel.TryClose();
NotifyOfPropertyChange(() => CanShowWindow); NotifyOfPropertyChange(() => CanShowWindow);
NotifyOfPropertyChange(() => CanHideWindow); NotifyOfPropertyChange(() => CanHideWindow);
} }
public void ExitApplication() public void ExitApplication()
{ {
_shellViewModel.MainManager.Shutdown(); _shellViewModel.MainManager.Shutdown();
Application.Current.Shutdown(); Application.Current.Shutdown();
// Sometimes you need to be rough. // Sometimes you need to be rough.
Environment.Exit(0); Environment.Exit(0);
} }
} }
} }

View File

@ -1,13 +1,13 @@
using System.Diagnostics; using System.Diagnostics;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
public class WelcomeViewModel : Screen public class WelcomeViewModel : Screen
{ {
public void NavigateTo(string url) public void NavigateTo(string url)
{ {
Process.Start(new ProcessStartInfo(url)); Process.Start(new ProcessStartInfo(url));
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for EffectsView.xaml /// Interaction logic for EffectsView.xaml
/// </summary> /// </summary>
public partial class EffectsView : UserControl public partial class EffectsView : UserControl
{ {
public EffectsView() public EffectsView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Views.Flyouts namespace Artemis.Views.Flyouts
{ {
/// <summary> /// <summary>
/// Interaction logic for FlyoutSettingsView.xaml /// Interaction logic for FlyoutSettingsView.xaml
/// </summary> /// </summary>
public partial class FlyoutSettingsView : UserControl public partial class FlyoutSettingsView : UserControl
{ {
public FlyoutSettingsView() public FlyoutSettingsView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for GamesView.xaml /// Interaction logic for GamesView.xaml
/// </summary> /// </summary>
public partial class GamesView : UserControl public partial class GamesView : UserControl
{ {
public GamesView() public GamesView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,15 +1,15 @@
using System.Windows.Controls; using System.Windows.Controls;
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for OverlaysView.xaml /// Interaction logic for OverlaysView.xaml
/// </summary> /// </summary>
public partial class OverlaysView : UserControl public partial class OverlaysView : UserControl
{ {
public OverlaysView() public OverlaysView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,13 +1,13 @@
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for ShellView.xaml /// Interaction logic for ShellView.xaml
/// </summary> /// </summary>
public partial class ShellView public partial class ShellView
{ {
public ShellView() public ShellView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,15 +1,15 @@
using MahApps.Metro.Controls; using MahApps.Metro.Controls;
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for SystemTrayView.xaml /// Interaction logic for SystemTrayView.xaml
/// </summary> /// </summary>
public partial class SystemTrayView : MetroWindow public partial class SystemTrayView : MetroWindow
{ {
public SystemTrayView() public SystemTrayView()
{ {
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -1,22 +1,22 @@
using System.Diagnostics; using System.Diagnostics;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Navigation; using System.Windows.Navigation;
namespace Artemis.Views namespace Artemis.Views
{ {
/// <summary> /// <summary>
/// Interaction logic for WelcomeView.xaml /// Interaction logic for WelcomeView.xaml
/// </summary> /// </summary>
public partial class WelcomeView : UserControl public partial class WelcomeView : UserControl
{ {
public WelcomeView() public WelcomeView()
{ {
InitializeComponent(); InitializeComponent();
} }
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{ {
Process.Start("https://github.com/SpoinkyNL/Artemis/wiki/Frequently-Asked-Questions-(FAQ)"); Process.Start("https://github.com/SpoinkyNL/Artemis/wiki/Frequently-Asked-Questions-(FAQ)");
} }
} }
} }