~ubuntu-branches/ubuntu/hoary/kdemultimedia/hoary

« back to all changes in this revision

Viewing changes to noatun/noatun/library/effectview.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Martin Schulze
  • Date: 2003-01-22 15:00:51 UTC
  • Revision ID: james.westby@ubuntu.com-20030122150051-uihwkdoxf15mi1tn
Tags: upstream-2.2.2
ImportĀ upstreamĀ versionĀ 2.2.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "effectview.h"
 
2
#include "noatunapp.h"
 
3
#include "effects.h"
 
4
 
 
5
#include <kdialog.h>
 
6
#include <qlayout.h>
 
7
#include <klocale.h>
 
8
#include <qwhatsthis.h>
 
9
#include <qsplitter.h>
 
10
#include <kiconloader.h>
 
11
#include <klistview.h>
 
12
#include <qiconview.h>
 
13
#include <qpushbutton.h>
 
14
#include <qabstractlayout.h>
 
15
#include <qlabel.h>
 
16
#include <qheader.h>
 
17
 
 
18
class EffectIconItem : public QIconViewItem
 
19
{
 
20
public:
 
21
        EffectIconItem(QIconView *parent, const QCString &name)
 
22
                : QIconViewItem(parent, Effect::clean(name))
 
23
        {
 
24
                mName = name;
 
25
                setPixmap(DesktopIcon("effect"));
 
26
        }
 
27
 
 
28
        QCString effectName() const { return mName; }
 
29
 
 
30
private:
 
31
        QCString mName;
 
32
};
 
33
 
 
34
 
 
35
class EffectListItem : public QListViewItem
 
36
{
 
37
public:
 
38
        EffectListItem(QListView *parent, QListViewItem *after, Effect *e)
 
39
                : QListViewItem(parent, after, e->title()), mEffect(e)
 
40
        {
 
41
        }
 
42
 
 
43
        Effect *effect() const { return mEffect; }
 
44
 
 
45
private:
 
46
        Effect *mEffect;
 
47
};
 
48
 
 
49
EffectList::EffectList(QWidget *parent)
 
50
        : KListView(parent)
 
51
{
 
52
}
 
53
 
 
54
bool EffectList::acceptDrag(QDropEvent *event) const
 
55
{
 
56
        return QCString(event->format()) == "application/x-noatun-effectdrag";
 
57
}
 
58
 
 
59
QDragObject *EffectList::dragObject() const
 
60
{
 
61
        if (!currentItem()) return 0;
 
62
        return new QStoredDrag("application/x-noatun-effectdrag", (QWidget*)this);
 
63
}
 
64
 
 
65
 
 
66
EffectAvailable::EffectAvailable(QWidget *parent, EffectView *v)
 
67
        : KIconView(parent), mView(v)
 
68
{
 
69
        setGridY(64);
 
70
        setGridX(128);
 
71
        setResizeMode(QIconView::Adjust);
 
72
        setAutoArrange(true);
 
73
        setMode(KIconView::Select);
 
74
}
 
75
 
 
76
QDragObject *EffectAvailable::dragObject()
 
77
{
 
78
        if (!currentItem()) return 0;
 
79
        return new QStoredDrag("application/x-noatun-effectdrag", (QWidget*)this);
 
80
}
 
81
 
 
82
void EffectAvailable::contentsDropEvent(QDropEvent *e)
 
83
{
 
84
        EffectList *el = mView->active();
 
85
        if (el != e->source())
 
86
                return;
 
87
        mView->removeCurrent();
 
88
}
 
89
 
 
90
EffectView::EffectView()
 
91
        : KDialogBase(0, 0, false, i18n("Effects"), Help | Close, Close, true), first(true)
 
92
{
 
93
 
 
94
}
 
95
 
 
96
void EffectView::show()
 
97
{
 
98
        if (first)
 
99
        {
 
100
                setCaption(i18n("Effects"));
 
101
                setIcon(SmallIcon("effect"));
 
102
 
 
103
                QFrame *box = makeMainWidget();
 
104
                (new QHBoxLayout(box, KDialog::marginHint(), KDialog::spacingHint()))->setAutoAdd(true);
 
105
                QSplitter *split = new QSplitter(box);
 
106
                QPushButton *buttons;
 
107
 
 
108
                // left side
 
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."));
 
114
 
 
115
                // center
 
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));
 
120
 
 
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()));
 
126
 
 
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()));
 
132
 
 
133
#ifdef HELPBUTTONS
 
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()));
 
139
#endif
 
140
 
 
141
                vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, 
 
142
                                        QSizePolicy::Expanding));
 
143
 
 
144
                col->setFixedWidth(buttons->width() + 2 * KDialog::marginHint());
 
145
 
 
146
                // right
 
147
                QWidget *col2 = new QWidget(split);
 
148
                (new QHBoxLayout(col2))->setAutoAdd(true);
 
149
 
 
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."));
 
155
 
 
156
                // far 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));
 
161
 
 
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()));
 
167
 
 
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()));
 
173
 
 
174
//#ifdef HELPBUTTONS
 
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()));
 
180
//#endif
 
