[Controller] pass interval from documentPlugin without storing it

This commit is contained in:
thibaud keller 2024-12-09 13:33:58 +00:00
parent 0ed36bfade
commit b4a498aa20
5 changed files with 29 additions and 36 deletions

@ -1 +1 @@
Subproject commit 34ec6482874d49de63a353160d78af786a7258e6 Subproject commit b4287d3aa4052cd165c4c783cb433cfffb381689

View file

@ -7,28 +7,29 @@
namespace Hardware namespace Hardware
{ {
Controller::Controller(const score::DocumentContext& document) Controller::Controller(const score::DocumentContext& document,
Scenario::IntervalModel& i)
: bugui::controller<Controller>{} : bugui::controller<Controller>{}
, doc{document} , doc{document}
, interval{&i}
, h_ofset{0.} // initial horizontal ofset , h_ofset{0.} // initial horizontal ofset
, v_ofset{0.} // initial verticalal ofset , v_ofset{0.} // initial verticalal ofset
, h_zoom{.125} // initial horizontal zoom , h_zoom{.125} // initial horizontal zoom
, v_zoom{1.1} // initial verticalal zoom , v_zoom{1.1} // initial verticalal zoom
{}
void Controller::setup_scenario(Scenario::ProcessModel* s)
{ {
scenar = s;
// Connet interval signals // Connet interval signals
// adapted from // adapted from
// src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18 // src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18
scenar->intervals.added.connect<&Controller::on_interval_changed>(this); auto scnr = qobject_cast<Scenario::ProcessModel*>(&*i.processes.begin());
scenar->intervals.removed.connect<&Controller::on_interval_changed>(this);
connect(scenar, scnr->intervals.added.connect<&Controller::on_interval_changed>(this);
scnr->intervals.removed.connect<&Controller::on_interval_changed>(this);
connect(scnr,
&Scenario::ProcessModel::intervalMoved, &Scenario::ProcessModel::intervalMoved,
[this] { update(); }); [this] { update(); });
setup();
} }
void Controller::on_interval_changed(const Scenario::IntervalModel&) void Controller::on_interval_changed(const Scenario::IntervalModel&)
@ -38,14 +39,14 @@ void Controller::on_interval_changed(const Scenario::IntervalModel&)
void Controller::paint(bugui::painter& painter) const void Controller::paint(bugui::painter& painter) const
{ {
if (!scenar) return;
// Copied from MiniscenarioView // Copied from MiniscenarioView
auto& skin = Process::Style::instance(); auto& skin = Process::Style::instance();
const auto col = skin.IntervalBase().color(); const auto col = skin.IntervalBase().color();
painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); painter.set_color(col.red(), col.green(), col.blue(), col.alpha());
for(const Scenario::IntervalModel& c : scenar->intervals) auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval->processes.begin());
for(const Scenario::IntervalModel& c : scnr->intervals)
{ {
auto def = c.duration.defaultDuration().sec() * h_zoom; auto def = c.duration.defaultDuration().sec() * h_zoom;
auto st = (c.date().sec() * h_zoom) - h_ofset; auto st = (c.date().sec() * h_zoom) - h_ofset;

View file

@ -17,9 +17,9 @@ class SCORE_ADDON_HARDWARE_EXPORT Controller
W_OBJECT(Controller) W_OBJECT(Controller)
public: public:
explicit Controller(const score::DocumentContext& document); explicit Controller(const score::DocumentContext& document,
Scenario::IntervalModel& s);
void setup_scenario(Scenario::ProcessModel* s);
void paint(bugui::painter& painter) const override; void paint(bugui::painter& painter) const override;
void play(bool pressed); void play(bool pressed);
@ -33,7 +33,7 @@ public:
private: private:
void on_interval_changed(const Scenario::IntervalModel&); void on_interval_changed(const Scenario::IntervalModel&);
Scenario::ProcessModel* scenar; Scenario::IntervalModel* interval;
const score::DocumentContext& doc; const score::DocumentContext& doc;
bool m_shift{false}; bool m_shift{false};

View file

@ -24,7 +24,7 @@ namespace Hardware
using namespace std::literals; using namespace std::literals;
DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* parent) DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* parent)
: score::DocumentPlugin{doc, "Hardware::DocumentPlugin", parent} : score::DocumentPlugin{doc, "Hardware::DocumentPlugin", parent}
, ctrlr{doc} , ctrlr{nullptr}
{ {
auto& set = m_context.app.settings<Settings::Model>(); auto& set = m_context.app.settings<Settings::Model>();
if(set.getEnabled()) if(set.getEnabled())
@ -32,8 +32,9 @@ DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* paren
create(); create();
} }
con( con(set,
set, &Settings::Model::EnabledChanged, this, &Settings::Model::EnabledChanged,
this,
[this] (bool b) [this] (bool b)
{ {
if (b) if (b)
@ -53,27 +54,20 @@ void DocumentPlugin::on_documentClosing()
void DocumentPlugin::create() void DocumentPlugin::create()
{ {
if (cstr) cleanup(); if (ctrlr) cleanup();
auto& doc = m_context.document.model().modelDelegate(); auto& doc = m_context.document.model().modelDelegate();
auto scenar = safe_cast<Scenario::ScenarioDocumentModel*>(&doc); auto scenar = safe_cast<Scenario::ScenarioDocumentModel*>(&doc);
cstr = &scenar->baseScenario().interval(); auto cstr = &scenar->baseScenario().interval();
ctrlr.setup(); ctrlr = new Controller{m_context, *cstr};
// Get Scenario::processModel
// adapted from
// src/plugins/score-plugin-scenario/Scenario/Document/ScenarioDocument/ScenarioDocumentModel.cpp#67
ctrlr.setup_scenario(
qobject_cast<Scenario::ProcessModel*>(
&*cstr->processes.begin())
);
} }
void DocumentPlugin::cleanup() void DocumentPlugin::cleanup()
{ {
if (!cstr) return; if (!ctrlr) return;
cstr = nullptr; delete ctrlr;
ctrlr = nullptr;
} }
} }

View file

@ -21,12 +21,10 @@ public:
void on_documentClosing() override; void on_documentClosing() override;
Controller ctrlr; Controller* ctrlr;
private: private:
void create(); void create();
void cleanup(); void cleanup();
Scenario::IntervalModel* cstr{nullptr};
}; };
} }