From b1c937873240dd6ac40977016b1294c260ceee9f Mon Sep 17 00:00:00 2001 From: thibaudk Date: Sun, 6 Oct 2024 15:16:11 +0100 Subject: [PATCH] [DocumentPlugin]functional version fixing https://codeberg.org/bugui/score/issues/1 --- CMakeLists.txt | 18 ++-- Hardware/ApplicationPlugin.cpp | 10 +++ Hardware/ApplicationPlugin.hpp | 3 + Hardware/Controller.cpp | 143 ++++++++++++++++++++++++++++++++ Hardware/Controller.hpp | 36 ++++++-- Hardware/DocumentPlugin.cpp | 77 +++++++++++++++++ Hardware/DocumentPlugin.hpp | 32 ++++++++ Hardware/Hardware.cpp | 145 --------------------------------- Hardware/Hardware.hpp | 39 --------- Hardware/MidiController.hpp | 7 +- Hardware/Settings/Model.hpp | 2 - 11 files changed, 305 insertions(+), 207 deletions(-) create mode 100644 Hardware/DocumentPlugin.cpp create mode 100644 Hardware/DocumentPlugin.hpp delete mode 100644 Hardware/Hardware.cpp delete mode 100644 Hardware/Hardware.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ffc8d7e..8da92fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,29 +13,29 @@ endif() score_common_setup() set(HDRS - # "Hardware/Hardware.hpp" - # "Hardware/Controller.hpp" - # "Hardware/MidiController.hpp" + "Hardware/Controller.hpp" + "Hardware/MidiController.hpp" "Hardware/Settings/Model.hpp" "Hardware/Settings/Presenter.hpp" "Hardware/Settings/View.hpp" "Hardware/Settings/Factory.hpp" + "Hardware/DocumentPlugin.hpp" "Hardware/ApplicationPlugin.hpp" "score_addon_hardware.hpp" ) set(SRCS - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Hardware.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Controller.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/MidiController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Controller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/MidiController.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/Model.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/Presenter.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/View.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/Model.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/Presenter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Settings/View.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/DocumentPlugin.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/ApplicationPlugin.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/score_addon_hardware.cpp" diff --git a/Hardware/ApplicationPlugin.cpp b/Hardware/ApplicationPlugin.cpp index 334d28f..0062275 100644 --- a/Hardware/ApplicationPlugin.cpp +++ b/Hardware/ApplicationPlugin.cpp @@ -1,10 +1,20 @@ #include +#include +#include + #include +#include namespace Hardware { ApplicationPlugin::ApplicationPlugin(const score::GUIApplicationContext& app) : GUIApplicationPlugin{app} { } + +void ApplicationPlugin::on_createdDocument(score::Document& doc) +{ + doc.model().addPluginModel(new DocumentPlugin{doc.context(), &doc.model()}); +} + } diff --git a/Hardware/ApplicationPlugin.hpp b/Hardware/ApplicationPlugin.hpp index abd465a..9d420f8 100644 --- a/Hardware/ApplicationPlugin.hpp +++ b/Hardware/ApplicationPlugin.hpp @@ -8,5 +8,8 @@ class ApplicationPlugin final : public score::GUIApplicationPlugin { public: ApplicationPlugin(const score::GUIApplicationContext& app); + +protected: + void on_createdDocument(score::Document& doc) override; }; } diff --git a/Hardware/Controller.cpp b/Hardware/Controller.cpp index 31a025d..75c6c66 100644 --- a/Hardware/Controller.cpp +++ b/Hardware/Controller.cpp @@ -1,2 +1,145 @@ +#include + +#include +#include +#include + +#include "MidiController.hpp" + #include "Controller.hpp" +namespace Hardware +{ +Controller::Controller(const score::DocumentContext& doc) + : 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 +{ + commandCallback = [&doc, this](Controller::Commands com, const bool& shift) { + switch (com) + { + case Controller::Play: + if (shift) + doc.app.actions.action().action()->trigger(); + else + doc.app.actions.action().action()->trigger(); + break; + case Controller::Stop: + if (shift) + doc.app.actions.action().action()->trigger(); + else + doc.app.actions.action().action()->trigger(); + break; + case Controller::Up: + if (shift) + { + v_zoom += .2; + draw_intervals(); + } + else + { + v_ofset += .02; + draw_intervals(); + } + break; + case Controller::Down: + if (shift) + { + if (v_zoom > .2) + { + v_zoom -= .2; + draw_intervals(); + } + } + else + { + v_ofset -= .02; + draw_intervals(); + } + break; + case Controller::Left: + if (shift) + { + if (h_zoom > .02) + { + h_zoom -= .02; + draw_intervals(); + } + } + else + { + if (h_ofset > 0) + { + h_ofset -= .02; + draw_intervals(); + } + } + break; + case Controller::Right: + if (shift) + { + h_zoom += .02; + draw_intervals(); + } + else + { + h_ofset += .02; + draw_intervals(); + } + break; + default: + break; + } + + // qDebug() << "v_ofset: " << v_ofset; + // qDebug() << "v_zoom: " << v_zoom; + // qDebug() << "h_ofset: " << h_ofset; + // qDebug() << "h_zoom: " << h_ofset; + }; +} + +void Controller::setup() +{ + ctl = new MidiController{}; + ctl->on_command = commandCallback; + ctl->setup(); +} + +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); + + connect(scenar, + &Scenario::ProcessModel::intervalMoved, + [this] { draw_intervals(); }); +} + +void Controller::on_interval_changed(const Scenario::IntervalModel &) +{ + draw_intervals(); +} + +void Controller::draw_intervals() +{ + if (!ctl || !scenar) return; + + for(const Scenario::IntervalModel& c : scenar->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; + ctl->draw_line({st, y}, {st + def, y}); + } + + ctl->update_grid(); +} +} + +W_OBJECT_IMPL(Hardware::Controller) diff --git a/Hardware/Controller.hpp b/Hardware/Controller.hpp index be5b0cc..d0c5bcd 100644 --- a/Hardware/Controller.hpp +++ b/Hardware/Controller.hpp @@ -1,12 +1,21 @@ -#ifndef CONTROLLER_HPP -#define CONTROLLER_HPP +#pragma once + +#include + +#include +#include namespace Hardware { +class MidiController; -struct Controller +class SCORE_ADDON_HARDWARE_EXPORT Controller + : public QObject { - Controller() = default; + W_OBJECT(Controller) + +public: + explicit Controller(const score::DocumentContext& doc); enum Commands { @@ -17,8 +26,23 @@ struct Controller Up, Down }; -}; + void setup(); + void setup_scenario(Scenario::ProcessModel* s); + void draw_intervals(); + +private: + double h_ofset; + double v_ofset; + double h_zoom; + double v_zoom; + + MidiController* ctl; + Scenario::ProcessModel* scenar; + + std::function commandCallback; + + void on_interval_changed(const Scenario::IntervalModel &); +}; } -#endif // CONTROLLER_HPP diff --git a/Hardware/DocumentPlugin.cpp b/Hardware/DocumentPlugin.cpp new file mode 100644 index 0000000..b06298b --- /dev/null +++ b/Hardware/DocumentPlugin.cpp @@ -0,0 +1,77 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include "DocumentPlugin.hpp" + +namespace Hardware +{ +using namespace std::literals; +DocumentPlugin::DocumentPlugin(const score::DocumentContext& doc, QObject* parent) + : score::DocumentPlugin{doc, "Hardware::DocumentPlugin", parent} + , hardware{doc} +{ + auto& set = m_context.app.settings(); + if(set.getEnabled()) + { + create(); + } + + con( + set, &Settings::Model::EnabledChanged, this, + [this](bool b) { + if(b) + create(); + else + cleanup(); + }, + Qt::QueuedConnection); +} + +DocumentPlugin::~DocumentPlugin() { } + +void DocumentPlugin::on_documentClosing() +{ + cleanup(); +} + +void DocumentPlugin::create() +{ + if(cstr) + cleanup(); + + auto& doc = m_context.document.model().modelDelegate(); + auto scenar = safe_cast(&doc); + cstr = &scenar->baseScenario().interval(); + + hardware.setup(); + + // Get Scenario::processModel + // adapted from + // src/plugins/score-plugin-scenario/Scenario/Document/ScenarioDocument/ScenarioDocumentModel.cpp#67 + hardware.setup_scenario(qobject_cast(&*cstr->processes.begin())); +} + +void DocumentPlugin::cleanup() +{ + if(!cstr) + return; + + cstr = nullptr; +} +} diff --git a/Hardware/DocumentPlugin.hpp b/Hardware/DocumentPlugin.hpp new file mode 100644 index 0000000..e2c1aad --- /dev/null +++ b/Hardware/DocumentPlugin.hpp @@ -0,0 +1,32 @@ +#pragma once +#include + +#include +#include + +#include "Controller.hpp" + +namespace Scenario +{ +class IntervalModel; +} + +namespace Hardware +{ +class SCORE_ADDON_HARDWARE_EXPORT DocumentPlugin : public score::DocumentPlugin +{ +public: + DocumentPlugin(const score::DocumentContext& doc, QObject* parent); + ~DocumentPlugin(); + + void on_documentClosing() override; + + Controller hardware; + +private: + void create(); + void cleanup(); + + Scenario::IntervalModel* cstr{nullptr}; +}; +} diff --git a/Hardware/Hardware.cpp b/Hardware/Hardware.cpp deleted file mode 100644 index 30b7de8..0000000 --- a/Hardware/Hardware.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include - -#include -#include -#include -#include - -#include "Hardware.hpp" - -namespace Hardware -{ -Hardware::Hardware(const score::DocumentContext& doc) - : m_dev{doc.plugin()} - , 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 -{ - commandCallback = [&doc, this](Controller::Commands com, const bool& shift) { - switch (com) - { - case Controller::Play: - if (shift) - doc.app.actions.action().action()->trigger(); - else - doc.app.actions.action().action()->trigger(); - break; - case Controller::Stop: - if (shift) - doc.app.actions.action().action()->trigger(); - else - doc.app.actions.action().action()->trigger(); - break; - case Controller::Up: - if (shift) - { - v_zoom += .2; - draw_intervals(); - } - else - { - v_ofset += .02; - draw_intervals(); - } - break; - case Controller::Down: - if (shift) - { - if (v_zoom > .2) - { - v_zoom -= .2; - draw_intervals(); - } - } - else - { - v_ofset -= .02; - draw_intervals(); - } - break; - case Controller::Left: - if (shift) - { - if (h_zoom > .02) - { - h_zoom -= .02; - draw_intervals(); - } - } - else - { - if (h_ofset > 0) - { - h_ofset -= .02; - draw_intervals(); - } - } - break; - case Controller::Right: - if (shift) - { - h_zoom += .02; - draw_intervals(); - } - else - { - h_ofset += .02; - draw_intervals(); - } - break; - default: - break; - } - - // qDebug() << "v_ofset: " << v_ofset; - // qDebug() << "v_zoom: " << v_zoom; - // qDebug() << "h_ofset: " << h_ofset; - // qDebug() << "h_zoom: " << h_ofset; - }; -} - -void Hardware::setupController() -{ - ctl = new MidiController{}; - ctl->on_command = commandCallback; - ctl->setup(); -} - -void Hardware::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<&Hardware::on_interval_changed>(this); - scenar->intervals.removed.connect<&Hardware::on_interval_changed>(this); - - connect(scenar, - &Scenario::ProcessModel::intervalMoved, - [this] { draw_intervals(); }); -} - -void Hardware::on_interval_changed(const Scenario::IntervalModel &) -{ - draw_intervals(); -} - -void Hardware::draw_intervals() -{ - if (!ctl || !scenar) return; - - for(const Scenario::IntervalModel& c : scenar->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; - ctl->draw_line({st, y}, {st + def, y}); - } - - ctl->update_grid(); -} -} - -W_OBJECT_IMPL(Hardware::Hardware) diff --git a/Hardware/Hardware.hpp b/Hardware/Hardware.hpp deleted file mode 100644 index dbdec84..0000000 --- a/Hardware/Hardware.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -// #include - -#include -#include - -#include "MidiController.hpp" - -namespace Hardware -{ -class /*SCORE_PLUGIN_HARDWARE_EXPORT*/ Hardware - : public QObject -{ - W_OBJECT(Hardware) - -public: - explicit Hardware(const score::DocumentContext& doc); - - void setupController(); - void setup_scenario(Scenario::ProcessModel* s); - void draw_intervals(); - -private: - double h_ofset; - double v_ofset; - double h_zoom; - double v_zoom; - - MidiController* ctl; - Explorer::DeviceDocumentPlugin& m_dev; - Scenario::ProcessModel* scenar; - - std::function commandCallback; - - void on_interval_changed(const Scenario::IntervalModel &); -}; -} - diff --git a/Hardware/MidiController.hpp b/Hardware/MidiController.hpp index b9b4e1f..48dbccf 100644 --- a/Hardware/MidiController.hpp +++ b/Hardware/MidiController.hpp @@ -39,14 +39,9 @@ #define MAX_ROW_INDEX 7 #define MAX_COLUMN_INDEX 7 -namespace Explorer -{ -class DeviceDocumentPlugin; -} - namespace Hardware { -class MidiController : public Controller +class MidiController { public: MidiController(); diff --git a/Hardware/Settings/Model.hpp b/Hardware/Settings/Model.hpp index 269468b..87af966 100644 --- a/Hardware/Settings/Model.hpp +++ b/Hardware/Settings/Model.hpp @@ -3,8 +3,6 @@ #include -#include - namespace Hardware { namespace Settings