Mercurial > hg > svgui
comparison widgets/PluginParameterBox.cpp @ 342:a904364dfb6e
* fix support for logarithmic hints in plugin parameters
author | Chris Cannam |
---|---|
date | Mon, 17 Dec 2007 12:32:28 +0000 |
parents | 15b8a4bfe855 |
children | 4cb5cd9ccac7 |
comparison
equal
deleted
inserted
replaced
341:998786b3174f | 342:a904364dfb6e |
---|---|
16 #include "PluginParameterBox.h" | 16 #include "PluginParameterBox.h" |
17 | 17 |
18 #include "AudioDial.h" | 18 #include "AudioDial.h" |
19 | 19 |
20 #include "plugin/PluginXml.h" | 20 #include "plugin/PluginXml.h" |
21 #include "plugin/RealTimePluginInstance.h" // for PortHint stuff | |
21 | 22 |
22 #include "base/RangeMapper.h" | 23 #include "base/RangeMapper.h" |
23 | 24 |
24 #include <QDoubleSpinBox> | 25 #include <QDoubleSpinBox> |
25 #include <QGridLayout> | 26 #include <QGridLayout> |
96 float min = params[i].minValue; | 97 float min = params[i].minValue; |
97 float max = params[i].maxValue; | 98 float max = params[i].maxValue; |
98 float deft = params[i].defaultValue; | 99 float deft = params[i].defaultValue; |
99 float value = m_plugin->getParameter(params[i].identifier); | 100 float value = m_plugin->getParameter(params[i].identifier); |
100 | 101 |
102 int hint = PortHint::NoHint; | |
103 RealTimePluginInstance *rtpi = dynamic_cast<RealTimePluginInstance *> | |
104 (m_plugin); | |
105 if (rtpi) { | |
106 hint = rtpi->getParameterDisplayHint(i); | |
107 } | |
108 | |
101 float qtz = 0.0; | 109 float qtz = 0.0; |
102 if (params[i].isQuantized) qtz = params[i].quantizeStep; | 110 if (params[i].isQuantized) qtz = params[i].quantizeStep; |
103 | 111 |
112 std::cerr << "PluginParameterBox: hint = " << hint << ", min = " << min << ", max = " | |
113 << max << ", qtz = " << qtz << std::endl; | |
114 | |
104 std::vector<std::string> valueNames = params[i].valueNames; | 115 std::vector<std::string> valueNames = params[i].valueNames; |
105 | 116 |
106 // construct an integer range | 117 // construct an integer range |
107 | 118 |
108 int imin = 0, imax = 100; | 119 int imin = 0, imax = 100; |
109 | 120 |
110 if (qtz > 0.0) { | 121 if (!(hint & PortHint::Logarithmic)) { |
111 imax = int((max - min) / qtz); | 122 if (qtz > 0.0) { |
112 } else { | 123 imax = int((max - min) / qtz); |
113 qtz = (max - min) / 100.0; | 124 } else { |
125 qtz = (max - min) / 100.0; | |
126 } | |
114 } | 127 } |
115 | 128 |
116 //!!! would be nice to ensure the default value corresponds to | 129 //!!! would be nice to ensure the default value corresponds to |
117 // an integer! | 130 // an integer! |
118 | 131 |
160 dial->setObjectName(name); | 173 dial->setObjectName(name); |
161 dial->setMinimum(imin); | 174 dial->setMinimum(imin); |
162 dial->setMaximum(imax); | 175 dial->setMaximum(imax); |
163 dial->setPageStep(1); | 176 dial->setPageStep(1); |
164 dial->setNotchesVisible((imax - imin) <= 12); | 177 dial->setNotchesVisible((imax - imin) <= 12); |
165 dial->setDefaultValue(lrintf((deft - min) / qtz)); | 178 //!!! dial->setDefaultValue(lrintf((deft - min) / qtz)); |
166 dial->setValue(lrintf((value - min) / qtz)); | 179 // dial->setValue(lrintf((value - min) / qtz)); |
167 dial->setFixedWidth(32); | 180 dial->setFixedWidth(32); |
168 dial->setFixedHeight(32); | 181 dial->setFixedHeight(32); |
169 dial->setRangeMapper(new LinearRangeMapper | 182 RangeMapper *rm = 0; |
170 (imin, imax, min, max, unit)); | 183 if (hint & PortHint::Logarithmic) { |
184 rm = new LogRangeMapper(imin, imax, min, max, unit); | |
185 } else { | |
186 rm = new LinearRangeMapper(imin, imax, min, max, unit); | |
187 } | |
188 dial->setRangeMapper(rm); | |
189 dial->setDefaultValue(rm->getPositionForValue(deft)); | |
190 dial->setValue(rm->getPositionForValue(value)); | |
171 dial->setShowToolTip(true); | 191 dial->setShowToolTip(true); |
172 connect(dial, SIGNAL(valueChanged(int)), | 192 connect(dial, SIGNAL(valueChanged(int)), |
173 this, SLOT(dialChanged(int))); | 193 this, SLOT(dialChanged(int))); |
174 m_layout->addWidget(dial, i + offset, 1); | 194 m_layout->addWidget(dial, i + offset, 1); |
175 | 195 |
176 QDoubleSpinBox *spinbox = new QDoubleSpinBox; | 196 QDoubleSpinBox *spinbox = new QDoubleSpinBox; |
177 spinbox->setObjectName(identifier); | 197 spinbox->setObjectName(identifier); |
178 spinbox->setMinimum(min); | 198 spinbox->setMinimum(min); |
179 spinbox->setMaximum(max); | 199 spinbox->setMaximum(max); |
180 spinbox->setSuffix(QString(" %1").arg(unit)); | 200 spinbox->setSuffix(QString(" %1").arg(unit)); |
181 spinbox->setSingleStep(qtz); | 201 if (qtz != 0) spinbox->setSingleStep(qtz); |
182 spinbox->setValue(value); | 202 spinbox->setValue(value); |
183 spinbox->setDecimals(4); | 203 spinbox->setDecimals(4); |
184 connect(spinbox, SIGNAL(valueChanged(double)), | 204 connect(spinbox, SIGNAL(valueChanged(double)), |
185 this, SLOT(spinBoxChanged(double))); | 205 this, SLOT(spinBoxChanged(double))); |
186 m_layout->addWidget(spinbox, i + offset, 2); | 206 m_layout->addWidget(spinbox, i + offset, 2); |
236 qtz = (max - min) / 100.0; | 256 qtz = (max - min) / 100.0; |
237 } | 257 } |
238 newValue = min + ival * qtz; | 258 newValue = min + ival * qtz; |
239 } | 259 } |
240 | 260 |
261 std::cerr << "PluginParameterBox::dialChanged: newValue = " << newValue << std::endl; | |
262 | |
241 QDoubleSpinBox *spin = m_params[identifier].spin; | 263 QDoubleSpinBox *spin = m_params[identifier].spin; |
242 if (spin) { | 264 if (spin) { |
243 spin->blockSignals(true); | 265 spin->blockSignals(true); |
244 spin->setValue(newValue); | 266 spin->setValue(newValue); |
245 spin->blockSignals(false); | 267 spin->blockSignals(false); |
318 int ival = lrintf((value - min) / qtz); | 340 int ival = lrintf((value - min) / qtz); |
319 | 341 |
320 AudioDial *dial = m_params[identifier].dial; | 342 AudioDial *dial = m_params[identifier].dial; |
321 if (dial) { | 343 if (dial) { |
322 dial->blockSignals(true); | 344 dial->blockSignals(true); |
323 dial->setValue(ival); | 345 if (dial->rangeMapper()) { |
346 dial->setMappedValue(value); | |
347 } else { | |
348 dial->setValue(ival); | |
349 } | |
324 dial->blockSignals(false); | 350 dial->blockSignals(false); |
325 } | 351 } |
326 | 352 |
327 m_plugin->setParameter(identifier.toStdString(), value); | 353 m_plugin->setParameter(identifier.toStdString(), value); |
328 | 354 |