annotate widgets/LevelPanToolButton.cpp @ 1212:a1ee3108d1d3 3.0-integration

Make the colour 3d plot renderer able to support more than one level of peak cache; introduce a second "peak" cache for the spectrogram layer that actually has a 1-1 column relationship with the underlying FFT model, and use it in addition to the existing peak cache if memory is plentiful. Makes spectrograms appear much faster in many common situations.
author Chris Cannam
date Thu, 05 Jan 2017 14:02:54 +0000
parents 808d375a3b12
children 8ef67917c301
rev   line source
Chris@929 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@929 2
Chris@929 3 /*
Chris@929 4 Sonic Visualiser
Chris@929 5 An audio file viewer and annotation editor.
Chris@929 6 Centre for Digital Music, Queen Mary, University of London.
Chris@929 7
Chris@929 8 This program is free software; you can redistribute it and/or
Chris@929 9 modify it under the terms of the GNU General Public License as
Chris@929 10 published by the Free Software Foundation; either version 2 of the
Chris@929 11 License, or (at your option) any later version. See the file
Chris@929 12 COPYING included with this distribution for more information.
Chris@929 13 */
Chris@929 14
Chris@929 15 #include "LevelPanToolButton.h"
Chris@929 16 #include "LevelPanWidget.h"
Chris@929 17
Chris@929 18 #include <QMenu>
Chris@929 19 #include <QWidgetAction>
Chris@929 20 #include <QImage>
Chris@936 21 #include <QStylePainter>
Chris@936 22 #include <QStyleOptionToolButton>
Chris@929 23
Chris@929 24 #include <iostream>
Chris@929 25 using std::cerr;
Chris@929 26 using std::endl;
Chris@929 27
Chris@929 28 LevelPanToolButton::LevelPanToolButton(QWidget *parent) :
Chris@929 29 QToolButton(parent),
Chris@930 30 m_pixels(32),
Chris@942 31 m_pixelsBig(32 * 3),
Chris@930 32 m_muted(false),
Chris@930 33 m_savedLevel(1.f)
Chris@929 34 {
Chris@929 35 m_lpw = new LevelPanWidget();
Chris@929 36
Chris@929 37 connect(m_lpw, SIGNAL(levelChanged(float)), this, SIGNAL(levelChanged(float)));
Chris@930 38 connect(m_lpw, SIGNAL(levelChanged(float)), this, SLOT(selfLevelChanged(float)));
Chris@929 39
Chris@929 40 connect(m_lpw, SIGNAL(panChanged(float)), this, SIGNAL(panChanged(float)));
Chris@932 41 connect(m_lpw, SIGNAL(panChanged(float)), this, SLOT(update()));
Chris@930 42
Chris@930 43 connect(this, SIGNAL(clicked(bool)), this, SLOT(selfClicked()));
Chris@929 44
Chris@929 45 QMenu *menu = new QMenu();
Chris@929 46 QWidgetAction *wa = new QWidgetAction(menu);
Chris@929 47 wa->setDefaultWidget(m_lpw);
Chris@929 48 menu->addAction(wa);
Chris@929 49
Chris@936 50 setPopupMode(InstantPopup);
Chris@929 51 setMenu(menu);
Chris@1191 52 setToolTip(tr("Click to adjust level and pan"));
Chris@929 53
Chris@932 54 setImageSize(m_pixels);
Chris@942 55 setBigImageSize(m_pixelsBig);
Chris@929 56 }
Chris@929 57
Chris@929 58 LevelPanToolButton::~LevelPanToolButton()
Chris@929 59 {
Chris@929 60 }
Chris@929 61
Chris@1200 62 void
Chris@1200 63 LevelPanToolButton::wheelEvent(QWheelEvent *e)
Chris@1200 64 {
Chris@1200 65 m_lpw->wheelEvent(e);
Chris@1200 66 }
Chris@1200 67
Chris@929 68 float
Chris@929 69 LevelPanToolButton::getLevel() const
Chris@929 70 {
Chris@929 71 return m_lpw->getLevel();
Chris@929 72 }
Chris@929 73
Chris@929 74 float
Chris@929 75 LevelPanToolButton::getPan() const
Chris@929 76 {
Chris@929 77 return m_lpw->getPan();
Chris@929 78 }
Chris@929 79
Chris@940 80 bool
Chris@940 81 LevelPanToolButton::includesMute() const
Chris@940 82 {
Chris@940 83 return m_lpw->includesMute();
Chris@940 84 }
Chris@940 85
Chris@929 86 void
Chris@929 87 LevelPanToolButton::setImageSize(int pixels)
Chris@929 88 {
Chris@929 89 m_pixels = pixels;
Chris@932 90
Chris@932 91 QPixmap px(m_pixels, m_pixels);
Chris@932 92 px.fill(Qt::transparent);
Chris@932 93 setIcon(px);
Chris@942 94 }
Chris@932 95
Chris@942 96 void
Chris@942 97 LevelPanToolButton::setBigImageSize(int pixels)
Chris@942 98 {
Chris@942 99 m_pixelsBig = pixels;
Chris@942 100
Chris@942 101 m_lpw->setFixedWidth(m_pixelsBig);
Chris@942 102 m_lpw->setFixedHeight(m_pixelsBig);
Chris@929 103 }
Chris@929 104
Chris@929 105 void
Chris@929 106 LevelPanToolButton::setLevel(float level)
Chris@929 107 {
Chris@929 108 m_lpw->setLevel(level);
Chris@932 109 update();
Chris@929 110 }
Chris@929 111
Chris@929 112 void
Chris@929 113 LevelPanToolButton::setPan(float pan)
Chris@929 114 {
Chris@929 115 m_lpw->setPan(pan);
Chris@932 116 update();
Chris@930 117 }
Chris@930 118
Chris@930 119 void
Chris@1187 120 LevelPanToolButton::setMonitoringLevels(float left, float right)
Chris@1187 121 {
Chris@1187 122 m_lpw->setMonitoringLevels(left, right);
Chris@1187 123 update();
Chris@1187 124 }
Chris@1187 125
Chris@1187 126 void
Chris@940 127 LevelPanToolButton::setIncludeMute(bool include)
Chris@940 128 {
Chris@940 129 m_lpw->setIncludeMute(include);
Chris@940 130 update();
Chris@940 131 }
Chris@940 132
Chris@940 133 void
Chris@933 134 LevelPanToolButton::setEnabled(bool enabled)
Chris@933 135 {
Chris@933 136 m_lpw->setEnabled(enabled);
Chris@933 137 QToolButton::setEnabled(enabled);
Chris@933 138 }
Chris@933 139
Chris@933 140 void
Chris@930 141 LevelPanToolButton::selfLevelChanged(float level)
Chris@930 142 {
Chris@930 143 if (level > 0.f) {
Chris@930 144 m_muted = false;
Chris@930 145 } else {
Chris@930 146 m_muted = true;
Chris@930 147 m_savedLevel = 1.f;
Chris@930 148 }
Chris@932 149 update();
Chris@930 150 }
Chris@930 151
Chris@930 152 void
Chris@930 153 LevelPanToolButton::selfClicked()
Chris@930 154 {
Chris@930 155 cerr << "selfClicked" << endl;
Chris@930 156
Chris@930 157 if (m_muted) {
Chris@930 158 m_muted = false;
Chris@930 159 m_lpw->setLevel(m_savedLevel);
Chris@931 160 emit levelChanged(m_savedLevel);
Chris@930 161 } else {
Chris@930 162 m_savedLevel = m_lpw->getLevel();
Chris@930 163 m_muted = true;
Chris@930 164 m_lpw->setLevel(0.f);
Chris@931 165 emit levelChanged(0.f);
Chris@930 166 }
Chris@932 167 update();
Chris@929 168 }
Chris@929 169
Chris@929 170 void
Chris@936 171 LevelPanToolButton::paintEvent(QPaintEvent *)
Chris@929 172 {
Chris@936 173 QStylePainter p(this);
Chris@936 174 QStyleOptionToolButton opt;
Chris@936 175 initStyleOption(&opt);
Chris@936 176 opt.features &= (~QStyleOptionToolButton::HasMenu);
Chris@936 177 p.drawComplexControl(QStyle::CC_ToolButton, opt);
Chris@936 178
Chris@934 179 if (m_pixels >= height()) {
Chris@934 180 setImageSize(height()-1);
Chris@934 181 }
Chris@936 182
Chris@932 183 double margin = (double(height()) - m_pixels) / 2.0;
Chris@932 184 m_lpw->renderTo(this, QRectF(margin, margin, m_pixels, m_pixels), false);
Chris@929 185 }
Chris@929 186
Chris@1180 187 void
Chris@1180 188 LevelPanToolButton::enterEvent(QEvent *e)
Chris@1180 189 {
Chris@1180 190 QToolButton::enterEvent(e);
Chris@1180 191 emit mouseEntered();
Chris@1180 192 }
Chris@932 193
Chris@1180 194 void
Chris@1180 195 LevelPanToolButton::leaveEvent(QEvent *e)
Chris@1180 196 {
Chris@1180 197 QToolButton::enterEvent(e);
Chris@1180 198 emit mouseLeft();
Chris@1180 199 }
Chris@1180 200
Chris@1180 201