annotate widgets/LevelPanToolButton.cpp @ 1215:c603aba61702 3.0-integration

Fix memory leak of cache pixmaps in View
author Chris Cannam
date Fri, 13 Jan 2017 10:22:04 +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