181
 
 
182
                vbox->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, 
 
183
                                        QSizePolicy::Expanding));
 
184
 
 
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);
 
189
 
 
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);
 
198
 
 
199
                // DND for the KListView
 
200
                connect(mActive, SIGNAL(dropped(QDropEvent*, QListViewItem*)), SLOT(dropEvent(QDropEvent*, QListViewItem*)));
 
201
 
 
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*)));
 
206
 
 
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());
 
213
 
 
214
                first=false;
 
215
        }
 
216
        KDialogBase::show();
 
217
}
 
218
 
 
219
void EffectView::dropEvent(QDropEvent *e, QListViewItem *pafter)
 
220
{
 
221
        EffectListItem *after(static_cast<EffectListItem*>(pafter));
 
222
        if (e->source() == mAvailable)
 
223
        { // add
 
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);
 
229
        }
 
230
        else if (e->source() == mActive)
 
231
        { // move
 
232
                napp->effects()->move(after ? after->effect() : 0, 
 
233
                                      static_cast<EffectListItem*>(mActive->currentItem())->effect());
 
234
        }
 
235
        activeChanged(mActive->currentItem());
 
236
}
 
237
 
 
238
QListViewItem *EffectView::toListItem(Effect *e) const
 
239
{
 
240
        for (QListViewItem *i = mActive->firstChild(); i!=0; i=i->itemBelow())
 
241
                if (static_cast<EffectListItem*>(i)->effect() == e)
 
242
                        return i;
 
243
        return 0;
 
244
}
 
245
 
 
246
void EffectView::added(Effect *item)
 
247
{
 
248
        new EffectListItem(mActive, toListItem(item->before()), item);
 
249
        activeChanged(mActive->currentItem());
 
250
}
 
251
 
 
252
void EffectView::moved(Effect *item)
 
253
{
 
254
        delete toListItem(item);
 
255
        added(item);
 
256
}
 
257
 
 
258
void EffectView::removed(Effect *item)
 
259
{
 
260
        delete toListItem(item);
 
261
        activeChanged(mActive->currentItem());
 
262
}
 
263
 
 
264
void EffectView::moveDown()
 
265
{
 
266
        Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
 
267
 
 
268
        if (e->after())
 
269
                napp->effects()->move(e->after(), e);
 
270
        mActive->setCurrentItem(toListItem(e));
 
271
        mActive->setSelected(toListItem(e), true);
 
272
        activeChanged(mActive->currentItem());
 
273
}
 
274
 
 
275
void EffectView::moveUp()
 
276
{
 
277
        Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
 
278
        if (e->before())
 
279
        {
 
280
                if (e->before()->before())
 
281
                        napp->effects()->move(e->before()->before(), e);
 
282
                else
 
283
                        napp->effects()->move(0, e);
 
284
        }
 
285
        mActive->setCurrentItem(toListItem(e));
 
286
        mActive->setSelected(toListItem(e), true);
 
287
        activeChanged(mActive->currentItem());
 
288
}
 
289
 
 
290
void EffectView::moveLeft()
 
291
{
 
292
        removeCurrent();
 
293
}
 
294
 
 
295
void EffectView::moveRight()
 
296
{
 
297
        napp->effects()->append(new Effect(static_cast<EffectIconItem*>(mAvailable->currentItem())->effectName()));
 
298
        activeChanged(mActive->currentItem());
 
299
}
 
300
 
 
301
void EffectView::removeCurrent()
 
302
{
 
303
        EffectListItem *item = static_cast<EffectListItem*>(mActive->currentItem());
 
304
        napp->effects()->remove(item->effect());
 
305
        activeChanged(mActive->currentItem());
 
306
}
 
307
 
 
308
void EffectView::leftHelp()
 
309
{
 
310
 
 
311
}
 
312
 
 
313
void EffectView::rightHelp()
 
314
{
 
315
        Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
 
316
        if (!e) return;
 
317
        
 
318
        QWidget *c=e->configure();
 
319
        if (c)
 
320
                c->show();
 
321
}
 
322
 
 
323
void EffectView::activeChanged(QListViewItem *i)
 
324
{
 
325
        if(i)
 
326
        {
 
327
                mUp->setEnabled(i->itemAbove());
 
328
                mDown->setEnabled(i->itemBelow());
 
329
                mRight->setEnabled(true);
 
330
                
 
331
                Effect *e = static_cast<EffectListItem*>(mActive->currentItem())->effect();
 
332
                mRightHelp->setEnabled(e->configurable());
 
333
        }
 
334
        else
 
335
        {
 
336
                mUp->setEnabled(false);
 
337
                mDown->setEnabled(false);
 
338
                mRight->setEnabled(false);
 
339
                mRightHelp->setEnabled(false);
 
340
        }
 
341
}
 
342
 
 
343
void EffectView::availableChanged(QIconViewItem *i)
 
344
{
 
345
        if(i)
 
346
        {
 
347
                mLeft->setEnabled(true);
 
348
        }
 
349
        else
 
350
        {
 
351
                mLeft->setEnabled(false);
 
352
        }
 
353
}
 
354
 
 
355
#include "effectview.moc"