From 4c02a3b938eae2d351f58bc65d632705180f17fd Mon Sep 17 00:00:00 2001 From: Tobias Rundstrom Date: Sat, 4 Mar 2006 16:06:47 -0300 Subject: [PATCH] Drag from medialib to Playlist now works! No inserts yet, just append --- Medialib.cpp | 32 ++++++++++++++++++++++--- Medialib.h | 13 ++++++++++- PlaylistList.cpp | 61 +++++++++++++++++++++++++++++++++++++++++------- TextBar.cpp | 4 ++++ XMMSHandler.h | 1 + 5 files changed, 99 insertions(+), 12 deletions(-) diff --git a/Medialib.cpp b/Medialib.cpp index ac8f87b..125279a 100644 --- a/Medialib.cpp +++ b/Medialib.cpp @@ -131,6 +131,32 @@ MedialibList::httpDone (int id, bool error) } +QStringList +MedialibList::mimeTypes () const +{ + QStringList types; + types << "application/mlib.album"; + return types; +} + +QMimeData * +MedialibList::mimeData(const QList items) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encodedData; + + MedialibListItem *it = dynamic_cast (currentItem ()); + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + qDebug ("%s %s", qPrintable (it->getArtist ()), qPrintable (it->getAlbum ())); + stream << it->getArtist (); + stream << it->getAlbum (); + + mimeData->setData("application/mlib.album", encodedData); + return mimeData; +} + + void MedialibList::queryCallback (QList >l) { @@ -144,7 +170,7 @@ MedialibList::queryCallback (QList >l) for (int i = 0; i < l.count (); i++) { QHash h(l.value (i)); - MedialibListItem *item = new MedialibListItem (h.value("artist") + " - " + h.value("album"), this); + MedialibListItem *item = new MedialibListItem (h.value("artist"), h.value("album"), this); item->setSizeHint (QSize (90, 90)); item->setIcon (QIcon (":nocover.jpg")); item->setFont (font); @@ -153,7 +179,7 @@ MedialibList::queryCallback (QList >l) if (h.contains ("image")) { QString name = qtMD5 ((h.value("artist").toLower()+"-"+h.value("album").toLower()).toUtf8()); - QString fname (QDir::homePath () +"/.xmms2/clients/generic/art/"+name+"_small.jpg"); + QString fname (QDir::homePath () +"/.xmms2/clients/generic/art/"+name+"-small.jpg"); if (!QFile::exists (fname)) { QUrl url (h.value("image")); @@ -163,7 +189,7 @@ MedialibList::queryCallback (QList >l) m_http->setUser (url.userName(), url.password()); } - QFile *file = new QFile ("/tmp/"+name+"_small.jpg"); + QFile *file = new QFile ("/tmp/"+name+"-small.jpg"); file->open(QIODevice::WriteOnly); item->setFile (file); diff --git a/Medialib.h b/Medialib.h index fe9d2d7..aae7161 100644 --- a/Medialib.h +++ b/Medialib.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -18,13 +19,21 @@ class MedialibWindow; class MedialibListItem : public QListWidgetItem { public: - MedialibListItem (QString text, QListWidget *parent) : QListWidgetItem (text, parent) {} + MedialibListItem (QString artist, QString album, QListWidget *parent) : + QListWidgetItem (artist + " - " + album, parent) { + m_artist = artist; + m_album = album; + } ~MedialibListItem () {} void setFile (QFile *f) { m_file = f; } QFile *getFile (void) { return m_file; } + QString getArtist (void) { return m_artist; } + QString getAlbum (void) { return m_album; } private: QFile *m_file; + QString m_artist; + QString m_album; }; class MedialibList : public QListWidget @@ -33,11 +42,13 @@ class MedialibList : public QListWidget public: MedialibList (QWidget *parent); ~MedialibList () {} + QStringList mimeTypes (void) const; public slots: void queryCallback (QList >); void httpDone (int, bool); void search (QString); + QMimeData *mimeData(const QList items) const; private: QHash *m_httpmap; diff --git a/PlaylistList.cpp b/PlaylistList.cpp index 9d3b17b..905447f 100644 --- a/PlaylistList.cpp +++ b/PlaylistList.cpp @@ -302,8 +302,15 @@ PlaylistList::mouseMoveEvent (QMouseEvent *event) int i = m_selected->last (); m_drag = new QDrag (this); - m_md = new QMimeData; - m_md->setText (QString::number (m_selected->last ())); + + m_md = new QMimeData(); + QByteArray encodedData; + + QDataStream stream (&encodedData, QIODevice::WriteOnly); + stream << QString::number (m_selected->last ()); + + m_md->setData("application/playlist.move", encodedData); + m_drag->setMimeData (m_md); m_drag_id = m_items->value (i)->getID (); @@ -323,7 +330,25 @@ PlaylistList::mouseMoveEvent (QMouseEvent *event) void PlaylistList::dragEnterEvent (QDragEnterEvent *event) { + + if (event->mimeData()->hasFormat("application/mlib.album") || + event->mimeData()->hasFormat("application/playlist.move")) + event->acceptProposedAction(); + /* + const QMimeData *md = event->mimeData (); + QByteArray encodedData = md->data("application/mlib.album"); + QDataStream stream(&encodedData, QIODevice::ReadOnly); + + QString artist; + QString album; + stream >> artist; + stream >> album; + + qDebug ("korv %s - %s", qPrintable (artist), + qPrintable (album)); + event->accept (); + */ } void @@ -352,13 +377,33 @@ PlaylistList::dropEvent (QDropEvent *event) { XMMSHandler *xmmsh = XMMSHandler::getInstance (); - if (m_bar == -2) { - m_items->insert (m_pos, m_itemmap->value (m_drag_id)); - } else { - m_items->insert (m_bar + 1, m_itemmap->value (m_drag_id)); - xmmsh->playlistMove (m_pos, m_bar + 1); + if (event->mimeData()->hasFormat("application/playlist.move")) { + if (m_bar == -2) { + m_items->insert (m_pos, m_itemmap->value (m_drag_id)); + } else { + m_items->insert (m_bar + 1, m_itemmap->value (m_drag_id)); + xmmsh->playlistMove (m_pos, m_bar + 1); + } + m_selected->append (m_drag_id); + + event->acceptProposedAction (); + } else if (event->mimeData()->hasFormat("application/mlib.album")) { + const QMimeData *md = event->mimeData (); + QByteArray encodedData = md->data("application/mlib.album"); + QDataStream stream(&encodedData, QIODevice::ReadOnly); + + QString artist; + QString album; + stream >> artist; + stream >> album; + + QString query; + query.sprintf ("select m1.id as id, ifnull(m3.value,-1) as tracknr from Media m1 join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='tracknr' where m1.key='artist' and m1.value='%s' and m2.value='%s' order by tracknr", artist.toUtf8 ().data (), album.toUtf8 ().data ()); + + xmmsh->medialibQueryAdd (query); + + event->acceptProposedAction (); } - m_selected->append (m_drag_id); m_bar = -2; update (); } diff --git a/TextBar.cpp b/TextBar.cpp index 4893fbc..57e1259 100644 --- a/TextBar.cpp +++ b/TextBar.cpp @@ -13,7 +13,11 @@ TextScroller::TextScroller (QWidget *parent, uint w, uint h) : QWidget (parent) m_w = w; m_x_off = 0; m_x2_off = 0; +#ifdef Q_OS_MACX + m_fontsize = 9; +#else m_fontsize = 8; /* default */ +#endif m_ttf = true; setMinimumSize(m_w + 2, m_h); diff --git a/XMMSHandler.h b/XMMSHandler.h index 2d214e1..f97193c 100644 --- a/XMMSHandler.h +++ b/XMMSHandler.h @@ -32,6 +32,7 @@ class XMMSHandler : public QObject, public sigc::trackable { void playlistRemove (uint pos) { delete m_xmmsc->playlist_remove (pos); } void playlistMove (uint pos, uint newpos) { delete m_xmmsc->playlist_move (pos, newpos); } void medialibQuery (QString); + void medialibQueryAdd (QString q) { delete m_xmmsc->medialib_add_to_playlist (q.toUtf8 ()); } const XMMSClient *getXMMS () { return m_xmmsc; }