From: Robert J. <spa...@us...> - 2005-07-13 18:59:59
|
Update of /cvsroot/lmuse/muse/muse/mixer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22413/muse/mixer Modified Files: Tag: REL07 rack.cpp rack.h Log Message: drag&drop support for effect rack Index: rack.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/mixer/rack.h,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -C2 -d -r1.5 -r1.5.2.1 *** rack.h 17 Apr 2004 11:30:43 -0000 1.5 --- rack.h 13 Jul 2005 18:59:50 -0000 1.5.2.1 *************** *** 11,14 **** --- 11,15 ---- #include <qlistbox.h> + #include "xml.h" class AudioTrack; *************** *** 23,26 **** --- 24,31 ---- virtual QSize minimumSizeHint() const; + + void startDrag(int idx); + void initPlugin(Xml xml, int idx); + QPoint dragPos; private slots: *************** *** 29,32 **** --- 34,45 ---- void songChanged(int); + protected: + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void contentsDropEvent(QDropEvent *event); + void contentsDragEnterEvent(QDragEnterEvent *event); + void contentsMousePressEvent(QMouseEvent *event); + void contentsMouseMoveEvent(QMouseEvent *event); + public: EffectRack(QWidget*, AudioTrack* t); Index: rack.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/mixer/rack.cpp,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -C2 -d -r1.7 -r1.7.2.1 *** rack.cpp 17 Apr 2004 11:30:43 -0000 1.7 --- rack.cpp 13 Jul 2005 18:59:50 -0000 1.7.2.1 *************** *** 7,15 **** --- 7,21 ---- //========================================================= + #include <qapplication.h> #include <qtooltip.h> #include <qpalette.h> #include <qpainter.h> #include <qpopupmenu.h> + #include <qdragobject.h> + #include <qmessagebox.h> + #include <qurl.h> + #include <errno.h> + #include "xml.h" #include "rack.h" #include "song.h" *************** *** 18,21 **** --- 24,28 ---- #include "gconfig.h" #include "plugin.h" + #include "filedialog.h" //--------------------------------------------------------- *************** *** 84,87 **** --- 91,95 ---- setVScrollBarMode(AlwaysOff); setSelectionMode(Single); + setMaximumHeight(18 * PipelineDepth); for (int i = 0; i < PipelineDepth; ++i) new RackSlot(this, track, i); *************** *** 92,95 **** --- 100,104 ---- connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); QToolTip::add(this, tr("effect rack")); + setAcceptDrops(true); } *************** *** 238,239 **** --- 247,414 ---- } + void EffectRack::startDrag(int idx) + { + //printf("startDrag\n"); + + FILE* tmp = tmpfile(); + if (tmp == 0) { + fprintf(stderr, "ParCanvas::copy() fopen failed: %s\n", + strerror(errno)); + return; + } + Xml xml(tmp); + Pipeline* pipe = track->efxPipe(); + if (pipe) { + if ((*pipe)[idx] != NULL) { + //printf("writeConf\n"); + xml.header(); + xml.tag(0, "muse version=\"1.0\""); + (*pipe)[idx]->writeConfiguration(1, xml); + xml.tag(0, "/muse"); + } + else { + //printf("no plugin!\n"); + return; + } + } + else { + //printf("no pipe!\n"); + return; + } + + QString xmlconf; + xml.dump(xmlconf); + QTextDrag *drag = new QTextDrag(xmlconf, this); + drag->setSubtype("x-muse-plugin"); + drag->drag(); + } + + void EffectRack::contentsDropEvent(QDropEvent *event) + { + //printf("contentsDropEvent\n"); + } + + void EffectRack::dropEvent(QDropEvent *event) + { + QString text; + QListBoxItem *i = itemAt( contentsToViewport(event->pos()) ); + int idx = index(i); + + Pipeline* pipe = track->efxPipe(); + if (pipe) { + if ((*pipe)[idx] != NULL) { + if(!QMessageBox::question(this, tr("Replace effect"),tr("Do you really want to replace the effect %1?").arg(pipe->name(idx)), + tr("&Yes"), tr("&No"), + QString::null, 0, 1 )) + { + audio->msgAddPlugin(track, idx, 0); + song->update(SC_RACK); + } + else { + return; + } + } + if(QTextDrag::decode(event, text)) + { + text = text.stripWhiteSpace(); + if (text.endsWith(".pre", false)) + { + QUrl url(text); + QString newPath = url.path(); + + bool popenFlag = false; + FILE* fp = fileOpen(this, newPath, ".pre", "r", popenFlag, false, false); + + if (fp) { + Xml xml(fp); + initPlugin(xml, idx); + } + } + else if (event->provides("text/x-muse-plugin")) + { + //printf("yes!!!!\n"); + QString outxml; + QTextDrag::decode(event, outxml); + Xml xml(outxml); + initPlugin(xml, idx); + } + } + } + } + + void EffectRack::dragEnterEvent(QDragEnterEvent *event) + { + //printf("event accept=%d\n", QTextDrag::canDecode(event)); + event->accept(QTextDrag::canDecode(event)); + } + + + void EffectRack::contentsDragEnterEvent(QDragEnterEvent *event) + { + //printf("contentsDragEnterEvent\n"); + //event->accept(event->provides("text/x-muse-plugin")); + } + + void EffectRack::contentsMousePressEvent(QMouseEvent *event) + { + //printf("contentsMousePressEvent\n"); + if(event->state() & LeftButton) + dragPos = event->pos(); + QListBox::contentsMousePressEvent(event); + } + + void EffectRack::contentsMouseMoveEvent(QMouseEvent *event) + { + //printf("contentsMouseMoveEvent\n"); + if (event->state() & LeftButton) { + int distance = (event->pos() - dragPos).manhattanLength(); + if (distance > QApplication::startDragDistance()) { + QListBoxItem *i = itemAt( contentsToViewport(event->pos()) ); + int idx = index(i); + startDrag(idx); + } + } + QListBox::contentsMouseMoveEvent(event); + } + + + void EffectRack::initPlugin(Xml xml, int idx) + { + for (;;) { + Xml::Token token = xml.parse(); + QString tag = xml.s1(); + switch (token) { + case Xml::Error: + case Xml::End: + return; + case Xml::TagStart: + if (tag == "plugin") { + //printf("got a plugin!\n"); + PluginI* plugi = new PluginI(); + if (plugi->readConfiguration(xml, false)) { + printf("cannot intantiate plugin\n"); + delete plugi; + } + else { + //printf("instantiated!\n"); + audio->msgAddPlugin(track, idx, plugi); + song->update(SC_RACK); + return; + } + } + else if (tag =="muse") + break; + else + xml.unknown("EffectRack"); + break; + case Xml::Attribut: + break; + case Xml::TagEnd: + if (tag == "muse") + return; + default: + break; + } + } + } + |