annotate widgets/LevelPanToolButton.cpp @ 959:2633a1d73e39

Address #1214, layer import produces wrong layer type. We needed a more principled approach to making sure the format gets updated properly and the dialog elements are consistent (basically separating making the dialog elements consistent from subsequently updating the format). This change should provide that, though there may be gotchas still.
author Chris Cannam
date Tue, 12 May 2015 12:31:37 +0100
parents fcbfc7fad1f2
children 6a6a63506e3f
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@929 52
Chris@932 53 setImageSize(m_pixels);
Chris@942 54 setBigImageSize(m_pixelsBig);
Chris@929 55 }
Chris@929 56
Chris@929 57 LevelPanToolButton::~LevelPanToolButton()
Chris@929 58 {
Chris@929 59 }
Chris@929 60
Chris@929 61 float
Chris@929 62 LevelPanToolButton::getLevel() const
Chris@929 63 {
Chris@929 64 return m_lpw->getLevel();
Chris@929 65 }
Chris@929 66
Chris@929 67 float
Chris@929 68 LevelPanToolButton::getPan() const
Chris@929 69 {
Chris@929 70 return m_lpw->getPan();
Chris@929 71 }
Chris@929 72
Chris@940 73 bool
Chris@940 74 LevelPanToolButton::includesMute() const
Chris@940 75 {
Chris@940 76 return m_lpw->includesMute();
Chris@940 77 }
Chris@940 78
Chris@929 79 void
Chris@929 80 LevelPanToolButton::setImageSize(int pixels)
Chris@929 81 {
Chris@929 82 m_pixels = pixels;
Chris@932 83
Chris@932 84 QPixmap px(m_pixels, m_pixels);
Chris@932 85 px.fill(Qt::transparent);
Chris@932 86 setIcon(px);
Chris@942 87 }
Chris@932 88
Chris@942 89 void
Chris@942 90 LevelPanToolButton::setBigImageSize(int pixels)
Chris@942 91 {
Chris@942 92 m_pixelsBig = pixels;
Chris@942 93
Chris@942 94 m_lpw->setFixedWidth(m_pixelsBig);
Chris@942 95 m_lpw->setFixedHeight(m_pixelsBig);
Chris@929 96 }
Chris@929 97
Chris@929 98 void
Chris@929 99 LevelPanToolButton::setLevel(float level)
Chris@929 100 {
Chris@929 101 m_lpw->setLevel(level);
Chris@932 102 update();
Chris@929 103 }
Chris@929 104
Chris@929 105 void
Chris@929 106 LevelPanToolButton::setPan(float pan)
Chris@929 107 {
Chris@929 108 m_lpw->setPan(pan);
Chris@932 109 update();
Chris@930 110 }
Chris@930 111
Chris@930 112 void
Chris@940 113 LevelPanToolButton::setIncludeMute(bool include)
Chris@940 114 {
Chris@940 115 m_lpw->setIncludeMute(include);
Chris@940 116 update();
Chris@940 117 }
Chris@940 118
Chris@940 119 void
Chris@933 120 LevelPanToolButton::setEnabled(bool enabled)
Chris@933 121 {
Chris@933 122 m_lpw->setEnabled(enabled);
Chris@933 123 QToolButton::setEnabled(enabled);
Chris@933 124 }
Chris@933 125
Chris@933 126 void
Chris@930 127 LevelPanToolButton::selfLevelChanged(float level)
Chris@930 128 {
Chris@930 129 if (level > 0.f) {
Chris@930 130 m_muted = false;
Chris@930 131 } else {
Chris@930 132 m_muted = true;
Chris@930 133 m_savedLevel = 1.f;
Chris@930 134 }
Chris@932 135 update();
Chris@930 136 }
Chris@930 137
Chris@930 138 void
Chris@930 139 LevelPanToolButton::selfClicked()
Chris@930 140 {
Chris@930 141 cerr << "selfClicked" << endl;
Chris@930 142
Chris@930 143 if (m_muted) {
Chris@930 144 m_muted = false;
Chris@930 145 m_lpw->setLevel(m_savedLevel);
Chris@931 146 emit levelChanged(m_savedLevel);
Chris@930 147 } else {
Chris@930 148 m_savedLevel = m_lpw->getLevel();
Chris@930 149 m_muted = true;
Chris@930 150 m_lpw->setLevel(0.f);
Chris@931 151 emit levelChanged(0.f);
Chris@930 152 }
Chris@932 153 update();
Chris@929 154 }
Chris@929 155
Chris@929 156 void
Chris@936 157 LevelPanToolButton::paintEvent(QPaintEvent *)
Chris@929 158 {
Chris@936 159 QStylePainter p(this);
Chris@936 160 QStyleOptionToolButton opt;
Chris@936 161 initStyleOption(&opt);
Chris@936 162 opt.features &= (~QStyleOptionToolButton::HasMenu);
Chris@936 163 p.drawComplexControl(QStyle::CC_ToolButton, opt);
Chris@936 164
Chris@934 165 if (m_pixels >= height()) {
Chris@934 166 setImageSize(height()-1);
Chris@934 167 }
Chris@936 168
Chris@932 169 double margin = (double(height()) - m_pixels) / 2.0;
Chris@932 170 m_lpw->renderTo(this, QRectF(margin, margin, m_pixels, m_pixels), false);
Chris@929 171 }
Chris@929 172
Chris@932 173