HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
KeyboardKey.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/GUI/KeyboardModifiers.hpp"
7#include "TTauri/GUI/KeyboardVirtualKey.hpp"
8#include "TTauri/Foundation/hash.hpp"
9#include "TTauri/Foundation/exceptions.hpp"
10#include "TTauri/Foundation/strings.hpp"
11#include <string_view>
12#include <unordered_map>
13
14namespace tt {
15
16
17
18
19
26 KeyboardModifiers modifiers;
27
35 KeyboardVirtualKey virtualKey;
36
37public:
38 constexpr KeyboardKey() noexcept :
39 modifiers(KeyboardModifiers::None), virtualKey(KeyboardVirtualKey::Nul) {}
40
41 constexpr KeyboardKey(KeyboardModifiers modifiers, KeyboardVirtualKey key) noexcept :
42 modifiers(modifiers), virtualKey(key) {}
43
44 KeyboardKey(std::string_view key_combination) :
45 modifiers(KeyboardModifiers::None), virtualKey(KeyboardVirtualKey::Nul)
46 {
47 ttlet modifiers_and_vkey = split(key_combination, '+');
48 tt_assert(modifiers_and_vkey.cbegin() != modifiers_and_vkey.cend());
49
50 ttlet end_modifiers = modifiers_and_vkey.cend() - 1;
51 for (auto i = modifiers_and_vkey.cbegin(); i != end_modifiers; ++i) {
52 modifiers |= to_KeyboardModifiers(*i);
53 }
54
55 virtualKey = to_KeyboardVirtualKey(modifiers_and_vkey.back());
56 }
57
58 size_t hash() const noexcept {
59 return hash_mix(modifiers, virtualKey);
60 }
61
62 [[nodiscard]] friend bool operator==(KeyboardKey const &lhs, KeyboardKey const &rhs) noexcept {
63 return lhs.modifiers == rhs.modifiers && lhs.virtualKey == rhs.virtualKey;
64 }
65 [[nodiscard]] friend bool operator!=(KeyboardKey const &lhs, KeyboardKey const &rhs) noexcept {
66 return !(lhs == rhs);
67 }
68
69 [[nodiscard]] friend std::string to_string(KeyboardKey const &rhs) noexcept {
70 return fmt::format("{}{}", rhs.modifiers, rhs.virtualKey);
71 }
72
73 friend std::ostream &operator<<(std::ostream &lhs, KeyboardKey const &rhs) {
74 return lhs << to_string(rhs);
75 }
76};
77
78}
79
80namespace std {
81
82template<>
83struct hash<tt::KeyboardKey> {
84 [[nodiscard]] size_t operator() (tt::KeyboardKey const &rhs) const noexcept {
85 return rhs.hash();
86 }
87};
88
89}
STL namespace.
A key in combination with modifiers.
Definition KeyboardKey.hpp:23
T operator()(T... args)