23class grid<Device, Controller>
24 :
virtual public base_hardware
26 using id_t = std::remove_cvref_t
27 <
decltype(Device::grid::ids()[0][0])>;
31 int width()
const override {
return Device::grid::width(); }
32 int height()
const override {
return Device::grid::height(); }
35 color_grid[Device::grid::width()][Device::grid::height()];
39 std::chrono::time_point<std::chrono::steady_clock> t;
41 bool down, dragged{
false};
44 std::list<previous_press> presses{};
48 { std::cout <<
"presses size: " << presses.size() <<
'\n'; }
57 void paint(painter& paint
59 <
void(id_t,
const color_cnvtr&)>
62 const auto& top_left{paint.get_top_left()};
63 const auto& bottom_right{paint.get_bottom_right()};
65 for (
int i{top_left.y}; i < bottom_right.y; i++)
66 for (
int j{top_left.x}; j < bottom_right.x; j++)
68 color c{paint.read_clear(j, i)};
69 color_cnvtr& g{color_grid[i][j]};
74 func(Device::grid::ids()[i][j], g);
78 void clear(std::function<
void(id_t
id)>&& func)
80 for (
int i{0}; i < Device::grid::height(); i++)
81 for (
int j{0}; j < Device::grid::width(); j++)
83 color_converter<typename Device::color>&
87 func(Device::grid::ids()[i][j]);
91 bool on_grid_received(Controller* ctrlr, id_t
id)
94 for (
int i{0}; i < Device::grid::height(); i++)
95 for (
int j{0}; j < Device::grid::width(); j++)
96 if (
id == Device::grid::ids()[i][j])
99 bool down{prsr.get_bool()};
100 auto it{presses.begin()};
103 using namespace chrono;
104 auto now{steady_clock::now()};
106 while (it != presses.end())
108 if (!it->dragged && duration_cast<milliseconds>
109 (now - it->t) > 200ms)
111 it = presses.erase(it);
115 if (it->i == i && it->j == j)
117 if (down && !it->down)
119 prsr.button_presser::set_double_press();
121 ctrlr->handle_presser(prsr);
125 if (!down && it->down)
131 ctrlr->handle_presser(prsr);
137 else if (sqrt(pow(it->i - i, 2) +
138 pow(it->j - j, 2)) == 1)
140 if (!down && it->down)
142 prsr.set_drag(it->j, it->i);
146 while (it != presses.end())
148 if (it->i == i && it->j == j && it->dragged)
156 ctrlr->handle_presser(prsr);
164 down ? presses.emplace_front(
165 previous_press{now, i, j,
true})
166 : presses.emplace_back(
167 previous_press{now, i , j, false});
168 ctrlr->handle_presser(prsr);