#include #include #include #include #include "Controller.hpp" #include struct test { using type = Launchpad_Pro_Standalone; }; namespace Hardware { Controller::Controller(const score::DocumentContext& document, Scenario::IntervalModel& i) : bugui::controller{test{}} , 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 { // Connet interval signals // adapted from // src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18 auto scnr = qobject_cast(&*i.processes.begin()); 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(); }); } void Controller::on_interval_changed(const Scenario::IntervalModel&) { update(); } void Controller::paint(bugui::painter& painter) const { // 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()); auto scnr = qobject_cast(&*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; auto y = (c.heightPercentage() * v_zoom) + v_ofset; painter.draw_line({st, y}, {st + def, y}); } } void Controller::play(bool pressed) { if (m_shift) doc.app.actions.action().action()->trigger(); else doc.app.actions.action().action()->trigger(); } void Controller::stop(bool pressed) { if (m_shift) doc.app.actions.action().action()->trigger(); else doc.app.actions.action().action()->trigger(); } void Controller::shift(bool pressed) { m_shift = pressed; } void Controller::up(bool pressed) { if (m_shift) { v_zoom += .2; update(); } else { v_ofset += .02; update(); } } void Controller::down(bool pressed) { if (m_shift) { if (v_zoom > .2) { v_zoom -= .2; update(); } } else { v_ofset -= .02; update(); } } void Controller::left(bool pressed) { if (m_shift) { if (h_zoom > .02) { h_zoom -= .02; update(); } } else { if (h_ofset > 0) { h_ofset -= .02; update(); } } } void Controller::right(bool pressed) { if (m_shift) { h_zoom += .02; update(); } else { h_ofset += .02; update(); } } } #include W_OBJECT_IMPL(Hardware::Controller)