annotate widgets/Thumbwheel.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 This file copyright 2006 QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "Thumbwheel.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "base/RangeMapper.h"
lbajardsilogic@0 19 #include "base/Profiler.h"
lbajardsilogic@0 20
lbajardsilogic@0 21 #include <QMouseEvent>
lbajardsilogic@0 22 #include <QPaintEvent>
lbajardsilogic@0 23 #include <QWheelEvent>
lbajardsilogic@0 24 #include <QInputDialog>
lbajardsilogic@0 25 #include <QPainter>
lbajardsilogic@0 26 #include <QPainterPath>
lbajardsilogic@0 27
lbajardsilogic@0 28 #include <cmath>
lbajardsilogic@0 29 #include <iostream>
lbajardsilogic@0 30
lbajardsilogic@0 31 Thumbwheel::Thumbwheel(Qt::Orientation orientation,
lbajardsilogic@0 32 QWidget *parent) :
lbajardsilogic@0 33 QWidget(parent),
lbajardsilogic@0 34 m_min(0),
lbajardsilogic@0 35 m_max(100),
lbajardsilogic@0 36 m_default(50),
lbajardsilogic@0 37 m_value(50),
lbajardsilogic@0 38 m_mappedValue(50),
lbajardsilogic@0 39 m_noMappedUpdate(false),
lbajardsilogic@0 40 m_rotation(0.5),
lbajardsilogic@0 41 m_orientation(orientation),
lbajardsilogic@0 42 m_speed(1.0),
lbajardsilogic@0 43 m_tracking(true),
lbajardsilogic@0 44 m_showScale(true),
lbajardsilogic@0 45 m_clicked(false),
lbajardsilogic@0 46 m_atDefault(true),
lbajardsilogic@0 47 m_clickRotation(m_rotation),
lbajardsilogic@0 48 m_showTooltip(true),
lbajardsilogic@0 49 m_rangeMapper(0)
lbajardsilogic@0 50 {
lbajardsilogic@0 51 }
lbajardsilogic@0 52
lbajardsilogic@0 53 Thumbwheel::~Thumbwheel()
lbajardsilogic@0 54 {
lbajardsilogic@0 55 delete m_rangeMapper;
lbajardsilogic@0 56 }
lbajardsilogic@0 57
lbajardsilogic@0 58 void
lbajardsilogic@0 59 Thumbwheel::setRangeMapper(RangeMapper *mapper)
lbajardsilogic@0 60 {
lbajardsilogic@0 61 if (m_rangeMapper == mapper) return;
lbajardsilogic@0 62
lbajardsilogic@0 63 if (!m_rangeMapper && mapper) {
lbajardsilogic@0 64 connect(this, SIGNAL(valueChanged(int)),
lbajardsilogic@0 65 this, SLOT(updateMappedValue(int)));
lbajardsilogic@0 66 }
lbajardsilogic@0 67
lbajardsilogic@0 68 delete m_rangeMapper;
lbajardsilogic@0 69 m_rangeMapper = mapper;
lbajardsilogic@0 70
lbajardsilogic@0 71 updateMappedValue(getValue());
lbajardsilogic@0 72 }
lbajardsilogic@0 73
lbajardsilogic@0 74 void
lbajardsilogic@0 75 Thumbwheel::setShowToolTip(bool show)
lbajardsilogic@0 76 {
lbajardsilogic@0 77 m_showTooltip = show;
lbajardsilogic@0 78 m_noMappedUpdate = true;
lbajardsilogic@0 79 updateMappedValue(getValue());
lbajardsilogic@0 80 m_noMappedUpdate = false;
lbajardsilogic@0 81 }
lbajardsilogic@0 82
lbajardsilogic@0 83 void
lbajardsilogic@0 84 Thumbwheel::setMinimumValue(int min)
lbajardsilogic@0 85 {
lbajardsilogic@0 86 if (m_min == min) return;
lbajardsilogic@0 87
lbajardsilogic@0 88 m_min = min;
lbajardsilogic@0 89 if (m_max <= m_min) m_max = m_min + 1;
lbajardsilogic@0 90 if (m_value < m_min) m_value = m_min;
lbajardsilogic@0 91 if (m_value > m_max) m_value = m_max;
lbajardsilogic@0 92
lbajardsilogic@0 93 m_rotation = float(m_value - m_min) / float(m_max - m_min);
lbajardsilogic@0 94 update();
lbajardsilogic@0 95 }
lbajardsilogic@0 96
lbajardsilogic@0 97 int
lbajardsilogic@0 98 Thumbwheel::getMinimumValue() const
lbajardsilogic@0 99 {
lbajardsilogic@0 100 return m_min;
lbajardsilogic@0 101 }
lbajardsilogic@0 102
lbajardsilogic@0 103 void
lbajardsilogic@0 104 Thumbwheel::setMaximumValue(int max)
lbajardsilogic@0 105 {
lbajardsilogic@0 106 if (m_max == max) return;
lbajardsilogic@0 107
lbajardsilogic@0 108 m_max = max;
lbajardsilogic@0 109 if (m_min >= m_max) m_min = m_max - 1;
lbajardsilogic@0 110 if (m_value < m_min) m_value = m_min;
lbajardsilogic@0 111 if (m_value > m_max) m_value = m_max;
lbajardsilogic@0 112
lbajardsilogic@0 113 m_rotation = float(m_value - m_min) / float(m_max - m_min);
lbajardsilogic@0 114 update();
lbajardsilogic@0 115 }
lbajardsilogic@0 116
lbajardsilogic@0 117 int
lbajardsilogic@0 118 Thumbwheel::getMaximumValue() const
lbajardsilogic@0 119 {
lbajardsilogic@0 120 return m_max;
lbajardsilogic@0 121 }
lbajardsilogic@0 122
lbajardsilogic@0 123 void
lbajardsilogic@0 124 Thumbwheel::setDefaultValue(int deft)
lbajardsilogic@0 125 {
lbajardsilogic@0 126 if (m_default == deft) return;
lbajardsilogic@0 127
lbajardsilogic@0 128 m_default = deft;
lbajardsilogic@0 129 if (m_atDefault) {
lbajardsilogic@0 130 setValue(m_default);
lbajardsilogic@0 131 m_atDefault = true; // setValue unsets this
lbajardsilogic@0 132 emit valueChanged(getValue());
lbajardsilogic@0 133 }
lbajardsilogic@0 134 }
lbajardsilogic@0 135
lbajardsilogic@0 136 void
lbajardsilogic@0 137 Thumbwheel::setMappedValue(float mappedValue)
lbajardsilogic@0 138 {
lbajardsilogic@0 139 if (m_rangeMapper) {
lbajardsilogic@0 140 int newValue = m_rangeMapper->getPositionForValue(mappedValue);
lbajardsilogic@0 141 bool changed = (m_mappedValue != mappedValue);
lbajardsilogic@0 142 m_mappedValue = mappedValue;
lbajardsilogic@0 143 m_noMappedUpdate = true;
lbajardsilogic@0 144 // std::cerr << "Thumbwheel::setMappedValue(" << mappedValue << "): new value is " << newValue << " (visible " << isVisible() << ")" << std::endl;
lbajardsilogic@0 145 if (newValue != getValue()) {
lbajardsilogic@0 146 setValue(newValue);
lbajardsilogic@0 147 changed = true;
lbajardsilogic@0 148 }
lbajardsilogic@0 149 if (changed) emit valueChanged(newValue);
lbajardsilogic@0 150 m_noMappedUpdate = false;
lbajardsilogic@0 151 } else {
lbajardsilogic@0 152 int v = int(mappedValue);
lbajardsilogic@0 153 if (v != getValue()) {
lbajardsilogic@0 154 setValue(v);
lbajardsilogic@0 155 emit valueChanged(v);
lbajardsilogic@0 156 }
lbajardsilogic@0 157 }
lbajardsilogic@0 158 }
lbajardsilogic@0 159
lbajardsilogic@0 160 int
lbajardsilogic@0 161 Thumbwheel::getDefaultValue() const
lbajardsilogic@0 162 {
lbajardsilogic@0 163 return m_default;
lbajardsilogic@0 164 }
lbajardsilogic@0 165
lbajardsilogic@0 166 void
lbajardsilogic@0 167 Thumbwheel::setValue(int value)
lbajardsilogic@0 168 {
lbajardsilogic@0 169 // std::cerr << "Thumbwheel::setValue(" << value << ") (from " << m_value
lbajardsilogic@0 170 // << ", rotation " << m_rotation << ")" << " (visible " << isVisible() << ")" << std::endl;
lbajardsilogic@0 171
lbajardsilogic@0 172 if (m_value != value) {
lbajardsilogic@0 173
lbajardsilogic@0 174 m_atDefault = false;
lbajardsilogic@0 175
lbajardsilogic@0 176 if (value < m_min) value = m_min;
lbajardsilogic@0 177 if (value > m_max) value = m_max;
lbajardsilogic@0 178 m_value = value;
lbajardsilogic@0 179 }
lbajardsilogic@0 180
lbajardsilogic@0 181 m_rotation = float(m_value - m_min) / float(m_max - m_min);
lbajardsilogic@0 182 if (isVisible()) update();
lbajardsilogic@0 183 }
lbajardsilogic@0 184
lbajardsilogic@0 185 void
lbajardsilogic@0 186 Thumbwheel::resetToDefault()
lbajardsilogic@0 187 {
lbajardsilogic@0 188 if (m_default == m_value) return;
lbajardsilogic@0 189 setValue(m_default);
lbajardsilogic@0 190 m_atDefault = true;
lbajardsilogic@0 191 emit valueChanged(getValue());
lbajardsilogic@0 192 }
lbajardsilogic@0 193
lbajardsilogic@0 194 int
lbajardsilogic@0 195 Thumbwheel::getValue() const
lbajardsilogic@0 196 {
lbajardsilogic@0 197 return m_value;
lbajardsilogic@0 198 }
lbajardsilogic@0 199
lbajardsilogic@0 200 float
lbajardsilogic@0 201 Thumbwheel::getMappedValue() const
lbajardsilogic@0 202 {
lbajardsilogic@0 203 if (m_rangeMapper) {
lbajardsilogic@0 204 // std::cerr << "Thumbwheel::getMappedValue(): value = " << getValue() << ", mappedValue = " << m_mappedValue << std::endl;
lbajardsilogic@0 205 return m_mappedValue;
lbajardsilogic@0 206 }
lbajardsilogic@0 207 return getValue();
lbajardsilogic@0 208 }
lbajardsilogic@0 209
lbajardsilogic@0 210 void
lbajardsilogic@0 211 Thumbwheel::updateMappedValue(int value)
lbajardsilogic@0 212 {
lbajardsilogic@0 213 if (!m_noMappedUpdate) {
lbajardsilogic@0 214 if (m_rangeMapper) {
lbajardsilogic@0 215 m_mappedValue = m_rangeMapper->getValueForPosition(value);
lbajardsilogic@0 216 } else {
lbajardsilogic@0 217 m_mappedValue = value;
lbajardsilogic@0 218 }
lbajardsilogic@0 219 }
lbajardsilogic@0 220
lbajardsilogic@0 221 if (m_showTooltip) {
lbajardsilogic@0 222 QString name = objectName();
lbajardsilogic@0 223 QString unit = "";
lbajardsilogic@0 224 QString text;
lbajardsilogic@0 225 if (m_rangeMapper) unit = m_rangeMapper->getUnit();
lbajardsilogic@0 226 if (name != "") {
lbajardsilogic@0 227 text = tr("%1: %2%3").arg(name).arg(m_mappedValue).arg(unit);
lbajardsilogic@0 228 } else {
lbajardsilogic@0 229 text = tr("%2%3").arg(m_mappedValue).arg(unit);
lbajardsilogic@0 230 }
lbajardsilogic@0 231 setToolTip(text);
lbajardsilogic@0 232 }
lbajardsilogic@0 233 }
lbajardsilogic@0 234
lbajardsilogic@0 235 void
lbajardsilogic@0 236 Thumbwheel::setSpeed(float speed)
lbajardsilogic@0 237 {
lbajardsilogic@0 238 m_speed = speed;
lbajardsilogic@0 239 }
lbajardsilogic@0 240
lbajardsilogic@0 241 float
lbajardsilogic@0 242 Thumbwheel::getSpeed() const
lbajardsilogic@0 243 {
lbajardsilogic@0 244 return m_speed;
lbajardsilogic@0 245 }
lbajardsilogic@0 246
lbajardsilogic@0 247 void
lbajardsilogic@0 248 Thumbwheel::setTracking(bool tracking)
lbajardsilogic@0 249 {
lbajardsilogic@0 250 m_tracking = tracking;
lbajardsilogic@0 251 }
lbajardsilogic@0 252
lbajardsilogic@0 253 bool
lbajardsilogic@0 254 Thumbwheel::getTracking() const
lbajardsilogic@0 255 {
lbajardsilogic@0 256 return m_tracking;
lbajardsilogic@0 257 }
lbajardsilogic@0 258
lbajardsilogic@0 259 void
lbajardsilogic@0 260 Thumbwheel::setShowScale(bool showScale)
lbajardsilogic@0 261 {
lbajardsilogic@0 262 m_showScale = showScale;
lbajardsilogic@0 263 }
lbajardsilogic@0 264
lbajardsilogic@0 265 bool
lbajardsilogic@0 266 Thumbwheel::getShowScale() const
lbajardsilogic@0 267 {
lbajardsilogic@0 268 return m_showScale;
lbajardsilogic@0 269 }
lbajardsilogic@0 270
lbajardsilogic@0 271 void
lbajardsilogic@0 272 Thumbwheel::enterEvent(QEvent *)
lbajardsilogic@0 273 {
lbajardsilogic@0 274 emit mouseEntered();
lbajardsilogic@0 275 }
lbajardsilogic@0 276
lbajardsilogic@0 277 void
lbajardsilogic@0 278 Thumbwheel::leaveEvent(QEvent *)
lbajardsilogic@0 279 {
lbajardsilogic@0 280 emit mouseLeft();
lbajardsilogic@0 281 }
lbajardsilogic@0 282
lbajardsilogic@0 283 void
lbajardsilogic@0 284 Thumbwheel::mousePressEvent(QMouseEvent *e)
lbajardsilogic@0 285 {
lbajardsilogic@0 286 if (e->button() == Qt::MidButton ||
lbajardsilogic@0 287 ((e->button() == Qt::LeftButton) &&
lbajardsilogic@0 288 (e->modifiers() & Qt::ControlModifier))) {
lbajardsilogic@0 289 resetToDefault();
lbajardsilogic@0 290 } else if (e->button() == Qt::LeftButton) {
lbajardsilogic@0 291 m_clicked = true;
lbajardsilogic@0 292 m_clickPos = e->pos();
lbajardsilogic@0 293 m_clickRotation = m_rotation;
lbajardsilogic@0 294 }
lbajardsilogic@0 295 }
lbajardsilogic@0 296
lbajardsilogic@0 297 void
lbajardsilogic@0 298 Thumbwheel::mouseDoubleClickEvent(QMouseEvent *mouseEvent)
lbajardsilogic@0 299 {
lbajardsilogic@0 300 //!!! needs a common base class with AudioDial (and Panner?)
lbajardsilogic@0 301
lbajardsilogic@0 302 if (mouseEvent->button() != Qt::LeftButton) {
lbajardsilogic@0 303 return;
lbajardsilogic@0 304 }
lbajardsilogic@0 305
lbajardsilogic@0 306 bool ok = false;
lbajardsilogic@0 307
lbajardsilogic@0 308 if (m_rangeMapper) {
lbajardsilogic@0 309
lbajardsilogic@0 310 float min = m_rangeMapper->getValueForPosition(m_min);
lbajardsilogic@0 311 float max = m_rangeMapper->getValueForPosition(m_max);
lbajardsilogic@0 312
lbajardsilogic@0 313 if (min > max) {
lbajardsilogic@0 314 float tmp = min;
lbajardsilogic@0 315 min = max;
lbajardsilogic@0 316 max = tmp;
lbajardsilogic@0 317 }
lbajardsilogic@0 318
lbajardsilogic@0 319 QString unit = m_rangeMapper->getUnit();
lbajardsilogic@0 320
lbajardsilogic@0 321 QString text;
lbajardsilogic@0 322 if (objectName() != "") {
lbajardsilogic@0 323 if (unit != "") {
lbajardsilogic@0 324 text = tr("New value for %1, from %2 to %3 %4:")
lbajardsilogic@0 325 .arg(objectName()).arg(min).arg(max).arg(unit);
lbajardsilogic@0 326 } else {
lbajardsilogic@0 327 text = tr("New value for %1, from %2 to %3:")
lbajardsilogic@0 328 .arg(objectName()).arg(min).arg(max);
lbajardsilogic@0 329 }
lbajardsilogic@0 330 } else {
lbajardsilogic@0 331 if (unit != "") {
lbajardsilogic@0 332 text = tr("Enter a new value from %1 to %2 %3:")
lbajardsilogic@0 333 .arg(min).arg(max).arg(unit);
lbajardsilogic@0 334 } else {
lbajardsilogic@0 335 text = tr("Enter a new value from %1 to %2:")
lbajardsilogic@0 336 .arg(min).arg(max);
lbajardsilogic@0 337 }
lbajardsilogic@0 338 }
lbajardsilogic@0 339
lbajardsilogic@0 340 float newValue = QInputDialog::getDouble
lbajardsilogic@0 341 (this,
lbajardsilogic@0 342 tr("Enter new value"),
lbajardsilogic@0 343 text,
lbajardsilogic@0 344 m_mappedValue,
lbajardsilogic@0 345 min,
lbajardsilogic@0 346 max,
lbajardsilogic@0 347 4,
lbajardsilogic@0 348 &ok);
lbajardsilogic@0 349
lbajardsilogic@0 350 if (ok) {
lbajardsilogic@0 351 setMappedValue(newValue);
lbajardsilogic@0 352 }
lbajardsilogic@0 353
lbajardsilogic@0 354 } else {
lbajardsilogic@0 355
lbajardsilogic@0 356 int newValue = QInputDialog::getInteger
lbajardsilogic@0 357 (this,
lbajardsilogic@0 358 tr("Enter new value"),
lbajardsilogic@0 359 tr("Enter a new value from %1 to %2:")
lbajardsilogic@0 360 .arg(m_min).arg(m_max),
lbajardsilogic@0 361 getValue(), m_min, m_max, 1, &ok);
lbajardsilogic@0 362
lbajardsilogic@0 363 if (ok) {
lbajardsilogic@0 364 setValue(newValue);
lbajardsilogic@0 365 }
lbajardsilogic@0 366 }
lbajardsilogic@0 367 }
lbajardsilogic@0 368
lbajardsilogic@0 369
lbajardsilogic@0 370 void
lbajardsilogic@0 371 Thumbwheel::mouseMoveEvent(QMouseEvent *e)
lbajardsilogic@0 372 {
lbajardsilogic@0 373 if (!m_clicked) return;
lbajardsilogic@0 374 int dist = 0;
lbajardsilogic@0 375 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 376 dist = e->x() - m_clickPos.x();
lbajardsilogic@0 377 } else {
lbajardsilogic@0 378 dist = e->y() - m_clickPos.y();
lbajardsilogic@0 379 }
lbajardsilogic@0 380
lbajardsilogic@0 381 float rotation = m_clickRotation + (m_speed * dist) / 100;
lbajardsilogic@0 382 if (rotation < 0.f) rotation = 0.f;
lbajardsilogic@0 383 if (rotation > 1.f) rotation = 1.f;
lbajardsilogic@0 384 int value = lrintf(m_min + (m_max - m_min) * m_rotation);
lbajardsilogic@0 385 if (value != m_value) {
lbajardsilogic@0 386 setValue(value);
lbajardsilogic@0 387 if (m_tracking) emit valueChanged(getValue());
lbajardsilogic@0 388 m_rotation = rotation;
lbajardsilogic@0 389 } else if (fabsf(rotation - m_rotation) > 0.001) {
lbajardsilogic@0 390 m_rotation = rotation;
lbajardsilogic@0 391 repaint();
lbajardsilogic@0 392 }
lbajardsilogic@0 393 }
lbajardsilogic@0 394
lbajardsilogic@0 395 void
lbajardsilogic@0 396 Thumbwheel::mouseReleaseEvent(QMouseEvent *e)
lbajardsilogic@0 397 {
lbajardsilogic@0 398 if (!m_clicked) return;
lbajardsilogic@0 399 bool reallyTracking = m_tracking;
lbajardsilogic@0 400 m_tracking = true;
lbajardsilogic@0 401 mouseMoveEvent(e);
lbajardsilogic@0 402 m_tracking = reallyTracking;
lbajardsilogic@0 403 m_clicked = false;
lbajardsilogic@0 404 }
lbajardsilogic@0 405
lbajardsilogic@0 406 void
lbajardsilogic@0 407 Thumbwheel::wheelEvent(QWheelEvent *e)
lbajardsilogic@0 408 {
lbajardsilogic@0 409 int step = lrintf(m_speed);
lbajardsilogic@0 410 if (step == 0) step = 1;
lbajardsilogic@0 411
lbajardsilogic@0 412 if (e->delta() > 0) {
lbajardsilogic@0 413 setValue(m_value + step);
lbajardsilogic@0 414 } else {
lbajardsilogic@0 415 setValue(m_value - step);
lbajardsilogic@0 416 }
lbajardsilogic@0 417
lbajardsilogic@0 418 emit valueChanged(getValue());
lbajardsilogic@0 419 }
lbajardsilogic@0 420
lbajardsilogic@0 421 void
lbajardsilogic@0 422 Thumbwheel::paintEvent(QPaintEvent *)
lbajardsilogic@0 423 {
lbajardsilogic@0 424 Profiler profiler("Thumbwheel::paintEvent", true);
lbajardsilogic@0 425
lbajardsilogic@0 426 int bw = 3;
lbajardsilogic@0 427
lbajardsilogic@0 428 QRect subclip;
lbajardsilogic@0 429 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 430 subclip = QRect(bw, bw+1, width() - bw*2, height() - bw*2 - 2);
lbajardsilogic@0 431 } else {
lbajardsilogic@0 432 subclip = QRect(bw+1, bw, width() - bw*2 - 2, height() - bw*2);
lbajardsilogic@0 433 }
lbajardsilogic@0 434
lbajardsilogic@0 435 QPainter paint(this);
lbajardsilogic@0 436 paint.fillRect(subclip, palette().background().color());
lbajardsilogic@0 437
lbajardsilogic@0 438 paint.setRenderHint(QPainter::Antialiasing, true);
lbajardsilogic@0 439
lbajardsilogic@0 440 float w = width();
lbajardsilogic@0 441 float w0 = 0.5;
lbajardsilogic@0 442 float w1 = w - 0.5;
lbajardsilogic@0 443
lbajardsilogic@0 444 float h = height();
lbajardsilogic@0 445 float h0 = 0.5;
lbajardsilogic@0 446 float h1 = h - 0.5;
lbajardsilogic@0 447
lbajardsilogic@0 448 for (int i = bw-1; i >= 0; --i) {
lbajardsilogic@0 449 // for (int i = 0; i < 1; ++i) {
lbajardsilogic@0 450
lbajardsilogic@0 451 int grey = (i + 1) * (256 / (bw + 1));
lbajardsilogic@0 452 QColor fc = QColor(grey, grey, grey);
lbajardsilogic@0 453 paint.setPen(fc);
lbajardsilogic@0 454
lbajardsilogic@0 455 QPainterPath path;
lbajardsilogic@0 456
lbajardsilogic@0 457 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 458 path.moveTo(w0 + i, h0 + i + 2);
lbajardsilogic@0 459 path.quadTo(w/2, i * 1.25, w1 - i, h0 + i + 2);
lbajardsilogic@0 460 path.lineTo(w1 - i, h1 - i - 2);
lbajardsilogic@0 461 path.quadTo(w/2, h - i * 1.25, w0 + i, h1 - i - 2);
lbajardsilogic@0 462 path.closeSubpath();
lbajardsilogic@0 463 } else {
lbajardsilogic@0 464 path.moveTo(w0 + i + 2, h0 + i);
lbajardsilogic@0 465 path.quadTo(i * 1.25, h/2, w0 + i + 2, h1 - i);
lbajardsilogic@0 466 path.lineTo(w1 - i - 2, h1 - i);
lbajardsilogic@0 467 path.quadTo(w - i * 1.25, h/2, w1 - i - 2, h0 + i);
lbajardsilogic@0 468 path.closeSubpath();
lbajardsilogic@0 469 }
lbajardsilogic@0 470
lbajardsilogic@0 471 paint.drawPath(path);
lbajardsilogic@0 472 }
lbajardsilogic@0 473
lbajardsilogic@0 474 paint.setClipRect(subclip);
lbajardsilogic@0 475
lbajardsilogic@0 476 float radians = m_rotation * 1.5f * M_PI;
lbajardsilogic@0 477
lbajardsilogic@0 478 // std::cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << std::endl;
lbajardsilogic@0 479
lbajardsilogic@0 480 w = (m_orientation == Qt::Horizontal ? width() : height()) - bw*2;
lbajardsilogic@0 481
lbajardsilogic@0 482 // total number of notches on the entire wheel
lbajardsilogic@0 483 int notches = 25;
lbajardsilogic@0 484
lbajardsilogic@0 485 // radius of the wheel including invisible part
lbajardsilogic@0 486 int radius = int(w / 2 + 2);
lbajardsilogic@0 487
lbajardsilogic@0 488 for (int i = 0; i < notches; ++i) {
lbajardsilogic@0 489
lbajardsilogic@0 490 float a0 = (2.f * M_PI * i) / notches + radians;
lbajardsilogic@0 491 float a1 = a0 + M_PI / (notches * 2);
lbajardsilogic@0 492 float a2 = (2.f * M_PI * (i + 1)) / notches + radians;
lbajardsilogic@0 493
lbajardsilogic@0 494 float depth = cosf((a0 + a2) / 2);
lbajardsilogic@0 495 if (depth < 0) continue;
lbajardsilogic@0 496
lbajardsilogic@0 497 float x0 = radius * sinf(a0) + w/2;
lbajardsilogic@0 498 float x1 = radius * sinf(a1) + w/2;
lbajardsilogic@0 499 float x2 = radius * sinf(a2) + w/2;
lbajardsilogic@0 500 if (x2 < 0 || x0 > w) continue;
lbajardsilogic@0 501
lbajardsilogic@0 502 if (x0 < 0) x0 = 0;
lbajardsilogic@0 503 if (x2 > w) x2 = w;
lbajardsilogic@0 504
lbajardsilogic@0 505 x0 += bw;
lbajardsilogic@0 506 x1 += bw;
lbajardsilogic@0 507 x2 += bw;
lbajardsilogic@0 508
lbajardsilogic@0 509 int grey = lrintf(255 * depth);
lbajardsilogic@0 510 QColor fc = QColor(grey, grey, grey);
lbajardsilogic@0 511 QColor oc = palette().dark().color();
lbajardsilogic@0 512
lbajardsilogic@0 513 paint.setPen(oc);
lbajardsilogic@0 514 paint.setBrush(fc);
lbajardsilogic@0 515
lbajardsilogic@0 516 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 517 paint.drawRect(QRectF(x1, bw, x2 - x1, height() - bw*2));
lbajardsilogic@0 518 } else {
lbajardsilogic@0 519 paint.drawRect(QRectF(bw, x1, width() - bw*2, x2 - x1));
lbajardsilogic@0 520 }
lbajardsilogic@0 521
lbajardsilogic@0 522 if (m_showScale) {
lbajardsilogic@0 523
lbajardsilogic@0 524 paint.setBrush(oc);
lbajardsilogic@0 525
lbajardsilogic@0 526 float prop;
lbajardsilogic@0 527 if (i >= notches / 4) {
lbajardsilogic@0 528 prop = float(notches - (((i - float(notches) / 4.f) * 4.f) / 3.f))
lbajardsilogic@0 529 / notches;
lbajardsilogic@0 530 } else {
lbajardsilogic@0 531 prop = 0.f;
lbajardsilogic@0 532 }
lbajardsilogic@0 533
lbajardsilogic@0 534 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 535 paint.drawRect(QRectF(x1, height() - (height() - bw*2) * prop - bw,
lbajardsilogic@0 536 x2 - x1, height() * prop));
lbajardsilogic@0 537 } else {
lbajardsilogic@0 538 paint.drawRect(QRectF(bw, x1, (width() - bw*2) * prop, x2 - x1));
lbajardsilogic@0 539 }
lbajardsilogic@0 540 }
lbajardsilogic@0 541
lbajardsilogic@0 542 paint.setPen(oc);
lbajardsilogic@0 543 paint.setBrush(palette().background().color());
lbajardsilogic@0 544
lbajardsilogic@0 545 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 546 paint.drawRect(QRectF(x0, bw, x1 - x0, height() - bw*2));
lbajardsilogic@0 547 } else {
lbajardsilogic@0 548 paint.drawRect(QRectF(bw, x0, width() - bw*2, x1 - x0));
lbajardsilogic@0 549 }
lbajardsilogic@0 550 }
lbajardsilogic@0 551 }
lbajardsilogic@0 552
lbajardsilogic@0 553 QSize
lbajardsilogic@0 554 Thumbwheel::sizeHint() const
lbajardsilogic@0 555 {
lbajardsilogic@0 556 if (m_orientation == Qt::Horizontal) {
lbajardsilogic@0 557 return QSize(80, 12);
lbajardsilogic@0 558 } else {
lbajardsilogic@0 559 return QSize(12, 80);
lbajardsilogic@0 560 }
lbajardsilogic@0 561 }
lbajardsilogic@0 562