Mercurial > hg > svgui
diff widgets/PluginParameterBox.cpp @ 60:4df1a479bf10
* Add plugin parameter box widget
author | Chris Cannam |
---|---|
date | Mon, 20 Mar 2006 18:18:30 +0000 |
parents | |
children | 50429a56680f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/PluginParameterBox.cpp Mon Mar 20 18:18:30 2006 +0000 @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "PluginParameterBox.h" + +#include "AudioDial.h" + +#include <QDoubleSpinBox> +#include <QGridLayout> +#include <QLayout> +#include <QLabel> + +#include <iostream> +#include <string> + +PluginParameterBox::PluginParameterBox(PluginInstance *plugin) : + m_plugin(plugin) +{ + m_layout = new QGridLayout; + setLayout(m_layout); + populate(); +} + +PluginParameterBox::~PluginParameterBox() +{ +} + +void +PluginParameterBox::populate() +{ + PluginInstance::ParameterList params = m_plugin->getParameterDescriptors(); + + m_params.clear(); + + for (size_t i = 0; i < params.size(); ++i) { + + QString name = params[i].name.c_str(); + QString description = params[i].description.c_str(); + QString unit = params[i].unit.c_str(); + + float min = params[i].minValue; + float max = params[i].maxValue; + float deft = params[i].defaultValue; + + float qtz = 0.0; + if (params[i].isQuantized) qtz = params[i].quantizeStep; + + // construct an integer range + + int imin = 0, imax = 100; + + if (qtz > 0.0) { + imax = int((max - min) / qtz); + } else { + qtz = (max - min) / 100.0; + } + + //!!! would be nice to ensure the default value corresponds to + // an integer! + + QLabel *label = new QLabel(description); + m_layout->addWidget(label, i, 0); + + AudioDial *dial = new AudioDial; + dial->setObjectName(name); + dial->setMinimum(imin); + dial->setMaximum(imax); + dial->setPageStep(1); + dial->setNotchesVisible((imax - imin) <= 12); + dial->setDefaultValue(int((deft - min) / qtz)); + connect(dial, SIGNAL(valueChanged(int)), + this, SLOT(dialChanged(int))); + m_layout->addWidget(dial, i, 1); + + QDoubleSpinBox *spinbox = new QDoubleSpinBox; + spinbox->setObjectName(name); + spinbox->setMinimum(min); + spinbox->setMaximum(max); + spinbox->setSuffix(unit); + spinbox->setSingleStep(qtz); + spinbox->setValue(deft); + connect(spinbox, SIGNAL(valueChanged(double)), + this, SLOT(spinBoxChanged(double))); + m_layout->addWidget(spinbox, i, 2); + + ParamRec rec; + rec.dial = dial; + rec.spin = spinbox; + rec.param = params[i]; + m_params[name] = rec; + } +} + +void +PluginParameterBox::dialChanged(int ival) +{ + QObject *obj = sender(); + QString name = obj->objectName(); + + if (m_params.find(name) == m_params.end()) { + std::cerr << "WARNING: PluginParameterBox::dialChanged: Unknown parameter \"" << name.toStdString() << "\"" << std::endl; + return; + } + + PluginInstance::ParameterDescriptor params = m_params[name].param; + + float min = params.minValue; + float max = params.maxValue; + + float qtz = 0.0; + if (params.isQuantized) qtz = params.quantizeStep; + + if (qtz == 0.0) { + qtz = (max - min) / 100.0; + } + + float newValue = min + ival * qtz; + + QDoubleSpinBox *spin = m_params[name].spin; + spin->blockSignals(true); + spin->setValue(newValue); + spin->blockSignals(false); + + m_plugin->setParameter(name.toStdString(), newValue); +} + +void +PluginParameterBox::spinBoxChanged(double value) +{ + QObject *obj = sender(); + QString name = obj->objectName(); + + if (m_params.find(name) == m_params.end()) { + std::cerr << "WARNING: PluginParameterBox::spinBoxChanged: Unknown parameter \"" << name.toStdString() << "\"" << std::endl; + return; + } + + PluginInstance::ParameterDescriptor params = m_params[name].param; + + float min = params.minValue; + float max = params.maxValue; + + float qtz = 0.0; + if (params.isQuantized) qtz = params.quantizeStep; + + if (qtz > 0.0) { + int step = int((value - min) / qtz); + value = min + step * qtz; + } + + int imin = 0, imax = 100; + + if (qtz > 0.0) { + imax = int((max - min) / qtz); + } else { + qtz = (max - min) / 100.0; + } + + int ival = (value - min) / qtz; + + AudioDial *dial = m_params[name].dial; + dial->blockSignals(true); + dial->setValue(ival); + dial->blockSignals(false); + + m_plugin->setParameter(name.toStdString(), value); +} + +