35 T& self,
const score::Skin& skin,
const QString& text, QPainter* painter,
38 painter->setRenderHint(QPainter::Antialiasing,
false);
40 painter->setPen(skin.NoPen);
41 painter->setBrush(skin.Emphasis2.main.brush);
44 const QRectF brect = self.boundingRect();
45 const QRectF srect = self.sliderRect();
46 painter->drawRoundedRect(srect, 1, 1);
51 static const auto dpi_adjust
52 = (widget ? widget->devicePixelRatioF() : painter->device()->devicePixelRatioF())
57 static const constexpr auto dpi_adjust = 0;
59 static const constexpr auto dpi_adjust = -2;
61 painter->setPen(skin.Base4.lighter180.pen1);
62 painter->setFont(skin.Medium8Pt);
63 const auto textrect = brect.adjusted(2, srect.height() + 2 + dpi_adjust, -2, -1);
64 painter->drawText(textrect, text, QTextOption(Qt::AlignCenter));
67 painter->fillRect(self.handleRect(), skin.Base4);
69 painter->fillRect(self.execHandleRect(), skin.Base4.lighter180.brush);
80 static void mousePressEvent(T& self, QGraphicsSceneMouseEvent* event)
82 if(event->button() == Qt::LeftButton && self.isInHandle(event->pos()))
86 const auto srect = self.sliderRect();
87 const auto posX =
event->pos().x() - srect.x();
88 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
89 if(curPos != self.m_value)
91 self.m_value = curPos;
100 template <
typename T>
101 static void mouseMoveEvent(T& self, QGraphicsSceneMouseEvent* event)
103 if((event->buttons() & Qt::LeftButton) && self.m_grab)
105 const auto srect = self.sliderRect();
106 const auto posX =
event->pos().x() - srect.x();
107 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
108 if(curPos != self.m_value)
110 if constexpr(std::is_same_v<
decltype(self.m_value),
int>)
112 self.m_value = curPos;
116 double ratio = qGuiApp->keyboardModifiers() & Qt::CTRL ? 0.1 : 1.;
117 self.m_value = std::clamp(
118 double(self.m_value + ((curPos - self.m_value) * ratio)), 0., 1.);
128 template <
typename T>
129 static void mouseReleaseEvent(T& self, QGraphicsSceneMouseEvent* event)
133 const auto srect = self.sliderRect();
134 const auto posX =
event->pos().x() - srect.x();
135 double curPos = self.from01(ossia::clamp(posX, 0., srect.width()) / srect.width());
136 if(curPos != self.m_value)
138 if constexpr(std::is_same_v<
decltype(self.m_value),
int>)
140 self.m_value = curPos;
144 double ratio = qGuiApp->keyboardModifiers() & Qt::CTRL ? 0.1 : 1.;
145 self.m_value = std::clamp(
146 double(self.m_value + ((curPos - self.m_value) * ratio)), 0., 1.);
153 self.sliderReleased();
155 if(event->button() == Qt::RightButton)
157 contextMenuEvent(self, event->scenePos());
170 template <
typename T>
177 self.sliderReleased();
180 template <
typename T>
181 static void contextMenuEvent(T& self, QPointF pos)
183 auto build = [&, self_p = &self, pos] {
187 self_p->impl->spinbox =
nullptr;
188 self_p->impl->spinboxProxy =
nullptr;
191 self.impl->spinbox = w;
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);
199 self.impl->spinboxProxy = obj;
202#if defined(__EMSCRIPTEN__)
205 QTimer::singleShot(0, w, [w] { w->setFocus(); });
208 auto con = QObject::connect(
209 w, SignalUtils::QDoubleSpinBox_valueChanged_double(), &self,
210 [&self, obj, scene = self.scene()](
double v) {
211 DefaultControlImpl::editWidgetInContextMenu(self, scene, obj, v);
215 w, &DoubleSpinboxWithEnter::editingFinished, &self, [obj, con, self_p] {
216 if(self_p->impl->spinbox)
218 self_p->sliderReleased();
219 QObject::disconnect(con);
223 QTimer::singleShot(0, obj, [scene = self_p->scene(), obj] {
224 scene->removeItem(obj);
227 self_p->impl->spinbox =
nullptr;
228 self_p->impl->spinboxProxy =
nullptr;
232#if defined(__EMSCRIPTEN__)
235 QTimer::singleShot(0, &self, build);
239 template <
typename T>
240 static void mouseDoubleClickEvent(T& self, QGraphicsSceneMouseEvent* event)
242 self.m_value = self.unmap(self.init);
246 self.sliderReleased();