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: 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: /** lbajardsilogic@0: * A rotary dial widget. lbajardsilogic@0: * lbajardsilogic@0: * Based on an original design by Thorsten Wilms. lbajardsilogic@0: * lbajardsilogic@0: * Implemented as a widget for the Rosegarden MIDI and audio sequencer lbajardsilogic@0: * and notation editor by Chris Cannam. lbajardsilogic@0: * lbajardsilogic@0: * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas lbajardsilogic@0: * and adapted for use in QSynth. lbajardsilogic@0: * lbajardsilogic@0: * Ported to Qt4 by Chris Cannam. lbajardsilogic@0: * lbajardsilogic@0: * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro lbajardsilogic@0: * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. 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 "AudioDial.h" lbajardsilogic@0: lbajardsilogic@0: #include "base/RangeMapper.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: using std::endl; lbajardsilogic@0: using std::cerr; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: //!!! Pedro updated his version to use my up/down response code from RG -- need to grab that code in preference to this version from Rui lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: //------------------------------------------------------------------------- lbajardsilogic@0: // AudioDial - Instance knob widget class. lbajardsilogic@0: // lbajardsilogic@0: lbajardsilogic@0: #define AUDIO_DIAL_MIN (0.25 * M_PI) lbajardsilogic@0: #define AUDIO_DIAL_MAX (1.75 * M_PI) lbajardsilogic@0: #define AUDIO_DIAL_RANGE (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: //static int dialsExtant = 0; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: // Constructor. lbajardsilogic@0: AudioDial::AudioDial(QWidget *parent) : lbajardsilogic@0: QDial(parent), lbajardsilogic@0: m_knobColor(Qt::black), lbajardsilogic@0: m_meterColor(Qt::white), lbajardsilogic@0: m_defaultValue(0), lbajardsilogic@0: m_mappedValue(0), lbajardsilogic@0: m_noMappedUpdate(false), lbajardsilogic@0: m_showTooltip(true), lbajardsilogic@0: m_rangeMapper(0) lbajardsilogic@0: { lbajardsilogic@0: m_mouseDial = false; lbajardsilogic@0: m_mousePressed = false; lbajardsilogic@0: // ++dialsExtant; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: // Destructor. lbajardsilogic@0: AudioDial::~AudioDial (void) lbajardsilogic@0: { lbajardsilogic@0: delete m_rangeMapper; lbajardsilogic@0: // --dialsExtant; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setRangeMapper(RangeMapper *mapper) lbajardsilogic@0: { lbajardsilogic@0: // std::cerr << "AudioDial[" << this << "][\"" << objectName().toStdString() << "\"::setRangeMapper(" << mapper << ") [current is " << m_rangeMapper << "] (have " << dialsExtant << " dials extant)" << std::endl; 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(value()); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::paintEvent(QPaintEvent *) lbajardsilogic@0: { lbajardsilogic@0: QPainter paint; lbajardsilogic@0: lbajardsilogic@0: float angle = AUDIO_DIAL_MIN // offset lbajardsilogic@0: + (AUDIO_DIAL_RANGE * lbajardsilogic@0: (float(QDial::value() - QDial::minimum()) / lbajardsilogic@0: (float(QDial::maximum() - QDial::minimum())))); lbajardsilogic@0: int degrees = int(angle * 180.0 / M_PI); lbajardsilogic@0: lbajardsilogic@0: int ns = notchSize(); lbajardsilogic@0: int numTicks = 1 + (maximum() + ns - minimum()) / ns; lbajardsilogic@0: lbajardsilogic@0: QColor knobColor(m_knobColor); lbajardsilogic@0: if (knobColor == Qt::black) lbajardsilogic@0: knobColor = palette().background().color(); lbajardsilogic@0: lbajardsilogic@0: QColor meterColor(m_meterColor); lbajardsilogic@0: if (!isEnabled()) lbajardsilogic@0: meterColor = palette().mid().color(); lbajardsilogic@0: else if (m_meterColor == Qt::white) lbajardsilogic@0: meterColor = palette().highlight().color(); lbajardsilogic@0: lbajardsilogic@0: int m_size = width() < height() ? width() : height(); lbajardsilogic@0: int scale = 1; lbajardsilogic@0: int width = m_size - 2*scale; lbajardsilogic@0: lbajardsilogic@0: paint.begin(this); lbajardsilogic@0: paint.setRenderHint(QPainter::Antialiasing, true); lbajardsilogic@0: paint.translate(1, 1); lbajardsilogic@0: lbajardsilogic@0: QPen pen; lbajardsilogic@0: QColor c; lbajardsilogic@0: lbajardsilogic@0: // Knob body and face... lbajardsilogic@0: lbajardsilogic@0: c = knobColor; lbajardsilogic@0: pen.setColor(knobColor); lbajardsilogic@0: pen.setWidth(scale * 2); lbajardsilogic@0: pen.setCapStyle(Qt::FlatCap); lbajardsilogic@0: lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.setBrush(c); lbajardsilogic@0: lbajardsilogic@0: int indent = (int)(width * 0.15 + 1); lbajardsilogic@0: lbajardsilogic@0: paint.drawEllipse(indent-1, indent-1, width-2*indent, width-2*indent); lbajardsilogic@0: lbajardsilogic@0: pen.setWidth(3 * scale); lbajardsilogic@0: int pos = indent-1 + (width-2*indent) / 20; lbajardsilogic@0: int darkWidth = (width-2*indent) * 3 / 4; lbajardsilogic@0: while (darkWidth) { lbajardsilogic@0: c = c.light(102); lbajardsilogic@0: pen.setColor(c); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.drawEllipse(pos, pos, darkWidth, darkWidth); lbajardsilogic@0: if (!--darkWidth) break; lbajardsilogic@0: paint.drawEllipse(pos, pos, darkWidth, darkWidth); lbajardsilogic@0: if (!--darkWidth) break; lbajardsilogic@0: paint.drawEllipse(pos, pos, darkWidth, darkWidth); lbajardsilogic@0: ++pos; --darkWidth; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // Tick notches... lbajardsilogic@0: lbajardsilogic@0: if ( notchesVisible() ) { lbajardsilogic@0: // std::cerr << "Notches visible" << std::endl; lbajardsilogic@0: pen.setColor(palette().dark().color()); lbajardsilogic@0: pen.setWidth(scale); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: for (int i = 0; i < numTicks; ++i) { lbajardsilogic@0: int div = numTicks; lbajardsilogic@0: if (div > 1) --div; lbajardsilogic@0: drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, lbajardsilogic@0: width, true); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // The bright metering bit... lbajardsilogic@0: lbajardsilogic@0: c = meterColor; lbajardsilogic@0: pen.setColor(c); lbajardsilogic@0: pen.setWidth(indent); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: lbajardsilogic@0: // std::cerr << "degrees " << degrees << ", gives us " << -(degrees - 45) * 16 << std::endl; lbajardsilogic@0: lbajardsilogic@0: int arcLen = -(degrees - 45) * 16; lbajardsilogic@0: if (arcLen == 0) arcLen = -16; lbajardsilogic@0: lbajardsilogic@0: paint.drawArc(indent/2, indent/2, lbajardsilogic@0: width-indent, width-indent, (180 + 45) * 16, arcLen); lbajardsilogic@0: lbajardsilogic@0: paint.setBrush(Qt::NoBrush); lbajardsilogic@0: lbajardsilogic@0: // Shadowing... lbajardsilogic@0: lbajardsilogic@0: pen.setWidth(scale); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: lbajardsilogic@0: // Knob shadow... lbajardsilogic@0: lbajardsilogic@0: int shadowAngle = -720; lbajardsilogic@0: c = knobColor.dark(); lbajardsilogic@0: for (int arc = 120; arc < 2880; arc += 240) { lbajardsilogic@0: pen.setColor(c); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.drawArc(indent, indent, lbajardsilogic@0: width-2*indent, width-2*indent, shadowAngle + arc, 240); lbajardsilogic@0: paint.drawArc(indent, indent, lbajardsilogic@0: width-2*indent, width-2*indent, shadowAngle - arc, 240); lbajardsilogic@0: c = c.light(110); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // Scale shadow... lbajardsilogic@0: lbajardsilogic@0: shadowAngle = 2160; lbajardsilogic@0: c = palette().dark().color(); lbajardsilogic@0: for (int arc = 120; arc < 2880; arc += 240) { lbajardsilogic@0: pen.setColor(c); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.drawArc(scale/2, scale/2, lbajardsilogic@0: width-scale, width-scale, shadowAngle + arc, 240); lbajardsilogic@0: paint.drawArc(scale/2, scale/2, lbajardsilogic@0: width-scale, width-scale, shadowAngle - arc, 240); lbajardsilogic@0: c = c.light(108); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // Undraw the bottom part... lbajardsilogic@0: lbajardsilogic@0: pen.setColor(palette().background().color()); lbajardsilogic@0: pen.setWidth(scale * 4); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.drawArc(scale/2, scale/2, lbajardsilogic@0: width-scale, width-scale, -45 * 16, -92 * 16); lbajardsilogic@0: lbajardsilogic@0: // Scale ends... lbajardsilogic@0: lbajardsilogic@0: pen.setColor(palette().dark().color()); lbajardsilogic@0: pen.setWidth(scale); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: for (int i = 0; i < numTicks; ++i) { lbajardsilogic@0: if (i != 0 && i != numTicks - 1) continue; lbajardsilogic@0: int div = numTicks; lbajardsilogic@0: if (div > 1) --div; lbajardsilogic@0: drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div, lbajardsilogic@0: width, false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // Pointer notch... lbajardsilogic@0: lbajardsilogic@0: float hyp = float(width) / 2.0; lbajardsilogic@0: float len = hyp - indent; lbajardsilogic@0: --len; lbajardsilogic@0: lbajardsilogic@0: float x0 = hyp; lbajardsilogic@0: float y0 = hyp; lbajardsilogic@0: lbajardsilogic@0: float x = hyp - len * sin(angle); lbajardsilogic@0: float y = hyp + len * cos(angle); lbajardsilogic@0: lbajardsilogic@0: c = palette().dark().color(); lbajardsilogic@0: pen.setColor(isEnabled() ? c.dark(130) : c); lbajardsilogic@0: pen.setWidth(scale * 2); lbajardsilogic@0: paint.setPen(pen); lbajardsilogic@0: paint.drawLine(int(x0), int(y0), int(x), int(y)); lbajardsilogic@0: lbajardsilogic@0: paint.end(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::drawTick(QPainter &paint, lbajardsilogic@0: float angle, int size, bool internal) lbajardsilogic@0: { lbajardsilogic@0: float hyp = float(size) / 2.0; lbajardsilogic@0: float x0 = hyp - (hyp - 1) * sin(angle); lbajardsilogic@0: float y0 = hyp + (hyp - 1) * cos(angle); lbajardsilogic@0: lbajardsilogic@0: // cerr << "drawTick: angle " << angle << ", size " << size << ", internal " << internal << endl; lbajardsilogic@0: lbajardsilogic@0: if (internal) { lbajardsilogic@0: lbajardsilogic@0: float len = hyp / 4; lbajardsilogic@0: float x1 = hyp - (hyp - len) * sin(angle); lbajardsilogic@0: float y1 = hyp + (hyp - len) * cos(angle); lbajardsilogic@0: lbajardsilogic@0: paint.drawLine(int(x0), int(y0), int(x1), int(y1)); lbajardsilogic@0: lbajardsilogic@0: } else { lbajardsilogic@0: lbajardsilogic@0: float len = hyp / 4; lbajardsilogic@0: float x1 = hyp - (hyp + len) * sin(angle); lbajardsilogic@0: float y1 = hyp + (hyp + len) * cos(angle); lbajardsilogic@0: lbajardsilogic@0: paint.drawLine(int(x0), int(y0), int(x1), int(y1)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setKnobColor(const QColor& color) lbajardsilogic@0: { lbajardsilogic@0: m_knobColor = color; lbajardsilogic@0: update(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setMeterColor(const QColor& color) lbajardsilogic@0: { lbajardsilogic@0: m_meterColor = color; lbajardsilogic@0: update(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setMouseDial(bool mouseDial) lbajardsilogic@0: { lbajardsilogic@0: m_mouseDial = mouseDial; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setDefaultValue(int defaultValue) lbajardsilogic@0: { lbajardsilogic@0: m_defaultValue = defaultValue; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setValue(int value) lbajardsilogic@0: { lbajardsilogic@0: QDial::setValue(value); lbajardsilogic@0: updateMappedValue(value); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setMappedValue(float mappedValue) lbajardsilogic@0: { lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: int newPosition = 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 << "AudioDial::setMappedValue(" << mappedValue << "): new position is " << newPosition << std::endl; lbajardsilogic@0: if (newPosition != value()) { lbajardsilogic@0: setValue(newPosition); lbajardsilogic@0: } else if (changed) { lbajardsilogic@0: emit valueChanged(newPosition); lbajardsilogic@0: } lbajardsilogic@0: m_noMappedUpdate = false; lbajardsilogic@0: } else { lbajardsilogic@0: setValue(int(mappedValue)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::setShowToolTip(bool show) lbajardsilogic@0: { lbajardsilogic@0: m_showTooltip = show; lbajardsilogic@0: m_noMappedUpdate = true; lbajardsilogic@0: updateMappedValue(value()); lbajardsilogic@0: m_noMappedUpdate = false; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: float AudioDial::mappedValue() const lbajardsilogic@0: { lbajardsilogic@0: if (m_rangeMapper) { lbajardsilogic@0: std::cerr << "AudioDial::mappedValue(): value = " << value() << ", mappedValue = " << m_mappedValue << std::endl; lbajardsilogic@0: return m_mappedValue; lbajardsilogic@0: } lbajardsilogic@0: return value(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::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: lbajardsilogic@0: // Alternate mouse behavior event handlers. lbajardsilogic@0: void AudioDial::mousePressEvent(QMouseEvent *mouseEvent) lbajardsilogic@0: { lbajardsilogic@0: if (m_mouseDial) { lbajardsilogic@0: QDial::mousePressEvent(mouseEvent); lbajardsilogic@0: } else if (mouseEvent->button() == Qt::MidButton || lbajardsilogic@0: ((mouseEvent->button() == Qt::LeftButton) && lbajardsilogic@0: (mouseEvent->modifiers() & Qt::ControlModifier))) { lbajardsilogic@0: int dv = m_defaultValue; lbajardsilogic@0: if (dv < minimum()) dv = minimum(); lbajardsilogic@0: if (dv > maximum()) dv = maximum(); lbajardsilogic@0: setValue(m_defaultValue); lbajardsilogic@0: } else if (mouseEvent->button() == Qt::LeftButton) { lbajardsilogic@0: m_mousePressed = true; lbajardsilogic@0: m_posMouse = mouseEvent->pos(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::mouseDoubleClickEvent(QMouseEvent *mouseEvent) lbajardsilogic@0: { lbajardsilogic@0: //!!! needs a common base class with Thumbwheel lbajardsilogic@0: lbajardsilogic@0: if (m_mouseDial) { lbajardsilogic@0: QDial::mouseDoubleClickEvent(mouseEvent); lbajardsilogic@0: } else 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(minimum()); lbajardsilogic@0: float max = m_rangeMapper->getValueForPosition(maximum()); 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 newPosition = 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(minimum()).arg(maximum()), lbajardsilogic@0: value(), minimum(), maximum(), pageStep(), &ok); lbajardsilogic@0: lbajardsilogic@0: if (ok) { lbajardsilogic@0: setValue(newPosition); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::mouseMoveEvent(QMouseEvent *mouseEvent) lbajardsilogic@0: { lbajardsilogic@0: if (m_mouseDial) { lbajardsilogic@0: QDial::mouseMoveEvent(mouseEvent); lbajardsilogic@0: } else if (m_mousePressed) { lbajardsilogic@0: const QPoint& posMouse = mouseEvent->pos(); lbajardsilogic@0: int v = QDial::value() lbajardsilogic@0: + (posMouse.x() - m_posMouse.x()) lbajardsilogic@0: + (m_posMouse.y() - posMouse.y()); lbajardsilogic@0: if (v > QDial::maximum()) lbajardsilogic@0: v = QDial::maximum(); lbajardsilogic@0: else lbajardsilogic@0: if (v < QDial::minimum()) lbajardsilogic@0: v = QDial::minimum(); lbajardsilogic@0: m_posMouse = posMouse; lbajardsilogic@0: QDial::setValue(v); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void AudioDial::mouseReleaseEvent(QMouseEvent *mouseEvent) lbajardsilogic@0: { lbajardsilogic@0: if (m_mouseDial) { lbajardsilogic@0: QDial::mouseReleaseEvent(mouseEvent); lbajardsilogic@0: } else if (m_mousePressed) { lbajardsilogic@0: m_mousePressed = false; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: AudioDial::enterEvent(QEvent *e) lbajardsilogic@0: { lbajardsilogic@0: QDial::enterEvent(e); lbajardsilogic@0: emit mouseEntered(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: AudioDial::leaveEvent(QEvent *e) lbajardsilogic@0: { lbajardsilogic@0: QDial::enterEvent(e); lbajardsilogic@0: emit mouseLeft(); lbajardsilogic@0: } lbajardsilogic@0: