annotate widgets/Panner.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 "Panner.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include <QMouseEvent>
lbajardsilogic@0 19 #include <QPaintEvent>
lbajardsilogic@0 20 #include <QWheelEvent>
lbajardsilogic@0 21 #include <QPainter>
lbajardsilogic@0 22
lbajardsilogic@0 23 #include <iostream>
lbajardsilogic@0 24 #include <cmath>
lbajardsilogic@0 25
lbajardsilogic@0 26 #include "system/System.h"
lbajardsilogic@0 27
lbajardsilogic@0 28 Panner::Panner(QWidget *parent) :
lbajardsilogic@0 29 QWidget(parent),
lbajardsilogic@0 30 m_rectX(0),
lbajardsilogic@0 31 m_rectY(0),
lbajardsilogic@0 32 m_rectWidth(1),
lbajardsilogic@0 33 m_rectHeight(1),
lbajardsilogic@0 34 m_defaultCentreX(0),
lbajardsilogic@0 35 m_defaultCentreY(0),
lbajardsilogic@0 36 m_defaultsSet(false),
lbajardsilogic@0 37 m_thumbColour(palette().highlightedText().color()),
lbajardsilogic@0 38 m_backgroundAlpha(255),
lbajardsilogic@0 39 m_thumbAlpha(255),
lbajardsilogic@0 40 m_clicked(false)
lbajardsilogic@0 41 {
lbajardsilogic@0 42 }
lbajardsilogic@0 43
lbajardsilogic@0 44 Panner::~Panner()
lbajardsilogic@0 45 {
lbajardsilogic@0 46 }
lbajardsilogic@0 47
lbajardsilogic@0 48 void
lbajardsilogic@0 49 Panner::setAlpha(int backgroundAlpha, int thumbAlpha)
lbajardsilogic@0 50 {
lbajardsilogic@0 51 m_backgroundAlpha = backgroundAlpha;
lbajardsilogic@0 52 m_thumbAlpha = thumbAlpha;
lbajardsilogic@0 53 }
lbajardsilogic@0 54
lbajardsilogic@0 55 void
lbajardsilogic@0 56 Panner::mousePressEvent(QMouseEvent *e)
lbajardsilogic@0 57 {
lbajardsilogic@0 58 if (e->button() == Qt::MidButton ||
lbajardsilogic@0 59 ((e->button() == Qt::LeftButton) &&
lbajardsilogic@0 60 (e->modifiers() & Qt::ControlModifier))) {
lbajardsilogic@0 61 resetToDefault();
lbajardsilogic@0 62 } else if (e->button() == Qt::LeftButton) {
lbajardsilogic@0 63 m_clicked = true;
lbajardsilogic@0 64 m_clickPos = e->pos();
lbajardsilogic@0 65 m_dragStartX = m_rectX;
lbajardsilogic@0 66 m_dragStartY = m_rectY;
lbajardsilogic@0 67 }
lbajardsilogic@0 68 }
lbajardsilogic@0 69
lbajardsilogic@0 70 void
lbajardsilogic@0 71 Panner::mouseDoubleClickEvent(QMouseEvent *e)
lbajardsilogic@0 72 {
lbajardsilogic@0 73 if (e->button() != Qt::LeftButton) {
lbajardsilogic@0 74 return;
lbajardsilogic@0 75 }
lbajardsilogic@0 76
lbajardsilogic@0 77 emit doubleClicked();
lbajardsilogic@0 78 }
lbajardsilogic@0 79
lbajardsilogic@0 80 void
lbajardsilogic@0 81 Panner::mouseMoveEvent(QMouseEvent *e)
lbajardsilogic@0 82 {
lbajardsilogic@0 83 if (!m_clicked) return;
lbajardsilogic@0 84
lbajardsilogic@0 85 float dx = float(e->pos().x() - m_clickPos.x()) / float(width());
lbajardsilogic@0 86 float dy = float(e->pos().y() - m_clickPos.y()) / float(height());
lbajardsilogic@0 87
lbajardsilogic@0 88 m_rectX = m_dragStartX + dx;
lbajardsilogic@0 89 m_rectY = m_dragStartY + dy;
lbajardsilogic@0 90
lbajardsilogic@0 91 normalise();
lbajardsilogic@0 92 repaint();
lbajardsilogic@0 93 emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight);
lbajardsilogic@0 94 emit rectCentreMoved(centreX(), centreY());
lbajardsilogic@0 95 }
lbajardsilogic@0 96
lbajardsilogic@0 97 void
lbajardsilogic@0 98 Panner::mouseReleaseEvent(QMouseEvent *e)
lbajardsilogic@0 99 {
lbajardsilogic@0 100 if (!m_clicked) return;
lbajardsilogic@0 101
lbajardsilogic@0 102 mouseMoveEvent(e);
lbajardsilogic@0 103 m_clicked = false;
lbajardsilogic@0 104 }
lbajardsilogic@0 105
lbajardsilogic@0 106 void
lbajardsilogic@0 107 Panner::wheelEvent(QWheelEvent *e)
lbajardsilogic@0 108 {
lbajardsilogic@0 109 if (e->delta() < 0) {
lbajardsilogic@0 110 m_rectY += 0.1;
lbajardsilogic@0 111 } else {
lbajardsilogic@0 112 m_rectY -= 0.1;
lbajardsilogic@0 113 }
lbajardsilogic@0 114
lbajardsilogic@0 115 normalise();
lbajardsilogic@0 116 emitAndUpdate();
lbajardsilogic@0 117 }
lbajardsilogic@0 118
lbajardsilogic@0 119 void
lbajardsilogic@0 120 Panner::enterEvent(QEvent *)
lbajardsilogic@0 121 {
lbajardsilogic@0 122 emit mouseEntered();
lbajardsilogic@0 123 }
lbajardsilogic@0 124
lbajardsilogic@0 125 void
lbajardsilogic@0 126 Panner::leaveEvent(QEvent *)
lbajardsilogic@0 127 {
lbajardsilogic@0 128 emit mouseLeft();
lbajardsilogic@0 129 }
lbajardsilogic@0 130
lbajardsilogic@0 131 void
lbajardsilogic@0 132 Panner::paintEvent(QPaintEvent *)
lbajardsilogic@0 133 {
lbajardsilogic@0 134 QPainter paint(this);
lbajardsilogic@0 135 paint.setRenderHint(QPainter::Antialiasing, false);
lbajardsilogic@0 136
lbajardsilogic@0 137 QColor bg(palette().background().color());
lbajardsilogic@0 138 bg.setAlpha(m_backgroundAlpha);
lbajardsilogic@0 139
lbajardsilogic@0 140 paint.setPen(palette().dark().color());
lbajardsilogic@0 141 paint.setBrush(bg);
lbajardsilogic@0 142 paint.drawRect(0, 0, width(), height());
lbajardsilogic@0 143
lbajardsilogic@0 144 QColor hl(m_thumbColour);
lbajardsilogic@0 145 hl.setAlpha(m_thumbAlpha);
lbajardsilogic@0 146
lbajardsilogic@0 147 paint.setBrush(hl);
lbajardsilogic@0 148
lbajardsilogic@0 149 paint.drawRect(lrintf(width() * m_rectX),
lbajardsilogic@0 150 lrintf(height() * m_rectY),
lbajardsilogic@0 151 lrintf(width() * m_rectWidth),
lbajardsilogic@0 152 lrintf(height() * m_rectHeight));
lbajardsilogic@0 153 }
lbajardsilogic@0 154
lbajardsilogic@0 155 void
lbajardsilogic@0 156 Panner::normalise()
lbajardsilogic@0 157 {
lbajardsilogic@0 158 if (m_rectWidth > 1.0) m_rectWidth = 1.0;
lbajardsilogic@0 159 if (m_rectHeight > 1.0) m_rectHeight = 1.0;
lbajardsilogic@0 160 if (m_rectX + m_rectWidth > 1.0) m_rectX = 1.0 - m_rectWidth;
lbajardsilogic@0 161 if (m_rectX < 0) m_rectX = 0;
lbajardsilogic@0 162 if (m_rectY + m_rectHeight > 1.0) m_rectY = 1.0 - m_rectHeight;
lbajardsilogic@0 163 if (m_rectY < 0) m_rectY = 0;
lbajardsilogic@0 164
lbajardsilogic@0 165 if (!m_defaultsSet) {
lbajardsilogic@0 166 m_defaultCentreX = centreX();
lbajardsilogic@0 167 m_defaultCentreY = centreY();
lbajardsilogic@0 168 m_defaultsSet = true;
lbajardsilogic@0 169 }
lbajardsilogic@0 170 }
lbajardsilogic@0 171
lbajardsilogic@0 172 void
lbajardsilogic@0 173 Panner::emitAndUpdate()
lbajardsilogic@0 174 {
lbajardsilogic@0 175 emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight);
lbajardsilogic@0 176 emit rectCentreMoved(centreX(), centreY());
lbajardsilogic@0 177 update();
lbajardsilogic@0 178 }
lbajardsilogic@0 179
lbajardsilogic@0 180 void
lbajardsilogic@0 181 Panner::getRectExtents(float &x0, float &y0, float &width, float &height)
lbajardsilogic@0 182 {
lbajardsilogic@0 183 x0 = m_rectX;
lbajardsilogic@0 184 y0 = m_rectY;
lbajardsilogic@0 185 width = m_rectWidth;
lbajardsilogic@0 186 height = m_rectHeight;
lbajardsilogic@0 187 }
lbajardsilogic@0 188
lbajardsilogic@0 189 void
lbajardsilogic@0 190 Panner::setRectExtents(float x0, float y0, float width, float height)
lbajardsilogic@0 191 {
lbajardsilogic@0 192 // std::cerr << "Panner::setRectExtents(" << x0 << ", " << y0 << ", "
lbajardsilogic@0 193 // << width << ", " << height << ")" << std::endl;
lbajardsilogic@0 194
lbajardsilogic@0 195 if (m_rectX == x0 &&
lbajardsilogic@0 196 m_rectY == y0 &&
lbajardsilogic@0 197 m_rectWidth == width &&
lbajardsilogic@0 198 m_rectHeight == height) {
lbajardsilogic@0 199 return;
lbajardsilogic@0 200 }
lbajardsilogic@0 201
lbajardsilogic@0 202 m_rectX = x0;
lbajardsilogic@0 203 m_rectY = y0;
lbajardsilogic@0 204 m_rectWidth = width;
lbajardsilogic@0 205 m_rectHeight = height;
lbajardsilogic@0 206
lbajardsilogic@0 207 normalise();
lbajardsilogic@0 208 emitAndUpdate();
lbajardsilogic@0 209 }
lbajardsilogic@0 210
lbajardsilogic@0 211 void
lbajardsilogic@0 212 Panner::setRectWidth(float width)
lbajardsilogic@0 213 {
lbajardsilogic@0 214 if (m_rectWidth == width) return;
lbajardsilogic@0 215 m_rectWidth = width;
lbajardsilogic@0 216 normalise();
lbajardsilogic@0 217 emitAndUpdate();
lbajardsilogic@0 218 }
lbajardsilogic@0 219
lbajardsilogic@0 220 void
lbajardsilogic@0 221 Panner::setRectHeight(float height)
lbajardsilogic@0 222 {
lbajardsilogic@0 223 if (m_rectHeight == height) return;
lbajardsilogic@0 224 m_rectHeight = height;
lbajardsilogic@0 225 normalise();
lbajardsilogic@0 226 emitAndUpdate();
lbajardsilogic@0 227 }
lbajardsilogic@0 228
lbajardsilogic@0 229 void
lbajardsilogic@0 230 Panner::setRectCentreX(float x)
lbajardsilogic@0 231 {
lbajardsilogic@0 232 float x0 = x - m_rectWidth/2;
lbajardsilogic@0 233 if (x0 == m_rectX) return;
lbajardsilogic@0 234 m_rectX = x0;
lbajardsilogic@0 235 normalise();
lbajardsilogic@0 236 emitAndUpdate();
lbajardsilogic@0 237 }
lbajardsilogic@0 238
lbajardsilogic@0 239 void
lbajardsilogic@0 240 Panner::setRectCentreY(float y)
lbajardsilogic@0 241 {
lbajardsilogic@0 242 float y0 = y - m_rectHeight/2;
lbajardsilogic@0 243 if (y0 == m_rectY) return;
lbajardsilogic@0 244 m_rectY = y0;
lbajardsilogic@0 245 normalise();
lbajardsilogic@0 246 emitAndUpdate();
lbajardsilogic@0 247 }
lbajardsilogic@0 248
lbajardsilogic@0 249 QSize
lbajardsilogic@0 250 Panner::sizeHint() const
lbajardsilogic@0 251 {
lbajardsilogic@0 252 return QSize(30, 30);
lbajardsilogic@0 253 }
lbajardsilogic@0 254
lbajardsilogic@0 255 void
lbajardsilogic@0 256 Panner::setDefaultRectCentre(float cx, float cy)
lbajardsilogic@0 257 {
lbajardsilogic@0 258 m_defaultCentreX = cx;
lbajardsilogic@0 259 m_defaultCentreY = cy;
lbajardsilogic@0 260 m_defaultsSet = true;
lbajardsilogic@0 261 }
lbajardsilogic@0 262
lbajardsilogic@0 263 void
lbajardsilogic@0 264 Panner::resetToDefault()
lbajardsilogic@0 265 {
lbajardsilogic@0 266 float x0 = m_defaultCentreX - m_rectWidth/2;
lbajardsilogic@0 267 float y0 = m_defaultCentreY - m_rectHeight/2;
lbajardsilogic@0 268 if (x0 == m_rectX && y0 == m_rectY) return;
lbajardsilogic@0 269 m_rectX = x0;
lbajardsilogic@0 270 m_rectY = y0;
lbajardsilogic@0 271 normalise();
lbajardsilogic@0 272 emitAndUpdate();
lbajardsilogic@0 273 }
lbajardsilogic@0 274
lbajardsilogic@0 275