Files
better-genshin-impact/BetterGenshinImpact/Model/HotKey.cs
2023-10-15 01:32:47 +08:00

64 lines
1.8 KiB
C#

using System;
using System.Text;
using System.Windows.Input;
namespace BetterGenshinImpact.Model;
public readonly partial record struct HotKey(Key Key, ModifierKeys Modifiers = ModifierKeys.None)
{
public override string ToString()
{
if (Key == Key.None && Modifiers == ModifierKeys.None)
return "< None >";
var buffer = new StringBuilder();
if (Modifiers.HasFlag(ModifierKeys.Control))
buffer.Append("Ctrl + ");
if (Modifiers.HasFlag(ModifierKeys.Shift))
buffer.Append("Shift + ");
if (Modifiers.HasFlag(ModifierKeys.Alt))
buffer.Append("Alt + ");
if (Modifiers.HasFlag(ModifierKeys.Windows))
buffer.Append("Win + ");
buffer.Append(Key);
return buffer.ToString();
}
public bool IsEmpty => Key == Key.None && Modifiers == ModifierKeys.None;
public static HotKey FromString(string str)
{
var key = Key.None;
var modifiers = ModifierKeys.None;
if (string.IsNullOrWhiteSpace(str) || string.Equals(str, "< None >"))
{
return new HotKey(key, modifiers);
}
var parts = str.Split('+');
foreach (var part in parts)
{
var trimmed = part.Trim();
if (trimmed == "Ctrl")
modifiers |= ModifierKeys.Control;
else if (trimmed == "Shift")
modifiers |= ModifierKeys.Shift;
else if (trimmed == "Alt")
modifiers |= ModifierKeys.Alt;
else if (trimmed == "Win")
modifiers |= ModifierKeys.Windows;
else
key = (Key)Enum.Parse(typeof(Key), trimmed);
}
return new HotKey(key, modifiers);
}
}
public partial record struct HotKey
{
public static HotKey None { get; } = new();
}