HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
keyboard_key.hpp
1// Copyright Take Vos 2020.
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 tt {
16
23 keyboard_modifiers modifiers;
24
32 keyboard_virtual_key virtualKey;
33
34public:
35 constexpr keyboard_key() noexcept :
36 modifiers(keyboard_modifiers::None), virtualKey(keyboard_virtual_key::Nul) {}
37
38 constexpr keyboard_key(keyboard_modifiers modifiers, keyboard_virtual_key key) noexcept :
39 modifiers(modifiers), virtualKey(key) {}
40
41 keyboard_key(std::string_view key_combination) :
42 modifiers(keyboard_modifiers::None), virtualKey(keyboard_virtual_key::Nul)
43 {
44 ttlet modifiers_and_vkey = split(key_combination, '+');
45 tt_assert(modifiers_and_vkey.cbegin() != modifiers_and_vkey.cend());
46
47 ttlet 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 virtualKey = to_keyboard_virtual_key(modifiers_and_vkey.back());
53 }
54
55 size_t hash() const noexcept {
56 return hash_mix(modifiers, virtualKey);
57 }
58
59 [[nodiscard]] friend bool operator==(keyboard_key const &lhs, keyboard_key const &rhs) noexcept {
60 return lhs.modifiers == rhs.modifiers && lhs.virtualKey == rhs.virtualKey;
61 }
62 [[nodiscard]] friend bool operator!=(keyboard_key const &lhs, keyboard_key const &rhs) noexcept {
63 return !(lhs == rhs);
64 }
65
66 [[nodiscard]] friend std::string to_string(keyboard_key const &rhs) noexcept {
67 return std::format("{}{}", rhs.modifiers, rhs.virtualKey);
68 }
69
70 friend std::ostream &operator<<(std::ostream &lhs, keyboard_key const &rhs) {
71 return lhs << to_string(rhs);
72 }
73};
74
75}
76
77namespace std {
78
79template<>
80struct hash<tt::keyboard_key> {
81 [[nodiscard]] size_t operator() (tt::keyboard_key const &rhs) const noexcept {
82 return rhs.hash();
83 }
84};
85
86}
STL namespace.
A key in combination with modifiers.
Definition keyboard_key.hpp:20
T operator()(T... args)