• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ossia / score / 30712882626

01 Aug 2026 06:35PM UTC coverage: 15.224% (-0.04%) from 15.263%
30712882626

Pull #2170

github

web-flow
Merge 03b0da44d into 3ceec338e
Pull Request #2170: Make the X11-dependent parts optional (gfx, vst3, linuxcheck)

30381 of 199565 relevant lines covered (15.22%)

1075.35 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

60.47
/src/plugins/score-plugin-scenario/Scenario/Document/TimeSync/TimeSyncPresenter.cpp
1
// This is an open source non-commercial project. Dear PVS-Studio, please check
2
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
3
#include "TimeSyncPresenter.hpp"
4

5
#include <State/MessageListSerialization.hpp>
6

7
#include <Scenario/Commands/TimeSync/SetTrigger.hpp>
8
#include <Scenario/Document/Event/EventModel.hpp>
9
#include <Scenario/Document/TimeSync/TimeSyncModel.hpp>
10
#include <Scenario/Document/TimeSync/TimeSyncView.hpp>
11
#include <Scenario/Document/TimeSync/TriggerView.hpp>
12

13
#include <score/command/Dispatchers/CommandDispatcher.hpp>
14
#include <score/document/DocumentContext.hpp>
15
#include <score/graphics/GraphicsItem.hpp>
16
#include <score/model/Identifier.hpp>
17
#include <score/model/ModelMetadata.hpp>
18
#include <score/selection/Selectable.hpp>
19
#include <score/tools/Bind.hpp>
20

21
#include <wobjectimpl.h>
22
W_OBJECT_IMPL(Scenario::TimeSyncPresenter)
144✔
23
namespace Scenario
24
{
25
TimeSyncPresenter::TimeSyncPresenter(
90✔
26
    const TimeSyncModel& model, QGraphicsItem* parentview, QObject* parent)
27
    : QObject{parent}
30✔
28
    , m_model{model}
30✔
29
    , m_view{new TimeSyncView{*this, parentview}}
30✔
30
    , m_triggerView{new TriggerView{m_view}}
30✔
31
{
30✔
32
  con(m_model.selection, &Selectable::changed, this, [this](bool b) {
30✔
33
    m_view->setSelected(b);
×
34
    m_triggerView->setSelected(b);
×
35
  });
×
36
  con(m_model, &TimeSyncModel::waitingChanged, this, [this](bool b) {
30✔
37
    if(b)
×
38
      m_triggerView->onWaitStart();
×
39
    else
40
      m_triggerView->onWaitEnd();
×
41
  });
×
42

43
  con(m_model.metadata(), &score::ModelMetadata::ColorChanged, this,
60✔
44
      [this](const score::ColorRef& c) { m_view->changeColor(c.getBrush()); });
30✔
45
  con(m_model.metadata(), &score::ModelMetadata::LabelChanged, this,
60✔
46
      [this](const auto& t) { m_view->setLabel(t); });
30✔
47
  con(m_model, &TimeSyncModel::activeChanged, this, [this] {
30✔
48
    m_view->setTriggerActive(m_model.active());
×
49
    m_triggerView->setVisible(m_model.active());
×
50
    m_triggerView->setToolTip(m_model.expression().toString());
×
51
  });
×
52

53
  m_view->changeColor(m_model.metadata().getColor().getBrush());
30✔
54
  m_view->setLabel(m_model.metadata().getLabel());
30✔
55
  m_view->setTriggerActive(m_model.active());
30✔
56
  // TODO find a correct way to handle validity of model elements.
57
  // extentChanged is updated in scenario.
58

59
  m_triggerView->setVisible(m_model.active());
30✔
60
  m_triggerView->setPos(-10., -25.);
30✔
61

62
  m_triggerView->setToolTip(m_model.expression().toString());
30✔
63
  con(m_model, &TimeSyncModel::triggerChanged, this,
60✔
64
      [&](const State::Expression& t) { m_triggerView->setToolTip(t.toString()); });
30✔
65

66
  connect(m_triggerView, &TriggerView::pressed, &m_model, [this](QPointF sp) {
30✔
67
    m_model.triggeredByGui();
×
68
    pressed(sp);
×
69
  });
×
70
  connect(
30✔
71
      m_triggerView, &TriggerView::moved, &m_model, [this](QPointF sp) { moved(sp); });
30✔
72
  connect(m_triggerView, &TriggerView::released, &m_model, [this](QPointF sp) {
30✔
73
    released(sp);
×
74
  });
×
75

76
  connect(
30✔
77
      m_triggerView, &TriggerView::dropReceived, this, &TimeSyncPresenter::handleDrop);
30✔
78
}
30✔
79

80
TimeSyncPresenter::~TimeSyncPresenter() { }
30✔
81

82
const VerticalExtent& TimeSyncPresenter::extent() const noexcept
330✔
83
{
84
  return m_extent;
330✔
85
}
86

87
void TimeSyncPresenter::setExtent(const VerticalExtent& extent)
123✔
88
{
89
  if(extent != m_extent)
123✔
90
  {
91
    m_extent = extent;
24✔
92
    extentChanged(m_extent);
24✔
93
  }
24✔
94
}
123✔
95

96
void TimeSyncPresenter::addEvent(EventPresenter* ev)
20✔
97
{
98
  m_events.push_back(ev);
20✔
99
}
20✔
100

101
void TimeSyncPresenter::removeEvent(EventPresenter* ev)
3✔
102
{
103
  auto it = ossia::find(m_events, ev);
3✔
104
  if(it != m_events.end())
3✔
105
    m_events.erase(it);
3✔
106
}
3✔
107

108
const Id<TimeSyncModel>& TimeSyncPresenter::id() const
36✔
109
{
110
  return m_model.id();
36✔
111
}
112

113
const TimeSyncModel& TimeSyncPresenter::model() const
195✔
114
{
115
  return m_model;
195✔
116
}
117

118
TimeSyncView* TimeSyncPresenter::view() const
547✔
119
{
120
  return m_view;
547✔
121
}
122

123
TriggerView& TimeSyncPresenter::trigger() const noexcept
×
124
{
125
  return *m_triggerView;
×
126
}
127

128
void TimeSyncPresenter::handleDrop(const QPointF& pos, const QMimeData& mime)
×
129
{
130
  // If the mime data has states in it we can handle it.
131
  if(mime.hasFormat(score::mime::messagelist()))
×
132
  {
133
    Mime<State::MessageList>::Deserializer des{mime};
×
134
    State::MessageList ml = des.deserialize();
×
135

136
    if(ml.size() > 0)
×
137
    {
138
      QString expr = "{" + toString(State::Pulse{ml[0].address.address}) + "}";
×
139
      auto trig = State::parseExpression(expr);
×
140

141
      if(trig)
×
142
      {
143
        CommandDispatcher<> dispatcher{
×
144
            score::IDocument::documentContext(m_model).commandStack};
×
145
        auto cmd = new Command::SetTrigger{m_model, std::move(*trig)};
×
146
        dispatcher.submit(cmd);
×
147
      }
×
148
    }
×
149
  }
×
150
}
×
151
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc