From 7468c290b69d91c9fa286b7818ffc9eef874db2f Mon Sep 17 00:00:00 2001 From: thibaudk Date: Mon, 13 Jan 2025 18:49:21 +0000 Subject: [PATCH] [ScenarioComponents] more considerations on Nano vd Qt for signal handling --- Hardware/3rdparty/bugui | 2 +- Hardware/Widgets/EventWidget.hpp | 5 ++- Hardware/Widgets/IntervalWidget.cpp | 26 ++++++++++- Hardware/Widgets/IntervalWidget.hpp | 16 ++++--- Hardware/Widgets/ScenarioComponent.hpp | 5 +++ Hardware/Widgets/ScenarioWidget.cpp | 21 --------- Hardware/Widgets/ScenarioWidget.hpp | 8 ---- Hardware/Widgets/StateWidget.cpp | 26 ++++++++--- Hardware/Widgets/StateWidget.hpp | 17 ++++--- Hardware/Widgets/TimeSyncWidget.cpp | 62 ++++++++++++++++---------- Hardware/Widgets/TimeSyncWidget.hpp | 11 ++--- 11 files changed, 121 insertions(+), 78 deletions(-) diff --git a/Hardware/3rdparty/bugui b/Hardware/3rdparty/bugui index 9e937d4..cdb5364 160000 --- a/Hardware/3rdparty/bugui +++ b/Hardware/3rdparty/bugui @@ -1 +1 @@ -Subproject commit 9e937d4c88c835428ec30373f8a866854555b3ee +Subproject commit cdb5364672da1c0669c68020d7e5df418093c421 diff --git a/Hardware/Widgets/EventWidget.hpp b/Hardware/Widgets/EventWidget.hpp index eea91a3..f81d0c0 100644 --- a/Hardware/Widgets/EventWidget.hpp +++ b/Hardware/Widgets/EventWidget.hpp @@ -13,8 +13,6 @@ struct EventWidget final : Nano::Observer ScenarioWidget* scenario, bugui::container_widget* parent); - void paint(bugui::painter& painter) const override; - void on_press(int x, int y, bool pressed) override; int y() const override; int height() const override; @@ -24,6 +22,9 @@ struct EventWidget final : Nano::Observer protected: bool contains(int px, int py) const override; + void paint(bugui::painter& painter) const override; + + void on_press(int x, int y, bool pressed) override; void on_state_added(Scenario::StateModel& state); void on_state_removed(const Scenario::StateModel& state); diff --git a/Hardware/Widgets/IntervalWidget.cpp b/Hardware/Widgets/IntervalWidget.cpp index 2c09950..9584bab 100644 --- a/Hardware/Widgets/IntervalWidget.cpp +++ b/Hardware/Widgets/IntervalWidget.cpp @@ -9,7 +9,28 @@ IntervalWidget::IntervalWidget(Scenario::IntervalModel& interval, ScenarioWidget* scenario, bugui::container_widget* parent) : ScenarioComponentSpec{interval, scenario, parent} -{ } +{ + connect(&model, + &Scenario::IntervalModel::heightPercentageChanged, + this, + [scenario] (double) { scenario->update(); }); + + connect(&model, + &Scenario::IntervalModel::dateChanged, + this, + [scenario] (const TimeVal&) { scenario->update(); }); +} + +IntervalWidget::~IntervalWidget() +{ + disconnect(&model, + &Scenario::IntervalModel::heightPercentageChanged, + this, 0); + + disconnect(&model, + &Scenario::IntervalModel::dateChanged, + this, 0); +} int IntervalWidget::x() const { @@ -62,3 +83,6 @@ void IntervalWidget::on_drag(int from_x, int from_y, int to_x, int to_y) } } // namespace hardware + +#include +W_OBJECT_IMPL(Hardware::IntervalWidget); diff --git a/Hardware/Widgets/IntervalWidget.hpp b/Hardware/Widgets/IntervalWidget.hpp index 0a1ba6b..8be71ee 100644 --- a/Hardware/Widgets/IntervalWidget.hpp +++ b/Hardware/Widgets/IntervalWidget.hpp @@ -8,22 +8,28 @@ namespace Hardware { struct IntervalWidget final : ScenarioComponentSpec + , QObject { explicit IntervalWidget(Scenario::IntervalModel& interval, ScenarioWidget* scenario, bugui::container_widget* parent); - void paint(bugui::painter& painter) const override; - void on_press(int x, int y, bool pressed) override; - void on_double_press(int x, int y) override; - void on_drag(int from_x, int from_y, int to_x, int to_y) override; + ~IntervalWidget() override; int x() const override; int y() const override; int width() const override; -protected: +private: + W_OBJECT(IntervalWidget) + bool contains(int px, int py) const override; + + void paint(bugui::painter& painter) const override; + + void on_press(int x, int y, bool pressed) override; + void on_double_press(int x, int y) override; + void on_drag(int from_x, int from_y, int to_x, int to_y) override; }; } // namespace Hardware diff --git a/Hardware/Widgets/ScenarioComponent.hpp b/Hardware/Widgets/ScenarioComponent.hpp index c97e99f..ff33977 100644 --- a/Hardware/Widgets/ScenarioComponent.hpp +++ b/Hardware/Widgets/ScenarioComponent.hpp @@ -23,6 +23,10 @@ struct ScenarioComponent : T virtual bool this_model(const Scenario::TimeSyncModel&) const { return false; }; virtual bool this_model(const Scenario::EventModel&) const { return false; }; virtual bool this_model(const Scenario::StateModel&) const { return false; }; + virtual bool this_model(const Id&) const { return false; }; + virtual bool this_model(const Id&) const { return false; }; + virtual bool this_model(const Id&) const { return false; }; + virtual bool this_model(const Id&) const { return false; }; protected: explicit ScenarioComponent(ScenarioWidget* s, @@ -44,6 +48,7 @@ template struct ScenarioComponentSpec : ScenarioComponent { bool this_model(const T& m) const override { return m.id() == model.id(); }; + bool this_model(const Id& m) const override { return m == model.id(); }; const T& get_model() const { return model; } protected: diff --git a/Hardware/Widgets/ScenarioWidget.cpp b/Hardware/Widgets/ScenarioWidget.cpp index 904f20d..87b4c69 100644 --- a/Hardware/Widgets/ScenarioWidget.cpp +++ b/Hardware/Widgets/ScenarioWidget.cpp @@ -13,11 +13,6 @@ ScenarioWidget::ScenarioWidget(Scenario::ProcessModel* scenario, model->intervals.mutable_added.connect<&ScenarioWidget::on_interval_added>(this); model->intervals.removed.connect<&ScenarioWidget::on_interval_removed>(this); - connect(model, - &Scenario::ProcessModel::intervalMoved, - this, - &ScenarioWidget::on_interval_changed); - for(Scenario::IntervalModel& i : model->intervals) add_widget(i, this); @@ -28,14 +23,6 @@ ScenarioWidget::ScenarioWidget(Scenario::ProcessModel* scenario, add_widget(t, this); } -ScenarioWidget::~ScenarioWidget() -{ - disconnect(model, - &Scenario::ProcessModel::intervalMoved, - this, - &ScenarioWidget::on_interval_changed); -} - int ScenarioWidget::x() const { return bugui::base_widget::parent->x(); @@ -76,11 +63,6 @@ void ScenarioWidget::on_interval_removed(const Scenario::IntervalModel& interval update(); } -void ScenarioWidget::on_interval_changed(const Scenario::IntervalModel*) -{ - update(); -} - void ScenarioWidget::on_time_sync_added(Scenario::TimeSyncModel& timeSync) { add_widget(timeSync, this); @@ -94,6 +76,3 @@ void ScenarioWidget::on_time_sync_removed(const Scenario::TimeSyncModel& timeSyn } } // namespace Hardware - -#include "wobjectimpl.h" -W_OBJECT_IMPL(Hardware::ScenarioWidget) diff --git a/Hardware/Widgets/ScenarioWidget.hpp b/Hardware/Widgets/ScenarioWidget.hpp index c0ea348..581e7f9 100644 --- a/Hardware/Widgets/ScenarioWidget.hpp +++ b/Hardware/Widgets/ScenarioWidget.hpp @@ -1,7 +1,5 @@ #pragma once -#include - #include #include @@ -11,16 +9,11 @@ namespace Hardware class ScenarioWidget final : public bugui::container_widget , public Nano::Observer - , public QObject { - W_OBJECT(ScenarioWidget) - public: explicit ScenarioWidget(Scenario::ProcessModel* scenario, bugui::container_widget* parent); - ~ScenarioWidget() override; - int x() const override; int y() const override; int width() const override; @@ -31,7 +24,6 @@ public: private: void on_interval_added(Scenario::IntervalModel& interval); void on_interval_removed(const Scenario::IntervalModel& interval); - void on_interval_changed(const Scenario::IntervalModel*); void on_time_sync_added(Scenario::TimeSyncModel& timeSync); void on_time_sync_removed(const Scenario::TimeSyncModel& timeSync); diff --git a/Hardware/Widgets/StateWidget.cpp b/Hardware/Widgets/StateWidget.cpp index a0272df..df9b73b 100644 --- a/Hardware/Widgets/StateWidget.cpp +++ b/Hardware/Widgets/StateWidget.cpp @@ -1,7 +1,8 @@ #include +#include "ScenarioWidget.hpp" +#include "EventWidget.hpp" #include "StateWidget.hpp" -#include "Hardware/Widgets/ScenarioWidget.hpp" namespace Hardware { @@ -9,7 +10,19 @@ StateWidget::StateWidget(Scenario::StateModel& state, ScenarioWidget* scenario, bugui::container_widget* parent) : ScenarioComponentSpec{state, scenario, parent} -{ } +{ + connect(&model, + &Scenario::StateModel::heightPercentageChanged, + this, + [parent] { static_cast(parent)->set_y_height(); }); +} + +StateWidget::~StateWidget() +{ + disconnect(&model, + &Scenario::StateModel::heightPercentageChanged, + this, 0); +} int StateWidget::y() const { @@ -44,8 +57,11 @@ void StateWidget::on_double_press(int x, int y) void StateWidget::on_drag(int from_x, int from_y, int to_x, int to_y) { - if (from_y != to_y) - model.setHeightPercentage(to_y / static_cast(parent->height())); + double increment{to_y / static_cast(scenario->height())}; + model.setHeightPercentage(model.heightPercentage() + increment); } -} +} // namespace Hardware + +#include +W_OBJECT_IMPL(Hardware::StateWidget) diff --git a/Hardware/Widgets/StateWidget.hpp b/Hardware/Widgets/StateWidget.hpp index 3985fca..5c79b7a 100644 --- a/Hardware/Widgets/StateWidget.hpp +++ b/Hardware/Widgets/StateWidget.hpp @@ -5,21 +5,26 @@ namespace Hardware { -struct StateWidget final : ScenarioComponentSpec +struct StateWidget final : QObject + , ScenarioComponentSpec { explicit StateWidget(Scenario::StateModel& state, ScenarioWidget* scenario, bugui::container_widget* parent); + ~StateWidget() override; + + int y() const override; + +private: + W_OBJECT(StateWidget) + + bool contains(int px, int py) const override; + void paint(bugui::painter& painter) const override; void on_press(int x, int y, bool pressed) override; void on_double_press(int x, int y) override; void on_drag(int from_x, int from_y, int to_x, int to_y) override; - - int y() const override; - -protected: - bool contains(int px, int py) const override; }; } //namespace Hardware diff --git a/Hardware/Widgets/TimeSyncWidget.cpp b/Hardware/Widgets/TimeSyncWidget.cpp index e82bf9f..a65adfd 100644 --- a/Hardware/Widgets/TimeSyncWidget.cpp +++ b/Hardware/Widgets/TimeSyncWidget.cpp @@ -1,6 +1,6 @@ #include -#include "Hardware/Widgets/EventWidget.hpp" +#include "EventWidget.hpp" #include "ScenarioWidget.hpp" #include "TimeSyncWidget.hpp" @@ -12,14 +12,41 @@ TimeSyncWidget::TimeSyncWidget(Scenario::TimeSyncModel& timeSync, : ScenarioComponentSpec{timeSync, scenario, parent} { - Scenario::ProcessModel* scen{scenario->get_model()}; + connect(&model, + &Scenario::TimeSyncModel::dateChanged, + this, + [scenario] (const TimeVal&) { scenario->update(); }); - scen->events.mutable_added.connect<&TimeSyncWidget::on_event_added>(this); - scen->events.removed.connect<&TimeSyncWidget::on_event_removed>(this); + connect(&model, + &Scenario::TimeSyncModel::newEvent, + this, + [scenario, this] (const Id& eventId) + { add_widget(scenario->get_model()->events.at(eventId), scenario); }); - for(Scenario::EventModel& e : scen->events) - if (e.timeSync() == model.id()) - add_widget(e, scenario); + connect(&model, + &Scenario::TimeSyncModel::eventRemoved, + this, + [scenario, this] (const Id& eventId) + { + remove_widget([&eventId] + (const auto& w) + { return static_cast*>(w.get())->this_model(eventId); }); + }); +} + +TimeSyncWidget::~TimeSyncWidget() +{ + disconnect(&model, + &Scenario::TimeSyncModel::dateChanged, + this, 0); + + disconnect(&model, + &Scenario::TimeSyncModel::newEvent, + this, 0); + + disconnect(&model, + &Scenario::TimeSyncModel::eventRemoved, + this, 0); } int TimeSyncWidget::x() const @@ -42,7 +69,7 @@ void TimeSyncWidget::set_y_height() m_y = std::numeric_limits::max(); m_height = std::numeric_limits::lowest(); - for(const auto& e : children) + for(const auto& e : bugui::container_widget::children) { int ey = e->y(); if (ey <= m_y) m_y = ey; @@ -70,25 +97,12 @@ bool TimeSyncWidget::contains(int px, int py) const return false; } -void TimeSyncWidget::on_event_added(Scenario::EventModel& event) -{ - if (event.timeSync() != model.id()) return; - - add_widget(event, scenario); -} - -void TimeSyncWidget::on_event_removed(const Scenario::EventModel& event) -{ - if (event.timeSync() != model.id()) return; - - remove_widget([&event] - (const auto& w) - { return static_cast*>(w.get())->this_model(event); }); -} - void TimeSyncWidget::on_press(int x, int y, bool pressed) { qDebug() << "is inside!"; } } // namespace Hardware + +#include +W_OBJECT_IMPL(Hardware::TimeSyncWidget); diff --git a/Hardware/Widgets/TimeSyncWidget.hpp b/Hardware/Widgets/TimeSyncWidget.hpp index fb69a89..4793ad4 100644 --- a/Hardware/Widgets/TimeSyncWidget.hpp +++ b/Hardware/Widgets/TimeSyncWidget.hpp @@ -6,7 +6,7 @@ namespace Hardware { -struct TimeSyncWidget final : Nano::Observer +struct TimeSyncWidget final : QObject , ScenarioComponentSpec { @@ -14,8 +14,7 @@ struct TimeSyncWidget final : Nano::Observer ScenarioWidget* scenario, bugui::container_widget* parent); - void paint(bugui::painter& painter) const override; - void on_press(int x, int y, bool pressed) override; + ~TimeSyncWidget() override; int x() const override; int y() const override; @@ -24,10 +23,12 @@ struct TimeSyncWidget final : Nano::Observer void set_y_height(); private: + W_OBJECT(TimeSyncWidget) + bool contains(int px, int py) const override; - void on_event_added(Scenario::EventModel& event); - void on_event_removed(const Scenario::EventModel& event); + void paint(bugui::painter& painter) const override; + void on_press(int x, int y, bool pressed) override; int m_y; int m_height;