score-addon-hardware/Hardware/Widgets/ScenarioComponent.hpp

46 lines
1.4 KiB
C++

#pragma once
#include "widgets/base_widget.hpp"
#include <Process/Style/ScenarioStyle.hpp>
#include <Scenario/Document/Interval/IntervalModel.hpp>
namespace Hardware
{
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::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)
: T{parent}
{ }
};
template <typename T, typename Base = bugui::base_widget>
requires (std::same_as<T, Scenario::IntervalModel> ||
std::same_as<T, Scenario::TimeSyncModel> ||
std::same_as<T, Scenario::EventModel> ||
std::same_as<T, Scenario::StateModel>)
struct ScenarioComponentSpec : ScenarioComponent<Base>
{
bool this_model(const T& m) const override { return m.id() == model.id(); };
protected:
explicit ScenarioComponentSpec(T& m,
bugui::container_widget* parent)
: ScenarioComponent<Base>{parent}
, model{m}
, skin{Process::Style::instance()}
{ }
T& model;
const Process::Style& skin;
};
} // hardware