plugins/score-plugin-media/Media/Step/Presenter.hpp
1 #pragma once
2 #include <Process/Focus/FocusDispatcher.hpp>
3 #include <Process/LayerPresenter.hpp>
4 
5 #include <Audio/Settings/Model.hpp>
6 #include <Media/Step/Commands.hpp>
7 #include <Media/Step/View.hpp>
8 
9 #include <score/application/GUIApplicationContext.hpp>
10 #include <score/command/Dispatchers/SingleOngoingCommandDispatcher.hpp>
11 #include <score/tools/Bind.hpp>
12 
13 #include <ossia/detail/math.hpp>
14 namespace Media
15 {
16 namespace Step
17 {
18 class Model;
19 class Presenter final : public Process::LayerPresenter
20 {
21 public:
22  explicit Presenter(
23  const Process::ProcessModel& model, View* view, const Process::Context& ctx,
24  QObject* parent)
25  : LayerPresenter{model, view, ctx, parent}
26  , m_view{view}
27  , m_disp{m_context.context.commandStack}
28  {
29  putToFront();
30  auto& m = static_cast<const Step::Model&>(model);
31 
32  connect(view, &View::change, this, [&](std::size_t num, float v) {
33  updateSteps(m, m_disp, num, v);
34  });
35 
36  connect(view, &View::released, this, [&] { m_disp.commit(); });
37 
38  con(m, &Step::Model::stepsChanged, this, [&] { m_view->update(); });
39  con(m, &Step::Model::stepCountChanged, this, [&] { m_view->update(); });
40  con(m, &Step::Model::stepDurationChanged, this,
41  [&] { on_zoomRatioChanged(m_ratio); });
42 
43  auto& audio_settings = context().context.app.settings<Audio::Settings::Model>();
44  con(audio_settings, &Audio::Settings::Model::RateChanged, this,
45  [&] { on_zoomRatioChanged(m_ratio); });
46  }
47 
48  void setWidth(qreal width, qreal defaultWidth) override { m_view->setWidth(width); }
49  void setHeight(qreal val) override { m_view->setHeight(val); }
50 
51  void putToFront() override { m_view->setVisible(true); }
52 
53  void putBehind() override { m_view->setVisible(false); }
54 
55  void on_zoomRatioChanged(ZoomRatio r) override
56  {
57  auto samplerate
58  = 0.001 * context().context.app.settings<Audio::Settings::Model>().getRate();
59  m_ratio = r;
60  auto& m = static_cast<const Step::Model&>(m_process);
61  auto v = TimeVal::fromMsecs(m.stepDuration() / samplerate).toPixels(r);
62  m_view->setBarWidth(v);
63  }
64 
65  void parentGeometryChanged() override { }
66 
67 private:
68  View* m_view{};
70  ZoomRatio m_ratio{};
71 };
72 }
73 }
Definition: score-plugin-audio/Audio/Settings/Model.hpp:22
Definition: score-plugin-media/Media/Step/Model.hpp:23
Definition: plugins/score-plugin-media/Media/Step/Presenter.hpp:20
Definition: score-plugin-media/Media/Step/View.hpp:23
Definition: LayerPresenter.hpp:34
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: ProcessContext.hpp:12
T & settings() const
Access a specific Settings model instance.
Definition: ApplicationContext.hpp:40