diff --git a/Hardware/Widgets/EventWidget.cpp b/Hardware/Widgets/EventWidget.cpp index af4326b..86eeb06 100644 --- a/Hardware/Widgets/EventWidget.cpp +++ b/Hardware/Widgets/EventWidget.cpp @@ -22,80 +22,27 @@ EventWidget::EventWidget(Scenario::EventModel& event, if (s.eventId() == model.id()) add_widget(s, scenario); - set_recursive_height(); + set_span_recursive(); } -int EventWidget::y() const +void EventWidget::set_span_recursive() { - return m_y; -} - -int EventWidget::height() const -{ - return m_height; -} - -void EventWidget::set_recursive_y(int state_y) -{ - static_cast(bugui::base_widget::parent)->set_y(state_y); - - int relative_y{state_y - bugui::base_widget::parent->y()}; - - if (children.size() <= 1) - m_y = relative_y; - else - { - if (relative_y < m_y) - m_y = relative_y; - else - { - int lowest{std::numeric_limits::max()}; - - for(const auto& s : bugui::container_widget::children) - { - int sy = s->y(); - if (sy < lowest) lowest = sy; - } - - m_y = lowest; - } - } -} - -void EventWidget::set_recursive_height() -{ - if (children.size() <= 1) - m_height = 0; - else - { - int heighest{std::numeric_limits::lowest()}; - - for(const auto& s : bugui::container_widget::children) - { - int sy = s->y(); - if (sy > heighest) heighest = sy; - } - - m_height = heighest; - } - - static_cast(bugui::base_widget::parent)->set_height(); -} - -void EventWidget::set_recursive_y_height() -{ - m_y = std::numeric_limits::max(); - m_height = std::numeric_limits::lowest(); + int lowest{std::numeric_limits::max()}; + int heighest{0}; for(const auto& s : bugui::container_widget::children) { - int sy = s->y(); - if (sy < m_y) m_y = sy; - if (sy > m_height) m_height = sy; + int sy = static_cast(s.get())->get_absolute_y(); + if (sy < lowest) lowest = sy; + if (sy > heighest) heighest = sy; } - static_cast(bugui::base_widget::parent)->set_y( - bugui::base_widget::parent->y() + m_height); + m_absolute_y = lowest; + m_height = heighest - lowest; + + static_cast(bugui::base_widget::parent)->set_span(); + + m_y = m_absolute_y - parent->y(); } void EventWidget::paint(bugui::painter& painter) const @@ -120,7 +67,7 @@ void EventWidget::on_state_added(Scenario::StateModel& state) add_widget(state, scenario); - set_recursive_height(); + set_span_recursive(); } void EventWidget::on_state_removed(const Scenario::StateModel& state) @@ -131,7 +78,7 @@ void EventWidget::on_state_removed(const Scenario::StateModel& state) (const auto& w) { return static_cast*>(w.get())->this_model(state); }); - set_recursive_y_height(); + set_span_recursive(); update(); } diff --git a/Hardware/Widgets/EventWidget.hpp b/Hardware/Widgets/EventWidget.hpp index 7d32962..2885a2b 100644 --- a/Hardware/Widgets/EventWidget.hpp +++ b/Hardware/Widgets/EventWidget.hpp @@ -13,12 +13,11 @@ struct EventWidget final : Nano::Observer ScenarioWidget* scenario, bugui::container_widget* parent); - int y() const override; - int height() const override; + int y() const override { return m_y; } + int get_absolute_y() { return m_absolute_y; }; + int height() const override { return m_height; } - void set_recursive_y(int state_y); - void set_recursive_height(); - void set_recursive_y_height(); + void set_span_recursive(); private: bool contains(int px, int py) const override; @@ -31,6 +30,7 @@ private: void on_state_added(Scenario::StateModel& state); void on_state_removed(const Scenario::StateModel& state); + int m_absolute_y{0}; int m_y{0}; int m_height{0}; }; diff --git a/Hardware/Widgets/StateWidget.cpp b/Hardware/Widgets/StateWidget.cpp index d89786c..e6d2b79 100644 --- a/Hardware/Widgets/StateWidget.cpp +++ b/Hardware/Widgets/StateWidget.cpp @@ -11,33 +11,20 @@ StateWidget::StateWidget(Scenario::StateModel& state, bugui::container_widget* parent) : ScenarioComponentSpec{state, scenario, parent} { - connect(&model, - &Scenario::StateModel::heightPercentageChanged, - this, - [this] + con = connect(&model, + &Scenario::StateModel::heightPercentageChanged, + this, + [scenario, this] { - set_recursive_y(); - - static_cast(bugui::base_widget::parent) - ->set_recursive_height(); + m_absolute_y = model.heightPercentage() * scenario->height(); + set_recursive_span(); + scenario->update(); }); - - set_recursive_y(); } -// StateWidget::~StateWidget() -// { - // FIXME : this disconnect seem to cause crashes - // disconnect(&model, - // &Scenario::StateModel::heightPercentageChanged, - // this, 0); -// } - -int StateWidget::y() const +StateWidget::~StateWidget() { - return absolute_y - - bugui::base_widget::parent->get_parent()->y() - - bugui::base_widget::parent->y(); + disconnect(con); } void StateWidget::paint(bugui::painter& painter) const @@ -72,12 +59,19 @@ void StateWidget::on_drag(int from_x, int from_y, int to_x, int to_y) model.setHeightPercentage(model.heightPercentage() + increment); } -void StateWidget::set_recursive_y() +void StateWidget::set_absolute_y() { - absolute_y = model.heightPercentage() * scenario->height(); + m_absolute_y = model.heightPercentage() * scenario->height(); +} +void StateWidget::set_recursive_span() +{ static_cast(bugui::base_widget::parent) - ->set_recursive_y(absolute_y); + ->set_span_recursive(); + + m_y = m_absolute_y - + bugui::base_widget::parent->get_parent()->y() - + bugui::base_widget::parent->y(); } } // namespace Hardware diff --git a/Hardware/Widgets/StateWidget.hpp b/Hardware/Widgets/StateWidget.hpp index d232d7b..80069f4 100644 --- a/Hardware/Widgets/StateWidget.hpp +++ b/Hardware/Widgets/StateWidget.hpp @@ -12,14 +12,17 @@ struct StateWidget final : QObject ScenarioWidget* scenario, bugui::container_widget* parent); - // ~StateWidget() override; + ~StateWidget() override; - int y() const override; + int y() const override { return m_y; } + int get_absolute_y() { return m_absolute_y; }; private: W_OBJECT(StateWidget) - void set_recursive_y(); + QMetaObject::Connection con; + + void set_recursive_span(); void paint(bugui::painter& painter) const override; @@ -29,7 +32,9 @@ private: 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 absolute_y; + void set_absolute_y(); + int m_absolute_y; + int m_y; }; } //namespace Hardware diff --git a/Hardware/Widgets/TimeSyncWidget.cpp b/Hardware/Widgets/TimeSyncWidget.cpp index 45a9bcc..eb8e089 100644 --- a/Hardware/Widgets/TimeSyncWidget.cpp +++ b/Hardware/Widgets/TimeSyncWidget.cpp @@ -34,7 +34,7 @@ TimeSyncWidget::TimeSyncWidget(Scenario::TimeSyncModel& timeSync, (const auto& w) { return static_cast*>(w.get())->this_model(eventId); }); - set_height(); + set_span(); update(); }); @@ -60,35 +60,20 @@ TimeSyncWidget::~TimeSyncWidget() this, 0); } -int TimeSyncWidget::x() const +void TimeSyncWidget::set_span() { - return model.date().sec(); -} + int lowest{std::numeric_limits::max()}; + int heighest{0}; -int TimeSyncWidget::y() const -{ - return m_y; -} - -int TimeSyncWidget::height() const -{ - return m_height; -} - -void TimeSyncWidget::set_y(int event_y) -{ - if (event_y < m_y) m_y = event_y; -} - -void TimeSyncWidget::set_height() -{ for(const auto& e : bugui::container_widget::children) { - int span = e->y() + e->height(); - if (span > m_height) m_height = span; + int sy = static_cast(e.get())->get_absolute_y(); + if (sy < lowest) lowest = sy; + if (sy > heighest) heighest = sy; } - update(); + m_y = lowest; + m_height = heighest - lowest; } void TimeSyncWidget::paint(bugui::painter& painter) const diff --git a/Hardware/Widgets/TimeSyncWidget.hpp b/Hardware/Widgets/TimeSyncWidget.hpp index e2e2d98..16c5593 100644 --- a/Hardware/Widgets/TimeSyncWidget.hpp +++ b/Hardware/Widgets/TimeSyncWidget.hpp @@ -16,12 +16,11 @@ struct TimeSyncWidget final : QObject ~TimeSyncWidget() override; - int x() const override; - int y() const override; - int height() const override; + int x() const override { return model.date().sec(); } + int y() const override { return m_y; } + int height() const override { return m_height; } - void set_y(int event_y); - void set_height(); + void set_span(); private: W_OBJECT(TimeSyncWidget)