summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeordie Hall <me@geordiehall.com>2022-02-05 18:04:12 +1100
committerLinus Groh <mail@linusgroh.de>2022-05-30 00:13:27 +0100
commita252c3e0583a92f0921d08d583e62b319a071557 (patch)
tree6b2020c50ab606a5c7c946fe60b2d015be46010a
parent8b9b836a0e8d3c91f816ec9741909830ebd47e13 (diff)
downloadserenity-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.cpp16
-rw-r--r--Userland/Libraries/LibGUI/Shortcut.h61
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());
+ }
}
};