[ScenarioComponent] fixed inheritance, maybe a little convoluted

This commit is contained in:
thibaud keller 2025-01-10 10:12:29 +00:00
parent 92583043f0
commit 8c9eef1959
4 changed files with 14 additions and 11 deletions

View file

@ -6,7 +6,10 @@
namespace Hardware namespace Hardware
{ {
struct ScenarioComponent : bugui::base_widget template <typename T = bugui::base_widget>
requires (std::same_as<T, bugui::base_widget> ||
std::derived_from<T, bugui::base_widget>)
struct ScenarioComponent : T
{ {
virtual bool this_model(const Scenario::IntervalModel&) const { return false; }; 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::TimeSyncModel&) const { return false; };
@ -15,23 +18,23 @@ struct ScenarioComponent : bugui::base_widget
protected: protected:
explicit ScenarioComponent(bugui::container_widget* parent) explicit ScenarioComponent(bugui::container_widget* parent)
: bugui::base_widget{parent} : T{parent}
{ } { }
}; };
template <typename T> template <typename T, typename Base = bugui::base_widget>
requires (std::same_as<T, Scenario::IntervalModel> || requires (std::same_as<T, Scenario::IntervalModel> ||
std::same_as<T, Scenario::TimeSyncModel> || std::same_as<T, Scenario::TimeSyncModel> ||
std::same_as<T, Scenario::EventModel> || std::same_as<T, Scenario::EventModel> ||
std::same_as<T, Scenario::StateModel>) std::same_as<T, Scenario::StateModel>)
struct ScenarioComponentSpec : ScenarioComponent struct ScenarioComponentSpec : ScenarioComponent<Base>
{ {
bool this_model(const T& m) const override { return m.id() == model.id(); }; bool this_model(const T& m) const override { return m.id() == model.id(); };
protected: protected:
explicit ScenarioComponentSpec(T& m, explicit ScenarioComponentSpec(T& m,
bugui::container_widget* parent) bugui::container_widget* parent)
: ScenarioComponent{parent} : ScenarioComponent<Base>{parent}
, model{m} , model{m}
, skin{Process::Style::instance()} , skin{Process::Style::instance()}
{ } { }

View file

@ -57,7 +57,7 @@ void ScenarioWidget::on_interval_removed(const Scenario::IntervalModel& interval
{ {
remove_widget([&interval] remove_widget([&interval]
(const auto& w) (const auto& w)
{ return static_cast<ScenarioComponent*>(w.get())->this_model(interval); }); { return static_cast<ScenarioComponent<>*>(w.get())->this_model(interval); });
update(); update();
} }
@ -77,7 +77,7 @@ void ScenarioWidget::on_time_sync_removed(const Scenario::TimeSyncModel& timeSyn
{ {
remove_widget([&timeSync] remove_widget([&timeSync]
(const auto& w) (const auto& w)
{ return static_cast<ScenarioComponent*>(w.get())->this_model(timeSync); }); { return static_cast<ScenarioComponent<>*>(w.get())->this_model(timeSync); });
update(); update();
} }

View file

@ -6,8 +6,8 @@ namespace Hardware
{ {
TimeSyncWidget::TimeSyncWidget(Scenario::TimeSyncModel& timeSync, TimeSyncWidget::TimeSyncWidget(Scenario::TimeSyncModel& timeSync,
bugui::container_widget* parent) bugui::container_widget* parent)
: ScenarioComponentSpec<Scenario::TimeSyncModel>{timeSync, parent} : ScenarioComponentSpec<Scenario::TimeSyncModel,
// , bugui::container_widget{parent} bugui::container_widget>{timeSync, parent}
{ } { }
int TimeSyncWidget::x() const int TimeSyncWidget::x() const

View file

@ -6,8 +6,8 @@
namespace Hardware namespace Hardware
{ {
struct TimeSyncWidget final : ScenarioComponentSpec<Scenario::TimeSyncModel> struct TimeSyncWidget final : ScenarioComponentSpec<Scenario::TimeSyncModel,
// , virtual bugui::container_widget bugui::container_widget>
{ {
explicit TimeSyncWidget(Scenario::TimeSyncModel& timeSync, explicit TimeSyncWidget(Scenario::TimeSyncModel& timeSync,
bugui::container_widget* parent); bugui::container_widget* parent);