aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-01-16 14:21:46 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-01-16 14:21:46 +0000
commit87f088c76f029859fdbfa54e95bb074b41391fdd (patch)
treec662291529b8cae1eb056b40ecb06464a9390bab /src/plugins
parentc20f469b2021f070cbf5cf5a73ce430ddcd2fbd0 (diff)
downloadqmmp-87f088c76f029859fdbfa54e95bb074b41391fdd.tar.gz
qmmp-87f088c76f029859fdbfa54e95bb074b41391fdd.tar.bz2
qmmp-87f088c76f029859fdbfa54e95bb074b41391fdd.zip
library: using JSON for drag and drop data
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9635 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/General/library/library.cpp2
-rw-r--r--src/plugins/General/library/librarymodel.cpp83
-rw-r--r--src/plugins/General/library/librarymodel.h6
-rw-r--r--src/plugins/Ui/qsui/listwidget.cpp15
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;
}