From b7d5afc0ca6037cb16a1899573434c381c34d84f Mon Sep 17 00:00:00 2001 From: Tobias Rundstrom Date: Mon, 6 Mar 2006 00:34:28 -0300 Subject: [PATCH] Worked much on the Medialib. --- MediaAlbumList.cpp | 105 +++++++++++++++++++ MediaAlbumList.h | 24 +++++ MediaArtistList.cpp | 102 +++++++++++++++++++ MediaArtistList.h | 24 +++++ MediaSongList.cpp | 100 ++++++++++++++++++ MediaSongList.h | 23 +++++ Medialib.cpp | 240 ++++++++++++++++++++++---------------------- Medialib.h | 65 +++++++++--- PlaylistList.cpp | 54 +++++++--- SettingsWindow.cpp | 129 ++++++++++++++++++++++++ SettingsWindow.h | 3 + XMMSHandler.cpp | 5 +- XMMSHandler.h | 4 +- noalbum.png | Bin 0 -> 4301 bytes noartist.png | Bin 0 -> 4301 bytes nosong.png | Bin 0 -> 4301 bytes promoe.pro | 10 +- promoe.qrc | 4 +- 18 files changed, 737 insertions(+), 155 deletions(-) create mode 100644 MediaAlbumList.cpp create mode 100644 MediaAlbumList.h create mode 100644 MediaArtistList.cpp create mode 100644 MediaArtistList.h create mode 100644 MediaSongList.cpp create mode 100644 MediaSongList.h create mode 100644 noalbum.png create mode 100644 noartist.png create mode 100644 nosong.png 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 0000000000000000000000000000000000000000..37c509888c0efc0ffab92bcd30de5c58e40c22de GIT binary patch literal 4301 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 literal 0 HcmV?d00001 diff --git a/noartist.png b/noartist.png new file mode 100644 index 0000000000000000000000000000000000000000..37c509888c0efc0ffab92bcd30de5c58e40c22de GIT binary patch literal 4301 zcmV;;5HjzHP)%#kt47lLQEm03yhH02KrTkvBV35U~pQRz$2`k)pI!7vxH**os1dB6_{H+zZv_ z*y~%>f>o%3NNqu&iZXBo6_tYWA|RlEyah=hFLVEx+3d;5+1<07-6Y)K=d+)jGxN+m zbDlFV&&$k-&|35V1;XJR;NO9-b%-ZxsvTK1#W>Xv4z~ewfhIuDnrzD%FI3^s8gPK? zZPGj);zZqk!5P_8g+mVTKfu3vvL4hSj@3YuD&UM0 zs&MEIECep_WNieVtNs>M#u+vIg~J$N9hC(NFj0pntL7&8;*992!XX>@J@B(ABujOO zHPzUpn5gwa6%J$2!Hc)K;rWCb8sMclo zci@~Picb+va4kkST#1>7J7N~Ol>0twT&UKLUk03)WEFjZzYB-6VT=X)!*up?*W%o3&ZI6N{48d zP6pN4Q>Rh$0tM0^X{{Ea3Wxr{L)F160FI`cLE43CEvA=%%yjb#h_pvrtD~n*2hObq zK0%Rk|EU*g6{>LP3QSBVk0fw@x*4Rqr_Q4qdPags)^QUUX%nh&7ztdNuKKHhRyIPL zHl#(U!l3~$CmnUC00Ouvoea{|Q^x^$X{tLF7?sY-t87t8DYJk~rPL_^;ZPUYL9j?@ zO`#0P(;@bzqw=I&e^SbZz%Y#O@^YXHkpSFiYPUeajL`9<$sh^bQ>B#6fFEK6c@>at zvtCq6jR6o28Ng=zH;~mf6at-fh_6yzaonCNrECgJ0VWU;q#G}~u5aMX5Ga^P!EE66 zR975zp^{QIkWx+owqqR1egfS`#Srhkscl}`@nhl8E7g_y3ROyZC$J581amMU8s;md z%Ah=!ep#v-RyPB3vY<&_XqF8v>qFay(6nBvH~>bydfc5LrEE~uN-GS1DW$+zK@$R& zcMttrse<$Q++4V{rTGnL1>Md95v8`>1+eiDY&aPC9VkkcGd~axSLzTe?0t@u@~^-w zrPO=LR9L=HS%E$U+!?U!CZ$yQ(Hh~f3Fwgs^QQG+LU*{UE3`>;Uy2J_!&`e`&d0DK zIVI_TbtvNNl~T^fbdqJjLrSTS5~(c1R+51U*#;FTxO%DG_83^8Z5zUz{;+#A%*3=c!5tTv=_3L36Am}H?!(V^4X{y4`LdLq@K_)4X&1p&W7g(!>-YAbz(u2F|O<7z&G|<0Ji{}rIb%dDdW!S8B)qt zz@&uOLlLmWbsu+uYM%q|jeyXFP^TK))h!#q(raL9@4yrNP~lJ?Kq*y%**W7zCU6h% zj+8Q{agzbuh0)m(!6! zf2Lcg-}58LtphJyQBj~@oq$I+LgxiAU@<(sCAdIip{Nv=e+84*Libl-@Dg}ycV)W1 z=fDH8?WgjnfKo~W-v(emPD(k}osa><9uSqGflaP^-${G!rO>gFxjudxCch8o&WDHA z!xw3eXRh7{S1*H}ufU%_hZ5I0z+d-)p3!%*wzX?S7^efWoGYa)4{l}vs}gH6+muo# zT=y-!1S2}a*e*sXe_<&}#`Q}$xVl;?fu7wi;h5OOBaPh0eI&ST* zDUqHEMztK00icxH1N-J+O*g}!R>8}~5NH|T zUN3?!RBl}6?sX2ZGC(2sV;?6ul?*WE<8zn89|xIU=!cRr*i`@r3!yZMG&(kdRX>b5 zPX@&v9jb8HEy&3AqCxqiD5bQN@_OLUP{Cv4MY&LQh%(`DB1z^<=ni*uiQE^L!e6!< zm1xIt*jZq#ty25iGJxjwLAEfa?^SJ~n^p9MfZq>*kH3X=2a;(G0H231q?C1li<78B zROlZ{sgqL5k(iAT(e^-jP12(zA=Hk!@TfH#zAb{MHp3I2!v2%d%aj4%6dEgR@s}oT zaBG;{)42ZXX2QZD(0gIhM#bl@>z+U|afS_*v^AwvnNsTK7@_(NxZa-oJxMU;-X3P< zp71WTd(jvLu>=|otM3LimLt$M2PP$BcpH4^y7sjc1K{nbZVsi?JYWQH$dlE= zZ9S0Wf!X`lLf(t;;vT1wdj2pm4asA1PAr9OuQHmE73{-u-}3Jk|(n(7b*zy}F5 zAYo*s|A3GN7P#&Q5GEef8BtNnHqT5*}#&mU_@s%Dw z4WAx{&yK)0_afHy0QfPwm(da zv4S5v1wUSy^xWx(%XNr<0!S$@!F*6G9$p82p_JO`%}CkdG~qBFs{YN=S^Z#YA9MX( zF{p3g=xL~zX>{ALS6^$mZ!P?n*JqYEKG2~^jLmMO7!ia1Enu2bD(aM%N}*;0J27YM zlR|bT>>Fdu(qAfAwYPHUqeCu?Iv;-33o->Xf4)j8nFa>w5bpv=DZ64EOMdg|KY^)A zskmQiOX)F6;cyLR6-|0+$*p4oe(}&e8?I{)&uvYX69CWZ5I+syNGYGE;{JzEFwe6@ zDW!r|n)0)$_LCY9q_ooX;1JM7hfEwwN|}cd;yb{bz?;^4moU=t5rwH3JvL=K0Mh^s zj0+3Y;v~>QDOKfAq`-LmJ7Mhne64k*!6$?mjro|%lYaS?=*=gM-v`=PwSj5E3>{)- zx+)jIt3-~#+@rPrLnR_1J^{J|xmxQJ-hAJR9a>=KqrNF>YpU?F4smNb8MrMf4NMb4 zRC&`YfQ|DE!hEK)wqPYNHZD~a;TGy5j5?I?7IPs)mJlLO2+>-I$W~n);v`1rn-{pU z6Nli?PAHBuwVgg`=uQOL?*PCHz%U&m(3~lRXe@;2D1`9amLIK53n4^XFvDMCqJ{@B zwrmrvHQ^s-Rn$O^Cp`yvf=F0JW6lBm0;^e+)8^}esJ+9MaWJPG(T%@^YSw*_b#%r3k*G%7{$=5U7ZLw{?ANUd&>Pa6BeCm3h zLX2Oam4~jcE&m`UQu2kRFLMjEJI3bK!0dQJ#e`K>+4MCSr}jgbvjQ5JTj@dabq4u* zEctqWMFEU6574-cX6OT&(a&hE`;F$j0h-~DMCcyftI2I)X#0)QjB+$r-LI*aqY)XJ zI~PW1@BXWyYv1o>AAt(Y0lFhVwkv(QZTr74fzY1;Ph-4rTQF-%n0A1rRhR(bOTc}Y zf8bC-sP%wd7*|${I6@t3)0P04uJooZ!S?b#kQHtY`FbY#dLQ@x!#sTJ9-7AwRqny_ ziXzwF8)IlkJXVor$_CSObI%FW7cuv{hcUY7ZXm-W)Iqj=`L48{wwEcOu801omVUaA zP&F{pO<%$Fr?ox>%m5l<^vzhf&HkOCwJtXlwbqA$$Ly`|Dyu`B&>^M+?U;Y}Y5<1M zK246#CZ{?!OjKG78()Qn&0w%6e3sW6`rHf!2Vl)puLBqAdmBsz<^%13D?GJ^t)@S@ z(td*J!Be%?-q7^3m>1;d6WFM=UgS>j^QXRm>Hc>KAv*ZvhtUIbbn-)=y!G~P_Za2T zAxb&4(`;}%xb0lb_xKiI0&o>gy#w2zxDeX)iU``~0B=xq+zF{}(nYxpXR7R9fp&A;eUSHZTLY z!>1yEM!-SsZ|8>NT0zva#z297b<$qokM@Uf$OU>~!o&^P{XrfOqUhKr%%P7@flWHZ z0RS;>>1~+aR?bsvz0vB}Hwq!fYpn}_8!^#ecQ1v=ZkuQyRXjrE9Dp0X>PPvU>X}E@ zVI|1hliu&Z@}y({=QFM*zWh68oUT^1CRH0%I%mh_4F1( z`0XZQ|;SWVe<;8+*5C~Y3~9JUFjV# zy|@_Y6yS~b!StMMKzkq6r@8BXuH`w$LpKaF=k36MY|9+QER-{CU0(oGTy%{w`l7~| zoU<|8lul#3OoO7-f0OGOjsf+f(2cR3p~yblEX>Cq7h%-Qxh~q6LY)Du20BJzG{@$z z_BIBy&`q{NEx~953Xk3vP_WlyjER%B=kB#HypMtX8)dF%K;IQZPFKYo9%00000NkvXXu0mjfjbSPt literal 0 HcmV?d00001 diff --git a/nosong.png b/nosong.png new file mode 100644 index 0000000000000000000000000000000000000000..37c509888c0efc0ffab92bcd30de5c58e40c22de GIT binary patch literal 4301 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 literal 0 HcmV?d00001 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