diff options
author | Geordie Hall <me@geordiehall.com> | 2022-02-05 18:04:12 +1100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-05-30 00:13:27 +0100 |
commit | a252c3e0583a92f0921d08d583e62b319a071557 (patch) | |
tree | 6b2020c50ab606a5c7c946fe60b2d015be46010a | |
parent | 8b9b836a0e8d3c91f816ec9741909830ebd47e13 (diff) | |
download | serenity-a252c3e0583a92f0921d08d583e62b319a071557.zip |
LibGUI: Allow Shortcuts to have a mouse button associated with them
A Shortcut can now be either have a keyboard key, or a mouse button,
along with any modifiers.
Decided to add an extra type field instead of subclassing, which means
callers will have to be a little careful before accessing a particular
input method's "key", but it keeps things simple for now.
-rw-r--r-- | Userland/Libraries/LibGUI/Shortcut.cpp | 16 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Shortcut.h | 61 |
2 files changed, 62 insertions, 15 deletions
diff --git a/Userland/Libraries/LibGUI/Shortcut.cpp b/Userland/Libraries/LibGUI/Shortcut.cpp index 06bc970715..0866934499 100644 --- a/Userland/Libraries/LibGUI/Shortcut.cpp +++ b/Userland/Libraries/LibGUI/Shortcut.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2022, Geordie Hall <me@geordiehall.com> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -24,10 +25,17 @@ String Shortcut::to_string() const if (m_modifiers & Mod_Super) parts.append("Super"); - if (auto* key_name = key_code_to_string(m_key)) - parts.append(key_name); - else - parts.append("(Invalid)"); + if (m_type == Type::Keyboard) { + if (auto* key_name = key_code_to_string(m_keyboard_key)) + parts.append(key_name); + else + parts.append("(Invalid)"); + } else { + if (m_mouse_button != MouseButton::None) + parts.append(String::formatted("Mouse {}", mouse_button_to_string(m_mouse_button))); + else + parts.append("(Invalid)"); + } StringBuilder builder; builder.join('+', parts); diff --git a/Userland/Libraries/LibGUI/Shortcut.h b/Userland/Libraries/LibGUI/Shortcut.h index 856260e5d8..1e95e002c9 100644 --- a/Userland/Libraries/LibGUI/Shortcut.h +++ b/Userland/Libraries/LibGUI/Shortcut.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2022, Geordie Hall <me@geordiehall.com> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -8,6 +9,7 @@ #include <AK/Traits.h> #include <Kernel/API/KeyCode.h> +#include <LibGUI/Event.h> namespace GUI { @@ -15,30 +17,62 @@ class Shortcut { public: Shortcut() = default; Shortcut(u8 modifiers, KeyCode key) - : m_modifiers(modifiers) - , m_key(key) + : m_type(Type::Keyboard) + , m_modifiers(modifiers) + , m_keyboard_key(key) { } Shortcut(KeyCode key) - : m_modifiers(0) - , m_key(key) + : m_type(Type::Keyboard) + , m_modifiers(0) + , m_keyboard_key(key) + { + } + Shortcut(u8 modifiers, MouseButton button) + : m_type(Type::Mouse) + , m_modifiers(modifiers) + , m_mouse_button(button) + { + } + Shortcut(MouseButton button) + : m_type(Type::Mouse) + , m_modifiers(0) + , m_mouse_button(button) { } - bool is_valid() const { return m_key != KeyCode::Key_Invalid; } - u8 modifiers() const { return m_modifiers; } - KeyCode key() const { return m_key; } + enum class Type : u8 { + Keyboard, + Mouse, + }; + String to_string() const; + Type type() const { return m_type; } + bool is_valid() const { return m_type == Type::Keyboard ? (m_keyboard_key != Key_Invalid) : (m_mouse_button != MouseButton::None); } + u8 modifiers() const { return m_modifiers; } + + KeyCode key() const + { + VERIFY(m_type == Type::Keyboard); + return m_keyboard_key; + } + + MouseButton mouse_button() const + { + VERIFY(m_type == Type::Mouse); + return m_mouse_button; + } bool operator==(Shortcut const& other) const { - return m_modifiers == other.m_modifiers - && m_key == other.m_key; + return m_modifiers == other.m_modifiers && m_type == other.m_type && m_keyboard_key == other.m_keyboard_key && m_mouse_button == other.m_mouse_button; } private: + Type m_type { Type::Keyboard }; u8 m_modifiers { 0 }; - KeyCode m_key { KeyCode::Key_Invalid }; + KeyCode m_keyboard_key { KeyCode::Key_Invalid }; + MouseButton m_mouse_button { MouseButton::None }; }; } @@ -49,7 +83,12 @@ template<> struct Traits<GUI::Shortcut> : public GenericTraits<GUI::Shortcut> { static unsigned hash(const GUI::Shortcut& shortcut) { - return pair_int_hash(shortcut.modifiers(), shortcut.key()); + auto base_hash = pair_int_hash(shortcut.modifiers(), (u32)shortcut.type()); + if (shortcut.type() == GUI::Shortcut::Type::Keyboard) { + return pair_int_hash(base_hash, shortcut.key()); + } else { + return pair_int_hash(base_hash, shortcut.mouse_button()); + } } }; |