diff options
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/General/library/library.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/General/library/librarymodel.cpp | 83 | ||||
| -rw-r--r-- | src/plugins/General/library/librarymodel.h | 6 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.cpp | 15 |
4 files changed, 82 insertions, 24 deletions
diff --git a/src/plugins/General/library/library.cpp b/src/plugins/General/library/library.cpp index ebe36108b..b3799dc4e 100644 --- a/src/plugins/General/library/library.cpp +++ b/src/plugins/General/library/library.cpp @@ -127,7 +127,7 @@ bool Library::createTables() "ID INTEGER PRIMARY KEY AUTOINCREMENT," "Timestamp TIMESTAMP NOT NULL," "Title TEXT, Artist TEXT, AlbumArtist TEXT, Album TEXT, Comment TEXT, Genre TEXT, Composer TEXT," - "Year INTEGER, Track INTEGER, DiscNumer INTEGER, Duration INTEGER, " + "Year INTEGER, Track INTEGER, DiscNumber INTEGER, Duration INTEGER, " "AudioInfo BLOB, URL TEXT, FilePath TEXT, SearchString TEXT)"); if(!ok) diff --git a/src/plugins/General/library/librarymodel.cpp b/src/plugins/General/library/librarymodel.cpp index 4e79dd6cd..ce6490924 100644 --- a/src/plugins/General/library/librarymodel.cpp +++ b/src/plugins/General/library/librarymodel.cpp @@ -23,7 +23,11 @@ #include <QSqlError> #include <QtDebug> #include <QMimeData> +#include <QHash> +#include <QJsonDocument> +#include <QJsonObject> #include <qmmp/qmmp.h> +#include <qmmpui/playlistparser.h> #include "librarymodel.h" #define CONNECTION_NAME "qmmp_library_view" @@ -79,23 +83,26 @@ Qt::ItemFlags LibraryModel::flags(const QModelIndex &index) const QStringList LibraryModel::mimeTypes() const { - return QStringList("text/uri-list"); + return QStringList("application/json"); } QMimeData *LibraryModel::mimeData(const QModelIndexList &indexes) const { - QList<QUrl> urls; + QList<PlayListTrack *> tracks; for(const QModelIndex &index : indexes) { if(index.isValid()) - urls << getUrls(index); + { + tracks << getTracks(index); + } } - if(!urls.isEmpty()) + if(!tracks.isEmpty()) { QMimeData *mimeData = new QMimeData; - mimeData->setUrls(urls); + mimeData->setData("application/json", PlayListParser::serialize(tracks)); + qDeleteAll(tracks); return mimeData; } @@ -297,19 +304,19 @@ void LibraryModel::refresh() endResetModel(); } -QList<QUrl> LibraryModel::getUrls(const QModelIndex &index) const +QList<PlayListTrack *> LibraryModel::getTracks(const QModelIndex &index) const { QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); - QList<QUrl> urls; + QList<PlayListTrack *> tracks; if(!db.isOpen()) - return urls; + return tracks; const LibraryTreeItem *item = static_cast<const LibraryTreeItem *>(index.internalPointer()); if(item->type == Qmmp::TITLE) { QSqlQuery query(db); - query.prepare("SELECT URL from track_library WHERE Artist = :artist AND Album = :album AND Title = :title"); + query.prepare("SELECT * from track_library WHERE Artist = :artist AND Album = :album AND Title = :title"); query.bindValue(":artist", item->parent->parent->name); query.bindValue(":album", item->parent->name); query.bindValue(":title", item->name); @@ -317,52 +324,86 @@ QList<QUrl> LibraryModel::getUrls(const QModelIndex &index) const if(!query.exec()) { qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); - return urls; + return tracks; } if(query.next()) { - QString path = query.value("URL").toString(); - urls << (path.contains("://") ? QUrl(path) : QUrl::fromLocalFile(path)); + tracks << createTrack(query); } } else if(item->type == Qmmp::ALBUM) { QSqlQuery query(db); - query.prepare("SELECT URL from track_library WHERE Artist = :artist AND Album = :album"); + query.prepare("SELECT * from track_library WHERE Artist = :artist AND Album = :album"); query.bindValue(":artist", item->parent->name); query.bindValue(":album", item->name); if(!query.exec()) { qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); - return urls; + return tracks; } while(query.next()) { - QString path = query.value("URL").toString(); - urls << (path.contains("://") ? QUrl(path) : QUrl::fromLocalFile(path)); + tracks << createTrack(query); } } else if(item->type == Qmmp::ARTIST) { QSqlQuery query(db); - query.prepare("SELECT URL from track_library WHERE Artist = :artist"); + query.prepare("SELECT * from track_library WHERE Artist = :artist"); query.bindValue(":artist", item->name); if(!query.exec()) { qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); - return urls; + return tracks; } while(query.next()) { - QString path = query.value("URL").toString(); - urls << (path.contains("://") ? QUrl(path) : QUrl::fromLocalFile(path)); + tracks << createTrack(query); } } - return urls; + return tracks; +} + +PlayListTrack *LibraryModel::createTrack(const QSqlQuery &query) const +{ + static const QHash<int, QString> metaColumns = { + { Qmmp::TITLE, "Title" }, + { Qmmp::ARTIST, "Artist" }, + { Qmmp::ALBUMARTIST, "AlbumArtist" }, + { Qmmp::ALBUM, "Album" }, + { Qmmp::COMMENT, "Comment" }, + { Qmmp::GENRE, "Genre" }, + { Qmmp::COMPOSER, "Composer" }, + { Qmmp::YEAR, "Year" }, + { Qmmp::TRACK, "Track" }, + { Qmmp::DISCNUMBER, "DiscNumber" } + }; + + PlayListTrack *track = new PlayListTrack; + track->setPath(query.value("URL").toString()); + track->setDuration(query.value("Duration").toLongLong()); + + for(int key = Qmmp::TITLE; key <= Qmmp::DISCNUMBER; ++key) + { + QString value = query.value(metaColumns.value(key)).toString(); + track->setValue(static_cast<Qmmp::MetaData>(key), value); + } + + QJsonDocument document = QJsonDocument::fromJson(query.value("AudioInfo").toByteArray()); + QJsonObject obj = document.object(); + track->setValue(Qmmp::BITRATE, obj.value("bitrate").toInt()); + track->setValue(Qmmp::SAMPLERATE, obj.value("samplerate").toInt()); + track->setValue(Qmmp::CHANNELS, obj.value("channels").toInt()); + track->setValue(Qmmp::BITS_PER_SAMPLE, obj.value("bitsPerSample").toInt()); + track->setValue(Qmmp::FORMAT_NAME, obj.value("formatName").toString()); + track->setValue(Qmmp::DECODER, obj.value("decoder").toString()); + track->setValue(Qmmp::FILE_SIZE, qint64(obj.value("fileSize").toDouble())); + return track; } diff --git a/src/plugins/General/library/librarymodel.h b/src/plugins/General/library/librarymodel.h index 327e91629..f1d604b38 100644 --- a/src/plugins/General/library/librarymodel.h +++ b/src/plugins/General/library/librarymodel.h @@ -28,6 +28,8 @@ class QSqlDatabase; class LibraryTreeItem; +class PlayListTrack; +class QSqlQuery; class LibraryModel : public QAbstractItemModel { @@ -51,7 +53,9 @@ public: private: - QList<QUrl> getUrls(const QModelIndex &index) const; + QList<PlayListTrack *> getTracks(const QModelIndex &index) const; + PlayListTrack *createTrack(const QSqlQuery &query) const; + LibraryTreeItem *m_rootItem; QString m_filter; }; diff --git a/src/plugins/Ui/qsui/listwidget.cpp b/src/plugins/Ui/qsui/listwidget.cpp index c7df9e82b..b92928782 100644 --- a/src/plugins/Ui/qsui/listwidget.cpp +++ b/src/plugins/Ui/qsui/listwidget.cpp @@ -631,7 +631,7 @@ void ListWidget::updateSkin() void ListWidget::dragEnterEvent(QDragEnterEvent *event) { - if (event->mimeData()->hasFormat("text/uri-list")) + if (event->mimeData()->hasFormat("text/uri-list") || event->mimeData()->hasFormat("application/json")) event->acceptProposedAction(); } @@ -650,6 +650,19 @@ void ListWidget::dropEvent(QDropEvent *event) } m_model->insert(index, list_urls); } + else if (!m_filterMode && event->mimeData()->hasFormat("application/json")) + { + QByteArray json = event->mimeData()->data("application/json"); + event->acceptProposedAction(); + QApplication::restoreOverrideCursor(); + + int index = indexAt(event->pos().y()); + if(index == INVALID_INDEX) + { + index = qMin(m_first + m_row_count, m_model->count()); + } + m_model->insert(index, json); + } m_drop_index = INVALID_INDEX; } |
