diff options
| -rw-r--r-- | src/plugins/Ui/skinned/listwidget.cpp | 12 | ||||
| -rw-r--r-- | src/qmmpui/fileloader.cpp | 55 | ||||
| -rw-r--r-- | src/qmmpui/fileloader_p.h | 18 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 46 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.h | 8 |
5 files changed, 101 insertions, 38 deletions
diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp index 8acd31783..954987ca7 100644 --- a/src/plugins/Ui/skinned/listwidget.cpp +++ b/src/plugins/Ui/skinned/listwidget.cpp @@ -549,13 +549,11 @@ void ListWidget::dropEvent(QDropEvent *event) event->acceptProposedAction(); QApplication::restoreOverrideCursor(); - foreach(QUrl u, list_urls) - { - if(u.scheme() == "file") - m_model->add(QFileInfo(u.toLocalFile()).absoluteFilePath()); - else - m_model->add(u.toString()); - } + int index = rowAt(event->pos().y()); + if(index != INVALID_ROW) + index += m_first; + + m_model->insert(index, list_urls); } m_drop_row = -1; } diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp index 8205a129a..d86e4a3f4 100644 --- a/src/qmmpui/fileloader.cpp +++ b/src/qmmpui/fileloader.cpp @@ -22,6 +22,7 @@ #include <QRegExp> #include "fileloader_p.h" #include "qmmpuisettings.h" +#include "playlistitem.h" #include "playlisttrack.h" FileLoader::FileLoader(QObject *parent) : QThread(parent) @@ -33,16 +34,24 @@ FileLoader::FileLoader(QObject *parent) : QThread(parent) FileLoader::~FileLoader() {} -void FileLoader::addFile(const QString &path) +void FileLoader::addFile(const QString &path, PlayListItem *before) { bool use_meta = m_settings->useMetadata(); QList <FileInfo *> playList = MetaDataManager::instance()->createPlayList(path, use_meta); - foreach(FileInfo *info, playList) - emit newTrackToAdd(new PlayListTrack(info)); + if(before) + { + foreach(FileInfo *info, playList) + emit newTrackToInsert(before, new PlayListTrack(info)); + } + else + { + foreach(FileInfo *info, playList) + emit newTrackToAdd(new PlayListTrack(info)); + } qDeleteAll(playList); } -void FileLoader::addDirectory(const QString& s) +void FileLoader::addDirectory(const QString& s, PlayListItem *before) { QDir dir(s); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); @@ -51,7 +60,7 @@ void FileLoader::addDirectory(const QString& s) foreach(QFileInfo info, l) { if(checkRestrictFilters(info) && checkExcludeFilters(info)) - addFile(info.absoluteFilePath ()); + addFile(info.absoluteFilePath (), before); if (m_finished) return; } dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); @@ -62,7 +71,7 @@ void FileLoader::addDirectory(const QString& s) for (int i = 0; i < l.size(); ++i) { QFileInfo fileInfo = l.at(i); - addDirectory(fileInfo.absoluteFilePath ()); + addDirectory(fileInfo.absoluteFilePath (), before); if (m_finished) return; } } @@ -70,20 +79,29 @@ void FileLoader::addDirectory(const QString& s) void FileLoader::run() { m_finished = false; - while(!m_paths.isEmpty() && !m_finished) + while((!m_paths.isEmpty() || !m_insertItems.isEmpty()) && !m_finished) { - QString path = m_paths.dequeue(); + PlayListItem *before = 0; + QString path; + if(!m_insertItems.isEmpty()) + { + InsertItem i = m_insertItems.dequeue(); + before = i.before; + path = i.path; + } + else if(!m_paths.isEmpty()) + path = m_paths.dequeue(); QFileInfo info(path); if(info.isDir()) { - addDirectory(path); + addDirectory(path, before); continue; } else if(info.isFile()) { - addFile(path); + addFile(path, before); continue; } } @@ -102,13 +120,24 @@ void FileLoader::add(const QStringList &paths) start(QThread::IdlePriority); } -void FileLoader::insert(int index, const QString &path) +void FileLoader::insert(PlayListItem *before, const QString &path) { - insert(index, QStringList() << path); + insert(before, QStringList() << path); } -void FileLoader::insert(int index, const QStringList &paths) +void FileLoader::insert(PlayListItem *before, const QStringList &paths) { + foreach (QString path, paths) + { + InsertItem item; + item.before = before; + item.path = path; + m_insertItems.append(item); + } + + MetaDataManager::instance()->prepareForAnotherThread(); + m_filters = MetaDataManager::instance()->nameFilters(); + start(QThread::IdlePriority); } void FileLoader::finish() diff --git a/src/qmmpui/fileloader_p.h b/src/qmmpui/fileloader_p.h index 11d3424c8..66ce40ef0 100644 --- a/src/qmmpui/fileloader_p.h +++ b/src/qmmpui/fileloader_p.h @@ -27,6 +27,7 @@ #include <QThread> class PlayListTrack; +class PlayListItem; class QmmpUiSettings; /*! @internal @@ -64,8 +65,8 @@ public: */ void add(const QStringList &paths); - void insert(int index, const QString &path); - void insert(int index, const QStringList &paths); + void insert(PlayListItem *before, const QString &path); + void insert(PlayListItem *before, const QStringList &paths); signals: /*! @@ -73,15 +74,22 @@ signals: * @param item Pointer of the new PlayListTrack object. */ void newTrackToAdd(PlayListTrack *track); - void newTrackToInsert(int index, PlayListTrack *track); + void newTrackToInsert(PlayListItem *before, PlayListTrack *track); private: virtual void run(); - void addFile(const QString &path); - void addDirectory(const QString &s); + void addFile(const QString &path, PlayListItem *before = 0); + void addDirectory(const QString &s, PlayListItem *before = 0); bool checkRestrictFilters(const QFileInfo &info); bool checkExcludeFilters(const QFileInfo &info); + struct InsertItem + { + PlayListItem *before; + QString path; + + }; QQueue <QString> m_paths; + QQueue <InsertItem> m_insertItems; QStringList m_filters; QmmpUiSettings *m_settings; bool m_finished; diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp index b82faf27b..cd45d8cb2 100644 --- a/src/qmmpui/playlistmodel.cpp +++ b/src/qmmpui/playlistmodel.cpp @@ -51,8 +51,8 @@ PlayListModel::PlayListModel(const QString &name, QObject *parent) m_container = new NormalContainer; connect(m_loader, SIGNAL(newTrackToAdd(PlayListTrack*)), SLOT(add(PlayListTrack*)), Qt::QueuedConnection); - connect(m_loader, SIGNAL(newTrackToInsert(int, PlayListTrack*)), - SLOT(insert(int, PlayListTrack*)), Qt::QueuedConnection); + connect(m_loader, SIGNAL(newTrackToInsert(PlayListItem*, PlayListTrack*)), + SLOT(insert(PlayListItem*, PlayListTrack*)), Qt::QueuedConnection); connect(m_loader, SIGNAL(finished()), SLOT(preparePlayState())); connect(m_loader, SIGNAL(finished()), SIGNAL(loaderFinished())); } @@ -164,6 +164,11 @@ void PlayListModel::insert(int index, PlayListTrack *track) emit countChanged(); } +void PlayListModel::insert(PlayListItem *before, PlayListTrack *track) +{ + insert(m_container->indexOf(before), track); +} + void PlayListModel::insert(int index, QList<PlayListTrack *> tracks) { if(tracks.isEmpty()) @@ -193,24 +198,39 @@ void PlayListModel::insert(int index, QList<PlayListTrack *> tracks) void PlayListModel::insert(int index, const QString &path) { - m_loader->insert(index, path); - /*QFileInfo f_info(path); - if (f_info.isDir()) - m_loader->loadDirectory(path); + if(index < 0 || index >= m_container->count()) + add(path); else { - m_loader->loadFile(path); - loadPlaylist(path); - }*/ + PlayListItem *before = m_container->item(index); + m_loader->insert(before, path); + } + //TODO insert playlist } void PlayListModel::insert(int index, const QStringList &paths) { - m_loader->insert(index, paths); - /*foreach(QString str, paths) + if(index < 0 || index >= m_container->count()) + add(paths); + else + { + PlayListItem *before = m_container->item(index); + m_loader->insert(before, paths); + } + //TODO insert playlist +} + +void PlayListModel::insert(int index, const QList<QUrl> &urls) +{ + QStringList paths; + foreach (QUrl url, urls) { - add(str); - }*/ + if(url.scheme() == "file") + paths.append(QFileInfo(url.toLocalFile()).absoluteFilePath()); + else + paths.append(url.toString()); + } + insert(index, paths); } int PlayListModel::count() const diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h index ce63a8157..31841387b 100644 --- a/src/qmmpui/playlistmodel.h +++ b/src/qmmpui/playlistmodel.h @@ -333,6 +333,8 @@ public slots: * Inserts \b track at index position \b index in the playlist. */ void insert(int index, PlayListTrack *track); + + void insert(PlayListItem *before, PlayListTrack *track); /*! * Inserts \b tracks at index position \b index in the playlist. */ @@ -350,6 +352,12 @@ public slots: */ void insert(int index, const QStringList &paths); /*! + * Adds a list of URLs at index position \b index in the playlist. + * @param paths urls a list of URLs. + * @param index Position in the playlist. + */ + void insert(int index, const QList<QUrl> &urls); + /*! * Removes all items. */ void clear(); |
