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 QTimer::singleShot(0, &self, [&, 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 QTimer::singleShot(0, w, [w] { w->setFocus(); });
166 auto con = QObject::connect(
167 w, SignalUtils::QSpinBox_valueChanged_int(), &self,
168 [&self, obj, scene = self.scene()](
double v) {
169 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, v);
173 w, &SpinboxWithEnter::editingFinished, &self, [obj, con, self_p]()
mutable {
176 self_p->sliderReleased();
177 QObject::disconnect(con);
178 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
179 scene->removeItem(obj);
188 template <
typename T>
189 requires std::is_floating_point_v<std::decay_t<decltype(std::declval<T>().value())>>
190 static void contextMenuEvent(T& self, QPointF pos)
192 QTimer::singleShot(0, &self, [&, self_p = &self, pos] {
194 w->setRange(self.min, self.max);
197 w->setValue(self.map(self.m_value));
198 auto obj = self.scene()->addWidget(
199 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
202 QTimer::singleShot(0, w, [w] { w->setFocus(); });
204 auto con = QObject::connect(
205 w, SignalUtils::QDoubleSpinBox_valueChanged_double(), &self,
206 [&self, obj, scene = self.scene()](
double v) {
207 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, 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)
230 self.m_value = self.unmap(self.init);
234 self.sliderReleased();