diff --git a/MediaAlbumList.cpp b/MediaAlbumList.cpp new file mode 100644 index 0000000..69f2bb3 --- /dev/null +++ b/MediaAlbumList.cpp @@ -0,0 +1,105 @@ +#include "XMMSHandler.h" + +#include "MediaAlbumList.h" + +#include "qtmd5.h" + +#include + + +MediaAlbumList::MediaAlbumList (QWidget *parent, const QString &name) : + MedialibList (parent, name) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + connect (xmmsh, SIGNAL (medialibResponse (uint, QList >)), + this, SLOT (queryCallback (uint, QList >))); + + refresh (); +} + +void +MediaAlbumList::refresh (void) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + m_cid = xmmsh->medialibQuery ("select distinct ifnull(nullif(ifnull(nullif(ifnull(m3.value,0),1),'Various Artists'),0),m1.value) as artist, ifnull(m2.value,'[unknown]') as album, m4.value as art from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='compilation' left join Media m4 on m4.id = m1.id and m4.key='album_front_small' where m1.key='artist' order by artist, album"); +} + + +QStringList +MediaAlbumList::mimeTypes () const +{ + QStringList types; + types << "application/mlib.album"; + return types; +} + +QMimeData * +MediaAlbumList::mimeData(const QList items) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encodedData; + + MedialibListItem *it = dynamic_cast (currentItem ()); + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + stream << it->getArtist (); + stream << it->getAlbum (); + + mimeData->setData("application/mlib.album", encodedData); + return mimeData; +} + + +void +MediaAlbumList::queryCallback (uint id, QList >l) +{ + if (m_cid != id) + return; + + clear (); + + qDebug ("in query callback album"); + + for (int i = 0; i < l.count (); i++) { + QHash h(l.value (i)); + + MedialibListItem *item = new MedialibListItem (h.value("artist"), h.value("album"), this); + item->setFont (m_font); + item->setTextAlignment (Qt::AlignVCenter); + + if (m_noicon) { + continue; + } + + item->setIcon (QIcon (":noalbum.png")); + item->setSizeHint (iconSize () + QSize (2, 2)); + + if (h.contains ("art")) { + + QString name = qtMD5 ((h.value("artist").toLower()+"-"+h.value("album").toLower()).toUtf8()); + QString fname (QDir::homePath () +"/.xmms2/clients/generic/art/"+name+"-small.jpg"); + + if (!QFile::exists (fname)) { + QUrl url (h.value("art")); + + QFile *file = new QFile ("/tmp/"+name+"-small.jpg"); + file->open(QIODevice::WriteOnly); + + item->setFile (file); + m_win->addRequest (url, item); + + } else { + QIcon ico (fname); + item->setIcon (ico); + } + + } + + + } + + +} + diff --git a/MediaAlbumList.h b/MediaAlbumList.h new file mode 100644 index 0000000..ed8b870 --- /dev/null +++ b/MediaAlbumList.h @@ -0,0 +1,24 @@ +#ifndef __MEDIAALBUMLIST_H__ +#define __MEDIAALBUMLIST_H__ + +class MediaAlbumList; + +#include "Medialib.h" + +class MediaAlbumList : public MedialibList +{ + Q_OBJECT + public: + MediaAlbumList (QWidget *parent, const QString &name); + ~MediaAlbumList () {} + QStringList mimeTypes (void) const; + + void refresh (void); + + public slots: + void queryCallback (uint, QList >); + QMimeData *mimeData(const QList items) const; + +}; + +#endif diff --git a/MediaArtistList.cpp b/MediaArtistList.cpp new file mode 100644 index 0000000..5cd35a6 --- /dev/null +++ b/MediaArtistList.cpp @@ -0,0 +1,102 @@ +#include "XMMSHandler.h" + +#include "MediaArtistList.h" + +#include "qtmd5.h" + +#include + +MediaArtistList::MediaArtistList (QWidget *parent, const QString &name) : + MedialibList (parent, name) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + connect (xmmsh, SIGNAL (medialibResponse (uint, QList >)), + this, SLOT (queryCallback (uint, QList >))); + + refresh (); +} + +void +MediaArtistList::refresh (void) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + m_cid = xmmsh->medialibQuery ("select distinct ifnull(nullif(ifnull(nullif(ifnull(m2.value,0),1),'Various Artists'),0),m1.value) as artist, m3.value as art from Media m1 left join Media m2 on m1.id = m2.id and m2.key='compilation' left join Media m3 on m3.id = m1.id and m3.key='artist_art_small' where m1.key='artist' order by artist"); +} + +QStringList +MediaArtistList::mimeTypes () const +{ + QStringList types; + types << "application/mlib.artist"; + return types; +} + +QMimeData * +MediaArtistList::mimeData(const QList items) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encodedData; + + MedialibListItem *it = dynamic_cast (currentItem ()); + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + stream << it->getArtist (); + + mimeData->setData("application/mlib.artist", encodedData); + return mimeData; +} + + +void +MediaArtistList::queryCallback (uint id, QList >l) +{ + if (m_cid != id) + return; + + clear (); + + qDebug ("in query callback artist"); + + for (int i = 0; i < l.count (); i++) { + QHash h(l.value (i)); + + MedialibListItem *item = new MedialibListItem (h.value("artist"), this); + item->setFont (m_font); + item->setTextAlignment (Qt::AlignVCenter); + + if (m_noicon) { + continue; + } + + item->setIcon (QIcon (":noartist.png")); + item->setSizeHint (iconSize () + QSize (5, 5)); + + if (h.contains ("art")) { + + QString name = qtMD5 ((h.value("artist").toLower()).toUtf8()); + QString fname (QDir::homePath () +"/.xmms2/clients/generic/art/"+name+"-small.jpg"); + + if (!QFile::exists (fname)) { + QUrl url (h.value("art")); + + QFile *file = new QFile ("/tmp/"+name+"-small.jpg"); + file->open(QIODevice::WriteOnly); + + item->setFile (file); + m_win->addRequest (url, item); + + } else { + QIcon ico (fname); + item->setIcon (ico); + } + + } + + + } + + +} + diff --git a/MediaArtistList.h b/MediaArtistList.h new file mode 100644 index 0000000..30b9e9a --- /dev/null +++ b/MediaArtistList.h @@ -0,0 +1,24 @@ +#ifndef __MEDIAARTISTLIST_H__ +#define __MEDIAARTISTLIST_H__ + +class MediaArtistList; + +#include "Medialib.h" + +class MediaArtistList : public MedialibList +{ + Q_OBJECT + + public: + MediaArtistList (QWidget *parent, const QString &name); + ~MediaArtistList () {} + QStringList mimeTypes (void) const; + void refresh (void); + + public slots: + void queryCallback (uint, QList >); + QMimeData *mimeData(const QList items) const; + +}; + +#endif diff --git a/MediaSongList.cpp b/MediaSongList.cpp new file mode 100644 index 0000000..4c35221 --- /dev/null +++ b/MediaSongList.cpp @@ -0,0 +1,100 @@ +#include "XMMSHandler.h" + +#include "MediaSongList.h" + +#include "qtmd5.h" + +#include + +MediaSongList::MediaSongList (QWidget *parent, const QString &name) : + MedialibList (parent, name) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + connect (xmmsh, SIGNAL (medialibResponse (uint, QList >)), + this, SLOT (queryCallback (uint, QList >))); + + refresh (); +} + +void +MediaSongList::refresh (void) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + m_cid = xmmsh->medialibQuery ("select distinct ifnull(m1.value,'[unknown]') as artist, ifnull(m2.value,'[unknown]') as album, ifnull(m5.value,m6.value) as song, ifnull(m7.value,-1) as tracknr, m4.value as art from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m4 on m4.id = m1.id and m4.key='album_front_small' left join Media m5 on m1.id = m5.id and m5.key='title' left join Media m6 on m1.id = m6.id and m6.key='url' left join Media m7 on m1.id = m7.id and m7.key='tracknr' where m1.key='artist' order by artist, album, tracknr, song"); + +} + +QStringList +MediaSongList::mimeTypes () const +{ + QStringList types; + types << "application/mlib.song"; + return types; +} + +QMimeData * +MediaSongList::mimeData(const QList items) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encodedData; + + MedialibListItem *it = dynamic_cast (currentItem ()); + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + stream << it->getArtist (); + stream << it->getAlbum (); + stream << it->getSong (); + + mimeData->setData("application/mlib.song", encodedData); + return mimeData; +} + + +void +MediaSongList::queryCallback (uint id, QList >l) +{ + if (m_cid != id) + return; + + qDebug ("in query callback song"); + + clear (); + + m_win->setBusy (false); + m_win->setStatusText ("idle"); + + for (int i = 0; i < l.count (); i++) { + QHash h(l.value (i)); + + MedialibListItem *item = new MedialibListItem (h.value("artist"), + h.value("album"), + h.value("song"), + this); + item->setFont (m_font); + item->setTextAlignment (Qt::AlignVCenter); + + if (m_noicon) { + continue; + } + + item->setIcon (QIcon (":nosong.png")); + item->setSizeHint (iconSize () + QSize (2, 2)); + + if (h.contains ("art")) { + + QString name = qtMD5 ((h.value("artist").toLower()+"-"+h.value("album").toLower()).toUtf8()); + QString fname (QDir::homePath () +"/.xmms2/clients/generic/art/"+name+"-small.jpg"); + + if (QFile::exists (fname)) { + QIcon ico (fname); + item->setIcon (ico); + } + + } + + + } +} + diff --git a/MediaSongList.h b/MediaSongList.h new file mode 100644 index 0000000..5ca5f33 --- /dev/null +++ b/MediaSongList.h @@ -0,0 +1,23 @@ +#ifndef __MEDIASONGLIST_H__ +#define __MEDIASONGLIST_H__ + +class MediaSongList; + +#include "Medialib.h" + +class MediaSongList : public MedialibList +{ + Q_OBJECT + public: + MediaSongList (QWidget *parent, const QString &name); + ~MediaSongList () {} + QStringList mimeTypes (void) const; + void refresh (void); + + public slots: + void queryCallback (uint, QList >); + QMimeData *mimeData(const QList items) const; + +}; + +#endif diff --git a/Medialib.cpp b/Medialib.cpp index 6263759..9e3a6c4 100644 --- a/Medialib.cpp +++ b/Medialib.cpp @@ -8,6 +8,10 @@ #include #include "qtmd5.h" +#include "MediaArtistList.h" +#include "MediaAlbumList.h" +#include "MediaSongList.h" + MedialibWindow::MedialibWindow (QWidget *parent) : QMainWindow (parent) { #ifndef _WIN32 @@ -15,6 +19,8 @@ MedialibWindow::MedialibWindow (QWidget *parent) : QMainWindow (parent) #endif setWindowTitle ("Promoe - Medialib Window"); + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + QSettings s; s.beginGroup ("medialib"); @@ -43,11 +49,36 @@ MedialibWindow::MedialibWindow (QWidget *parent) : QMainWindow (parent) m_status->setFrameStyle (QFrame::NoFrame); statusBar ()->addPermanentWidget (m_status, 2); - m_list = new MedialibList (this); - m_tab->addTab (new QWidget (), tr ("Artists")); - m_tab->addTab (m_list, tr ("Albums")); - m_tab->addTab (new QWidget (), tr ("Songs")); + /*** Init views ***/ + QDir dir (QDir::homePath ()+"/.xmms2/clients/generic/art/"); + if (!dir.exists()) { + dir.mkpath (dir.path ()); + } + m_http = new QHttp (this); + connect (m_http, SIGNAL (requestFinished (int, bool)), this, + SLOT (httpDone (int, bool))); + + /*** artist ***/ + m_artist = new MediaArtistList (this, "artist"); + m_tab->addTab (m_artist, tr ("Artists")); + connect (m_search, SIGNAL (textEdited (QString)), + m_artist, SLOT (search (QString))); + + /*** album ***/ + m_album = new MediaAlbumList (this, "album"); + m_tab->addTab (m_album, tr ("Albums")); + connect (m_search, SIGNAL (textEdited (QString)), + m_album, SLOT (search (QString))); + + /*** song ***/ + m_song = new MediaSongList (this, "song"); + m_tab->addTab (m_song, tr ("Songs")); + connect (m_search, SIGNAL (textEdited (QString)), + m_song, SLOT (search (QString))); + + + /*** set active view from config ***/ for (int i = 0; i < m_tab->count() ; i++) { if (s.value("selected").toString () == m_tab->tabText (i)) { m_tab->setCurrentIndex (i); @@ -57,60 +88,46 @@ MedialibWindow::MedialibWindow (QWidget *parent) : QMainWindow (parent) s.endGroup (); - connect (m_search, SIGNAL (textEdited (QString)), m_list, SLOT (search (QString))); -} + setBusy (true); + setStatusText ("Loading medialib"); -MedialibList::MedialibList (QWidget *parent) : QListWidget () -{ - XMMSHandler *xmmsh = XMMSHandler::getInstance (); - m_http = new QHttp (this); - m_httpmap = new QHash; - m_win = dynamic_cast (parent); - - setIconSize (QSize (85, 85)); - setDragEnabled (true); - - QDir dir (QDir::homePath ()+"/.xmms2/clients/generic/art/"); - if (!dir.exists()) { - dir.mkpath (dir.path ()); - } - - xmmsh->medialibQuery ("select distinct ifnull(nullif(ifnull(nullif(ifnull(m3.value,0),1),'Various Artists'),0),m1.value) as artist, ifnull(m2.value,'[unknown]') as album, m4.value as image from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='compilation' left join Media m4 on m4.id = m1.id and m4.key='album_front_small' where m1.key='artist' order by artist, album"); - - connect (xmmsh, SIGNAL (medialibResponse (QList >)), - this, SLOT (queryCallback (QList >))); - - connect (m_http, SIGNAL (requestFinished (int, bool)), this, - SLOT (httpDone (int, bool))); - - m_win->setBusy (true); - m_win->setStatusText ("Loading album view"); + connect (xmmsh, SIGNAL (settingsSaved ()), this, SLOT (settingsSaved ())); } void -MedialibList::search (QString s) +MedialibWindow::settingsSaved () { - if (s.length () > 0) { - for (int i = 0; i < count (); i++) { - MedialibListItem *it = dynamic_cast (item (i)); - if (!it->text().contains (s, Qt::CaseInsensitive)) { - setItemHidden (it, true); - } else if (isItemHidden (it)) { - setItemHidden (it, false); - } - } + m_artist->setSizes(); + m_album->setSizes(); + m_song->setSizes(); - } else { - for (int i = 0; i < count (); i++) { - MedialibListItem *it = dynamic_cast (item (i)); - setItemHidden (it, false); - } - } + setBusy (true); + setStatusText ("Refreshing medialib"); + m_artist->refresh(); + m_album->refresh(); + m_song->refresh(); + + update (); } void -MedialibList::httpDone (int id, bool error) +MedialibWindow::addRequest (QUrl url, MedialibListItem *item) +{ + m_http->setHost (url.host (), url.port () != 1 ? url.port () : 80); + + if (!url.userName().isEmpty()) { + m_http->setUser (url.userName(), url.password()); + } + + int id = m_http->get (url.path (), item->getFile ()); + m_httpmap->insert (id, item); + + qDebug ("add request %s (%d)", qPrintable (url.path ()), id); +} + +void +MedialibWindow::httpDone (int id, bool error) { if (error) { qWarning ("error!"); @@ -137,11 +154,11 @@ MedialibList::httpDone (int id, bool error) delete f; m_httpmap->remove (id); if (m_httpmap->count () == 0) { - m_win->setBusy (false); - m_win->setStatusText ("idle"); + setBusy (false); + setStatusText ("idle"); } else { - m_win->setBusy (m_httpmap->count ()); - m_win->setStatusText ("Got art for: " + it->text()); + setBusy (m_httpmap->count ()); + setStatusText ("Got art for: " + it->text()); } } @@ -149,84 +166,67 @@ MedialibList::httpDone (int id, bool error) } -QStringList -MedialibList::mimeTypes () const + + +MedialibList::MedialibList (QWidget *parent, const QString &name) : QListWidget () { - QStringList types; - types << "application/mlib.album"; - return types; + m_win = dynamic_cast (parent); + + setDragEnabled (true); + + m_name = name; + setSizes (); } -QMimeData * -MedialibList::mimeData(const QList items) const -{ - QMimeData *mimeData = new QMimeData(); - QByteArray encodedData; - - MedialibListItem *it = dynamic_cast (currentItem ()); - - QDataStream stream(&encodedData, QIODevice::WriteOnly); - stream << it->getArtist (); - stream << it->getAlbum (); - - mimeData->setData("application/mlib.album", encodedData); - return mimeData; -} - - void -MedialibList::queryCallback (QList >l) +MedialibList::setSizes (void) { - QFont font; - - font.setPixelSize (14); - - m_win->setBusy (false); - m_win->setStatusText ("idle"); - - for (int i = 0; i < l.count (); i++) { - QHash h(l.value (i)); - - MedialibListItem *item = new MedialibListItem (h.value("artist"), h.value("album"), this); - item->setSizeHint (QSize (90, 90)); - item->setIcon (QIcon (":nocover.png")); - item->setFont (font); - item->setTextAlignment (Qt::AlignVCenter); - - 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"); - - if (!QFile::exists (fname)) { - QUrl url (h.value("image")); - - m_http->setHost (url.host(), url.port() != -1 ? url.port() : 80); - if (!url.userName().isEmpty()) { - m_http->setUser (url.userName(), url.password()); - } - - QFile *file = new QFile ("/tmp/"+name+"-small.jpg"); - file->open(QIODevice::WriteOnly); - - item->setFile (file); - - int id = m_http->get (url.path(), file); - m_httpmap->insert (id, item); - } else { - QIcon ico (fname); - item->setIcon (ico); - } - - } + QSettings s; + s.beginGroup ("medialib_"+m_name); + if (!s.contains ("size")) { + s.setValue ("size", tr ("Large")); } + + QString size = s.value("size").toString (); + + m_noicon = false; - if (m_httpmap->count() > 0) { - m_win->setBusy (0, m_httpmap->count ()); - m_win->setStatusText ("Loading album art"); + if (size == tr ("Small")) { + setIconSize (QSize (42, 42)); + m_font.setPixelSize (10); + } else if (size == tr ("Large")) { + setIconSize (QSize (85, 85)); + m_font.setPixelSize (14); + } else if (size == tr ("None")) { + setIconSize (QSize (10, 10)); + m_noicon = true; + m_font.setPixelSize (10); } } +void +MedialibList::search (const QString &s) +{ + if (s.length () > 0) { + for (int i = 0; i < count (); i++) { + MedialibListItem *it = dynamic_cast (item (i)); + if (!it->text().contains (s, Qt::CaseInsensitive)) { + setItemHidden (it, true); + } else if (isItemHidden (it)) { + setItemHidden (it, false); + } + } + + } else { + for (int i = 0; i < count (); i++) { + MedialibListItem *it = dynamic_cast (item (i)); + setItemHidden (it, false); + } + } + +} + + diff --git a/Medialib.h b/Medialib.h index aae7161..6324b86 100644 --- a/Medialib.h +++ b/Medialib.h @@ -13,48 +13,75 @@ #include #include #include +#include class MedialibWindow; class MedialibListItem : public QListWidgetItem { public: - MedialibListItem (QString artist, QString album, QListWidget *parent) : + MedialibListItem (const QString &artist, const QString &album, + const QString &song, QListWidget *parent) : + QListWidgetItem (artist + " - " + song, parent) { + m_artist = artist; + m_album = album; + m_song = song; + } + MedialibListItem (const QString &artist, const QString &album, + QListWidget *parent) : QListWidgetItem (artist + " - " + album, parent) { m_artist = artist; m_album = album; } + MedialibListItem (const QString &artist, QListWidget *parent) : + QListWidgetItem (artist, parent) { + m_artist = artist; + } + ~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; } + QString getSong (void) { return m_song; } private: QFile *m_file; QString m_artist; QString m_album; + QString m_song; }; class MedialibList : public QListWidget { Q_OBJECT public: - MedialibList (QWidget *parent); + MedialibList (QWidget *parent, const QString &name); ~MedialibList () {} - QStringList mimeTypes (void) const; + void setSizes (void); + void refresh (void) {} + /* + QStringList mimeTypes (void) const {}; + */ public slots: - void queryCallback (QList >); - void httpDone (int, bool); - void search (QString); - QMimeData *mimeData(const QList items) const; + + /* + void queryCallback (uint, QList >) {}; + QMimeData *mimeData(const QList items) const {}; + */ + + void search (const QString &); + + protected: + uint m_cid; + QFont m_font; + MedialibWindow *m_win; + bool m_noicon; private: - QHash *m_httpmap; - QHttp *m_http; - MedialibWindow *m_win; - int m_httpr; + QString m_name; }; @@ -74,17 +101,26 @@ class MedialibWindow : public QMainWindow m_progress->reset (); } } + void setBusy (int min, int max) { m_progress->setMaximum (max); m_progress->setMinimum (min); } + void setBusy (int cur) { m_progress->setValue (cur); } + void setStatusText (QString s) { m_status->setText (s); } + void addRequest (QUrl url, MedialibListItem *item); + + public slots: + void httpDone (int, bool); + void settingsSaved (void); + private: QWidget *m_dummy; QTabWidget *m_tab; @@ -92,7 +128,12 @@ class MedialibWindow : public QMainWindow QVBoxLayout *m_vbox; QProgressBar *m_progress; QLabel *m_status; - MedialibList *m_list; + MedialibList *m_artist; + MedialibList *m_album; + MedialibList *m_song; + + QHash *m_httpmap; + QHttp *m_http; }; #endif diff --git a/PlaylistList.cpp b/PlaylistList.cpp index 730063d..a5bdd92 100644 --- a/PlaylistList.cpp +++ b/PlaylistList.cpp @@ -343,7 +343,7 @@ PlaylistList::mouseMoveEvent (QMouseEvent *event) m_items->removeAt (i); m_selected->clear (); - Qt::DropAction drop = m_drag->start (); + m_drag->start (); } } @@ -353,23 +353,10 @@ PlaylistList::dragEnterEvent (QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/mlib.album") || + event->mimeData()->hasFormat("application/mlib.artist") || + event->mimeData()->hasFormat("application/mlib.song") || 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 @@ -427,6 +414,41 @@ PlaylistList::dropEvent (QDropEvent *event) xmmsh->medialibQueryAdd (query); + event->acceptProposedAction (); + } else if (event->mimeData()->hasFormat("application/mlib.artist")) { + const QMimeData *md = event->mimeData (); + QByteArray encodedData = md->data("application/mlib.artist"); + QDataStream stream(&encodedData, QIODevice::ReadOnly); + + QString artist; + stream >> artist; + + QString query; + if (artist == "Various Artists") { + query.sprintf ("select m1.id as id, m2.value as album, ifnull(m3.value,-1) as tracknr from Media m1 left 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='compilation' and m1.value=1 order by album, tracknr;"); + } else { + query.sprintf ("select m1.id as id, m2.value as album, ifnull(m3.value,-1) as tracknr from Media m1 left 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' order by album, tracknr", artist.toUtf8 ().data ()); + } + + xmmsh->medialibQueryAdd (query); + event->acceptProposedAction (); + } else if (event->mimeData()->hasFormat("application/mlib.song")) { + const QMimeData *md = event->mimeData (); + QByteArray encodedData = md->data("application/mlib.song"); + QDataStream stream(&encodedData, QIODevice::ReadOnly); + + QString artist; + QString album; + QString song; + stream >> artist; + stream >> album; + stream >> song; + + QString query; + query.sprintf ("select m1.id as id, ifnull(m1.value, '[unknown]') as artist, ifnull(m2.value,'[unknown]') as album, ifnull(m4.value,m5.value) as song from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m4 on m1.id = m4.id and m4.key='title' left join Media m5 on m1.id = m5.id and m5.key='url' where m1.key='artist' and artist='%s' and album='%s' and song='%s'", artist.toUtf8 ().data (), album.toUtf8 ().data (), song.toUtf8 ().data ()); + + xmmsh->medialibQueryAdd (query); + event->acceptProposedAction (); } m_bar = -2; diff --git a/SettingsWindow.cpp b/SettingsWindow.cpp index 993ff23..72630fe 100644 --- a/SettingsWindow.cpp +++ b/SettingsWindow.cpp @@ -61,6 +61,18 @@ SettingsTabMedialib::SettingsTabMedialib (QWidget *parent) : QWidget (parent) { QSettings s; + if (!s.contains ("medialib_artist/size")) { + s.setValue ("medialib_artist/size", tr ("Large")); + } + + if (!s.contains ("medialib_album/size")) { + s.setValue ("medialib_album/size", tr ("Large")); + } + + if (!s.contains ("medialib_song/size")) { + s.setValue ("medialib_song/size", tr ("Large")); + } + s.beginGroup("medialib"); QWidget *dummy = new QWidget (this); @@ -87,7 +99,121 @@ SettingsTabMedialib::SettingsTabMedialib (QWidget *parent) : QWidget (parent) h->addWidget (m_selected); QLabel *l = new QLabel (tr ("Selected tab on startup"), c); + h->addWidget (l, 1); + s.endGroup (); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + + vbox->addWidget (c, 1); + + s.beginGroup ("medialib_artist"); + + l = new QLabel (tr ("Artist view"), c); + + QFrame *f = new QFrame (c); + f->setFrameStyle (QFrame::HLine | QFrame::Raised); + h->addWidget (l); + h->addWidget (f, 1); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + + vbox->addWidget (c, 1); + + m_artistsize = new QComboBox (c); + m_artistsize->addItem (tr ("None")); + m_artistsize->addItem (tr ("Small")); + m_artistsize->addItem (tr ("Large")); + m_artistsize->setEditable (false); + + curr = s.value ("size").toString (); + for (int i = 0; i < m_artistsize->count(); i++) { + if (m_artistsize->itemText (i) == curr) { + m_artistsize->setCurrentIndex (i); + break; + } + } + + h->addWidget (m_artistsize); + l = new QLabel (tr ("Size of media art icon"), c); + h->addWidget (l, 1); + + s.endGroup (); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + vbox->addWidget (c, 1); + + s.beginGroup ("medialib_album"); + + l = new QLabel (tr ("Album view"), c); + + f = new QFrame (c); + f->setFrameStyle (QFrame::HLine | QFrame::Raised); + h->addWidget (l); + h->addWidget (f, 1); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + + vbox->addWidget (c, 1); + + m_albumsize = new QComboBox (c); + m_albumsize->addItem (tr ("None")); + m_albumsize->addItem (tr ("Small")); + m_albumsize->addItem (tr ("Large")); + m_albumsize->setEditable (false); + + curr = s.value ("size").toString (); + for (int i = 0; i < m_artistsize->count(); i++) { + if (m_albumsize->itemText (i) == curr) { + m_albumsize->setCurrentIndex (i); + break; + } + } + + h->addWidget (m_albumsize); + l = new QLabel (tr ("Size of media art icon"), c); + h->addWidget (l, 1); + + s.endGroup (); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + vbox->addWidget (c, 1); + + s.beginGroup ("medialib_song"); + + l = new QLabel (tr ("Song view"), c); + + f = new QFrame (c); + f->setFrameStyle (QFrame::HLine | QFrame::Raised); + h->addWidget (l); + h->addWidget (f, 1); + + c = new QWidget (dummy); + h = new QHBoxLayout (c); + + vbox->addWidget (c, 1); + + m_songsize = new QComboBox (c); + m_songsize->addItem (tr ("None")); + m_songsize->addItem (tr ("Small")); + m_songsize->addItem (tr ("Large")); + m_songsize->setEditable (false); + + curr = s.value ("size").toString (); + for (int i = 0; i < m_artistsize->count(); i++) { + if (m_songsize->itemText (i) == curr) { + m_songsize->setCurrentIndex (i); + break; + } + } + + h->addWidget (m_songsize); + l = new QLabel (tr ("Size of media art icon"), c); h->addWidget (l, 1); s.endGroup (); @@ -99,6 +225,9 @@ SettingsTabMedialib::saveSettings () { QSettings s; s.setValue ("medialib/selected", m_selected->currentText ()); + s.setValue ("medialib_artist/size", m_artistsize->currentText ()); + s.setValue ("medialib_album/size", m_albumsize->currentText ()); + s.setValue ("medialib_song/size", m_songsize->currentText ()); } SettingsTabPlaylist::SettingsTabPlaylist (QWidget *parent) : QWidget (parent) diff --git a/SettingsWindow.h b/SettingsWindow.h index 12360ed..f12ffe1 100644 --- a/SettingsWindow.h +++ b/SettingsWindow.h @@ -20,6 +20,9 @@ class SettingsTabMedialib : public QWidget { private: QComboBox *m_selected; + QComboBox *m_artistsize; + QComboBox *m_albumsize; + QComboBox *m_songsize; }; class SettingsTabPlaylist : public QWidget { diff --git a/XMMSHandler.cpp b/XMMSHandler.cpp index ff510b5..882598c 100644 --- a/XMMSHandler.cpp +++ b/XMMSHandler.cpp @@ -261,11 +261,12 @@ XMMSHandler::PropDictToQHash (XMMSResultDict *res) return h; } -void +uint XMMSHandler::medialibQuery (QString q) { XMMSResultDictList *r = m_xmmsc->medialib_select (q.toUtf8 ()); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_select)); + return r->getCID (); } void @@ -278,7 +279,7 @@ XMMSHandler::medialib_select (XMMSResultDictList *res) l.append (h); } - emit medialibResponse (l); + emit medialibResponse (res->getCID (), l); } void diff --git a/XMMSHandler.h b/XMMSHandler.h index a8d8363..aed1791 100644 --- a/XMMSHandler.h +++ b/XMMSHandler.h @@ -31,7 +31,7 @@ class XMMSHandler : public QObject, public sigc::trackable { void playlistClear (void); 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); + uint medialibQuery (QString); void medialibQueryAdd (QString q) { delete m_xmmsc->medialib_add_to_playlist (q.toUtf8 ()); } const XMMSClient *getXMMS () { return m_xmmsc; } @@ -63,7 +63,7 @@ class XMMSHandler : public QObject, public sigc::trackable { void playlistList (QList); void currentID (uint); void playlistChanged (QHash); - void medialibResponse (QList >); + void medialibResponse (uint, QList >); private: XmmsQT4 *m_qt4; diff --git a/noalbum.png b/noalbum.png new file mode 100644 index 0000000..37c5098 Binary files /dev/null and b/noalbum.png differ diff --git a/noartist.png b/noartist.png new file mode 100644 index 0000000..37c5098 Binary files /dev/null and b/noartist.png differ diff --git a/nosong.png b/nosong.png new file mode 100644 index 0000000..37c5098 Binary files /dev/null and b/nosong.png differ diff --git a/promoe.pro b/promoe.pro index 9e5ab46..b979b7e 100644 --- a/promoe.pro +++ b/promoe.pro @@ -20,7 +20,10 @@ SOURCES += XmmsQT4.cpp \ PlaylistShade.cpp \ Medialib.cpp \ qtmd5.cpp \ - SettingsWindow.cpp + SettingsWindow.cpp \ + MediaArtistList.cpp \ + MediaAlbumList.cpp \ + MediaSongList.cpp HEADERS += XmmsQT4.h \ PixWidget.h \ @@ -44,7 +47,10 @@ HEADERS += XmmsQT4.h \ PlaylistShade.h \ Medialib.h \ qtmd5.h \ - SettingsWindow.h + SettingsWindow.h \ + MediaArtistList.h \ + MediaAlbumList.h \ + MediaSongList.h RESOURCES = promoe.qrc diff --git a/promoe.qrc b/promoe.qrc index f6d2d02..d3e59e4 100644 --- a/promoe.qrc +++ b/promoe.qrc @@ -1,7 +1,9 @@ icon.png - nocover.png + noartist.png + nosong.png + noalbum.png CleanAMP/Eq_ex.png CleanAMP/GENEX.png CleanAMP/Gen.png