annotate widgets/PluginParameterBox.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 Chris Cannam and 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 "PluginParameterBox.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "AudioDial.h"
lbajardsilogic@0 19
lbajardsilogic@0 20 #include "plugin/PluginXml.h"
lbajardsilogic@0 21
lbajardsilogic@0 22 #include "base/RangeMapper.h"
lbajardsilogic@0 23
lbajardsilogic@0 24 #include <QDoubleSpinBox>
lbajardsilogic@0 25 #include <QGridLayout>
lbajardsilogic@0 26 #include <QComboBox>
lbajardsilogic@0 27 #include <QCheckBox>
lbajardsilogic@0 28 #include <QLayout>
lbajardsilogic@0 29 #include <QLabel>
lbajardsilogic@0 30
lbajardsilogic@0 31 #include <iostream>
lbajardsilogic@0 32 #include <string>
lbajardsilogic@0 33
lbajardsilogic@0 34 #include <cmath>
lbajardsilogic@0 35
lbajardsilogic@0 36 PluginParameterBox::PluginParameterBox(Vamp::PluginBase *plugin, QWidget *parent) :
lbajardsilogic@0 37 QFrame(parent),
lbajardsilogic@0 38 m_plugin(plugin)
lbajardsilogic@0 39 {
lbajardsilogic@0 40 m_layout = new QGridLayout;
lbajardsilogic@0 41 setLayout(m_layout);
lbajardsilogic@0 42 populate();
lbajardsilogic@0 43 }
lbajardsilogic@0 44
lbajardsilogic@0 45 PluginParameterBox::~PluginParameterBox()
lbajardsilogic@0 46 {
lbajardsilogic@0 47 }
lbajardsilogic@0 48
lbajardsilogic@0 49 void
lbajardsilogic@0 50 PluginParameterBox::populate()
lbajardsilogic@0 51 {
lbajardsilogic@0 52 Vamp::PluginBase::ParameterList params = m_plugin->getParameterDescriptors();
lbajardsilogic@0 53 Vamp::PluginBase::ProgramList programs = m_plugin->getPrograms();
lbajardsilogic@0 54
lbajardsilogic@0 55 m_params.clear();
lbajardsilogic@0 56
lbajardsilogic@0 57 if (params.empty() && programs.empty()) {
lbajardsilogic@0 58 m_layout->addWidget
lbajardsilogic@0 59 (new QLabel(tr("This plugin has no adjustable parameters.")),
lbajardsilogic@0 60 0, 0);
lbajardsilogic@0 61 }
lbajardsilogic@0 62
lbajardsilogic@0 63 int offset = 0;
lbajardsilogic@0 64
lbajardsilogic@0 65 if (!programs.empty()) {
lbajardsilogic@0 66
lbajardsilogic@0 67 std::string currentProgram = m_plugin->getCurrentProgram();
lbajardsilogic@0 68
lbajardsilogic@0 69 QComboBox *programCombo = new QComboBox;
lbajardsilogic@0 70 programCombo->setMaxVisibleItems(20);
lbajardsilogic@0 71
lbajardsilogic@0 72 for (size_t i = 0; i < programs.size(); ++i) {
lbajardsilogic@0 73 programCombo->addItem(programs[i].c_str());
lbajardsilogic@0 74 if (programs[i] == currentProgram) {
lbajardsilogic@0 75 programCombo->setCurrentIndex(i);
lbajardsilogic@0 76 }
lbajardsilogic@0 77 }
lbajardsilogic@0 78
lbajardsilogic@0 79 m_layout->addWidget(new QLabel(tr("Program")), 0, 0);
lbajardsilogic@0 80 m_layout->addWidget(programCombo, 0, 1, 1, 2);
lbajardsilogic@0 81
lbajardsilogic@0 82 connect(programCombo, SIGNAL(currentIndexChanged(const QString &)),
lbajardsilogic@0 83 this, SLOT(programComboChanged(const QString &)));
lbajardsilogic@0 84
lbajardsilogic@0 85 offset = 1;
lbajardsilogic@0 86 }
lbajardsilogic@0 87
lbajardsilogic@0 88 for (size_t i = 0; i < params.size(); ++i) {
lbajardsilogic@0 89
lbajardsilogic@0 90 QString identifier = params[i].identifier.c_str();
lbajardsilogic@0 91 QString name = params[i].name.c_str();
lbajardsilogic@0 92 QString unit = params[i].unit.c_str();
lbajardsilogic@0 93
lbajardsilogic@0 94 float min = params[i].minValue;
lbajardsilogic@0 95 float max = params[i].maxValue;
lbajardsilogic@0 96 float deft = params[i].defaultValue;
lbajardsilogic@0 97 float value = m_plugin->getParameter(params[i].identifier);
lbajardsilogic@0 98
lbajardsilogic@0 99 float qtz = 0.0;
lbajardsilogic@0 100 if (params[i].isQuantized) qtz = params[i].quantizeStep;
lbajardsilogic@0 101
lbajardsilogic@0 102 std::vector<std::string> valueNames = params[i].valueNames;
lbajardsilogic@0 103
lbajardsilogic@0 104 // construct an integer range
lbajardsilogic@0 105
lbajardsilogic@0 106 int imin = 0, imax = 100;
lbajardsilogic@0 107
lbajardsilogic@0 108 if (qtz > 0.0) {
lbajardsilogic@0 109 imax = int((max - min) / qtz);
lbajardsilogic@0 110 } else {
lbajardsilogic@0 111 qtz = (max - min) / 100.0;
lbajardsilogic@0 112 }
lbajardsilogic@0 113
lbajardsilogic@0 114 //!!! would be nice to ensure the default value corresponds to
lbajardsilogic@0 115 // an integer!
lbajardsilogic@0 116
lbajardsilogic@0 117 QLabel *label = new QLabel(name);
lbajardsilogic@0 118 if (params[i].description != "") {
lbajardsilogic@0 119 label->setToolTip(params[i].description.c_str());
lbajardsilogic@0 120 }
lbajardsilogic@0 121 m_layout->addWidget(label, i + offset, 0);
lbajardsilogic@0 122
lbajardsilogic@0 123 ParamRec rec;
lbajardsilogic@0 124 rec.param = params[i];
lbajardsilogic@0 125 rec.dial = 0;
lbajardsilogic@0 126 rec.spin = 0;
lbajardsilogic@0 127 rec.check = 0;
lbajardsilogic@0 128 rec.combo = 0;
lbajardsilogic@0 129
lbajardsilogic@0 130 if (params[i].isQuantized && !valueNames.empty()) {
lbajardsilogic@0 131
lbajardsilogic@0 132 QComboBox *combobox = new QComboBox;
lbajardsilogic@0 133 combobox->setObjectName(identifier);
lbajardsilogic@0 134 for (unsigned int j = 0; j < valueNames.size(); ++j) {
lbajardsilogic@0 135 combobox->addItem(valueNames[j].c_str());
lbajardsilogic@0 136 if ((unsigned int)(lrintf(fabsf((value - min) / qtz))) == j) {
lbajardsilogic@0 137 combobox->setCurrentIndex(j);
lbajardsilogic@0 138 }
lbajardsilogic@0 139 }
lbajardsilogic@0 140 connect(combobox, SIGNAL(activated(int)),
lbajardsilogic@0 141 this, SLOT(dialChanged(int)));
lbajardsilogic@0 142 m_layout->addWidget(combobox, i + offset, 1, 1, 2);
lbajardsilogic@0 143 rec.combo = combobox;
lbajardsilogic@0 144
lbajardsilogic@0 145 } else if (min == 0.0 && max == 1.0 && qtz == 1.0) {
lbajardsilogic@0 146
lbajardsilogic@0 147 QCheckBox *checkbox = new QCheckBox;
lbajardsilogic@0 148 checkbox->setObjectName(identifier);
lbajardsilogic@0 149 checkbox->setCheckState(value == 0.0 ? Qt::Unchecked : Qt::Checked);
lbajardsilogic@0 150 connect(checkbox, SIGNAL(stateChanged(int)),
lbajardsilogic@0 151 this, SLOT(checkBoxChanged(int)));
lbajardsilogic@0 152 m_layout->addWidget(checkbox, i + offset, 2);
lbajardsilogic@0 153 rec.check = checkbox;
lbajardsilogic@0 154
lbajardsilogic@0 155 } else {
lbajardsilogic@0 156
lbajardsilogic@0 157 AudioDial *dial = new AudioDial;
lbajardsilogic@0 158 dial->setObjectName(name);
lbajardsilogic@0 159 dial->setMinimum(imin);
lbajardsilogic@0 160 dial->setMaximum(imax);
lbajardsilogic@0 161 dial->setPageStep(1);
lbajardsilogic@0 162 dial->setNotchesVisible((imax - imin) <= 12);
lbajardsilogic@0 163 dial->setDefaultValue(lrintf((deft - min) / qtz));
lbajardsilogic@0 164 dial->setValue(lrintf((value - min) / qtz));
lbajardsilogic@0 165 dial->setFixedWidth(32);
lbajardsilogic@0 166 dial->setFixedHeight(32);
lbajardsilogic@0 167 dial->setRangeMapper(new LinearRangeMapper
lbajardsilogic@0 168 (imin, imax, min, max, unit));
lbajardsilogic@0 169 dial->setShowToolTip(true);
lbajardsilogic@0 170 connect(dial, SIGNAL(valueChanged(int)),
lbajardsilogic@0 171 this, SLOT(dialChanged(int)));
lbajardsilogic@0 172 m_layout->addWidget(dial, i + offset, 1);
lbajardsilogic@0 173
lbajardsilogic@0 174 QDoubleSpinBox *spinbox = new QDoubleSpinBox;
lbajardsilogic@0 175 spinbox->setObjectName(identifier);
lbajardsilogic@0 176 spinbox->setMinimum(min);
lbajardsilogic@0 177 spinbox->setMaximum(max);
lbajardsilogic@0 178 spinbox->setSuffix(QString(" %1").arg(unit));
lbajardsilogic@0 179 spinbox->setSingleStep(qtz);
lbajardsilogic@0 180 spinbox->setValue(value);
lbajardsilogic@0 181 spinbox->setDecimals(4);
lbajardsilogic@0 182 connect(spinbox, SIGNAL(valueChanged(double)),
lbajardsilogic@0 183 this, SLOT(spinBoxChanged(double)));
lbajardsilogic@0 184 m_layout->addWidget(spinbox, i + offset, 2);
lbajardsilogic@0 185 rec.dial = dial;
lbajardsilogic@0 186 rec.spin = spinbox;
lbajardsilogic@0 187 }
lbajardsilogic@0 188
lbajardsilogic@0 189 m_params[identifier] = rec;
lbajardsilogic@0 190 m_nameMap[name] = identifier;
lbajardsilogic@0 191 }
lbajardsilogic@0 192 }
lbajardsilogic@0 193
lbajardsilogic@0 194 void
lbajardsilogic@0 195 PluginParameterBox::dialChanged(int ival)
lbajardsilogic@0 196 {
lbajardsilogic@0 197 QObject *obj = sender();
lbajardsilogic@0 198 QString identifier = obj->objectName();
lbajardsilogic@0 199
lbajardsilogic@0 200 if (m_params.find(identifier) == m_params.end() &&
lbajardsilogic@0 201 m_nameMap.find(identifier) != m_nameMap.end()) {
lbajardsilogic@0 202 identifier = m_nameMap[identifier];
lbajardsilogic@0 203 }
lbajardsilogic@0 204
lbajardsilogic@0 205 if (m_params.find(identifier) == m_params.end()) {
lbajardsilogic@0 206 std::cerr << "WARNING: PluginParameterBox::dialChanged: Unknown parameter \"" << identifier.toStdString() << "\"" << std::endl;
lbajardsilogic@0 207 return;
lbajardsilogic@0 208 }
lbajardsilogic@0 209
lbajardsilogic@0 210 Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param;
lbajardsilogic@0 211
lbajardsilogic@0 212 float min = params.minValue;
lbajardsilogic@0 213 float max = params.maxValue;
lbajardsilogic@0 214
lbajardsilogic@0 215 float newValue;
lbajardsilogic@0 216
lbajardsilogic@0 217 float qtz = 0.0;
lbajardsilogic@0 218 if (params.isQuantized) qtz = params.quantizeStep;
lbajardsilogic@0 219
lbajardsilogic@0 220 AudioDial *ad = dynamic_cast<AudioDial *>(obj);
lbajardsilogic@0 221
lbajardsilogic@0 222 if (ad && ad->rangeMapper()) {
lbajardsilogic@0 223
lbajardsilogic@0 224 newValue = ad->mappedValue();
lbajardsilogic@0 225 if (newValue < min) newValue = min;
lbajardsilogic@0 226 if (newValue > max) newValue = max;
lbajardsilogic@0 227 if (qtz != 0.0) {
lbajardsilogic@0 228 ival = lrintf((newValue - min) / qtz);
lbajardsilogic@0 229 newValue = min + ival * qtz;
lbajardsilogic@0 230 }
lbajardsilogic@0 231
lbajardsilogic@0 232 } else {
lbajardsilogic@0 233 if (qtz == 0.0) {
lbajardsilogic@0 234 qtz = (max - min) / 100.0;
lbajardsilogic@0 235 }
lbajardsilogic@0 236 newValue = min + ival * qtz;
lbajardsilogic@0 237 }
lbajardsilogic@0 238
lbajardsilogic@0 239 QDoubleSpinBox *spin = m_params[identifier].spin;
lbajardsilogic@0 240 if (spin) {
lbajardsilogic@0 241 spin->blockSignals(true);
lbajardsilogic@0 242 spin->setValue(newValue);
lbajardsilogic@0 243 spin->blockSignals(false);
lbajardsilogic@0 244 }
lbajardsilogic@0 245
lbajardsilogic@0 246 m_plugin->setParameter(identifier.toStdString(), newValue);
lbajardsilogic@0 247
lbajardsilogic@0 248 emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString());
lbajardsilogic@0 249 }
lbajardsilogic@0 250
lbajardsilogic@0 251 void
lbajardsilogic@0 252 PluginParameterBox::checkBoxChanged(int state)
lbajardsilogic@0 253 {
lbajardsilogic@0 254 QObject *obj = sender();
lbajardsilogic@0 255 QString identifier = obj->objectName();
lbajardsilogic@0 256
lbajardsilogic@0 257 if (m_params.find(identifier) == m_params.end() &&
lbajardsilogic@0 258 m_nameMap.find(identifier) != m_nameMap.end()) {
lbajardsilogic@0 259 identifier = m_nameMap[identifier];
lbajardsilogic@0 260 }
lbajardsilogic@0 261
lbajardsilogic@0 262 if (m_params.find(identifier) == m_params.end()) {
lbajardsilogic@0 263 std::cerr << "WARNING: PluginParameterBox::checkBoxChanged: Unknown parameter \"" << identifier.toStdString() << "\"" << std::endl;
lbajardsilogic@0 264 return;
lbajardsilogic@0 265 }
lbajardsilogic@0 266
lbajardsilogic@0 267 Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param;
lbajardsilogic@0 268
lbajardsilogic@0 269 if (state) m_plugin->setParameter(identifier.toStdString(), 1.0);
lbajardsilogic@0 270 else m_plugin->setParameter(identifier.toStdString(), 0.0);
lbajardsilogic@0 271
lbajardsilogic@0 272 emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString());
lbajardsilogic@0 273 }
lbajardsilogic@0 274
lbajardsilogic@0 275 void
lbajardsilogic@0 276 PluginParameterBox::spinBoxChanged(double value)
lbajardsilogic@0 277 {
lbajardsilogic@0 278 QObject *obj = sender();
lbajardsilogic@0 279 QString identifier = obj->objectName();
lbajardsilogic@0 280
lbajardsilogic@0 281 if (m_params.find(identifier) == m_params.end() &&
lbajardsilogic@0 282 m_nameMap.find(identifier) != m_nameMap.end()) {
lbajardsilogic@0 283 identifier = m_nameMap[identifier];
lbajardsilogic@0 284 }
lbajardsilogic@0 285
lbajardsilogic@0 286 if (m_params.find(identifier) == m_params.end()) {
lbajardsilogic@0 287 std::cerr << "WARNING: PluginParameterBox::spinBoxChanged: Unknown parameter \"" << identifier.toStdString() << "\"" << std::endl;
lbajardsilogic@0 288 return;
lbajardsilogic@0 289 }
lbajardsilogic@0 290
lbajardsilogic@0 291 Vamp::PluginBase::ParameterDescriptor params = m_params[identifier].param;
lbajardsilogic@0 292
lbajardsilogic@0 293 float min = params.minValue;
lbajardsilogic@0 294 float max = params.maxValue;
lbajardsilogic@0 295
lbajardsilogic@0 296 float qtz = 0.0;
lbajardsilogic@0 297 if (params.isQuantized) qtz = params.quantizeStep;
lbajardsilogic@0 298
lbajardsilogic@0 299 if (qtz > 0.0) {
lbajardsilogic@0 300 int step = int((value - min) / qtz);
lbajardsilogic@0 301 value = min + step * qtz;
lbajardsilogic@0 302 }
lbajardsilogic@0 303
lbajardsilogic@0 304 int imax = 100;
lbajardsilogic@0 305
lbajardsilogic@0 306 if (qtz > 0.0) {
lbajardsilogic@0 307 imax = int((max - min) / qtz);
lbajardsilogic@0 308 } else {
lbajardsilogic@0 309 qtz = (max - min) / 100.0;
lbajardsilogic@0 310 }
lbajardsilogic@0 311
lbajardsilogic@0 312 int ival = lrintf((value - min) / qtz);
lbajardsilogic@0 313
lbajardsilogic@0 314 AudioDial *dial = m_params[identifier].dial;
lbajardsilogic@0 315 if (dial) {
lbajardsilogic@0 316 dial->blockSignals(true);
lbajardsilogic@0 317 dial->setValue(ival);
lbajardsilogic@0 318 dial->blockSignals(false);
lbajardsilogic@0 319 }
lbajardsilogic@0 320
lbajardsilogic@0 321 m_plugin->setParameter(identifier.toStdString(), value);
lbajardsilogic@0 322
lbajardsilogic@0 323 emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString());
lbajardsilogic@0 324 }
lbajardsilogic@0 325
lbajardsilogic@0 326 void
lbajardsilogic@0 327 PluginParameterBox::programComboChanged(const QString &newProgram)
lbajardsilogic@0 328 {
lbajardsilogic@0 329 m_plugin->selectProgram(newProgram.toStdString());
lbajardsilogic@0 330
lbajardsilogic@0 331 for (std::map<QString, ParamRec>::iterator i = m_params.begin();
lbajardsilogic@0 332 i != m_params.end(); ++i) {
lbajardsilogic@0 333
lbajardsilogic@0 334 Vamp::PluginBase::ParameterDescriptor &param = i->second.param;
lbajardsilogic@0 335 float value = m_plugin->getParameter(param.identifier);
lbajardsilogic@0 336
lbajardsilogic@0 337 if (i->second.spin) {
lbajardsilogic@0 338 i->second.spin->blockSignals(true);
lbajardsilogic@0 339 i->second.spin->setValue(value);
lbajardsilogic@0 340 i->second.spin->blockSignals(false);
lbajardsilogic@0 341 }
lbajardsilogic@0 342
lbajardsilogic@0 343 if (i->second.dial) {
lbajardsilogic@0 344
lbajardsilogic@0 345 float min = param.minValue;
lbajardsilogic@0 346 float max = param.maxValue;
lbajardsilogic@0 347
lbajardsilogic@0 348 float qtz = 0.0;
lbajardsilogic@0 349 if (param.isQuantized) qtz = param.quantizeStep;
lbajardsilogic@0 350
lbajardsilogic@0 351 if (qtz == 0.0) {
lbajardsilogic@0 352 qtz = (max - min) / 100.0;
lbajardsilogic@0 353 }
lbajardsilogic@0 354
lbajardsilogic@0 355 i->second.dial->blockSignals(true);
lbajardsilogic@0 356 i->second.dial->setValue(lrintf((value - min) / qtz));
lbajardsilogic@0 357 i->second.dial->blockSignals(false);
lbajardsilogic@0 358 }
lbajardsilogic@0 359
lbajardsilogic@0 360 if (i->second.combo) {
lbajardsilogic@0 361 i->second.combo->blockSignals(true);
lbajardsilogic@0 362 i->second.combo->setCurrentIndex(lrintf(value));
lbajardsilogic@0 363 i->second.combo->blockSignals(false);
lbajardsilogic@0 364 }
lbajardsilogic@0 365 }
lbajardsilogic@0 366
lbajardsilogic@0 367 emit pluginConfigurationChanged(PluginXml(m_plugin).toXmlString());
lbajardsilogic@0 368 }
lbajardsilogic@0 369