[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
{
Controller::Controller(const score::DocumentContext& document)
Controller::Controller(const score::DocumentContext& document,
Scenario::IntervalModel& i)
: bugui::controller<Controller>{}
, doc{document}
, interval{&i}
, h_ofset{0.} // initial horizontal ofset
, v_ofset{0.} // initial verticalal ofset
, h_zoom{.125} // initial horizontal zoom
, v_zoom{1.1} // initial verticalal zoom
{}
void Controller::setup_scenario(Scenario::ProcessModel* s)
{
scenar = s;
// Connet interval signals
// adapted from
// src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18
scenar->intervals.added.connect<&Controller::on_interval_changed>(this);
scenar->intervals.removed.connect<&Controller::on_interval_changed>(this);
auto scnr = qobject_cast<Scenario::ProcessModel*>(&*i.processes.begin());
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,
[this] { update(); });
setup();
}
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
{
if (!scenar) return;
// Copied from MiniscenarioView
auto& skin = Process::Style::instance();
const auto col = skin.IntervalBase().color();
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 st = (c.date().sec() * h_zoom) - h_ofset;

View file

@ -17,9 +17,9 @@ class SCORE_ADDON_HARDWARE_EXPORT Controller
W_OBJECT(Controller)
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 play(bool pressed);
@ -33,7 +33,7 @@ public:
private:
void on_interval_changed(const Scenario::IntervalModel&);
Scenario::ProcessModel* scenar;
Scenario::IntervalModel* interval;
const score::DocumentContext& doc;
bool m_shift{false};

View file

@ -24,7 +24,7 @@ namespace Hardware
using namespace std::literals;
DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* parent)
: score::DocumentPlugin{doc, "Hardware::DocumentPlugin", parent}
, ctrlr{doc}
, ctrlr{nullptr}
{
auto& set = m_context.app.settings<Settings::Model>();
if(set.getEnabled())
@ -32,9 +32,10 @@ DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* paren
create();
}
con(
set, &Settings::Model::EnabledChanged, this,
[this](bool b)
con(set,
&Settings::Model::EnabledChanged,
this,
[this] (bool b)
{
if (b)
create();
@ -53,27 +54,20 @@ void DocumentPlugin::on_documentClosing()
void DocumentPlugin::create()
{
if (cstr) cleanup();
if (ctrlr) cleanup();
auto& doc = m_context.document.model().modelDelegate();
auto scenar = safe_cast<Scenario::ScenarioDocumentModel*>(&doc);
cstr = &scenar->baseScenario().interval();
auto cstr = &scenar->baseScenario().interval();
ctrlr.setup();
// 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())
);
ctrlr = new Controller{m_context, *cstr};
}
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;
Controller ctrlr;
Controller* ctrlr;
private:
void create();
void cleanup();
Scenario::IntervalModel* cstr{nullptr};
};
}