lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "Thumbwheel.h" lbajardsilogic@0: lbajardsilogic@0: #include "base/RangeMapper.h" lbajardsilogic@0: #include "base/Profiler.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: Thumbwheel::Thumbwheel(Qt::Orientation orientation, lbajardsilogic@0: QWidget *parent) : lbajardsilogic@0: QWidget(parent), lbajardsilogic@0: m_min(0), lbajardsilogic@0: m_max(100), lbajardsilogic@0: m_default(50), lbajardsilogic@0: m_value(50), lbajardsilogic@0: m_mappedValue(50), lbajardsilogic@0: m_noMappedUpdate(false), lbajardsilogic@0: m_rotation(0.5), lbajardsilogic@0: m_orientation(orientation), lbajardsilogic@0: m_speed(1.0), lbajardsilogic@0: m_tracking(true), lbajardsilogic@0: m_showScale(true), lbajardsilogic@0: m_clicked(false), lbajardsilogic@0: m_atDefault(true), lbajardsilogic@0: m_clickRotation(m_rotation), lbajardsilogic@0: m_showTooltip(true), lbajardsilogic@0: m_rangeMapper(0) lbajardsilogic@0: { lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Thumbwheel::~Thumbwheel() lbajardsilogic@0: { lbajardsilogic@0: delete m_rangeMapper; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setRangeMapper(RangeMapper *mapper) lbajardsilogic@0: { lbajardsilogic@0: if (m_rangeMapper == mapper) return; lbajardsilogic@0: lbajardsilogic@0: if (!m_rangeMapper && mapper) { lbajardsilogic@0: connect(this, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(updateMappedValue(int))); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: delete m_rangeMapper; lbajardsilogic@0: m_rangeMapper = mapper; lbajardsilogic@0: lbajardsilogic@0: updateMappedValue(getValue()); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setShowToolTip(bool show) lbajardsilogic@0: { lbajardsilogic@0: m_showTooltip = show; lbajardsilogic@0: m_noMappedUpdate = true; lbajardsilogic@0: updateMappedValue(getValue()); lbajardsilogic@0: m_noMappedUpdate = false; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setMinimumValue(int min) lbajardsilogic@0: { lbajardsilogic@0: if (m_min == min) return; lbajardsilogic@0: lbajardsilogic@0: m_min = min; lbajardsilogic@0: if (m_max <= m_min) m_max = m_min + 1; lbajardsilogic@0: if (m_value < m_min) m_value = m_min; lbajardsilogic@0: if (m_value > m_max) m_value = m_max; lbajardsilogic@0: lbajardsilogic@0: m_rotation = float(m_value - m_min) / float(m_max - m_min); lbajardsilogic@0: update(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: Thumbwheel::getMinimumValue() const lbajardsilogic@0: { lbajardsilogic@0: return m_min; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setMaximumValue(int max) lbajardsilogic@0: { lbajardsilogic@0: if (m_max == max) return; lbajardsilogic@0: lbajardsilogic@0: m_max = max; lbajardsilogic@0: if (m_min >= m_max) m_min = m_max - 1; lbajardsilogic@0: if (m_value < m_min) m_value = m_min; lbajardsilogic@0: if (m_value > m_max) m_value = m_max; lbajardsilogic@0: lbajardsilogic@0: m_rotation = float(m_value - m_min) / float(m_max - m_min); lbajardsilogic@0: update(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: Thumbwheel::getMaximumValue() const lbajardsilogic@0: { lbajardsilogic@0: return m_max; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setDefaultValue(int deft) lbajardsilogic@0: { lbajardsilogic@0: if (m_default == deft) return; lbajardsilogic@0: lbajardsilogic@0: m_default = deft; lbajardsilogic@0: if (m_atDefault) { lbajardsilogic@0: setValue(m_default); lbajardsilogic@0: m_atDefault = true; // setValue unsets this lbajardsilogic@0: emit valueChanged(getValue()); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setMappedValue(float mappedValue) lbajardsilogic@0: { lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: int newValue = m_rangeMapper->getPositionForValue(mappedValue); lbajardsilogic@0: bool changed = (m_mappedValue != mappedValue); lbajardsilogic@0: m_mappedValue = mappedValue; lbajardsilogic@0: m_noMappedUpdate = true; lbajardsilogic@0: // std::cerr << "Thumbwheel::setMappedValue(" << mappedValue << "): new value is " << newValue << " (visible " << isVisible() << ")" << std::endl; lbajardsilogic@0: if (newValue != getValue()) { lbajardsilogic@0: setValue(newValue); lbajardsilogic@0: changed = true; lbajardsilogic@0: } lbajardsilogic@0: if (changed) emit valueChanged(newValue); lbajardsilogic@0: m_noMappedUpdate = false; lbajardsilogic@0: } else { lbajardsilogic@0: int v = int(mappedValue); lbajardsilogic@0: if (v != getValue()) { lbajardsilogic@0: setValue(v); lbajardsilogic@0: emit valueChanged(v); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: Thumbwheel::getDefaultValue() const lbajardsilogic@0: { lbajardsilogic@0: return m_default; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setValue(int value) lbajardsilogic@0: { lbajardsilogic@0: // std::cerr << "Thumbwheel::setValue(" << value << ") (from " << m_value lbajardsilogic@0: // << ", rotation " << m_rotation << ")" << " (visible " << isVisible() << ")" << std::endl; lbajardsilogic@0: lbajardsilogic@0: if (m_value != value) { lbajardsilogic@0: lbajardsilogic@0: m_atDefault = false; lbajardsilogic@0: lbajardsilogic@0: if (value < m_min) value = m_min; lbajardsilogic@0: if (value > m_max) value = m_max; lbajardsilogic@0: m_value = value; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_rotation = float(m_value - m_min) / float(m_max - m_min); lbajardsilogic@0: if (isVisible()) update(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::resetToDefault() lbajardsilogic@0: { lbajardsilogic@0: if (m_default == m_value) return; lbajardsilogic@0: setValue(m_default); lbajardsilogic@0: m_atDefault = true; lbajardsilogic@0: emit valueChanged(getValue()); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: Thumbwheel::getValue() const lbajardsilogic@0: { lbajardsilogic@0: return m_value; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: Thumbwheel::getMappedValue() const lbajardsilogic@0: { lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: // std::cerr << "Thumbwheel::getMappedValue(): value = " << getValue() << ", mappedValue = " << m_mappedValue << std::endl; lbajardsilogic@0: return m_mappedValue; lbajardsilogic@0: } lbajardsilogic@0: return getValue(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::updateMappedValue(int value) lbajardsilogic@0: { lbajardsilogic@0: if (!m_noMappedUpdate) { lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: m_mappedValue = m_rangeMapper->getValueForPosition(value); lbajardsilogic@0: } else { lbajardsilogic@0: m_mappedValue = value; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (m_showTooltip) { lbajardsilogic@0: QString name = objectName(); lbajardsilogic@0: QString unit = ""; lbajardsilogic@0: QString text; lbajardsilogic@0: if (m_rangeMapper) unit = m_rangeMapper->getUnit(); lbajardsilogic@0: if (name != "") { lbajardsilogic@0: text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit); lbajardsilogic@0: } else { lbajardsilogic@0: text = tr("%2%3").arg(m_mappedValue).arg(unit); lbajardsilogic@0: } lbajardsilogic@0: setToolTip(text); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setSpeed(float speed) lbajardsilogic@0: { lbajardsilogic@0: m_speed = speed; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: Thumbwheel::getSpeed() const lbajardsilogic@0: { lbajardsilogic@0: return m_speed; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setTracking(bool tracking) lbajardsilogic@0: { lbajardsilogic@0: m_tracking = tracking; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool lbajardsilogic@0: Thumbwheel::getTracking() const lbajardsilogic@0: { lbajardsilogic@0: return m_tracking; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::setShowScale(bool showScale) lbajardsilogic@0: { lbajardsilogic@0: m_showScale = showScale; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool lbajardsilogic@0: Thumbwheel::getShowScale() const lbajardsilogic@0: { lbajardsilogic@0: return m_showScale; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::enterEvent(QEvent *) lbajardsilogic@0: { lbajardsilogic@0: emit mouseEntered(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::leaveEvent(QEvent *) lbajardsilogic@0: { lbajardsilogic@0: emit mouseLeft(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::mousePressEvent(QMouseEvent *e) lbajardsilogic@0: { lbajardsilogic@0: if (e->button() == Qt::MidButton || lbajardsilogic@0: ((e->button() == Qt::LeftButton) && lbajardsilogic@0: (e->modifiers() & Qt::ControlModifier))) { lbajardsilogic@0: resetToDefault(); lbajardsilogic@0: } else if (e->button() == Qt::LeftButton) { lbajardsilogic@0: m_clicked = true; lbajardsilogic@0: m_clickPos = e->pos(); lbajardsilogic@0: m_clickRotation = m_rotation; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::mouseDoubleClickEvent(QMouseEvent *mouseEvent) lbajardsilogic@0: { lbajardsilogic@0: //!!! needs a common base class with AudioDial (and Panner?) lbajardsilogic@0: lbajardsilogic@0: if (mouseEvent->button() != Qt::LeftButton) { lbajardsilogic@0: return; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool ok = false; lbajardsilogic@0: lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: lbajardsilogic@0: float min = m_rangeMapper->getValueForPosition(m_min); lbajardsilogic@0: float max = m_rangeMapper->getValueForPosition(m_max); lbajardsilogic@0: lbajardsilogic@0: if (min > max) { lbajardsilogic@0: float tmp = min; lbajardsilogic@0: min = max; lbajardsilogic@0: max = tmp; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString unit = m_rangeMapper->getUnit(); lbajardsilogic@0: lbajardsilogic@0: QString text; lbajardsilogic@0: if (objectName() != "") { lbajardsilogic@0: if (unit != "") { lbajardsilogic@0: text = tr("New value for %1, from %2 to %3 %4:") lbajardsilogic@0: .arg(objectName()).arg(min).arg(max).arg(unit); lbajardsilogic@0: } else { lbajardsilogic@0: text = tr("New value for %1, from %2 to %3:") lbajardsilogic@0: .arg(objectName()).arg(min).arg(max); lbajardsilogic@0: } lbajardsilogic@0: } else { lbajardsilogic@0: if (unit != "") { lbajardsilogic@0: text = tr("Enter a new value from %1 to %2 %3:") lbajardsilogic@0: .arg(min).arg(max).arg(unit); lbajardsilogic@0: } else { lbajardsilogic@0: text = tr("Enter a new value from %1 to %2:") lbajardsilogic@0: .arg(min).arg(max); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float newValue = QInputDialog::getDouble lbajardsilogic@0: (this, lbajardsilogic@0: tr("Enter new value"), lbajardsilogic@0: text, lbajardsilogic@0: m_mappedValue, lbajardsilogic@0: min, lbajardsilogic@0: max, lbajardsilogic@0: 4, lbajardsilogic@0: &ok); lbajardsilogic@0: lbajardsilogic@0: if (ok) { lbajardsilogic@0: setMappedValue(newValue); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: } else { lbajardsilogic@0: lbajardsilogic@0: int newValue = QInputDialog::getInteger lbajardsilogic@0: (this, lbajardsilogic@0: tr("Enter new value"), lbajardsilogic@0: tr("Enter a new value from %1 to %2:") lbajardsilogic@0: .arg(m_min).arg(m_max), lbajardsilogic@0: getValue(), m_min, m_max, 1, &ok); lbajardsilogic@0: lbajardsilogic@0: if (ok) { lbajardsilogic@0: setValue(newValue); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::mouseMoveEvent(QMouseEvent *e) lbajardsilogic@0: { lbajardsilogic@0: if (!m_clicked) return; lbajardsilogic@0: int dist = 0; lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: dist = e->x() - m_clickPos.x(); lbajardsilogic@0: } else { lbajardsilogic@0: dist = e->y() - m_clickPos.y(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float rotation = m_clickRotation + (m_speed * dist) / 100; lbajardsilogic@0: if (rotation < 0.f) rotation = 0.f; lbajardsilogic@0: if (rotation > 1.f) rotation = 1.f; lbajardsilogic@0: int value = lrintf(m_min + (m_max - m_min) * m_rotation); lbajardsilogic@0: if (value != m_value) { lbajardsilogic@0: setValue(value); lbajardsilogic@0: if (m_tracking) emit valueChanged(getValue()); lbajardsilogic@0: m_rotation = rotation; lbajardsilogic@0: } else if (fabsf(rotation - m_rotation) > 0.001) { lbajardsilogic@0: m_rotation = rotation; lbajardsilogic@0: repaint(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::mouseReleaseEvent(QMouseEvent *e) lbajardsilogic@0: { lbajardsilogic@0: if (!m_clicked) return; lbajardsilogic@0: bool reallyTracking = m_tracking; lbajardsilogic@0: m_tracking = true; lbajardsilogic@0: mouseMoveEvent(e); lbajardsilogic@0: m_tracking = reallyTracking; lbajardsilogic@0: m_clicked = false; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::wheelEvent(QWheelEvent *e) lbajardsilogic@0: { lbajardsilogic@0: int step = lrintf(m_speed); lbajardsilogic@0: if (step == 0) step = 1; lbajardsilogic@0: lbajardsilogic@0: if (e->delta() > 0) { lbajardsilogic@0: setValue(m_value + step); lbajardsilogic@0: } else { lbajardsilogic@0: setValue(m_value - step); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: emit valueChanged(getValue()); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Thumbwheel::paintEvent(QPaintEvent *) lbajardsilogic@0: { lbajardsilogic@0: Profiler profiler("Thumbwheel::paintEvent", true); lbajardsilogic@0: lbajardsilogic@0: int bw = 3; lbajardsilogic@0: lbajardsilogic@0: QRect subclip; lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: subclip = QRect(bw, bw+1, width() - bw*2, height() - bw*2 - 2); lbajardsilogic@0: } else { lbajardsilogic@0: subclip = QRect(bw+1, bw, width() - bw*2 - 2, height() - bw*2); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QPainter paint(this); lbajardsilogic@0: paint.fillRect(subclip, palette().background().color()); lbajardsilogic@0: lbajardsilogic@0: paint.setRenderHint(QPainter::Antialiasing, true); lbajardsilogic@0: lbajardsilogic@0: float w = width(); lbajardsilogic@0: float w0 = 0.5; lbajardsilogic@0: float w1 = w - 0.5; lbajardsilogic@0: lbajardsilogic@0: float h = height(); lbajardsilogic@0: float h0 = 0.5; lbajardsilogic@0: float h1 = h - 0.5; lbajardsilogic@0: lbajardsilogic@0: for (int i = bw-1; i >= 0; --i) { lbajardsilogic@0: // for (int i = 0; i < 1; ++i) { lbajardsilogic@0: lbajardsilogic@0: int grey = (i + 1) * (256 / (bw + 1)); lbajardsilogic@0: QColor fc = QColor(grey, grey, grey); lbajardsilogic@0: paint.setPen(fc); lbajardsilogic@0: lbajardsilogic@0: QPainterPath path; lbajardsilogic@0: lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: path.moveTo(w0 + i, h0 + i + 2); lbajardsilogic@0: path.quadTo(w/2, i * 1.25, w1 - i, h0 + i + 2); lbajardsilogic@0: path.lineTo(w1 - i, h1 - i - 2); lbajardsilogic@0: path.quadTo(w/2, h - i * 1.25, w0 + i, h1 - i - 2); lbajardsilogic@0: path.closeSubpath(); lbajardsilogic@0: } else { lbajardsilogic@0: path.moveTo(w0 + i + 2, h0 + i); lbajardsilogic@0: path.quadTo(i * 1.25, h/2, w0 + i + 2, h1 - i); lbajardsilogic@0: path.lineTo(w1 - i - 2, h1 - i); lbajardsilogic@0: path.quadTo(w - i * 1.25, h/2, w1 - i - 2, h0 + i); lbajardsilogic@0: path.closeSubpath(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: paint.drawPath(path); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: paint.setClipRect(subclip); lbajardsilogic@0: lbajardsilogic@0: float radians = m_rotation * 1.5f * M_PI; lbajardsilogic@0: lbajardsilogic@0: // std::cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << std::endl; lbajardsilogic@0: lbajardsilogic@0: w = (m_orientation == Qt::Horizontal ? width() : height()) - bw*2; lbajardsilogic@0: lbajardsilogic@0: // total number of notches on the entire wheel lbajardsilogic@0: int notches = 25; lbajardsilogic@0: lbajardsilogic@0: // radius of the wheel including invisible part lbajardsilogic@0: int radius = int(w / 2 + 2); lbajardsilogic@0: lbajardsilogic@0: for (int i = 0; i < notches; ++i) { lbajardsilogic@0: lbajardsilogic@0: float a0 = (2.f * M_PI * i) / notches + radians; lbajardsilogic@0: float a1 = a0 + M_PI / (notches * 2); lbajardsilogic@0: float a2 = (2.f * M_PI * (i + 1)) / notches + radians; lbajardsilogic@0: lbajardsilogic@0: float depth = cosf((a0 + a2) / 2); lbajardsilogic@0: if (depth < 0) continue; lbajardsilogic@0: lbajardsilogic@0: float x0 = radius * sinf(a0) + w/2; lbajardsilogic@0: float x1 = radius * sinf(a1) + w/2; lbajardsilogic@0: float x2 = radius * sinf(a2) + w/2; lbajardsilogic@0: if (x2 < 0 || x0 > w) continue; lbajardsilogic@0: lbajardsilogic@0: if (x0 < 0) x0 = 0; lbajardsilogic@0: if (x2 > w) x2 = w; lbajardsilogic@0: lbajardsilogic@0: x0 += bw; lbajardsilogic@0: x1 += bw; lbajardsilogic@0: x2 += bw; lbajardsilogic@0: lbajardsilogic@0: int grey = lrintf(255 * depth); lbajardsilogic@0: QColor fc = QColor(grey, grey, grey); lbajardsilogic@0: QColor oc = palette().dark().color(); lbajardsilogic@0: lbajardsilogic@0: paint.setPen(oc); lbajardsilogic@0: paint.setBrush(fc); lbajardsilogic@0: lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: paint.drawRect(QRectF(x1, bw, x2 - x1, height() - bw*2)); lbajardsilogic@0: } else { lbajardsilogic@0: paint.drawRect(QRectF(bw, x1, width() - bw*2, x2 - x1)); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (m_showScale) { lbajardsilogic@0: lbajardsilogic@0: paint.setBrush(oc); lbajardsilogic@0: lbajardsilogic@0: float prop; lbajardsilogic@0: if (i >= notches / 4) { lbajardsilogic@0: prop = float(notches - (((i - float(notches) / 4.f) * 4.f) / 3.f)) lbajardsilogic@0: / notches; lbajardsilogic@0: } else { lbajardsilogic@0: prop = 0.f; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: paint.drawRect(QRectF(x1, height() - (height() - bw*2) * prop - bw, lbajardsilogic@0: x2 - x1, height() * prop)); lbajardsilogic@0: } else { lbajardsilogic@0: paint.drawRect(QRectF(bw, x1, (width() - bw*2) * prop, x2 - x1)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: paint.setPen(oc); lbajardsilogic@0: paint.setBrush(palette().background().color()); lbajardsilogic@0: lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: paint.drawRect(QRectF(x0, bw, x1 - x0, height() - bw*2)); lbajardsilogic@0: } else { lbajardsilogic@0: paint.drawRect(QRectF(bw, x0, width() - bw*2, x1 - x0)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QSize lbajardsilogic@0: Thumbwheel::sizeHint() const lbajardsilogic@0: { lbajardsilogic@0: if (m_orientation == Qt::Horizontal) { lbajardsilogic@0: return QSize(80, 12); lbajardsilogic@0: } else { lbajardsilogic@0: return QSize(12, 80); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: