From 92583043f0240c8f1c8916dc53488b9cfe24d00b Mon Sep 17 00:00:00 2001 From: thibaudk Date: Fri, 10 Jan 2025 01:38:58 +0000 Subject: [PATCH] [ScenarioComponent] current issue with inheriting base_widget virtauly --- CMakeLists.txt | 5 +++ Hardware/3rdparty/bugui | 2 +- Hardware/Widgets/EventWidget.cpp | 54 ++++++++++++++++++++++++++ Hardware/Widgets/EventWidget.hpp | 29 ++++++++++++++ Hardware/Widgets/IntervalWidget.cpp | 6 +-- Hardware/Widgets/IntervalWidget.hpp | 9 ++--- Hardware/Widgets/ScenarioComponent.hpp | 43 ++++++++++++++++++++ Hardware/Widgets/ScenarioWidget.cpp | 36 +++++++++++++---- Hardware/Widgets/ScenarioWidget.hpp | 4 ++ Hardware/Widgets/StateWidget.cpp | 17 ++++---- Hardware/Widgets/StateWidget.hpp | 11 ++---- Hardware/Widgets/TimeSyncWidget.cpp | 54 ++++++++++++++++++++++++++ Hardware/Widgets/TimeSyncWidget.hpp | 29 ++++++++++++++ 13 files changed, 262 insertions(+), 37 deletions(-) create mode 100644 Hardware/Widgets/EventWidget.cpp create mode 100644 Hardware/Widgets/EventWidget.hpp create mode 100644 Hardware/Widgets/ScenarioComponent.hpp create mode 100644 Hardware/Widgets/TimeSyncWidget.cpp create mode 100644 Hardware/Widgets/TimeSyncWidget.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 074b90d..4ace8a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,10 @@ set(HDRS "Hardware/DocumentPlugin.hpp" "Hardware/ApplicationPlugin.hpp" + "Hardware/Widgets/ScenarioComponent.hpp" "Hardware/Widgets/ScenarioWidget.hpp" + "Hardware/Widgets/TimeSyncWidget.hpp" + "Hardware/Widgets/EventWidget.hpp" "Hardware/Widgets/StateWidget.hpp" "Hardware/Widgets/IntervalWidget.hpp" @@ -40,6 +43,8 @@ set(SRCS "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/ApplicationPlugin.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/ScenarioWidget.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/TimeSyncWidget.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/EventWidget.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/StateWidget.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/IntervalWidget.cpp" diff --git a/Hardware/3rdparty/bugui b/Hardware/3rdparty/bugui index 6beac15..08fcc66 160000 --- a/Hardware/3rdparty/bugui +++ b/Hardware/3rdparty/bugui @@ -1 +1 @@ -Subproject commit 6beac152a93db4887435abdf2712e89ff32f7c35 +Subproject commit 08fcc660909bfb688156904cf520d150e3b426f6 diff --git a/Hardware/Widgets/EventWidget.cpp b/Hardware/Widgets/EventWidget.cpp new file mode 100644 index 0000000..41e1eb6 --- /dev/null +++ b/Hardware/Widgets/EventWidget.cpp @@ -0,0 +1,54 @@ +#include + +#include "EventWidget.hpp" + +namespace Hardware +{ +EventWidget::EventWidget(Scenario::EventModel& event, + bugui::container_widget* parent) + : ScenarioComponentSpec{event, parent} + , bugui::container_widget{parent} +{ } + +int EventWidget::x() const +{ + return model.date().sec(); +} + +int EventWidget::y() const +{ + return 0; +} + +int EventWidget::height() const +{ + return 1; +} + +void EventWidget::paint(bugui::painter& painter) const +{ + // const auto col = skin.StateDot().color(); + // painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); + + // painter.draw_cell(0, 0); +} + +bool EventWidget::contains(int px, int py) const +{ + if (px == x() && py == y()) + return true; + + return false; +} + +void EventWidget::on_press(int x, int y, bool pressed) +{ + qDebug() << "is inside!"; +} + +const Scenario::EventModel& EventWidget::get_model() const +{ + return model; +} + +} diff --git a/Hardware/Widgets/EventWidget.hpp b/Hardware/Widgets/EventWidget.hpp new file mode 100644 index 0000000..ec6c9ff --- /dev/null +++ b/Hardware/Widgets/EventWidget.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include "ScenarioComponent.hpp" + +namespace Hardware +{ +struct EventWidget final : virtual bugui::container_widget + , ScenarioComponentSpec + +{ + explicit EventWidget(Scenario::EventModel& event, + bugui::container_widget* parent); + + void paint(bugui::painter& painter) const override; + void on_press(int x, int y, bool pressed) override; + + int x() const override; + int y() const override; + int height() const override; + + const Scenario::EventModel& get_model() const; + +protected: + bool contains(int px, int py) const override; +}; + +} //namespace Hardware + diff --git a/Hardware/Widgets/IntervalWidget.cpp b/Hardware/Widgets/IntervalWidget.cpp index 1051067..94a453f 100644 --- a/Hardware/Widgets/IntervalWidget.cpp +++ b/Hardware/Widgets/IntervalWidget.cpp @@ -6,9 +6,7 @@ namespace Hardware { IntervalWidget::IntervalWidget(Scenario::IntervalModel& interval, bugui::container_widget* parent) - : bugui::base_widget{parent} - , model{interval} - , skin{Process::Style::instance()} + : ScenarioComponentSpec{interval, parent} { } int IntervalWidget::x() const @@ -32,7 +30,7 @@ void IntervalWidget::paint(bugui::painter& painter) const const auto col = skin.IntervalBase().color(); painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); - painter.draw_line({0, 0}, {width(), 0}); + painter.draw_line(0, 0, width(), 0); } bool IntervalWidget::contains(int px, int py) const diff --git a/Hardware/Widgets/IntervalWidget.hpp b/Hardware/Widgets/IntervalWidget.hpp index 13a8cb0..6dcf36b 100644 --- a/Hardware/Widgets/IntervalWidget.hpp +++ b/Hardware/Widgets/IntervalWidget.hpp @@ -1,12 +1,13 @@ #pragma once -#include #include #include +#include "ScenarioComponent.hpp" + namespace Hardware { -struct IntervalWidget final : bugui::base_widget +struct IntervalWidget final : ScenarioComponentSpec { explicit IntervalWidget(Scenario::IntervalModel& interval, bugui::container_widget* parent); @@ -24,10 +25,6 @@ struct IntervalWidget final : bugui::base_widget protected: bool contains(int px, int py) const override; - -private: - Scenario::IntervalModel& model; - const Process::Style& skin; }; } // namespace Hardware diff --git a/Hardware/Widgets/ScenarioComponent.hpp b/Hardware/Widgets/ScenarioComponent.hpp new file mode 100644 index 0000000..b286d6f --- /dev/null +++ b/Hardware/Widgets/ScenarioComponent.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include "widgets/base_widget.hpp" +#include +#include + +namespace Hardware +{ +struct ScenarioComponent : bugui::base_widget +{ + virtual bool this_model(const Scenario::IntervalModel&) const { return false; }; + 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; }; + +protected: + explicit ScenarioComponent(bugui::container_widget* parent) + : bugui::base_widget{parent} + { } +}; + +template + requires (std::same_as || + std::same_as || + std::same_as || + std::same_as) +struct ScenarioComponentSpec : ScenarioComponent +{ + bool this_model(const T& m) const override { return m.id() == model.id(); }; + +protected: + explicit ScenarioComponentSpec(T& m, + bugui::container_widget* parent) + : ScenarioComponent{parent} + , model{m} + , skin{Process::Style::instance()} + { } + + T& model; + const Process::Style& skin; +}; + +} // hardware diff --git a/Hardware/Widgets/ScenarioWidget.cpp b/Hardware/Widgets/ScenarioWidget.cpp index 5a623b4..ab03213 100644 --- a/Hardware/Widgets/ScenarioWidget.cpp +++ b/Hardware/Widgets/ScenarioWidget.cpp @@ -1,5 +1,7 @@ #include "ScenarioWidget.hpp" + #include +#include namespace Hardware { @@ -15,8 +17,14 @@ ScenarioWidget::ScenarioWidget(Scenario::ProcessModel* scenario, &Scenario::ProcessModel::intervalMoved, [this] { update(); }); - for(Scenario::IntervalModel& s : model->intervals) - add_widget(s); + for(Scenario::IntervalModel& i : model->intervals) + add_widget(i); + + model->timeSyncs.mutable_added.connect<&ScenarioWidget::on_time_sync_added>(this); + model->timeSyncs.removed.connect<&ScenarioWidget::on_time_sync_removed>(this); + + for(Scenario::TimeSyncModel& t : model->timeSyncs) + add_widget(t); } int ScenarioWidget::x() const @@ -31,7 +39,7 @@ int ScenarioWidget::y() const int ScenarioWidget::width() const { - return bugui::base_widget::parent->width(); + return std::numeric_limits::max(); } int ScenarioWidget::height() const @@ -49,19 +57,31 @@ void ScenarioWidget::on_interval_removed(const Scenario::IntervalModel& interval { remove_widget([&interval] (const auto& w) - { - auto ntrvl = static_cast(w.get()); - return ntrvl->get_model().id() == interval.id(); - }); + { return static_cast(w.get())->this_model(interval); }); update(); } -void ScenarioWidget::on_interval_changed(const Scenario::IntervalModel &) +void ScenarioWidget::on_interval_changed(const Scenario::IntervalModel&) { update(); } +void ScenarioWidget::on_time_sync_added(Scenario::TimeSyncModel& timeSync) +{ + add_widget(timeSync); + update(); +} + +void ScenarioWidget::on_time_sync_removed(const Scenario::TimeSyncModel& timeSync) +{ + remove_widget([&timeSync] + (const auto& w) + { return static_cast(w.get())->this_model(timeSync); }); + + update(); +} + } // namespace Hardware #include "wobjectimpl.h" diff --git a/Hardware/Widgets/ScenarioWidget.hpp b/Hardware/Widgets/ScenarioWidget.hpp index c6a8f51..a012bca 100644 --- a/Hardware/Widgets/ScenarioWidget.hpp +++ b/Hardware/Widgets/ScenarioWidget.hpp @@ -3,6 +3,7 @@ #include #include + #include namespace Hardware @@ -27,6 +28,9 @@ private: 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); + Scenario::ProcessModel* model; }; diff --git a/Hardware/Widgets/StateWidget.cpp b/Hardware/Widgets/StateWidget.cpp index e5a8cb4..fcd793b 100644 --- a/Hardware/Widgets/StateWidget.cpp +++ b/Hardware/Widgets/StateWidget.cpp @@ -1,12 +1,12 @@ +#include + #include "StateWidget.hpp" namespace Hardware { StateWidget::StateWidget(Scenario::StateModel& state, - container_widget* parent) - : bugui::container_widget{parent} - , model{state} - , skin{Process::Style::instance()} + bugui::container_widget* parent) + : ScenarioComponentSpec{state, parent} { } int StateWidget::x() const @@ -21,18 +21,15 @@ int StateWidget::y() const void StateWidget::paint(bugui::painter& painter) const { - // Copied from MiniscenarioView - const auto col = skin.IntervalBase().color(); + const auto col = skin.StateDot().color(); painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); - painter.draw_line({x(), y()}, {x() + width(), y()}); + painter.draw_cell(0, 0); } bool StateWidget::contains(int px, int py) const { - if (px >= x() && - px <= (x() + width()) && - py == y()) + if (px == x() && py == y()) return true; return false; diff --git a/Hardware/Widgets/StateWidget.hpp b/Hardware/Widgets/StateWidget.hpp index 8f38aea..ba9c45c 100644 --- a/Hardware/Widgets/StateWidget.hpp +++ b/Hardware/Widgets/StateWidget.hpp @@ -1,15 +1,14 @@ #pragma once -#include -#include #include +#include "ScenarioComponent.hpp" namespace Hardware { -struct StateWidget final : bugui::container_widget +struct StateWidget final : ScenarioComponentSpec { explicit StateWidget(Scenario::StateModel& state, - container_widget* parent); + bugui::container_widget* parent); void paint(bugui::painter& painter) const override; void on_press(int x, int y, bool pressed) override; @@ -23,10 +22,6 @@ struct StateWidget final : bugui::container_widget protected: bool contains(int px, int py) const override; - -private: - Scenario::StateModel& model; - const Process::Style& skin; }; } //namespace Hardware diff --git a/Hardware/Widgets/TimeSyncWidget.cpp b/Hardware/Widgets/TimeSyncWidget.cpp new file mode 100644 index 0000000..a910b72 --- /dev/null +++ b/Hardware/Widgets/TimeSyncWidget.cpp @@ -0,0 +1,54 @@ +#include + +#include "TimeSyncWidget.hpp" + +namespace Hardware +{ +TimeSyncWidget::TimeSyncWidget(Scenario::TimeSyncModel& timeSync, + bugui::container_widget* parent) + : ScenarioComponentSpec{timeSync, parent} + // , bugui::container_widget{parent} +{ } + +int TimeSyncWidget::x() const +{ + return model.date().sec(); +} + +int TimeSyncWidget::y() const +{ + return 0; +} + +int TimeSyncWidget::height() const +{ + return 1; +} + +void TimeSyncWidget::paint(bugui::painter& painter) const +{ + // const auto col = skin.StateDot().color(); + // painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); + + // painter.draw_cell(0, 0); +} + +bool TimeSyncWidget::contains(int px, int py) const +{ + if (px == x() && py == y()) + return true; + + return false; +} + +void TimeSyncWidget::on_press(int x, int y, bool pressed) +{ + qDebug() << "is inside!"; +} + +const Scenario::TimeSyncModel& TimeSyncWidget::get_model() const +{ + return model; +} + +} diff --git a/Hardware/Widgets/TimeSyncWidget.hpp b/Hardware/Widgets/TimeSyncWidget.hpp new file mode 100644 index 0000000..8cc035e --- /dev/null +++ b/Hardware/Widgets/TimeSyncWidget.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "Hardware/Widgets/ScenarioComponent.hpp" +#include "Scenario/Document/TimeSync/TimeSyncModel.hpp" +#include + +namespace Hardware +{ +struct TimeSyncWidget final : ScenarioComponentSpec + // , virtual bugui::container_widget +{ + explicit TimeSyncWidget(Scenario::TimeSyncModel& timeSync, + bugui::container_widget* parent); + + void paint(bugui::painter& painter) const override; + void on_press(int x, int y, bool pressed) override; + + int x() const override; + int y() const override; + int height() const override; + + const Scenario::TimeSyncModel& get_model() const; + +protected: + bool contains(int px, int py) const override; +}; + +} //namespace Hardware +