1
#include "effectview.h"
8
#include <qwhatsthis.h>
10
#include <kiconloader.h>
11
#include <klistview.h>
12
#include <qiconview.h>
13
#include <qpushbutton.h>
14
#include <qabstractlayout.h>
18
class EffectIconItem : public QIconViewItem
21
EffectIconItem(QIconView *parent, const QCString &name)
22
: QIconViewItem(parent, Effect::clean(name))
25
setPixmap(DesktopIcon("effect"));
28
QCString effectName() const { return mName; }
35
class EffectListItem : public QListViewItem
38
EffectListItem(QListView *parent, QListViewItem *after, Effect *e)
39
: QListViewItem(parent, after, e->title()), mEffect(e)
43
Effect *effect() const { return mEffect; }
49
EffectList::EffectList(QWidget *parent)
54
bool EffectList::acceptDrag(QDropEvent *event) const
56
return QCString(event->format()) == "application/x-noatun-effectdrag";
59
QDragObject *EffectList::dragObject() const
61
if (!currentItem()) return 0;
62
return new QStoredDrag("application/x-noatun-effectdrag", (QWidget*)this);
66
EffectAvailable::EffectAvailable(QWidget *parent, EffectView *v)
67
: KIconView(parent), mView(v)
71
setResizeMode(QIconView::Adjust);
73
setMode(KIconView::Select);
76
QDragObject *EffectAvailable::dragObject()
78
if (!currentItem()) return 0;
79
return new QStoredDrag("application/x-noatun-effectdrag", (QWidget*)this);
82
void EffectAvailable::contentsDropEvent(QDropEvent *e)
84
EffectList *el = mView->active();
85
if (el != e->source())
87
mView->removeCurrent();
90
EffectView::EffectView()
91
: KDialogBase(0, 0, false, i18n("Effects"), Help | Close, Close, true), first(true)
96
void EffectView::show()
100
setCaption(i18n("Effects"));
101
setIcon(SmallIcon("effect"));
103
QFrame *box = makeMainWidget();
104
(new QHBoxLayout(box, KDialog::marginHint(), KDialog::spacingHint()))->setAutoAdd(true);
105
QSplitter *split = new QSplitter(box);
106
QPushButton *buttons;
109
QWidget *col = new QWidget(split);
110
(new QVBoxLayout(col, KDialog::marginHint(), KDialog::spacingHint()))->setAutoAdd(true);
111
col->setMinimumWidth( (new QLabel(i18n("<b>Available Effects</b>"), col))->width());
112
mAvailable = new EffectAvailable(col, this);
113
QWhatsThis::add(mAvailable, i18n("This shows all available effects.\n\nDrag files from here to the Active pane to the right to activate a plugin."));
116
col = new QWidget(split);
117
QVBoxLayout *vbox = new QVBoxLayout(col, KDialog::marginHint(), KDialog::spacingHint());
118
vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum,
119
QSizePolicy::Expanding));
121
(mLeft = buttons=new QPushButton(col))->setFixedSize(22, 22);
122
buttons->setPixmap(BarIcon("forward", KIcon::SizeSmall));
123
QWhatsThis::add(buttons, i18n("This will place the selected effect the bottom of your chain."));
124
vbox->addWidget(buttons);
125
connect(buttons, SIGNAL(clicked()), SLOT(moveRight()));
127
(mRight = buttons=new QPushButton(col))->setFixedSize(22, 22);
128
buttons->setPixmap(BarIcon("back", KIcon::SizeSmall));
129
QWhatsThis::add(buttons, i18n("This will remove the selected effect from your chain."));
130
vbox->addWidget(buttons);
131
connect(buttons, SIGNAL(clicked()), SLOT(moveLeft()));
134
(mLeftHelp = buttons=new QPushButton(col))->setFixedSize(22, 22);
135
buttons->setPixmap(BarIcon("help", KIcon::SizeSmall));
136
QWhatsThis::add(buttons, i18n("This button will show information on the selected effect."));
137
vbox->addWidget(buttons);
138
connect(buttons, SIGNAL(clicked()), SLOT(leftHelp()));
141
vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum,
142
QSizePolicy::Expanding));
144
col->setFixedWidth(buttons->width() + 2 * KDialog::marginHint());
147
QWidget *col2 = new QWidget(split);
148
(new QHBoxLayout(col2))->setAutoAdd(true);
150
col = new QWidget(col2);
151
(new QVBoxLayout(col, KDialog::marginHint(), KDialog::spacingHint()))->setAutoAdd(true);
152
col->setMinimumWidth( (new QLabel(i18n("<b>Active Effects</b>"), col))->width());
153
mActive = new EffectList(col);
154
QWhatsThis::add(mActive, i18n("This shows your effect chain. Noatun supports an unlimited amount of effects in any order. You can even have the same effect twice!\n\nDrag the items to and from here to add and remove them, respectively. You may also reorder them with drag-and-drop. These actions can also be performed with the buttons to the right."));
157
col = new QWidget(col2);
158
vbox = new QVBoxLayout(col, KDialog::marginHint(), KDialog::spacingHint());
159
vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum,
160
QSizePolicy::Expanding));
162
(mUp = buttons=new QPushButton(col))->setFixedSize(22, 22);
163
buttons->setPixmap(BarIcon("up", KIcon::SizeSmall));
164
QWhatsThis::add(buttons, i18n("Move the currently selected effect up in the chain."));
165
vbox->addWidget(buttons);
166
connect(buttons, SIGNAL(clicked()), SLOT(moveUp()));
168
(mDown = buttons=new QPushButton(col))->setFixedSize(22, 22);
169
buttons->setPixmap(BarIcon("down", KIcon::SizeSmall));
170
QWhatsThis::add(buttons, i18n("Move the currently selected effect down in the chain."));
171
vbox->addWidget(buttons);
172
connect(buttons, SIGNAL(clicked()), SLOT(moveDown()));
175
(mRightHelp = buttons=new QPushButton(col))->setFixedSize(22, 22);
176
buttons->setPixmap(BarIcon("configure", KIcon::SizeSmall));
177
QWhatsThis::add(buttons, i18n("Configure the currently selected effect.\n\nYou can change things such as intensity from here."));
178
vbox->addWidget(buttons);
179
connect(buttons, SIGNAL(clicked()), SLOT(rightHelp()));
182
vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum,
183
QSizePolicy::Expanding));
185
QStrList av = napp->effects()->available();
186
// scan and add the effects
187
for (char *i = av.first(); i!=0; i=av.next())
188
new EffectIconItem(mAvailable, i);
190
mActive->setAcceptDrops(true);
191
mActive->addColumn("");
192
mActive->header()->hide();
193
mActive->setSorting(-1);
194
mActive->setDropVisualizer(true);
195
mActive->setItemsMovable(true);
196
mActive->setSelectionMode(QListView::Single);
197
mActive->setDragEnabled(true);
199
// DND for the KListView
200
connect(mActive, SIGNAL(dropped(QDropEvent*, QListViewItem*)), SLOT(dropEvent(QDropEvent*, QListViewItem*)));
202
// when a new effect is added
203
connect(napp->effects(), SIGNAL(added(Effect*)), SLOT(added(Effect*)));
204
connect(napp->effects(), SIGNAL(removed(Effect*)), SLOT(removed(Effect*)));
205
connect(napp->effects(), SIGNAL(moved(Effect*)), SLOT(moved(Effect*)));
207
connect(mActive, SIGNAL(currentChanged(QListViewItem*)), SLOT(activeChanged(QListViewItem*)));
208
connect(mAvailable, SIGNAL(currentChanged(QIconViewItem*)), SLOT(availableChanged(QIconViewItem*)));
209
mActive->setCurrentItem(0);
210
mAvailable->setCurrentItem(0);
211
availableChanged(mAvailable->currentItem());
212
activeChanged(mActive->currentItem());
219
void EffectView::dropEvent(QDropEvent *e, QListViewItem *pafter)
221
EffectListItem *after(static_cast<EffectListItem*>(pafter));
222
if (e->source() == mAvailable)
224
napp->effects()->insert(after ? after->effect() : 0,
225
new Effect(static_cast<EffectIconItem*>(mAvailable->currentItem())->effectName()));
226
// QCString name = static_cast<EffectIconItem*>(mAvailable->currentItem())->effectName();
227
// Effect *e = new Effect(name);
228
// napp->effects()->append(e);
230
else if (e->source() == mActive)
232
napp->effects()->move(after ? after->effect() : 0,
233
static_cast<EffectListItem*>(mActive->currentItem())->effect());
235
activeChanged(mActive->currentItem());
238
QListViewItem *EffectView::toListItem(Effect *e) const
240
for (QListViewItem *i = mActive->firstChild(); i!=0; i=i->itemBelow())
241
if (static_cast<EffectListItem*>(i)->effect() == e)
246
void EffectView::added(Effect *item)
248
new EffectListItem(mActive, toListItem(item->before()), item);
249
activeChanged(mActive->currentItem());
252
void EffectView::moved(Effect *item)
254
delete toListItem(item);
258
void EffectView::removed(Effect *item)
260
delete toListItem(item);
261
activeChanged(mActive->currentItem());
264
void EffectView::moveDown()
266
Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
269
napp->effects()->move(e->after(), e);
270
mActive->setCurrentItem(toListItem(e));
271
mActive->setSelected(toListItem(e), true);
272
activeChanged(mActive->currentItem());
275
void EffectView::moveUp()
277
Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
280
if (e->before()->before())
281
napp->effects()->move(e->before()->before(), e);
283
napp->effects()->move(0, e);
285
mActive->setCurrentItem(toListItem(e));
286
mActive->setSelected(toListItem(e), true);
287
activeChanged(mActive->currentItem());
290
void EffectView::moveLeft()
295
void EffectView::moveRight()
297
napp->effects()->append(new Effect(static_cast<EffectIconItem*>(mAvailable->currentItem())->effectName()));
298
activeChanged(mActive->currentItem());
301
void EffectView::removeCurrent()
303
EffectListItem *item = static_cast<EffectListItem*>(mActive->currentItem());
304
napp->effects()->remove(item->effect());
305
activeChanged(mActive->currentItem());
308
void EffectView::leftHelp()
313
void EffectView::rightHelp()
315
Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
318
QWidget *c=e->configure();
323
void EffectView::activeChanged(QListViewItem *i)
327
mUp->setEnabled(i->itemAbove());
328
mDown->setEnabled(i->itemBelow());
329
mRight->setEnabled(true);
331
Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
332
mRightHelp->setEnabled(e->configurable());
336
mUp->setEnabled(false);
337
mDown->setEnabled(false);
338
mRight->setEnabled(false);
339
mRightHelp->setEnabled(false);
343
void EffectView::availableChanged(QIconViewItem *i)
347
mLeft->setEnabled(true);
351
mLeft->setEnabled(false);
355
#include "effectview.moc"