8#include "../exception.hpp"
9#include "../strings.hpp"
13namespace hi::inline v1 {
20enum class keyboard_modifiers : uint8_t {
28[[nodiscard]]
constexpr keyboard_modifiers
operator|(keyboard_modifiers
const& lhs, keyboard_modifiers
const& rhs)
noexcept
30 return static_cast<keyboard_modifiers
>(to_underlying(lhs) | to_underlying(rhs));
33[[nodiscard]]
constexpr keyboard_modifiers operator&(keyboard_modifiers
const& lhs, keyboard_modifiers
const& rhs)
noexcept
35 return static_cast<keyboard_modifiers
>(to_underlying(lhs) & to_underlying(rhs));
38constexpr keyboard_modifiers& operator|=(keyboard_modifiers& lhs, keyboard_modifiers
const& rhs)
noexcept
40 return lhs = lhs | rhs;
43[[nodiscard]]
constexpr bool any(keyboard_modifiers
const& rhs)
noexcept
45 return to_bool(to_underlying(rhs));
48bool operator>=(keyboard_modifiers
const& lhs, keyboard_modifiers
const& rhs) =
delete;
53inline keyboard_modifiers to_keyboard_modifiers(std::string_view s)
56 throw parse_error(
"Empty keyboard modifier");
60 hilet s_lower = to_lower((s.back() ==
'+') ? s.substr(0, ssize(s) - 1) : s);
62 if (s_lower ==
"shift") {
63 return keyboard_modifiers::shift;
64 }
else if (s_lower ==
"control" || s_lower ==
"ctrl" || s_lower ==
"cntr") {
65 return keyboard_modifiers::control;
66 }
else if (s_lower ==
"alt" || s_lower ==
"option" || s_lower ==
"meta") {
67 return keyboard_modifiers::alt;
68 }
else if (s_lower ==
"windows" || s_lower ==
"win" || s_lower ==
"command" || s_lower ==
"cmd" || s_lower ==
"super") {
69 return keyboard_modifiers::super;
71 throw parse_error(std::format(
"Unknown keyboard modifier '{}'", s));
79 if (any(modifiers & keyboard_modifiers::shift)) {
82 if (any(modifiers & keyboard_modifiers::control)) {
85 if (any(modifiers & keyboard_modifiers::alt)) {
88 if (any(modifiers & keyboard_modifiers::super)) {
110template<
typename CharT>
111struct std::formatter<hi::keyboard_modifiers, CharT> : std::formatter<std::string_view, CharT> {
112 auto format(hi::keyboard_modifiers
const& t,
auto& fc)
114 return std::formatter<std::string_view, CharT>::format(hi::to_string(t), fc);
This file includes required definitions.
#define hilet
Invariant should be the default for variables.
Definition required.hpp:23
constexpr alignment operator|(horizontal_alignment lhs, vertical_alignment rhs) noexcept
Combine vertical and horizontal alignment.
Definition alignment.hpp:200
T operator()(T... args)
Definition datum.hpp:2458