annotate widgets/Fader.cpp @ 101:0f36cdf407a6 sv1-v0.9rc1

* Make vertical scale alignment modes work in note layer as well as time-value layer, and several significant fixes to it * Make it possible to draw notes properly on the note layer * Show units (and frequencies etc in note layer's case) in the time-value and note layer description boxes * Minor fix to item edit dialog layout * Some minor menu rearrangement * Comment out a lot of debug output * Add SV website and reference URLs to Help menu, and add code to (attempt to) open them in the user's preferred browser
author Chris Cannam
date Fri, 12 May 2006 14:40:43 +0000
parents 82482231b6b1
children 5d3a483856ff
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 * Horizontal audio fader and meter widget.
Chris@0 17 *
Chris@0 18 * Based on the vertical fader and meter widget from the Hydrogen drum
Chris@0 19 * machine. (Any poor taste that has crept in during the
Chris@0 20 * modifications for this application is entirely my own, however.)
Chris@0 21 * The following copyright notice applies to code from this file, and
Chris@0 22 * also to the files in icons/fader_*.png (also modified by me). --cc
Chris@0 23 */
Chris@0 24
Chris@0 25 /**
Chris@0 26 * Hydrogen
Chris@0 27 * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net]
Chris@0 28 *
Chris@0 29 * http://www.hydrogen-music.org
Chris@0 30 *
Chris@0 31 * This program is free software; you can redistribute it and/or modify
Chris@0 32 * it under the terms of the GNU General Public License as published by
Chris@0 33 * the Free Software Foundation; either version 2 of the License, or
Chris@0 34 * (at your option) any later version.
Chris@0 35 *
Chris@0 36 * This program is distributed in the hope that it will be useful,
Chris@0 37 * but WITHOUT ANY WARRANTY, without even the implied warranty of
Chris@0 38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 39 * GNU General Public License for more details.
Chris@0 40 *
Chris@0 41 * You should have received a copy of the GNU General Public License
Chris@0 42 * along with this program; if not, write to the Free Software
Chris@0 43 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@0 44 */
Chris@0 45
Chris@0 46
Chris@0 47 #include "Fader.h"
Chris@0 48
Chris@0 49 #include "base/AudioLevel.h"
Chris@0 50
Chris@0 51 #include <QMouseEvent>
Chris@0 52 #include <QPixmap>
Chris@0 53 #include <QWheelEvent>
Chris@0 54 #include <QPaintEvent>
Chris@0 55 #include <QPainter>
Chris@0 56
Chris@0 57 Fader::Fader(QWidget *parent, bool withoutKnob) :
Chris@0 58 QWidget(parent),
Chris@0 59 m_withoutKnob(withoutKnob),
Chris@0 60 m_value(1.0),
Chris@0 61 m_peakLeft(0.0),
Chris@0 62 m_peakRight(0.0)
Chris@0 63 {
Chris@0 64 setMinimumSize(116, 23);
Chris@0 65 setMaximumSize(116, 23);
Chris@0 66 resize(116, 23);
Chris@0 67
Chris@0 68 QString background_path = ":/icons/fader_background.png";
Chris@0 69 bool ok = m_back.load(background_path);
Chris@0 70 if (ok == false) {
Chris@0 71 std::cerr << "Fader: Error loading pixmap" << std::endl;
Chris@0 72 }
Chris@0 73
Chris@0 74 QString leds_path = ":/icons/fader_leds.png";
Chris@0 75 ok = m_leds.load(leds_path);
Chris@0 76 if (ok == false) {
Chris@0 77 std::cerr << "Error loading pixmap" << std::endl;
Chris@0 78 }
Chris@0 79
Chris@0 80 QString knob_path = ":/icons/fader_knob.png";
Chris@0 81 ok = m_knob.load(knob_path);
Chris@0 82 if (ok == false) {
Chris@0 83 std::cerr << "Error loading pixmap" << std::endl;
Chris@0 84 }
Chris@0 85
Chris@0 86 QString clip_path = ":/icons/fader_knob_red.png";
Chris@0 87 ok = m_clip.load(clip_path);
Chris@0 88 if (ok == false) {
Chris@0 89 std::cerr << "Error loading pixmap" << std::endl;
Chris@0 90 }
Chris@0 91 }
Chris@0 92
Chris@0 93 Fader::~Fader()
Chris@0 94 {
Chris@0 95
Chris@0 96 }
Chris@0 97
Chris@0 98 void
Chris@0 99 Fader::mouseMoveEvent(QMouseEvent *ev)
Chris@0 100 {
Chris@0 101 int x = ev->x() - 6;
Chris@0 102 const int max_x = 116 - 12;
Chris@0 103
Chris@0 104 int value = x;
Chris@0 105
Chris@0 106 if (value > max_x) {
Chris@0 107 value = max_x;
Chris@0 108 } else if (value < 0) {
Chris@0 109 value = 0;
Chris@0 110 }
Chris@0 111
Chris@0 112 // float fval = float(value) / float(max_x);
Chris@0 113 float fval = AudioLevel::fader_to_multiplier
Chris@0 114 (value, max_x, AudioLevel::LongFader);
Chris@0 115
Chris@0 116 setValue(fval);
Chris@0 117 emit valueChanged(fval);
Chris@0 118
Chris@0 119 update();
Chris@0 120 }
Chris@0 121
Chris@0 122
Chris@0 123 void
Chris@0 124 Fader::mouseDoubleClickEvent(QMouseEvent *)
Chris@0 125 {
Chris@0 126 setValue(1.0);
Chris@0 127 emit valueChanged(1.0);
Chris@0 128 update();
Chris@0 129 }
Chris@0 130
Chris@0 131 void
Chris@0 132 Fader::mousePressEvent(QMouseEvent *ev)
Chris@0 133 {
Chris@82 134 if (ev->button() == Qt::MidButton) {
Chris@82 135 setValue(1.0);
Chris@82 136 emit valueChanged(1.0);
Chris@82 137 update();
Chris@82 138 return;
Chris@82 139 }
Chris@82 140
Chris@0 141 int x = ev->x() - 6;
Chris@0 142 const int max_x = 116 - 12;
Chris@0 143
Chris@0 144 int value = x;
Chris@0 145
Chris@0 146 if (value > max_x) {
Chris@0 147 value = max_x;
Chris@0 148 } else if (value < 0) {
Chris@0 149 value = 0;
Chris@0 150 }
Chris@0 151
Chris@0 152 float fval = AudioLevel::fader_to_multiplier
Chris@0 153 (value, max_x, AudioLevel::LongFader);
Chris@0 154
Chris@0 155 setValue(fval);
Chris@0 156 emit valueChanged(fval);
Chris@0 157
Chris@0 158 update();
Chris@0 159 }
Chris@0 160
Chris@0 161
Chris@0 162 void
Chris@0 163 Fader::wheelEvent(QWheelEvent *ev)
Chris@0 164 {
Chris@0 165 ev->accept();
Chris@0 166
Chris@0 167 //!!! needs improvement
Chris@0 168
Chris@0 169 if (ev->delta() > 0) {
Chris@0 170 setValue(m_value * 1.1);
Chris@0 171 } else {
Chris@0 172 setValue(m_value / 1.1);
Chris@0 173 }
Chris@0 174
Chris@0 175 update();
Chris@0 176 emit valueChanged(getValue());
Chris@0 177 }
Chris@0 178
Chris@0 179
Chris@0 180 void
Chris@0 181 Fader::setValue(float v)
Chris@0 182 {
Chris@0 183 float max = AudioLevel::dB_to_multiplier(10.0);
Chris@0 184
Chris@0 185 if (v > max) {
Chris@0 186 v = max;
Chris@0 187 } else if (v < 0.0) {
Chris@0 188 v = 0.0;
Chris@0 189 }
Chris@0 190
Chris@0 191 if (m_value != v) {
Chris@0 192 m_value = v;
Chris@0 193 float db = AudioLevel::multiplier_to_dB(m_value);
Chris@0 194 if (db <= AudioLevel::DB_FLOOR) {
Chris@0 195 setToolTip(tr("Level: Off"));
Chris@0 196 } else {
Chris@0 197 setToolTip(tr("Level: %1%2.%3%4 dB")
Chris@0 198 .arg(db < 0.0 ? "-" : "")
Chris@0 199 .arg(abs(int(db)))
Chris@0 200 .arg(abs(int(db * 10.0) % 10))
Chris@0 201 .arg(abs(int(db * 100.0) % 10)));
Chris@0 202 }
Chris@0 203 update();
Chris@0 204 }
Chris@0 205 }
Chris@0 206
Chris@0 207
Chris@0 208 float
Chris@0 209 Fader::getValue()
Chris@0 210 {
Chris@0 211 return m_value;
Chris@0 212 }
Chris@0 213
Chris@0 214
Chris@0 215
Chris@0 216 void
Chris@0 217 Fader::setPeakLeft(float peak)
Chris@0 218 {
Chris@0 219 if (this->m_peakLeft != peak) {
Chris@0 220 this->m_peakLeft = peak;
Chris@0 221 update();
Chris@0 222 }
Chris@0 223 }
Chris@0 224
Chris@0 225
Chris@0 226 void
Chris@0 227 Fader::setPeakRight(float peak)
Chris@0 228 {
Chris@0 229 if (this->m_peakRight != peak) {
Chris@0 230 this->m_peakRight = peak;
Chris@0 231 update();
Chris@0 232 }
Chris@0 233 }
Chris@0 234
Chris@0 235
Chris@0 236 void
Chris@0 237 Fader::paintEvent(QPaintEvent *)
Chris@0 238 {
Chris@0 239 QPainter painter(this);
Chris@0 240
Chris@0 241 // background
Chris@0 242 painter.drawPixmap(rect(), m_back, QRect(0, 0, 116, 23));
Chris@0 243
Chris@0 244 int offset_L = AudioLevel::multiplier_to_fader(m_peakLeft, 116,
Chris@0 245 AudioLevel::IEC268LongMeter);
Chris@0 246
Chris@0 247 painter.drawPixmap(QRect(0, 0, offset_L, 11), m_leds,
Chris@0 248 QRect(0, 0, offset_L, 11));
Chris@0 249
Chris@0 250 int offset_R = AudioLevel::multiplier_to_fader(m_peakRight, 116,
Chris@0 251 AudioLevel::IEC268LongMeter);
Chris@0 252
Chris@0 253 painter.drawPixmap(QRect(0, 11, offset_R, 11), m_leds,
Chris@0 254 QRect(0, 11, offset_R, 11));
Chris@0 255
Chris@0 256 if (m_withoutKnob == false) {
Chris@0 257
Chris@0 258 static const uint knob_width = 29;
Chris@0 259 static const uint knob_height = 9;
Chris@0 260
Chris@0 261 int x = AudioLevel::multiplier_to_fader(m_value, 116 - knob_width,
Chris@0 262 AudioLevel::LongFader);
Chris@0 263
Chris@0 264 bool clipping = (m_peakLeft > 1.0 || m_peakRight > 1.0);
Chris@0 265
Chris@0 266 painter.drawPixmap(QRect(x, 7, knob_width, knob_height),
Chris@0 267 clipping ? m_clip : m_knob,
Chris@0 268 QRect(0, 0, knob_width, knob_height));
Chris@0 269 }
Chris@0 270 }
Chris@0 271
Chris@0 272