annotate widgets/AudioDial.cpp @ 349:369a197737c7

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