2 #include <score/graphics/InfiniteScroller.hpp>
3 #include <score/model/Skin.hpp>
4 #include <score/tools/Cursor.hpp>
5 #include <score/widgets/DoubleSpinBox.hpp>
6 #include <score/widgets/SignalUtils.hpp>
8 #include <ossia/detail/math.hpp>
10 #include <QDoubleSpinBox>
11 #include <QGraphicsProxyWidget>
12 #include <QGraphicsScene>
13 #include <QGraphicsSceneMouseEvent>
14 #include <QGuiApplication>
25 T&
self,
const score::Skin& skin,
const QString& text, QPainter* painter,
28 painter->setRenderHint(QPainter::Antialiasing,
true);
30 constexpr
const double adj = 6.;
31 constexpr
const double space = 50.;
32 constexpr
const double start = (270. - space) * 16.;
33 constexpr
const double totalSpan = (360. - 2. * space) * 16.;
35 const QRectF srect =
self.boundingRect();
36 const QRectF r = srect.adjusted(adj, adj, -adj, -adj);
37 const double rw = r.width();
40 painter->setPen(skin.Emphasis2.main.pen1);
41 painter->setBrush(skin.Emphasis2.main.brush);
42 painter->drawChord(r, start, -totalSpan);
44 const double valueSpan = -
self.m_value * totalSpan;
45 double textDelta = 0.;
48 painter->setPen(skin.Base4.main.pen3_solid_round_round);
53 painter->setPen(skin.Base4.main.pen2_solid_round_round);
58 painter->setPen(skin.Base4.main.pen1_5);
63 painter->setPen(skin.Base4.main.pen1);
66 painter->drawArc(r, start, valueSpan);
69 const double r1 = 0.5 * rw;
70 const double x0 = r.center().x();
71 const double y0 = r.center().y();
72 const double theta = -0.0174533 * (start + valueSpan) / 16.;
73 const double x1 = r.center().x() + r1 * cos(theta);
74 const double y1 = r.center().y() + r1 * sin(theta);
76 painter->drawLine(QPointF{x0, y0}, QPointF{x1, y1});
78 painter->setPen(skin.Base4.lighter180.pen1);
81 const QRectF er = r.adjusted(1.5, 1.5, -1.5, -1.5);
82 const double valueSpan = -
self.m_execValue * totalSpan;
83 painter->drawArc(er, start, valueSpan);
87 painter->setFont(skin.Medium8Pt);
89 QRectF{0., srect.height() + textDelta, srect.width(), 10.}, text,
90 QTextOption(Qt::AlignCenter));
92 painter->setRenderHint(QPainter::Antialiasing,
false);
96 static void mousePressEvent(T&
self, QGraphicsSceneMouseEvent* event)
98 if(event->button() == Qt::LeftButton)
101 InfiniteScroller::start(
self,
self.m_value);
107 template <
typename T>
108 static void mouseMoveEvent(T&
self, QGraphicsSceneMouseEvent* event)
110 if((event->buttons() & Qt::LeftButton) &&
self.m_grab)
112 double v = InfiniteScroller::move(event);
113 if(v !=
self.m_value)
123 template <
typename T>
124 static void mouseReleaseEvent(T&
self, QGraphicsSceneMouseEvent* event)
126 InfiniteScroller::stop(
self, event);
129 double v = InfiniteScroller::move(event);
130 if(v !=
self.m_value)
138 self.sliderReleased();
140 if(event->button() == Qt::RightButton)
142 contextMenuEvent(
self, event->scenePos());
148 template <
typename T>
149 requires std::is_integral_v<std::decay_t<decltype(std::declval<T>().value())>>
150 static void contextMenuEvent(T&
self, QPointF pos)
152 QTimer::singleShot(0, &
self, [&, self_p = &
self, pos] {
154 w->setRange(
self.min,
self.max);
156 w->setValue(
self.map(
self.m_value));
157 auto obj =
self.scene()->addWidget(
158 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
161 QTimer::singleShot(0, w, [w] { w->setFocus(); });
163 auto con = QObject::connect(
164 w, SignalUtils::QSpinBox_valueChanged_int(), &
self, [&
self](
double v) {
165 self.m_value =
self.unmap(v);
171 w, &SpinboxWithEnter::editingFinished, &
self, [obj, con, self_p]()
mutable {
174 self_p->sliderReleased();
175 QObject::disconnect(con);
176 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
177 scene->removeItem(obj);
186 template <
typename T>
187 requires std::is_floating_point_v<std::decay_t<decltype(std::declval<T>().value())>>
188 static void contextMenuEvent(T&
self, QPointF pos)
190 QTimer::singleShot(0, &
self, [&, self_p = &
self, pos] {
192 w->setRange(
self.min,
self.max);
195 w->setValue(
self.map(
self.m_value));
196 auto obj =
self.scene()->addWidget(
197 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
200 QTimer::singleShot(0, w, [w] { w->setFocus(); });
202 auto con = QObject::connect(
203 w, SignalUtils::QDoubleSpinBox_valueChanged_double(), &
self,
205 self.m_value =
self.unmap(v);
211 w, &DoubleSpinboxWithEnter::editingFinished, &
self,
212 [obj, con, self_p]()
mutable {
215 self_p->sliderReleased();
216 QObject::disconnect(con);
217 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
218 scene->removeItem(obj);
227 template <
typename T>
228 static void mouseDoubleClickEvent(T&
self, QGraphicsSceneMouseEvent* event)
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Definition: DefaultGraphicsKnobImpl.hpp:22
Definition: DoubleSpinBox.hpp:17
Definition: DoubleSpinBox.hpp:9