aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/qmmpui/playlistmodel.cpp5
-rw-r--r--src/qmmpui/playlistmodel.h1
6 files changed, 88 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;
}
diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp
index e3845ef83..0b8602334 100644
--- a/src/qmmpui/playlistmodel.cpp
+++ b/src/qmmpui/playlistmodel.cpp
@@ -206,6 +206,11 @@ void PlayListModel::insert(int index, const QList<PlayListTrack *> &tracks)
emit listChanged(flags);
}
+void PlayListModel::insert(int index, const QByteArray &json)
+{
+ insert(index, PlayListParser::deserialize(json));
+}
+
void PlayListModel::insert(PlayListItem *before, const QList<PlayListTrack *> &tracks)
{
if(before)
diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h
index bfc8bade6..2a9cb8f3d 100644
--- a/src/qmmpui/playlistmodel.h
+++ b/src/qmmpui/playlistmodel.h
@@ -414,6 +414,7 @@ public slots:
* Inserts \b tracks at index position \b index in the playlist.
*/
void insert(int index, const QList<PlayListTrack *> &tracks);
+ void insert(int index, const QByteArray &json);
/*!
* Inserts \b tracks after item \b before in the playlist.
*/