2
// C++ Implementation: ssplugingui
7
// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
9
// Copyright: See COPYING file that comes with this distribution
16
#include <Q3HBoxLayout>
19
#include <Q3VBoxLayout>
21
#include "ssplugingui.h"
23
#include "simpledrumsgui.h"
25
#define SS_PLUGINGUI_XOFF 300
26
#define SS_PLUGINGUI_YOFF 300
27
#define SS_PLUGINGUI_WIDTH 450
28
#define SS_PLUGINGUI_MAX_WIDTH 700
30
#define SS_PLUGINFRONT_MINWIDTH SS_PLUGINGUI_WIDTH
31
#define SS_PLUGINFRONT_MINHEIGHT 70
32
#define SS_PLUGINFRONT_MARGIN 9
33
#define SS_PLUGINFRONT_INC_PARAM 30
34
#define SS_PLUGINFRONT_INC_PARAM_MIN 60
35
#define SS_PLUGINGUI_HEIGHT (SS_NR_OF_SENDEFFECTS * SS_PLUGINFRONT_MINHEIGHT)
37
#define SS_PLUGINCHOOSER_NAMECOL 0
38
#define SS_PLUGINCHOOSER_LABELCOL 1
39
#define SS_PLUGINCHOOSER_INPORTSCOL 2
40
#define SS_PLUGINCHOOSER_OUTPORTSCOL 3
41
#define SS_PLUGINCHOOSER_CREATORCOL 4
45
\fn SS_PluginChooser::SS_PluginChooser(QWidget* parent, const char* name = 0)
47
SS_PluginChooser::SS_PluginChooser(QWidget* parent, const char* name)
48
:SS_PluginChooserBase(parent, name)
53
for (iPlugin i=plugins.begin(); i !=plugins.end(); i++) {
54
//Support for only 2 or 1 inport/outports
55
if ( ((*i)->outports() == 2 || (*i)->outports() == 1) && ((*i)->inports() == 2 || (*i)->inports() == 1) ) {
56
Q3ListViewItem* tmpItem = new Q3ListViewItem(effectsListView);
57
tmpItem->setText(SS_PLUGINCHOOSER_NAMECOL, (*i)->name());
58
tmpItem->setText(SS_PLUGINCHOOSER_LABELCOL, (*i)->label());
59
tmpItem->setText(SS_PLUGINCHOOSER_INPORTSCOL, QString::number((*i)->inports()));
60
tmpItem->setText(SS_PLUGINCHOOSER_OUTPORTSCOL, QString::number((*i)->outports()));
61
tmpItem->setText(SS_PLUGINCHOOSER_CREATORCOL, (*i)->maker());
62
effectsListView->insertItem(tmpItem);
65
connect(okButton, SIGNAL(pressed()), SLOT(okPressed()));
66
connect(cancelButton, SIGNAL(pressed()), SLOT(cancelPressed()));
67
connect(effectsListView, SIGNAL(selectionChanged(Q3ListViewItem*)), SLOT(selectionChanged(Q3ListViewItem*)));
68
connect(effectsListView, SIGNAL(doubleClicked(Q3ListViewItem*)), SLOT(doubleClicked(Q3ListViewItem*)));
73
\fn SS_PluginChooser::selectionChanged(QListViewItem* item)
75
void SS_PluginChooser::selectionChanged(Q3ListViewItem* item)
83
\fn SS_PluginChooser::okPressed()
85
void SS_PluginChooser::okPressed()
88
selectedPlugin = findSelectedPlugin();
89
done(QDialog::Accepted);
94
\fn SS_PluginChooser::cancelPressed()
96
void SS_PluginChooser::cancelPressed()
100
done(QDialog::Rejected);
104
\fn SS_PluginChooser::doubleClicked(QListViewItem* item)
106
void SS_PluginChooser::doubleClicked(Q3ListViewItem* /*item*/)
109
selectedPlugin = findSelectedPlugin();
111
done(QDialog::Accepted);
115
\fn SS_PluginChooser::getSelectedPlugin()
117
LadspaPlugin* SS_PluginChooser::findSelectedPlugin()
120
LadspaPlugin* selected = 0;
121
for (iPlugin i=plugins.begin(); i != plugins.end(); i++) {
122
if ((*i)->name() == selectedItem->text(SS_PLUGINCHOOSER_NAMECOL))
123
selected = (LadspaPlugin*) (*i);
130
\fn SS_PluginFront::SS_PluginFront(QWidget* parent, const char* name = 0)
132
SS_PluginFront::SS_PluginFront(QWidget* parent, int in_fxid, const char* name)
133
: Q3GroupBox(parent, name), fxid (in_fxid)
143
setFrameStyle( Q3Frame::Box | Q3Frame::Raised );
144
setFrameShape(Q3GroupBox::Box);// QFrame::Box);
145
setFrameShadow(Sunken);
146
setFocusPolicy(Qt::NoFocus);
147
setMinimumSize(SS_PLUGINFRONT_MINWIDTH, SS_PLUGINFRONT_MINHEIGHT);
148
setMaximumSize(SS_PLUGINGUI_MAX_WIDTH, SS_PLUGINFRONT_MINHEIGHT);
150
Q3VBoxLayout* bigLayout = new Q3VBoxLayout(this);
151
bigLayout->setMargin(SS_PLUGINFRONT_MARGIN);
152
bigLayout->setAlignment(Qt::AlignTop);
153
bigLayout->setResizeMode(QLayout::SetNoConstraint);
155
layout = new Q3HBoxLayout(bigLayout);
156
layout->setAlignment(Qt::AlignVCenter);
157
layout->setResizeMode(QLayout::SetNoConstraint);
160
Q3VBoxLayout* onOffLayout = new Q3VBoxLayout(layout);
161
onOffLayout->setMargin(SS_PLUGINFRONT_MARGIN);
162
onOff = new QCheckBox(this);
163
onOffLayout->add(new QLabel("On/Off", this));
164
onOffLayout->add(onOff);
165
connect(onOff, SIGNAL(toggled(bool)), SLOT(onOffToggled(bool)));
167
pluginName = new QLineEdit(this);
168
pluginName->setReadOnly(true);
169
layout->add(pluginName);
171
loadFxButton = new QPushButton("L", this);
172
QRect r = loadFxButton->geometry();
173
loadFxButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
174
loadFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
175
loadFxButton->setMinimumSize(20,pluginName->geometry().height());
176
loadFxButton->setMaximumSize(30,pluginName->geometry().height());
177
connect(loadFxButton, SIGNAL(clicked()), SLOT(loadButton()));
178
layout->add(loadFxButton);
180
clearFxButton = new QPushButton("C", this);
181
r = clearFxButton->geometry();
182
clearFxButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
183
clearFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
184
clearFxButton->setMinimumSize(20,pluginName->geometry().height());
185
clearFxButton->setMaximumSize(30,pluginName->geometry().height());
186
connect(clearFxButton, SIGNAL(clicked()), SLOT(clearButtonPressed()));
187
layout->add(clearFxButton);
189
layout->addSpacing(5);
191
expandButton = new QPushButton("->", this);
192
r = loadFxButton->geometry();
193
expandButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
194
expandButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
195
expandButton->setMinimumSize(20,pluginName->geometry().height());
196
expandButton->setMaximumSize(30,pluginName->geometry().height());
197
connect(expandButton, SIGNAL(clicked()), SLOT(expandButtonPressed()));
198
layout->add(expandButton);
200
layout->addSpacing(5);
202
Q3VBoxLayout* gainSliderLayout = new Q3VBoxLayout(layout);
203
gainSliderLayout->add(new QLabel("Return level", this));
204
gainSliderLayout->setMargin(SS_PLUGINFRONT_MARGIN);
205
outGainSlider = new QSlider(Qt::Horizontal, this);
206
outGainSlider->setMinimumSize(100, pluginName->geometry().height());
207
outGainSlider->setMaximumSize(500, pluginName->geometry().height());
208
loadFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
209
outGainSlider->setRange(0, 127);
210
outGainSlider->setValue(75);
211
connect(outGainSlider, SIGNAL(valueChanged(int)), SLOT(returnSliderMoved(int)));
212
gainSliderLayout->add(outGainSlider);
213
clearPluginDisplay();
215
expLayout = new Q3VBoxLayout(bigLayout, 2);
217
QToolTip::add(clearFxButton, "Clear and unload effect");
218
QToolTip::add(loadFxButton, "Load effect");
219
QToolTip::add(expandButton, "Toggle display of effect parameters");
220
QToolTip::add(onOff, "Turn effect on/off");
224
SS_PluginFront::~SS_PluginFront()
227
delete pluginChooser;
231
\fn SS_PluginFront::clearPluginDisplay()
233
void SS_PluginFront::clearPluginDisplay()
237
expandButtonPressed();
239
pluginName->setText("No plugin loaded");
240
pluginName->setEnabled(false);
242
onOff->setEnabled(false);
243
onOff->blockSignals(true);
244
onOff->setChecked(false);
245
onOff->blockSignals(false);
247
clearFxButton->setEnabled(false);
248
expandButton->setEnabled(false);
249
outGainSlider->setEnabled(false);
254
\fn SS_PluginFront::setPluginName(QString name)
256
void SS_PluginFront::setPluginName(QString name)
258
pluginName->setText(name);
263
\fn SS_PluginFront::loadButton()
265
void SS_PluginFront::loadButton()
269
pluginChooser = new SS_PluginChooser(this, "temppluginchooser");
271
pluginChooser->exec();
272
if ((pluginChooser->result() == QDialog::Accepted) && pluginChooser->getSelectedPlugin()) {
273
Plugin* p = pluginChooser->getSelectedPlugin();
274
//printf("Selected plugin: %s\n", pluginChooser->getSelectedPlugin()->name().toLatin1());
275
emit loadPlugin(fxid, p->lib(), p->label());
281
\fn SS_PluginFront::returnSliderMoved(int val)
283
void SS_PluginFront::returnSliderMoved(int val)
285
emit returnLevelChanged(fxid, val);
290
\fn SS_PluginFront::updatePluginValue(unsigned i)
292
void SS_PluginFront::updatePluginValue(unsigned k)
295
// If parameters are shown - close them
297
expandButtonPressed();
301
if (k > plugins.size()) {
302
fprintf(stderr, "Internal error, tried to update plugin w range outside of list\n");
307
for (i = plugins.begin(); j != k; i++, j++) ;
308
plugin = (LadspaPlugin*) *(i);
309
setPluginName(plugin->label());
310
outGainSlider->setEnabled(true);
311
clearFxButton->setEnabled(true);
312
expandButton->setEnabled(true);
313
pluginName->setEnabled(true);
314
onOff->setEnabled(true);
315
onOff->setChecked(true);
320
\fn SS_PluginFront::onOffToggled(bool state)
322
void SS_PluginFront::onOffToggled(bool state)
324
emit fxToggled(fxid, state);
328
\fn SS_PluginFront::sizeHint() const
330
QSize SS_PluginFront::sizeHint() const
332
return QSize(SS_PLUGINFRONT_MINWIDTH, 50);
336
\fn SS_PluginFront::sizePolicy() const
338
QSizePolicy SS_PluginFront::sizePolicy() const
340
return QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
345
\fn SS_PluginFront::clearButtonPressed()
347
void SS_PluginFront::clearButtonPressed()
349
// If parameters are shown - close them
351
expandButtonPressed();
353
emit clearPlugin(fxid);
357
\fn SS_PluginFront::setRetGain(int val)
359
void SS_PluginFront::setRetGain(int val)
361
outGainSlider->blockSignals(true);
362
outGainSlider->setValue(val);
363
outGainSlider->blockSignals(false);
367
\fn SS_PluginFront::expandButtonPressed()
369
void SS_PluginFront::expandButtonPressed()
372
int sizeIncrease = 0;
373
QRect pf = geometry();
376
plugin->parameter() == 1 ? sizeIncrease = SS_PLUGINFRONT_INC_PARAM_MIN : sizeIncrease = plugin->parameter() * SS_PLUGINFRONT_INC_PARAM;
377
pf.setHeight(pf.height() + sizeIncrease);
378
setMinimumSize(QSize(pf.width(), pf.height()));
379
setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, pf.height()));
380
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
382
emit sizeChanged(fxid, sizeIncrease);
385
expandButton->setText("<-");
386
createPluginParameters();
389
expLayout->remove(expGroup);
391
expGroup->deleteLater();
392
paramWidgets.clear();
394
plugin->parameter() == 1 ? sizeIncrease = (0-SS_PLUGINFRONT_INC_PARAM_MIN) : sizeIncrease = 0 - (plugin->parameter() * SS_PLUGINFRONT_INC_PARAM);
395
expandButton->setText("->");
397
pf.setHeight(pf.height() + sizeIncrease);
398
pf.setTop(pf.top() + sizeIncrease);
399
pf.setBottom(pf.bottom() + sizeIncrease);
403
setMinimumSize(QSize(pf.width(), pf.height()));
404
setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, pf.height()));
405
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
406
emit sizeChanged(fxid, sizeIncrease);
412
\fn SS_PluginFront::createPluginParameters()
414
void SS_PluginFront::createPluginParameters()
417
expGroup = new Q3ButtonGroup(this);
419
expGroup->setMinimumSize(QSize(50, 50));
420
expGroup->setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, (plugin->parameter() * SS_PLUGINFRONT_INC_PARAM - SS_PLUGINFRONT_MARGIN)));
421
expGroup->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
422
expLayout->add(expGroup);
424
Q3VBoxLayout* expGroupLayout = new Q3VBoxLayout(expGroup, 1);
425
expGroupLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
426
expGroupLayout->setResizeMode(QLayout::SetNoConstraint);
427
expGroupLayout->setMargin(SS_PLUGINFRONT_MARGIN);
429
for (int i=0; i < plugin->parameter(); i++) {
430
Q3HBoxLayout* paramStrip = new Q3HBoxLayout(expGroupLayout, 3);
431
paramStrip->setAlignment(Qt::AlignLeft);
432
QLabel* paramName = new QLabel(plugin->getParameterName(i), expGroup);
434
paramName->setMinimumSize(QSize(150, 10));
435
paramName->setMaximumSize(QSize(300, SS_PLUGINFRONT_INC_PARAM));
436
paramName->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding));
438
paramStrip->add(paramName);
440
if (plugin->isBool(i)) {
441
SS_ParameterCheckBox* paramCheckBox = new SS_ParameterCheckBox(expGroup, plugin, fxid, i);
442
paramCheckBox->setEnabled(true);
443
paramCheckBox->setParamValue((int) plugin->getControlValue(i));
444
paramCheckBox->show();
445
paramStrip->add(paramCheckBox);
446
connect(paramCheckBox, SIGNAL(valueChanged(int, int, int)), SLOT(parameterValueChanged(int, int, int)));
449
SS_ParameterSlider* paramSlider = new SS_ParameterSlider(expGroup, plugin, fxid, i);
450
paramSlider->setEnabled(true);
452
paramSlider->setRange(SS_PLUGIN_PARAM_MIN, SS_PLUGIN_PARAM_MAX);
455
plugin->range(i, &min, &max);
457
paramSlider->setParamValue(plugin->getGuiControlValue(i));
458
connect(paramSlider, SIGNAL(valueChanged(int, int, int)), SLOT(parameterValueChanged(int, int, int)));
459
paramStrip->add(paramSlider);
462
expLayout->activate();
467
\fn SS_PluginFront::parameterValueChanged(int fxid, int parameter, int val)
469
void SS_PluginFront::parameterValueChanged(int fxid, int parameter, int val)
471
emit effectParameterChanged(fxid, parameter, val);
475
\fn SS_PluginFront::setParameterValue(int param, float val)
477
void SS_PluginFront::setParameterValue(int param, int val)
481
for (SS_iParameterWidgetList i=paramWidgets.begin(); i != paramWidgets.end(); i++, j++) {
483
(*i)->setParamValue(val);
489
SS_PluginGui::SS_PluginGui(QWidget* parent, const char* name)
490
: QDialog(parent, name, false)
492
this->setCaption("SimpleDrums LADSPA sendeffects");
493
for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
496
layout = new Q3VBoxLayout(this);
498
for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
499
pluginFronts[i] = new SS_PluginFront(this, i);
500
pluginFronts[i]->update();
501
layout->add(pluginFronts[i]);
502
connect(pluginFronts[i], SIGNAL(loadPlugin(int, QString, QString)), simplesynthgui_ptr, SLOT(loadEffectInvoked(int, QString, QString)));
503
connect(pluginFronts[i], SIGNAL(returnLevelChanged(int, int)), simplesynthgui_ptr, SLOT(returnLevelChanged(int, int)));
504
connect(pluginFronts[i], SIGNAL(fxToggled(int, int)), simplesynthgui_ptr, SLOT(toggleEffectOnOff(int, int)));
505
connect(pluginFronts[i], SIGNAL(clearPlugin(int)), simplesynthgui_ptr, SLOT(clearPlugin(int)));
506
connect(pluginFronts[i], SIGNAL(sizeChanged(int, int)), SLOT(pluginFrontSizeChanged(int, int)));
507
connect(pluginFronts[i], SIGNAL(effectParameterChanged(int, int, int)), simplesynthgui_ptr, SLOT(effectParameterChanged(int, int, int)));
509
setMinimumSize(QSize(SS_PLUGINGUI_WIDTH, geometry().height()));
510
setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, geometry().height()));
515
\fn SS_PluginGui::pluginFrontSizeChanged(int fxid, int val)
517
void SS_PluginGui::pluginFrontSizeChanged(int /*fxid*/, int val)
519
QRect r = geometry();
520
r.setHeight(r.height() + val);
521
setMinimumSize(QSize(SS_PLUGINGUI_WIDTH, r.height()));
522
setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, r.height()));
523
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
528
SS_PluginFront* SS_PluginGui::getPluginFront(unsigned i)
531
if (i<SS_NR_OF_SENDEFFECTS)
533
return pluginFronts[i];