aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Ui/skinned/listwidget.cpp12
-rw-r--r--src/qmmpui/fileloader.cpp55
-rw-r--r--src/qmmpui/fileloader_p.h18
-rw-r--r--src/qmmpui/playlistmodel.cpp46
-rw-r--r--src/qmmpui/playlistmodel.h8
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();