HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
keyboard_key.hpp
1// Copyright Take Vos 2020-2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "keyboard_modifiers.hpp"
8#include "keyboard_virtual_key.hpp"
9#include "../hash.hpp"
10#include "../exception.hpp"
11#include "../strings.hpp"
12#include <string_view>
13#include <unordered_map>
14
15namespace hi::inline v1 {
16
23 keyboard_modifiers modifiers;
24
32 keyboard_virtual_key virtual_key;
33
34public:
35 constexpr keyboard_key() noexcept : modifiers(keyboard_modifiers::none), virtual_key(keyboard_virtual_key::nul) {}
36
37 constexpr keyboard_key(keyboard_modifiers modifiers, keyboard_virtual_key key) noexcept :
38 modifiers(modifiers), virtual_key(key)
39 {
40 }
41
42 keyboard_key(std::string_view key_combination) : modifiers(keyboard_modifiers::none), virtual_key(keyboard_virtual_key::nul)
43 {
44 hilet modifiers_and_vkey = split(key_combination, '+');
45 hi_assert(modifiers_and_vkey.cbegin() != modifiers_and_vkey.cend());
46
47 hilet end_modifiers = modifiers_and_vkey.cend() - 1;
48 for (auto i = modifiers_and_vkey.cbegin(); i != end_modifiers; ++i) {
49 modifiers |= to_keyboard_modifiers(*i);
50 }
51
52 virtual_key = to_keyboard_virtual_key(modifiers_and_vkey.back());
53 }
54
55 std::size_t hash() const noexcept
56 {
57 return hash_mix(modifiers, virtual_key);
58 }
59
60 [[nodiscard]] friend bool operator==(keyboard_key const &lhs, keyboard_key const &rhs) noexcept
61 {
62 return lhs.modifiers == rhs.modifiers && lhs.virtual_key == rhs.virtual_key;
63 }
64
65 [[nodiscard]] friend std::string to_string(keyboard_key const &rhs) noexcept
66 {
67 return std::format("{}{}", rhs.modifiers, rhs.virtual_key);
68 }
69
70 friend std::ostream &operator<<(std::ostream &lhs, keyboard_key const &rhs)
71 {
72 return lhs << to_string(rhs);
73 }
74};
75
76} // namespace hi::inline v1
77
78template<>
79struct std::hash<hi::keyboard_key> {
80 [[nodiscard]] std::size_t operator()(hi::keyboard_key const &rhs) const noexcept
81 {
82 return rhs.hash();
83 }
84};
#define hi_assert(expression)
Assert if expression is true.
Definition assert.hpp:86
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:15
keyboard_modifiers
Key modification keys pressed at the same time as another key.
Definition keyboard_modifiers.hpp:20
keyboard_modifiers to_keyboard_modifiers(std::string_view s)
Parse a key-binding modifier name.
Definition keyboard_modifiers.hpp:53
The HikoGUI namespace.
Definition ascii.hpp:19
A key in combination with modifiers.
Definition keyboard_key.hpp:20
T operator()(T... args)