28 T& self,
const score::Skin& skin,
const QString& text, QPainter* painter,
31 painter->setRenderHint(QPainter::Antialiasing,
true);
33 constexpr const double adj = 6.;
34 constexpr const double space = 50.;
35 constexpr const double start = (270. - space) * 16.;
36 constexpr const double totalSpan = (360. - 2. * space) * 16.;
38 const QRectF srect = defaultKnobSize;
39 const QRectF r = srect.adjusted(adj, adj, -adj, -adj);
40 const double rw = r.width();
43 painter->setPen(skin.Emphasis2.main.pen1);
44 painter->setBrush(skin.Emphasis2.main.brush);
45 painter->drawChord(r, start, -totalSpan);
47 const double valueSpan = -self.m_value * totalSpan;
48 double textDelta = 0.;
51 painter->setPen(skin.Base4.main.pen3_solid_round_round);
56 painter->setPen(skin.Base4.main.pen2_solid_round_round);
61 painter->setPen(skin.Base4.main.pen1_5);
66 painter->setPen(skin.Base4.main.pen1);
69 painter->drawArc(r, start, valueSpan);
72 const double r1 = 0.5 * rw;
73 const double x0 = r.center().x();
74 const double y0 = r.center().y();
75 const double theta = -0.0174533 * (start + valueSpan) / 16.;
76 const double x1 = r.center().x() + r1 * cos(theta);
77 const double y1 = r.center().y() + r1 * sin(theta);
79 painter->drawLine(QPointF{x0, y0}, QPointF{x1, y1});
81 painter->setPen(skin.Base4.lighter180.pen1);
84 const QRectF er = r.adjusted(1.5, 1.5, -1.5, -1.5);
85 const double valueSpan = -self.m_execValue * totalSpan;
86 painter->drawArc(er, start, valueSpan);
90 painter->setFont(skin.Medium8Pt);
92 QRectF{0., srect.height() + textDelta, srect.width(), 10.}, text,
93 QTextOption(Qt::AlignCenter));
95 painter->setRenderHint(QPainter::Antialiasing,
false);
99 static void mousePressEvent(T& self, QGraphicsSceneMouseEvent* event)
101 if(event->button() == Qt::LeftButton)
104 InfiniteScroller::start(self, self.m_value);
110 template <
typename T>
111 static void mouseMoveEvent(T& self, QGraphicsSceneMouseEvent* event)
113 if((event->buttons() & Qt::LeftButton) && self.m_grab)
115 double v = InfiniteScroller::move(event);
116 if(v != self.m_value)
126 template <
typename T>
127 static void mouseReleaseEvent(T& self, QGraphicsSceneMouseEvent* event)
129 InfiniteScroller::stop(self, event);
132 double v = InfiniteScroller::move(event);
133 if(v != self.m_value)
141 self.sliderReleased();
143 if(event->button() == Qt::RightButton)
145 contextMenuEvent(self, event->scenePos());
151 template <
typename T>
152 requires std::is_integral_v<std::decay_t<decltype(std::declval<T>().value())>>
153 static void contextMenuEvent(T& self, QPointF pos)
155 auto build = [&, self_p = &self, pos] {
157 w->setRange(self.min, self.max);
159 w->setValue(self.map(self.m_value));
160 auto obj = self.scene()->addWidget(
161 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
164#if defined(__EMSCRIPTEN__)
167 QTimer::singleShot(0, w, [w] { w->setFocus(); });
170 auto con = QObject::connect(
171 w, SignalUtils::QSpinBox_valueChanged_int(), &self,
172 [&self, obj, scene = self.scene()](
double v) {
173 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, v);
177 w, &SpinboxWithEnter::editingFinished, &self, [obj, con, self_p]()
mutable {
180 self_p->sliderReleased();
181 QObject::disconnect(con);
182 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
183 scene->removeItem(obj);
190#if defined(__EMSCRIPTEN__)
193 QTimer::singleShot(0, &self, build);
197 template <
typename T>
198 requires std::is_floating_point_v<std::decay_t<decltype(std::declval<T>().value())>>
199 static void contextMenuEvent(T& self, QPointF pos)
201 auto build = [&, self_p = &self, pos] {
203 w->setRange(self.min, self.max);
206 w->setValue(self.map(self.m_value));
207 auto obj = self.scene()->addWidget(
208 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
211#if defined(__EMSCRIPTEN__)
214 QTimer::singleShot(0, w, [w] { w->setFocus(); });
217 auto con = QObject::connect(
218 w, SignalUtils::QDoubleSpinBox_valueChanged_double(), &self,
219 [&self, obj, scene = self.scene()](
double v) {
220 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, v);
224 w, &DoubleSpinboxWithEnter::editingFinished, &self,
225 [obj, con, self_p]()
mutable {
228 self_p->sliderReleased();
229 QObject::disconnect(con);
230 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
231 scene->removeItem(obj);
238#if defined(__EMSCRIPTEN__)
241 QTimer::singleShot(0, &self, build);
245 template <
typename T>
246 static void mouseDoubleClickEvent(T& self, QGraphicsSceneMouseEvent* event)
248 self.m_value = self.unmap(self.init);
252 self.sliderReleased();