#pragma once #include #include #include namespace bugui { struct base_widget; struct container_widget; } namespace Hardware { class ScenarioWidget; template requires (std::same_as || std::derived_from) struct ScenarioComponent : T { 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(ScenarioWidget* s, bugui::container_widget* parent) : T{parent} , scenario{s} , skin{Process::Style::instance()} { } ScenarioWidget* scenario{nullptr}; const Process::Style& skin; }; 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(); }; const T& get_model() const { return model; } protected: explicit ScenarioComponentSpec(T& m, ScenarioWidget* scenario, bugui::container_widget* parent) : ScenarioComponent{scenario, parent} , model{m} { } T& model; }; } // hardware