From e52bd0b3c0dc5a039e80c0de0ff0e517ea7acaf4 Mon Sep 17 00:00:00 2001 From: thibaudk Date: Mon, 30 Dec 2024 12:32:54 +0000 Subject: [PATCH] [widgets] start handling drag --- Hardware/3rdparty/bugui | 2 +- Hardware/Controller.cpp | 9 +++++++++ Hardware/Controller.hpp | 1 + Hardware/Widgets/IntervalWidget.cpp | 14 ++++++++++++++ Hardware/Widgets/IntervalWidget.hpp | 1 + Hardware/Widgets/ScenarioWidget.cpp | 10 ++++++++++ Hardware/Widgets/ScenarioWidget.hpp | 1 + 7 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Hardware/3rdparty/bugui b/Hardware/3rdparty/bugui index d1cdce9..92dbd6d 160000 --- a/Hardware/3rdparty/bugui +++ b/Hardware/3rdparty/bugui @@ -1 +1 @@ -Subproject commit d1cdce9329c01e98343d798adbe76c7df0013aec +Subproject commit 92dbd6d9d49bd13e573fa644e71561c696423140 diff --git a/Hardware/Controller.cpp b/Hardware/Controller.cpp index a2c1a78..f0ce03c 100644 --- a/Hardware/Controller.cpp +++ b/Hardware/Controller.cpp @@ -40,6 +40,15 @@ bool Controller::on_double_press(int x, int y) return false; } +bool Controller::on_drag(int from_x, int from_y, int to_x, int to_y) +{ + for (auto& w : widgets) + if (w->on_drag(from_x, from_y, to_x, to_y)) + return true; + + return false; +} + void Controller::on_play(bool pressed) { if (m_shift) diff --git a/Hardware/Controller.hpp b/Hardware/Controller.hpp index 73901c7..0ecfca7 100644 --- a/Hardware/Controller.hpp +++ b/Hardware/Controller.hpp @@ -31,6 +31,7 @@ public: bool on_press(int x, int y, bool pressed) override; bool on_double_press(int x, int y) override; + bool on_drag(int from_x, int from_y, int to_x, int to_y) override; private: Scenario::IntervalModel* interval; diff --git a/Hardware/Widgets/IntervalWidget.cpp b/Hardware/Widgets/IntervalWidget.cpp index 0fe6533..7862aa0 100644 --- a/Hardware/Widgets/IntervalWidget.cpp +++ b/Hardware/Widgets/IntervalWidget.cpp @@ -62,6 +62,20 @@ bool IntervalWidget::on_double_press(int x, int y) return true; } +bool IntervalWidget::on_drag(int from_x, int from_y, int to_x, int to_y) +{ + if (!is_inside(from_x, from_y)) return false; + + if (from_y != to_y) + { + double new_percentage{(1 / static_cast(parent->height())) * to_y}; + model.requestHeightChange(new_percentage); + parent->update(); + } + + return true; +} + const Scenario::IntervalModel &IntervalWidget::get_model() const { return model; diff --git a/Hardware/Widgets/IntervalWidget.hpp b/Hardware/Widgets/IntervalWidget.hpp index 23f4c13..e47546d 100644 --- a/Hardware/Widgets/IntervalWidget.hpp +++ b/Hardware/Widgets/IntervalWidget.hpp @@ -14,6 +14,7 @@ struct IntervalWidget final : bugui::base_widget void paint(bugui::painter& painter) const override; bool on_press(int x, int y, bool pressed) override; bool on_double_press(int x, int y) override; + bool on_drag(int from_x, int from_y, int to_x, int to_y) override; int x() const override; int y() const override; diff --git a/Hardware/Widgets/ScenarioWidget.cpp b/Hardware/Widgets/ScenarioWidget.cpp index 17bd715..9f7b2e8 100644 --- a/Hardware/Widgets/ScenarioWidget.cpp +++ b/Hardware/Widgets/ScenarioWidget.cpp @@ -44,6 +44,16 @@ bool ScenarioWidget::on_double_press(int x, int y) return true; } +bool ScenarioWidget::on_drag(int from_x, int from_y, int to_x, int to_y) +{ + if (!is_inside(from_x, from_y)) return false; + + for (auto& w : widgets) + if (w->on_drag(from_x, from_y, to_x, to_y)) return true; + + return true; +} + int ScenarioWidget::x() const { return bugui::base_widget::parent->x(); diff --git a/Hardware/Widgets/ScenarioWidget.hpp b/Hardware/Widgets/ScenarioWidget.hpp index 861dbbd..976ba80 100644 --- a/Hardware/Widgets/ScenarioWidget.hpp +++ b/Hardware/Widgets/ScenarioWidget.hpp @@ -20,6 +20,7 @@ public: void paint(bugui::painter& painter) const override; bool on_press(int x, int y, bool pressed) override; bool on_double_press(int x, int y) override; + bool on_drag(int from_x, int from_y, int to_x, int to_y) override; int x() const override; int y() const override;