ShareX/ShareX.HelpersLib/Input/HotkeyInfo.cs
2024-01-03 02:57:14 +03:00

173 lines
4.6 KiB
C#

#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
Copyright (c) 2007-2024 ShareX Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
using Newtonsoft.Json;
using System.Text;
using System.Windows.Forms;
namespace ShareX.HelpersLib
{
public class HotkeyInfo
{
public Keys Hotkey { get; set; }
[JsonIgnore]
public ushort ID { get; set; }
[JsonIgnore]
public HotkeyStatus Status { get; set; }
public Keys KeyCode => Hotkey & Keys.KeyCode;
public Keys ModifiersKeys => Hotkey & Keys.Modifiers;
public bool Control => Hotkey.HasFlag(Keys.Control);
public bool Shift => Hotkey.HasFlag(Keys.Shift);
public bool Alt => Hotkey.HasFlag(Keys.Alt);
public bool Win { get; set; }
public Modifiers ModifiersEnum
{
get
{
Modifiers modifiers = Modifiers.None;
if (Alt) modifiers |= Modifiers.Alt;
if (Control) modifiers |= Modifiers.Control;
if (Shift) modifiers |= Modifiers.Shift;
if (Win) modifiers |= Modifiers.Win;
return modifiers;
}
}
public bool IsOnlyModifiers => KeyCode == Keys.ControlKey || KeyCode == Keys.ShiftKey || KeyCode == Keys.Menu || (KeyCode == Keys.None && Win);
public bool IsValidHotkey => KeyCode != Keys.None && !IsOnlyModifiers;
public HotkeyInfo()
{
Status = HotkeyStatus.NotConfigured;
}
public HotkeyInfo(Keys hotkey) : this()
{
Hotkey = hotkey;
}
public HotkeyInfo(Keys hotkey, ushort id) : this(hotkey)
{
ID = id;
}
public override string ToString()
{
string text = "";
if (Control)
{
text += "Ctrl + ";
}
if (Shift)
{
text += "Shift + ";
}
if (Alt)
{
text += "Alt + ";
}
if (Win)
{
text += "Win + ";
}
if (IsOnlyModifiers)
{
text += "...";
}
else if (KeyCode == Keys.Back)
{
text += "Backspace";
}
else if (KeyCode == Keys.Return)
{
text += "Enter";
}
else if (KeyCode == Keys.Capital)
{
text += "Caps Lock";
}
else if (KeyCode == Keys.Next)
{
text += "Page Down";
}
else if (KeyCode == Keys.Scroll)
{
text += "Scroll Lock";
}
else if (KeyCode >= Keys.D0 && KeyCode <= Keys.D9)
{
text += (KeyCode - Keys.D0).ToString();
}
else if (KeyCode >= Keys.NumPad0 && KeyCode <= Keys.NumPad9)
{
text += "Numpad " + (KeyCode - Keys.NumPad0).ToString();
}
else
{
text += ToStringWithSpaces(KeyCode);
}
return text;
}
private string ToStringWithSpaces(Keys key)
{
string name = key.ToString();
StringBuilder result = new StringBuilder();
for (int i = 0; i < name.Length; i++)
{
if (i > 0 && char.IsUpper(name[i]))
{
result.Append(" " + name[i]);
}
else
{
result.Append(name[i]);
}
}
return result.ToString();
}
}
}