24struct grid<Device, Controller>
25 :
virtual base_hardware
26 ,
virtual common<Controller>
27 ,
virtual init<component<Device, class Device::grid>>
28 ,
virtual clear<component<Device, class Device::grid>>
29 ,
virtual protocol<component<Device, class Device::grid>>
33 this->send([&p,
this](
auto& formater)
35 const auto& top_left{p.get_top_left()};
36 const auto& bottom_right{p.get_bottom_right()};
38 for (
int i{top_left.y}; i < bottom_right.y; i++)
39 for (
int j{top_left.x}; j < bottom_right.x; j++)
42 color_cnvrtr& g{color_grid[i][j]};
47 formater.set(Device::grid::ids()[i][j], g);
56 this->on_message_received
57 ([
this](
auto id,
auto value)
58 {
return set(
id, value); });
61 void component_reset()
63 if constexpr(has_clear<typename Device::grid>)
64 this->clear<
class component<Device, class Device::grid>>
68 [
this](
auto& formater)
70 for (
int i{0}; i < m_height; i++)
71 for (
int j{0}; j < m_width; j++)
74 color_cnvrtr& g{color_grid[i][j]};
79 formater.set(Device::grid::ids()[i][j], g);
85 using color_cnvrtr = color_converter
86 <
typename color_t<Device, class Device::grid>::type>;
88 bool set(uint8_t
id, uint8_t midi)
91 return on_grid_received(
id);
94 bool set(
auto id,
bool boolean)
96 prsr.set_bool(
boolean);
97 return on_grid_received(
id);
100 bool on_grid_received(
auto id)
103 for (
int i{0}; i < m_height; i++)
104 for (
int j{0}; j < m_width; j++)
105 if (
id == Device::grid::ids()[i][j])
108 bool down{prsr.get_bool()};
109 auto it{presses.begin()};
112 using namespace chrono;
113 auto now{steady_clock::now()};
115 while (it != presses.end())
117 if (!it->dragged && duration_cast<milliseconds>
118 (now - it->t) > 200ms)
120 it = presses.erase(it);
124 if (it->i == i && it->j == j)
126 if (down && !it->down)
128 prsr.button_presser::set_double_press();
130 this->controller->handle_presser(prsr);
134 if (!down && it->down)
140 this->controller->handle_presser(prsr);
146 else if (sqrt(pow(it->i - i, 2) +
147 pow(it->j - j, 2)) == 1)
149 if (!down && it->down)
151 prsr.set_drag(it->j, it->i);
155 while (it != presses.end())
157 if (it->i == i && it->j == j && it->dragged)
165 this->controller->handle_presser(prsr);
173 down ? presses.emplace_front(
174 previous_press{now, i, j,
true})
175 : presses.emplace_back(
176 previous_press{now, i , j, false});
177 this->controller->handle_presser(prsr);
184 static constexpr int m_width{Device::grid::ids()[0].size()};
185 static constexpr int m_height{Device::grid::ids().size()};
186 int width()
const override {
return m_width; }
187 int height()
const override {
return m_height; }
189 color_cnvrtr color_grid[m_width][m_height];
191 struct previous_press
193 std::chrono::time_point<std::chrono::steady_clock> t;
195 bool down, dragged{
false};
198 std::list<previous_press> presses{};