From 590815e7dc5a8c32c7db3dabbc8a43697bb11fa8 Mon Sep 17 00:00:00 2001 From: thibaudk Date: Tue, 21 Jan 2025 15:16:53 +0000 Subject: [PATCH] [widget] set height with recursive_change --- Hardware/Widgets/IntervalWidget.cpp | 12 ++++- Hardware/Widgets/ScenarioComponent.hpp | 4 +- Hardware/Widgets/ScenarioWidget.cpp | 65 +++++++++++++++++++++++--- Hardware/Widgets/ScenarioWidget.hpp | 16 ++++--- Hardware/Widgets/StateWidget.cpp | 36 +++++++++----- 5 files changed, 106 insertions(+), 27 deletions(-) diff --git a/Hardware/Widgets/IntervalWidget.cpp b/Hardware/Widgets/IntervalWidget.cpp index e342bc6..04bb231 100644 --- a/Hardware/Widgets/IntervalWidget.cpp +++ b/Hardware/Widgets/IntervalWidget.cpp @@ -28,12 +28,14 @@ int IntervalWidget::width() const void IntervalWidget::change_previous(const Scenario::StateModel& state) { - + model.setHeightPercentage(state.heightPercentage()); + scenario->change_previous(model); } void IntervalWidget::change_next(const Scenario::StateModel& state) { model.setHeightPercentage(state.heightPercentage()); + scenario->change_next(model); } bool IntervalWidget::contains(int px, int py) const @@ -50,7 +52,9 @@ bool IntervalWidget::contains(int px, int py) const void IntervalWidget::paint(bugui::painter &painter) const { const auto col{model.metadata().getColor().getBrush().color()}; + // const auto col = skin.TimenodeDefault().color(); painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); + // painter.set_color(255, 255, 255, 255); painter.set_paint_over(false); painter.draw_line(0, 0, width(), 0); @@ -74,7 +78,13 @@ void IntervalWidget::on_drag(int from_x, int from_y, int to_x, int to_y) // prevent dragging out of scenario if (new_height >= 0 && new_height <= 1) + { + scenario->changing = true; model.setHeightPercentage(new_height); + scenario->recursive_change(model); + scenario->update(); + scenario->changing = false; + } } } // namespace hardware diff --git a/Hardware/Widgets/ScenarioComponent.hpp b/Hardware/Widgets/ScenarioComponent.hpp index ff33977..8ed0fbb 100644 --- a/Hardware/Widgets/ScenarioComponent.hpp +++ b/Hardware/Widgets/ScenarioComponent.hpp @@ -33,11 +33,11 @@ protected: bugui::container_widget* parent) : T{parent} , scenario{s} - , skin{Process::Style::instance()} + // , skin{Process::Style::instance()} { } ScenarioWidget* scenario{nullptr}; - const Process::Style& skin; + // const Process::Style& skin; }; template diff --git a/Hardware/Widgets/ScenarioWidget.cpp b/Hardware/Widgets/ScenarioWidget.cpp index 2d30a10..e416954 100644 --- a/Hardware/Widgets/ScenarioWidget.cpp +++ b/Hardware/Widgets/ScenarioWidget.cpp @@ -2,6 +2,7 @@ #include #include +#include namespace Hardware { @@ -9,7 +10,6 @@ ScenarioWidget::ScenarioWidget(Scenario::ProcessModel* scenario, bugui::container_widget* parent) : bugui::container_widget{parent} , model{scenario} - , skin{Process::Style::instance()} { model->intervals.mutable_added.connect<&ScenarioWidget::on_interval_added>(this); model->intervals.removing.connect<&ScenarioWidget::on_interval_removed>(this); @@ -38,8 +38,6 @@ void ScenarioWidget::remove_proxy(StateWidget* sw) void ScenarioWidget::on_interval_added(Scenario::IntervalModel& interval) { add_widget(interval, this); - - update(); } void ScenarioWidget::on_interval_removed(const Scenario::IntervalModel& interval) @@ -66,6 +64,32 @@ void ScenarioWidget::on_time_sync_removed(const Scenario::TimeSyncModel& timeSyn } void ScenarioWidget::recursive_change(const Scenario::StateModel& state) +{ + change_next(state); + change_previous(state); +} + +void ScenarioWidget::recursive_change(const Scenario::IntervalModel& interval) +{ + change_next(interval); + change_previous(interval); +} + +void ScenarioWidget::change_next(const Scenario::IntervalModel& interval) +{ + auto& es{interval.endState()}; + + for (const auto& s : states_proxy) + { + if (s->this_model(es)) + { + s->change_next(interval); + break; + } + } +} + +void ScenarioWidget::change_next(const Scenario::StateModel& state) { auto& ni{state.nextInterval()}; @@ -84,12 +108,41 @@ void ScenarioWidget::recursive_change(const Scenario::StateModel& state) } } } - - update(); } -void ScenarioWidget::recursive_change(const Scenario::IntervalModel& interval) +void ScenarioWidget::change_previous(const Scenario::IntervalModel& interval) { + auto& es{interval.startState()}; + + for (const auto& s : states_proxy) + { + if (s->this_model(es)) + { + s->change_previous(interval); + break; + } + } +} + +void ScenarioWidget::change_previous(const Scenario::StateModel& state) +{ + auto& ni{state.previousInterval()}; + + if (ni) + { + auto& v{ni.value()}; + + for (const auto& c : children) + { + ScenarioComponent<>* s{static_cast*>(c.get())}; + + if (s->this_model(v)) + { + static_cast(s)->change_previous(state); + break; + } + } + } } } // namespace Hardware diff --git a/Hardware/Widgets/ScenarioWidget.hpp b/Hardware/Widgets/ScenarioWidget.hpp index c3e10bd..ac578e3 100644 --- a/Hardware/Widgets/ScenarioWidget.hpp +++ b/Hardware/Widgets/ScenarioWidget.hpp @@ -10,7 +10,7 @@ struct StateWidget; class ScenarioWidget final : public bugui::container_widget , public Nano::Observer -{ +{ public: explicit ScenarioWidget(Scenario::ProcessModel* scenario, bugui::container_widget* parent); @@ -31,6 +31,13 @@ public: void recursive_change(const Scenario::StateModel& state); void recursive_change(const Scenario::IntervalModel& interval); + void change_previous(const Scenario::IntervalModel& interval); + void change_previous(const Scenario::StateModel& state); + void change_next(const Scenario::IntervalModel& interval); + void change_next(const Scenario::StateModel& state); + + bool changing{false}; + private: void on_interval_added(Scenario::IntervalModel& interval); void on_interval_removed(const Scenario::IntervalModel& interval); @@ -38,15 +45,10 @@ private: void on_time_sync_added(Scenario::TimeSyncModel& timeSync); void on_time_sync_removed(const Scenario::TimeSyncModel& timeSync); - void move_previous(const Scenario::IntervalModel& interval); - void move_previous(const Scenario::StateModel& interval); - void move_next(const Scenario::IntervalModel& interval); - void move_next(const Scenario::StateModel& interval); - std::vector states_proxy; Scenario::ProcessModel* model{nullptr}; - const Process::Style& skin; + // const Process::Style& skin; }; } // namespace Hardware diff --git a/Hardware/Widgets/StateWidget.cpp b/Hardware/Widgets/StateWidget.cpp index cfe92a6..a567564 100644 --- a/Hardware/Widgets/StateWidget.cpp +++ b/Hardware/Widgets/StateWidget.cpp @@ -13,15 +13,17 @@ StateWidget::StateWidget(Scenario::StateModel& state, { set_absolute_y(); - // con = connect(&model, - // &Scenario::StateModel::heightPercentageChanged, - // this, - // [scenario, this] - // { - // set_absolute_y(); - // set_span_recursive(); - // scenario->update(); - // }); + con = connect(&model, + &Scenario::StateModel::heightPercentageChanged, + this, + [scenario, this] + { + if (scenario->changing) return; + + set_absolute_y(); + set_span_recursive(); + scenario->update(); + }); scenario->add_proxy(this); } @@ -34,11 +36,17 @@ StateWidget::~StateWidget() void StateWidget::change_previous(const Scenario::IntervalModel& interval) { - + model.setHeightPercentage(interval.heightPercentage()); + set_absolute_y(); + set_span_recursive(); + scenario->change_previous(model); } void StateWidget::change_next(const Scenario::IntervalModel& interval) { - + model.setHeightPercentage(interval.heightPercentage()); + set_absolute_y(); + set_span_recursive(); + scenario->change_next(model); } void StateWidget::paint(bugui::painter& painter) const @@ -46,6 +54,7 @@ void StateWidget::paint(bugui::painter& painter) const const auto col{model.metadata().getColor().getBrush().color()}; // const auto col = skin.StateSelected().color(); painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); + // painter.set_color(255, 255, 255, 255); painter.draw_cell(0, 0); } @@ -76,8 +85,13 @@ void StateWidget::on_drag(int from_x, int from_y, int to_x, int to_y) // prevent dragging out of scenario if (new_height >= 0 && new_height <= 1) { + scenario->changing = true; model.setHeightPercentage(new_height); scenario->recursive_change(model); + set_absolute_y(); + set_span_recursive(); + scenario->update(); + scenario->changing = false; } }