36 T& self,
const score::Skin& skin,
const QString& text, QPainter* painter,
37 QWidget* widget,
const QStyleOptionGraphicsItem* option =
nullptr)
39 painter->setRenderHint(QPainter::Antialiasing,
false);
41 painter->setPen(skin.NoPen);
42 painter->setBrush(skin.Emphasis2.main.brush);
45 const QRectF brect = self.boundingRect();
46 const QRectF srect = self.sliderRect();
47 painter->drawRoundedRect(srect, 1, 1);
52 static const auto dpi_adjust
53 = (widget ? widget->devicePixelRatioF() : painter->device()->devicePixelRatioF())
58 static const constexpr auto dpi_adjust = 0;
60 static const constexpr auto dpi_adjust = -2;
63 bool showValue =
true;
64 if constexpr(std::is_base_of_v<QGraphicsItem, std::remove_cvref_t<T>>)
67 if constexpr(
requires { self.m_grab; })
68 grabbed = self.m_grab;
73 painter->setPen(skin.Base4.lighter180.pen1);
74 painter->setFont(skin.Medium8Pt);
76 = brect.adjusted(2, srect.height() + 2 + dpi_adjust, -2, -1);
77 painter->drawText(textrect, text, QTextOption(Qt::AlignCenter));
81 painter->fillRect(self.handleRect(), skin.Base4);
83 painter->fillRect(self.execHandleRect(), skin.Base4.lighter180.brush);
94 static void mousePressEvent(T& self, QGraphicsSceneMouseEvent* event)
96 if(event->button() == Qt::LeftButton && self.isInHandle(event->pos()))
100 const auto srect = self.sliderRect();
101 const auto posX =
event->pos().x() - srect.x();
102 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
103 if(curPos != self.m_value)
105 self.m_value = curPos;
114 template <
typename T>
115 static void mouseMoveEvent(T& self, QGraphicsSceneMouseEvent* event)
117 if((event->buttons() & Qt::LeftButton) && self.m_grab)
119 const auto srect = self.sliderRect();
120 const auto posX =
event->pos().x() - srect.x();
121 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
122 if(curPos != self.m_value)
124 if constexpr(std::is_same_v<
decltype(self.m_value),
int>)
126 self.m_value = curPos;
130 double ratio = qGuiApp->keyboardModifiers() & Qt::CTRL ? 0.1 : 1.;
131 self.m_value = std::clamp(
132 double(self.m_value + ((curPos - self.m_value) * ratio)), 0., 1.);
142 template <
typename T>
143 static void mouseReleaseEvent(T& self, QGraphicsSceneMouseEvent* event)
147 const auto srect = self.sliderRect();
148 const auto posX =
event->pos().x() - srect.x();
149 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
150 if(curPos != self.m_value)
152 if constexpr(std::is_same_v<
decltype(self.m_value),
int>)
154 self.m_value = curPos;
158 double ratio = qGuiApp->keyboardModifiers() & Qt::CTRL ? 0.1 : 1.;
159 self.m_value = std::clamp(
160 double(self.m_value + ((curPos - self.m_value) * ratio)), 0., 1.);
167 self.sliderReleased();
169 if(event->button() == Qt::RightButton)
171 contextMenuEvent(self, event->scenePos());
184 template <
typename T>
191 self.sliderReleased();
194 template <
typename T>
195 static void contextMenuEvent(T& self, QPointF pos)
197 auto build = [&, self_p = &self, pos] {
201 self_p->impl->spinbox =
nullptr;
202 self_p->impl->spinboxProxy =
nullptr;
205 self.impl->spinbox = w;
206 w->setRange(self.min, self.max);
209 w->setValue(self.map(self.m_value));
210 auto obj = self.scene()->addWidget(
211 w, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
213 self.impl->spinboxProxy = obj;
216#if defined(__EMSCRIPTEN__)
219 QTimer::singleShot(0, w, [w] { w->setFocus(); });
222 auto con = QObject::connect(
223 w, SignalUtils::QDoubleSpinBox_valueChanged_double(), &self,
224 [&self, obj, scene = self.scene()](
double v) {
225 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, v);
229 w, &DoubleSpinboxWithEnter::editingFinished, &self, [obj, con, self_p] {
230 if(self_p->impl->spinbox)
232 self_p->sliderReleased();
233 QObject::disconnect(con);
237 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
238 scene->removeItem(obj);
241 self_p->impl->spinbox =
nullptr;
242 self_p->impl->spinboxProxy =
nullptr;
246#if defined(__EMSCRIPTEN__)
249 QTimer::singleShot(0, &self, build);
253 template <
typename T>
254 static void mouseDoubleClickEvent(T& self, QGraphicsSceneMouseEvent* event)
256 self.m_value = self.unmap(self.init);
260 self.sliderReleased();