annotate widgets/AudioDial.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7
lbajardsilogic@0 8 This program is free software; you can redistribute it and/or
lbajardsilogic@0 9 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 10 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 11 License, or (at your option) any later version. See the file
lbajardsilogic@0 12 COPYING included with this distribution for more information.
lbajardsilogic@0 13 */
lbajardsilogic@0 14
lbajardsilogic@0 15 /**
lbajardsilogic@0 16 * A rotary dial widget.
lbajardsilogic@0 17 *
lbajardsilogic@0 18 * Based on an original design by Thorsten Wilms.
lbajardsilogic@0 19 *
lbajardsilogic@0 20 * Implemented as a widget for the Rosegarden MIDI and audio sequencer
lbajardsilogic@0 21 * and notation editor by Chris Cannam.
lbajardsilogic@0 22 *
lbajardsilogic@0 23 * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas
lbajardsilogic@0 24 * and adapted for use in QSynth.
lbajardsilogic@0 25 *
lbajardsilogic@0 26 * Ported to Qt4 by Chris Cannam.
lbajardsilogic@0 27 *
lbajardsilogic@0 28 * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro
lbajardsilogic@0 29 * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London.
lbajardsilogic@0 30 *
lbajardsilogic@0 31 * This program is free software; you can redistribute it and/or
lbajardsilogic@0 32 * modify it under the terms of the GNU General Public License as
lbajardsilogic@0 33 * published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 34 * License, or (at your option) any later version. See the file
lbajardsilogic@0 35 * COPYING included with this distribution for more information.
lbajardsilogic@0 36 */
lbajardsilogic@0 37
lbajardsilogic@0 38 #include "AudioDial.h"
lbajardsilogic@0 39
lbajardsilogic@0 40 #include "base/RangeMapper.h"
lbajardsilogic@0 41
lbajardsilogic@0 42 #include <cmath>
lbajardsilogic@0 43 #include <iostream>
lbajardsilogic@0 44
lbajardsilogic@0 45 #include <QTimer>
lbajardsilogic@0 46 #include <QPainter>
lbajardsilogic@0 47 #include <QPixmap>
lbajardsilogic@0 48 #include <QColormap>
lbajardsilogic@0 49 #include <QMouseEvent>
lbajardsilogic@0 50 #include <QPaintEvent>
lbajardsilogic@0 51 #include <QInputDialog>
lbajardsilogic@0 52
lbajardsilogic@0 53 using std::endl;
lbajardsilogic@0 54 using std::cerr;
lbajardsilogic@0 55
lbajardsilogic@0 56
lbajardsilogic@0 57 //!!! 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 58
lbajardsilogic@0 59
lbajardsilogic@0 60 //-------------------------------------------------------------------------
lbajardsilogic@0 61 // AudioDial - Instance knob widget class.
lbajardsilogic@0 62 //
lbajardsilogic@0 63
lbajardsilogic@0 64 #define AUDIO_DIAL_MIN (0.25 * M_PI)
lbajardsilogic@0 65 #define AUDIO_DIAL_MAX (1.75 * M_PI)
lbajardsilogic@0 66 #define AUDIO_DIAL_RANGE (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN)
lbajardsilogic@0 67
lbajardsilogic@0 68
lbajardsilogic@0 69 //static int dialsExtant = 0;
lbajardsilogic@0 70
lbajardsilogic@0 71
lbajardsilogic@0 72 // Constructor.
lbajardsilogic@0 73 AudioDial::AudioDial(QWidget *parent) :
lbajardsilogic@0 74 QDial(parent),
lbajardsilogic@0 75 m_knobColor(Qt::black),
lbajardsilogic@0 76 m_meterColor(Qt::white),
lbajardsilogic@0 77 m_defaultValue(0),
lbajardsilogic@0 78 m_mappedValue(0),
lbajardsilogic@0 79 m_noMappedUpdate(false),
lbajardsilogic@0 80 m_showTooltip(true),
lbajardsilogic@0 81 m_rangeMapper(0)
lbajardsilogic@0 82 {
lbajardsilogic@0 83 m_mouseDial = false;
lbajardsilogic@0 84 m_mousePressed = false;
lbajardsilogic@0 85 // ++dialsExtant;
lbajardsilogic@0 86 }
lbajardsilogic@0 87
lbajardsilogic@0 88
lbajardsilogic@0 89 // Destructor.
lbajardsilogic@0 90 AudioDial::~AudioDial (void)
lbajardsilogic@0 91 {
lbajardsilogic@0 92 delete m_rangeMapper;
lbajardsilogic@0 93 // --dialsExtant;
lbajardsilogic@0 94 }
lbajardsilogic@0 95
lbajardsilogic@0 96
lbajardsilogic@0 97 void AudioDial::setRangeMapper(RangeMapper *mapper)
lbajardsilogic@0 98 {
lbajardsilogic@0 99 // std::cerr << "AudioDial[" << this << "][\"" << objectName().toStdString() << "\"::setRangeMapper(" << mapper << ") [current is " << m_rangeMapper << "] (have " << dialsExtant << " dials extant)" << std::endl;
lbajardsilogic@0 100
lbajardsilogic@0 101 if (m_rangeMapper == mapper) return;
lbajardsilogic@0 102
lbajardsilogic@0 103 if (!m_rangeMapper && mapper) {
lbajardsilogic@0 104 connect(this, SIGNAL(valueChanged(int)),
lbajardsilogic@0 105 this, SLOT(updateMappedValue(int)));
lbajardsilogic@0 106 }
lbajardsilogic@0 107
lbajardsilogic@0 108 delete m_rangeMapper;
lbajardsilogic@0 109 m_rangeMapper = mapper;
lbajardsilogic@0 110
lbajardsilogic@0 111 updateMappedValue(value());
lbajardsilogic@0 112 }
lbajardsilogic@0 113
lbajardsilogic@0 114
lbajardsilogic@0 115 void AudioDial::paintEvent(QPaintEvent *)
lbajardsilogic@0 116 {
lbajardsilogic@0 117 QPainter paint;
lbajardsilogic@0 118
lbajardsilogic@0 119 float angle = AUDIO_DIAL_MIN // offset
lbajardsilogic@0 120 + (AUDIO_DIAL_RANGE *
lbajardsilogic@0 121 (float(QDial::value() - QDial::minimum()) /
lbajardsilogic@0 122 (float(QDial::maximum() - QDial::minimum()))));
lbajardsilogic@0 123 int degrees = int(angle * 180.0 / M_PI);
lbajardsilogic@0 124
lbajardsilogic@0 125 int ns = notchSize();
lbajardsilogic@0 126 int numTicks = 1 + (maximum() + ns - minimum()) / ns;
lbajardsilogic@0 127
lbajardsilogic@0 128 QColor knobColor(m_knobColor);
lbajardsilogic@0 129 if (knobColor == Qt::black)
lbajardsilogic@0 130 knobColor = palette().background().color();
lbajardsilogic@0 131
lbajardsilogic@0 132 QColor meterColor(m_meterColor);
lbajardsilogic@0 133 if (!isEnabled())
lbajardsilogic@0 134 meterColor = palette().mid().color();
lbajardsilogic@0 135 else if (m_meterColor == Qt::white)
lbajardsilogic@0 136 meterColor = palette().highlight().color();
lbajardsilogic@0 137
lbajardsilogic@0 138 int m_size = width() < height() ? width() : height();
lbajardsilogic@0 139 int scale = 1;
lbajardsilogic@0 140 int width = m_size - 2*scale;
lbajardsilogic@0 141
lbajardsilogic@0 142 paint.begin(this);
lbajardsilogic@0 143 paint.setRenderHint(QPainter::Antialiasing, true);
lbajardsilogic@0 144 paint.translate(1, 1);
lbajardsilogic@0 145
lbajardsilogic@0 146 QPen pen;
lbajardsilogic@0 147 QColor c;
lbajardsilogic@0 148
lbajardsilogic@0 149 // Knob body and face...
lbajardsilogic@0 150
lbajardsilogic@0 151 c = knobColor;
lbajardsilogic@0 152 pen.setColor(knobColor);
lbajardsilogic@0 153 pen.setWidth(scale * 2);
lbajardsilogic@0 154 pen.setCapStyle(Qt::FlatCap);
lbajardsilogic@0 155
lbajardsilogic@0 156 paint.setPen(pen);
lbajardsilogic@0 157 paint.setBrush(c);
lbajardsilogic@0 158
lbajardsilogic@0 159 int indent = (int)(width * 0.15 + 1);
lbajardsilogic@0 160
lbajardsilogic@0 161 paint.drawEllipse(indent-1, indent-1, width-2*indent, width-2*indent);
lbajardsilogic@0 162
lbajardsilogic@0 163 pen.setWidth(3 * scale);
lbajardsilogic@0 164 int pos = indent-1 + (width-2*indent) / 20;
lbajardsilogic@0 165 int darkWidth = (width-2*indent) * 3 / 4;
lbajardsilogic@0 166 while (darkWidth) {
lbajardsilogic@0 167 c = c.light(102);
lbajardsilogic@0 168 pen.setColor(c);
lbajardsilogic@0 169 paint.setPen(pen);
lbajardsilogic@0 170 paint.drawEllipse(pos, pos, darkWidth, darkWidth);
lbajardsilogic@0 171 if (!--darkWidth) break;
lbajardsilogic@0 172 paint.drawEllipse(pos, pos, darkWidth, darkWidth);
lbajardsilogic@0 173 if (!--darkWidth) break;
lbajardsilogic@0 174 paint.drawEllipse(pos, pos, darkWidth, darkWidth);
lbajardsilogic@0 175 ++pos; --darkWidth;
lbajardsilogic@0 176 }
lbajardsilogic@0 177
lbajardsilogic@0 178 // Tick notches...
lbajardsilogic@0 179
lbajardsilogic@0 180 if ( notchesVisible() ) {
lbajardsilogic@0 181 // std::cerr << "Notches visible" << std::endl;
lbajardsilogic@0 182 pen.setColor(palette().dark().color());
lbajardsilogic@0 183 pen.setWidth(scale);
lbajardsilogic@0 184 paint.setPen(pen);
lbajardsilogic@0 185 for (int i = 0; i < numTicks; ++i) {
lbajardsilogic@0 186 int div = numTicks;
lbajardsilogic@0 187 if (div > 1) --div;
lbajardsilogic@0 188 drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div,
lbajardsilogic@0 189 width, true);
lbajardsilogic@0 190 }
lbajardsilogic@0 191 }
lbajardsilogic@0 192
lbajardsilogic@0 193 // The bright metering bit...
lbajardsilogic@0 194
lbajardsilogic@0 195 c = meterColor;
lbajardsilogic@0 196 pen.setColor(c);
lbajardsilogic@0 197 pen.setWidth(indent);
lbajardsilogic@0 198 paint.setPen(pen);
lbajardsilogic@0 199
lbajardsilogic@0 200 // std::cerr << "degrees " << degrees << ", gives us " << -(degrees - 45) * 16 << std::endl;
lbajardsilogic@0 201
lbajardsilogic@0 202 int arcLen = -(degrees - 45) * 16;
lbajardsilogic@0 203 if (arcLen == 0) arcLen = -16;
lbajardsilogic@0 204
lbajardsilogic@0 205 paint.drawArc(indent/2, indent/2,
lbajardsilogic@0 206 width-indent, width-indent, (180 + 45) * 16, arcLen);
lbajardsilogic@0 207
lbajardsilogic@0 208 paint.setBrush(Qt::NoBrush);
lbajardsilogic@0 209
lbajardsilogic@0 210 // Shadowing...
lbajardsilogic@0 211
lbajardsilogic@0 212 pen.setWidth(scale);
lbajardsilogic@0 213 paint.setPen(pen);
lbajardsilogic@0 214
lbajardsilogic@0 215 // Knob shadow...
lbajardsilogic@0 216
lbajardsilogic@0 217 int shadowAngle = -720;
lbajardsilogic@0 218 c = knobColor.dark();
lbajardsilogic@0 219 for (int arc = 120; arc < 2880; arc += 240) {
lbajardsilogic@0 220 pen.setColor(c);
lbajardsilogic@0 221 paint.setPen(pen);
lbajardsilogic@0 222 paint.drawArc(indent, indent,
lbajardsilogic@0 223 width-2*indent, width-2*indent, shadowAngle + arc, 240);
lbajardsilogic@0 224 paint.drawArc(indent, indent,
lbajardsilogic@0 225 width-2*indent, width-2*indent, shadowAngle - arc, 240);
lbajardsilogic@0 226 c = c.light(110);
lbajardsilogic@0 227 }
lbajardsilogic@0 228
lbajardsilogic@0 229 // Scale shadow...
lbajardsilogic@0 230
lbajardsilogic@0 231 shadowAngle = 2160;
lbajardsilogic@0 232 c = palette().dark().color();
lbajardsilogic@0 233 for (int arc = 120; arc < 2880; arc += 240) {
lbajardsilogic@0 234 pen.setColor(c);
lbajardsilogic@0 235 paint.setPen(pen);
lbajardsilogic@0 236 paint.drawArc(scale/2, scale/2,
lbajardsilogic@0 237 width-scale, width-scale, shadowAngle + arc, 240);
lbajardsilogic@0 238 paint.drawArc(scale/2, scale/2,
lbajardsilogic@0 239 width-scale, width-scale, shadowAngle - arc, 240);
lbajardsilogic@0 240 c = c.light(108);
lbajardsilogic@0 241 }
lbajardsilogic@0 242
lbajardsilogic@0 243 // Undraw the bottom part...
lbajardsilogic@0 244
lbajardsilogic@0 245 pen.setColor(palette().background().color());
lbajardsilogic@0 246 pen.setWidth(scale * 4);
lbajardsilogic@0 247 paint.setPen(pen);
lbajardsilogic@0 248 paint.drawArc(scale/2, scale/2,
lbajardsilogic@0 249 width-scale, width-scale, -45 * 16, -92 * 16);
lbajardsilogic@0 250
lbajardsilogic@0 251 // Scale ends...
lbajardsilogic@0 252
lbajardsilogic@0 253 pen.setColor(palette().dark().color());
lbajardsilogic@0 254 pen.setWidth(scale);
lbajardsilogic@0 255 paint.setPen(pen);
lbajardsilogic@0 256 for (int i = 0; i < numTicks; ++i) {
lbajardsilogic@0 257 if (i != 0 && i != numTicks - 1) continue;
lbajardsilogic@0 258 int div = numTicks;
lbajardsilogic@0 259 if (div > 1) --div;
lbajardsilogic@0 260 drawTick(paint, AUDIO_DIAL_MIN + (AUDIO_DIAL_MAX - AUDIO_DIAL_MIN) * i / div,
lbajardsilogic@0 261 width, false);
lbajardsilogic@0 262 }
lbajardsilogic@0 263
lbajardsilogic@0 264 // Pointer notch...
lbajardsilogic@0 265
lbajardsilogic@0 266 float hyp = float(width) / 2.0;
lbajardsilogic@0 267 float len = hyp - indent;
lbajardsilogic@0 268 --len;
lbajardsilogic@0 269
lbajardsilogic@0 270 float x0 = hyp;
lbajardsilogic@0 271 float y0 = hyp;
lbajardsilogic@0 272
lbajardsilogic@0 273 float x = hyp - len * sin(angle);
lbajardsilogic@0 274 float y = hyp + len * cos(angle);
lbajardsilogic@0 275
lbajardsilogic@0 276 c = palette().dark().color();
lbajardsilogic@0 277 pen.setColor(isEnabled() ? c.dark(130) : c);
lbajardsilogic@0 278 pen.setWidth(scale * 2);
lbajardsilogic@0 279 paint.setPen(pen);
lbajardsilogic@0 280 paint.drawLine(int(x0), int(y0), int(x), int(y));
lbajardsilogic@0 281
lbajardsilogic@0 282 paint.end();
lbajardsilogic@0 283 }
lbajardsilogic@0 284
lbajardsilogic@0 285
lbajardsilogic@0 286 void AudioDial::drawTick(QPainter &paint,
lbajardsilogic@0 287 float angle, int size, bool internal)
lbajardsilogic@0 288 {
lbajardsilogic@0 289 float hyp = float(size) / 2.0;
lbajardsilogic@0 290 float x0 = hyp - (hyp - 1) * sin(angle);
lbajardsilogic@0 291 float y0 = hyp + (hyp - 1) * cos(angle);
lbajardsilogic@0 292
lbajardsilogic@0 293 // cerr << "drawTick: angle " << angle << ", size " << size << ", internal " << internal << endl;
lbajardsilogic@0 294
lbajardsilogic@0 295 if (internal) {
lbajardsilogic@0 296
lbajardsilogic@0 297 float len = hyp / 4;
lbajardsilogic@0 298 float x1 = hyp - (hyp - len) * sin(angle);
lbajardsilogic@0 299 float y1 = hyp + (hyp - len) * cos(angle);
lbajardsilogic@0 300
lbajardsilogic@0 301 paint.drawLine(int(x0), int(y0), int(x1), int(y1));
lbajardsilogic@0 302
lbajardsilogic@0 303 } else {
lbajardsilogic@0 304
lbajardsilogic@0 305 float len = hyp / 4;
lbajardsilogic@0 306 float x1 = hyp - (hyp + len) * sin(angle);
lbajardsilogic@0 307 float y1 = hyp + (hyp + len) * cos(angle);
lbajardsilogic@0 308
lbajardsilogic@0 309 paint.drawLine(int(x0), int(y0), int(x1), int(y1));
lbajardsilogic@0 310 }
lbajardsilogic@0 311 }
lbajardsilogic@0 312
lbajardsilogic@0 313
lbajardsilogic@0 314 void AudioDial::setKnobColor(const QColor& color)
lbajardsilogic@0 315 {
lbajardsilogic@0 316 m_knobColor = color;
lbajardsilogic@0 317 update();
lbajardsilogic@0 318 }
lbajardsilogic@0 319
lbajardsilogic@0 320
lbajardsilogic@0 321 void AudioDial::setMeterColor(const QColor& color)
lbajardsilogic@0 322 {
lbajardsilogic@0 323 m_meterColor = color;
lbajardsilogic@0 324 update();
lbajardsilogic@0 325 }
lbajardsilogic@0 326
lbajardsilogic@0 327
lbajardsilogic@0 328 void AudioDial::setMouseDial(bool mouseDial)
lbajardsilogic@0 329 {
lbajardsilogic@0 330 m_mouseDial = mouseDial;
lbajardsilogic@0 331 }
lbajardsilogic@0 332
lbajardsilogic@0 333
lbajardsilogic@0 334 void AudioDial::setDefaultValue(int defaultValue)
lbajardsilogic@0 335 {
lbajardsilogic@0 336 m_defaultValue = defaultValue;
lbajardsilogic@0 337 }
lbajardsilogic@0 338
lbajardsilogic@0 339
lbajardsilogic@0 340 void AudioDial::setValue(int value)
lbajardsilogic@0 341 {
lbajardsilogic@0 342 QDial::setValue(value);
lbajardsilogic@0 343 updateMappedValue(value);
lbajardsilogic@0 344 }
lbajardsilogic@0 345
lbajardsilogic@0 346
lbajardsilogic@0 347 void AudioDial::setMappedValue(float mappedValue)
lbajardsilogic@0 348 {
lbajardsilogic@0 349 if (m_rangeMapper) {
lbajardsilogic@0 350 int newPosition = m_rangeMapper->getPositionForValue(mappedValue);
lbajardsilogic@0 351 bool changed = (m_mappedValue != mappedValue);
lbajardsilogic@0 352 m_mappedValue = mappedValue;
lbajardsilogic@0 353 m_noMappedUpdate = true;
lbajardsilogic@0 354 std::cerr << "AudioDial::setMappedValue(" << mappedValue << "): new position is " << newPosition << std::endl;
lbajardsilogic@0 355 if (newPosition != value()) {
lbajardsilogic@0 356 setValue(newPosition);
lbajardsilogic@0 357 } else if (changed) {
lbajardsilogic@0 358 emit valueChanged(newPosition);
lbajardsilogic@0 359 }
lbajardsilogic@0 360 m_noMappedUpdate = false;
lbajardsilogic@0 361 } else {
lbajardsilogic@0 362 setValue(int(mappedValue));
lbajardsilogic@0 363 }
lbajardsilogic@0 364 }
lbajardsilogic@0 365
lbajardsilogic@0 366
lbajardsilogic@0 367 void AudioDial::setShowToolTip(bool show)
lbajardsilogic@0 368 {
lbajardsilogic@0 369 m_showTooltip = show;
lbajardsilogic@0 370 m_noMappedUpdate = true;
lbajardsilogic@0 371 updateMappedValue(value());
lbajardsilogic@0 372 m_noMappedUpdate = false;
lbajardsilogic@0 373 }
lbajardsilogic@0 374
lbajardsilogic@0 375
lbajardsilogic@0 376 float AudioDial::mappedValue() const
lbajardsilogic@0 377 {
lbajardsilogic@0 378 if (m_rangeMapper) {
lbajardsilogic@0 379 std::cerr << "AudioDial::mappedValue(): value = " << value() << ", mappedValue = " << m_mappedValue << std::endl;
lbajardsilogic@0 380 return m_mappedValue;
lbajardsilogic@0 381 }
lbajardsilogic@0 382 return value();
lbajardsilogic@0 383 }
lbajardsilogic@0 384
lbajardsilogic@0 385
lbajardsilogic@0 386 void AudioDial::updateMappedValue(int value)
lbajardsilogic@0 387 {
lbajardsilogic@0 388 if (!m_noMappedUpdate) {
lbajardsilogic@0 389 if (m_rangeMapper) {
lbajardsilogic@0 390 m_mappedValue = m_rangeMapper->getValueForPosition(value);
lbajardsilogic@0 391 } else {
lbajardsilogic@0 392 m_mappedValue = value;
lbajardsilogic@0 393 }
lbajardsilogic@0 394 }
lbajardsilogic@0 395
lbajardsilogic@0 396 if (m_showTooltip) {
lbajardsilogic@0 397 QString name = objectName();
lbajardsilogic@0 398 QString unit = "";
lbajardsilogic@0 399 QString text;
lbajardsilogic@0 400 if (m_rangeMapper) unit = m_rangeMapper->getUnit();
lbajardsilogic@0 401 if (name != "") {
lbajardsilogic@0 402 text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit);
lbajardsilogic@0 403 } else {
lbajardsilogic@0 404 text = tr("%2%3").arg(m_mappedValue).arg(unit);
lbajardsilogic@0 405 }
lbajardsilogic@0 406 setToolTip(text);
lbajardsilogic@0 407 }
lbajardsilogic@0 408 }
lbajardsilogic@0 409
lbajardsilogic@0 410
lbajardsilogic@0 411 // Alternate mouse behavior event handlers.
lbajardsilogic@0 412 void AudioDial::mousePressEvent(QMouseEvent *mouseEvent)
lbajardsilogic@0 413 {
lbajardsilogic@0 414 if (m_mouseDial) {
lbajardsilogic@0 415 QDial::mousePressEvent(mouseEvent);
lbajardsilogic@0 416 } else if (mouseEvent->button() == Qt::MidButton ||
lbajardsilogic@0 417 ((mouseEvent->button() == Qt::LeftButton) &&
lbajardsilogic@0 418 (mouseEvent->modifiers() & Qt::ControlModifier))) {
lbajardsilogic@0 419 int dv = m_defaultValue;
lbajardsilogic@0 420 if (dv < minimum()) dv = minimum();
lbajardsilogic@0 421 if (dv > maximum()) dv = maximum();
lbajardsilogic@0 422 setValue(m_defaultValue);
lbajardsilogic@0 423 } else if (mouseEvent->button() == Qt::LeftButton) {
lbajardsilogic@0 424 m_mousePressed = true;
lbajardsilogic@0 425 m_posMouse = mouseEvent->pos();
lbajardsilogic@0 426 }
lbajardsilogic@0 427 }
lbajardsilogic@0 428
lbajardsilogic@0 429
lbajardsilogic@0 430 void AudioDial::mouseDoubleClickEvent(QMouseEvent *mouseEvent)
lbajardsilogic@0 431 {
lbajardsilogic@0 432 //!!! needs a common base class with Thumbwheel
lbajardsilogic@0 433
lbajardsilogic@0 434 if (m_mouseDial) {
lbajardsilogic@0 435 QDial::mouseDoubleClickEvent(mouseEvent);
lbajardsilogic@0 436 } else if (mouseEvent->button() != Qt::LeftButton) {
lbajardsilogic@0 437 return;
lbajardsilogic@0 438 }
lbajardsilogic@0 439
lbajardsilogic@0 440 bool ok = false;
lbajardsilogic@0 441
lbajardsilogic@0 442 if (m_rangeMapper) {
lbajardsilogic@0 443
lbajardsilogic@0 444 float min = m_rangeMapper->getValueForPosition(minimum());
lbajardsilogic@0 445 float max = m_rangeMapper->getValueForPosition(maximum());
lbajardsilogic@0 446
lbajardsilogic@0 447 if (min > max) {
lbajardsilogic@0 448 float tmp = min;
lbajardsilogic@0 449 min = max;
lbajardsilogic@0 450 max = tmp;
lbajardsilogic@0 451 }
lbajardsilogic@0 452
lbajardsilogic@0 453 QString unit = m_rangeMapper->getUnit();
lbajardsilogic@0 454
lbajardsilogic@0 455 QString text;
lbajardsilogic@0 456 if (objectName() != "") {
lbajardsilogic@0 457 if (unit != "") {
lbajardsilogic@0 458 text = tr("New value for %1, from %2 to %3 %4:")
lbajardsilogic@0 459 .arg(objectName()).arg(min).arg(max).arg(unit);
lbajardsilogic@0 460 } else {
lbajardsilogic@0 461 text = tr("New value for %1, from %2 to %3:")
lbajardsilogic@0 462 .arg(objectName()).arg(min).arg(max);
lbajardsilogic@0 463 }
lbajardsilogic@0 464 } else {
lbajardsilogic@0 465 if (unit != "") {
lbajardsilogic@0 466 text = tr("Enter a new value from %1 to %2 %3:")
lbajardsilogic@0 467 .arg(min).arg(max).arg(unit);
lbajardsilogic@0 468 } else {
lbajardsilogic@0 469 text = tr("Enter a new value from %1 to %2:")
lbajardsilogic@0 470 .arg(min).arg(max);
lbajardsilogic@0 471 }
lbajardsilogic@0 472 }
lbajardsilogic@0 473
lbajardsilogic@0 474 float newValue = QInputDialog::getDouble
lbajardsilogic@0 475 (this,
lbajardsilogic@0 476 tr("Enter new value"),
lbajardsilogic@0 477 text,
lbajardsilogic@0 478 m_mappedValue,
lbajardsilogic@0 479 min,
lbajardsilogic@0 480 max,
lbajardsilogic@0 481 4,
lbajardsilogic@0 482 &ok);
lbajardsilogic@0 483
lbajardsilogic@0 484 if (ok) {
lbajardsilogic@0 485 setMappedValue(newValue);
lbajardsilogic@0 486 }
lbajardsilogic@0 487
lbajardsilogic@0 488 } else {
lbajardsilogic@0 489
lbajardsilogic@0 490 int newPosition = QInputDialog::getInteger
lbajardsilogic@0 491 (this,
lbajardsilogic@0 492 tr("Enter new value"),
lbajardsilogic@0 493 tr("Enter a new value from %1 to %2:")
lbajardsilogic@0 494 .arg(minimum()).arg(maximum()),
lbajardsilogic@0 495 value(), minimum(), maximum(), pageStep(), &ok);
lbajardsilogic@0 496
lbajardsilogic@0 497 if (ok) {
lbajardsilogic@0 498 setValue(newPosition);
lbajardsilogic@0 499 }
lbajardsilogic@0 500 }
lbajardsilogic@0 501 }
lbajardsilogic@0 502
lbajardsilogic@0 503
lbajardsilogic@0 504 void AudioDial::mouseMoveEvent(QMouseEvent *mouseEvent)
lbajardsilogic@0 505 {
lbajardsilogic@0 506 if (m_mouseDial) {
lbajardsilogic@0 507 QDial::mouseMoveEvent(mouseEvent);
lbajardsilogic@0 508 } else if (m_mousePressed) {
lbajardsilogic@0 509 const QPoint& posMouse = mouseEvent->pos();
lbajardsilogic@0 510 int v = QDial::value()
lbajardsilogic@0 511 + (posMouse.x() - m_posMouse.x())
lbajardsilogic@0 512 + (m_posMouse.y() - posMouse.y());
lbajardsilogic@0 513 if (v > QDial::maximum())
lbajardsilogic@0 514 v = QDial::maximum();
lbajardsilogic@0 515 else
lbajardsilogic@0 516 if (v < QDial::minimum())
lbajardsilogic@0 517 v = QDial::minimum();
lbajardsilogic@0 518 m_posMouse = posMouse;
lbajardsilogic@0 519 QDial::setValue(v);
lbajardsilogic@0 520 }
lbajardsilogic@0 521 }
lbajardsilogic@0 522
lbajardsilogic@0 523
lbajardsilogic@0 524 void AudioDial::mouseReleaseEvent(QMouseEvent *mouseEvent)
lbajardsilogic@0 525 {
lbajardsilogic@0 526 if (m_mouseDial) {
lbajardsilogic@0 527 QDial::mouseReleaseEvent(mouseEvent);
lbajardsilogic@0 528 } else if (m_mousePressed) {
lbajardsilogic@0 529 m_mousePressed = false;
lbajardsilogic@0 530 }
lbajardsilogic@0 531 }
lbajardsilogic@0 532
lbajardsilogic@0 533 void
lbajardsilogic@0 534 AudioDial::enterEvent(QEvent *e)
lbajardsilogic@0 535 {
lbajardsilogic@0 536 QDial::enterEvent(e);
lbajardsilogic@0 537 emit mouseEntered();
lbajardsilogic@0 538 }
lbajardsilogic@0 539
lbajardsilogic@0 540 void
lbajardsilogic@0 541 AudioDial::leaveEvent(QEvent *e)
lbajardsilogic@0 542 {
lbajardsilogic@0 543 QDial::enterEvent(e);
lbajardsilogic@0 544 emit mouseLeft();
lbajardsilogic@0 545 }
lbajardsilogic@0 546