score-addon-hardware/Hardware/Controller.cpp

153 lines
3 KiB
C++
Raw Normal View History

#include <score/application/GUIApplicationContext.hpp>
#include <score/actions/ActionManager.hpp>
#include <Scenario/Application/ScenarioActions.hpp>
2024-10-15 21:00:53 +01:00
#include <Process/Style/ScenarioStyle.hpp>
2024-10-03 23:50:15 +01:00
#include "Controller.hpp"
#include <devices/Launchpad_Pro_Standalone.hpp>
struct test
{
using type = Launchpad_Pro_Standalone;
};
namespace Hardware
{
Controller::Controller(const score::DocumentContext& document,
Scenario::IntervalModel& i)
: bugui::controller<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<Scenario::ProcessModel*>(&*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
{
2024-10-15 21:00:53 +01:00
// Copied from MiniscenarioView
auto& skin = Process::Style::instance();
2024-10-16 23:25:53 +01:00
const auto col = skin.IntervalBase().color();
painter.set_color(col.red(), col.green(), col.blue(), col.alpha());
2024-10-15 21:00:53 +01:00
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;
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<Actions::PlayGlobal>().action()->trigger();
else
doc.app.actions.action<Actions::Play>().action()->trigger();
}
void Controller::stop(bool pressed)
{
if (m_shift)
doc.app.actions.action<Actions::Reinitialize>().action()->trigger();
else
doc.app.actions.action<Actions::Stop>().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 <wobjectimpl.h>
W_OBJECT_IMPL(Hardware::Controller)