BuGUI
BUtton Grid User Interface
Loading...
Searching...
No Matches
device.hpp
1#pragma once
2#include "common.hpp"
3#include <macros/labels.hpp>
4#include <io/button_presser.hpp>
5
6#include <string_view>
7#include <type_traits>
8
9namespace bugui
10{
11template <typename Tp>
12concept has_color = std::is_aggregate_v<typename Tp::color>;
13
14template <typename Tp>
15concept has_color_palette = !std::is_void_v
16 <decltype(Tp::palette())>;
17
18template <typename Tp>
19concept hex_color_palette = requires
20{
21 { Tp::palette()[0].first } -> std::same_as<unsigned long&>;
22};
23
24template <typename Tp>
25concept is_valid_id = (std::is_arithmetic_v<Tp>
27 || std::same_as<Tp, char*>
28 || std::same_as<Tp, std::string_view>;
29
30template <typename Tp>
31concept has_grid = is_valid_id<std::remove_cvref_t
32 <decltype(Tp::grid::ids()[0][0])>>
33 && requires
34{
35 Tp::grid::ids().size() > 2;
36 Tp::grid::ids()[0].size() > 2;
37};
38
39template <typename Tp>
40concept has_buttons = (std::is_aggregate_v<typename Tp::buttons>
42 <typename Tp::buttons::id_type>);
43
44template <typename Tp>
45concept sends_sysex = !std::is_void_v
46 <decltype(Tp::sysex_prefix())>
47 && !std::is_void_v
48 <decltype(Tp::sysex_sufix())>;
49
50template <typename Tp>
51concept has_init = !std::is_void_v<decltype(Tp::init())>;
52
53template <typename Tp>
54concept has_clear = !std::is_void_v<decltype(Tp::clear())>;
55
56#define has_button(L) \
57template <typename Device> \
58concept device_##L##_button = \
59is_valid_id<decltype(Device::buttons::L##_id())>; \
60 \
61template <typename Controller> \
62concept controller_##L##_button = \
63requires(Controller c, button_presser p) \
64{ std::is_void_v<decltype(c.on_##L(p))>; }; \
65 \
66template <typename Device, typename Controller> \
67concept L##_button = \
68device_##L##_button<Device> \
69&& controller_##L##_button<Controller>;
70// FIXME : find more succint macro
71#define CALL_MACRO(r, data, elem) has_button(elem)
72FOR_EACH_LABEL(CALL_MACRO)
73#undef CALL_MACRO
74#undef has_button
75
76} // namespace bugui
Definition common.hpp:7
Definition device.hpp:40
Definition device.hpp:54
Definition device.hpp:15
Definition device.hpp:12
Definition device.hpp:31
Definition device.hpp:51
Definition device.hpp:19
Definition device.hpp:25
Definition device.hpp:45