aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-08-23 08:12:25 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-08-23 08:12:25 +0000
commit73b5f5312a00236f264403e995d268641212b61f (patch)
treeba26fdf486ac4e8797d81c50f7c8c2dea592c42e /src
parentb0c1e410bc00722617659647f2a05a0084228444 (diff)
downloadqmmp-73b5f5312a00236f264403e995d268641212b61f.tar.gz
qmmp-73b5f5312a00236f264403e995d268641212b61f.tar.bz2
qmmp-73b5f5312a00236f264403e995d268641212b61f.zip
improved sorting implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3648 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/qmmpui/groupedcontainer.cpp53
-rw-r--r--src/qmmpui/groupedcontainer_p.h3
-rw-r--r--src/qmmpui/normalcontainer.cpp31
-rw-r--r--src/qmmpui/normalcontainer_p.h3
-rw-r--r--src/qmmpui/playlistcontainer.cpp43
-rw-r--r--src/qmmpui/playlistcontainer_p.h6
-rw-r--r--src/qmmpui/playlistgroup.cpp5
-rw-r--r--src/qmmpui/playlistgroup.h1
8 files changed, 102 insertions, 43 deletions
diff --git a/src/qmmpui/groupedcontainer.cpp b/src/qmmpui/groupedcontainer.cpp
index 59eba7398..c789a3fd9 100644
--- a/src/qmmpui/groupedcontainer.cpp
+++ b/src/qmmpui/groupedcontainer.cpp
@@ -18,10 +18,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
+#include "playlistmodel.h"
#include "groupedcontainer_p.h"
GroupedContainer::GroupedContainer()
{
+ m_reverted = false;
}
GroupedContainer::~GroupedContainer()
@@ -295,6 +297,56 @@ void GroupedContainer::randomizeList()
addTracks(tracks);
}
+void GroupedContainer::sort(int mode)
+{
+ if(mode == PlayListModel::ARTIST || mode == PlayListModel::ALBUM || mode == PlayListModel::DATE)
+ {
+ QList<PlayListTrack *> tracks = takeAllTracks();
+ doSort(mode, tracks, m_reverted);
+ addTracks(tracks);
+ }
+ else
+ {
+ m_items.clear();
+ foreach (PlayListGroup *g, m_groups)
+ {
+ QList<PlayListTrack *> tracks = g->takeAll();
+ doSort(mode, tracks, m_reverted);
+ g->addTracks(tracks);
+ m_items.append(g);
+ foreach (PlayListTrack *t, tracks)
+ {
+ m_items.append(t);
+ }
+ }
+ updateIndex();
+ }
+ m_reverted = !m_reverted;
+}
+
+void GroupedContainer::sortSelection(int mode)
+{
+ QList<PlayListTrack *> tracks = takeAllTracks();
+ QList<PlayListTrack *> selected_tracks;
+ QList<int> selected_indexes;
+ for(int i = 0; i < tracks.count(); ++i)
+ {
+ if(tracks[i]->isSelected())
+ {
+ selected_tracks.append(tracks[i]);
+ selected_indexes.append(i);
+ }
+ }
+ doSort(mode, selected_tracks, m_reverted);
+
+ for (int i = 0; i < selected_indexes.count(); i++)
+ tracks.replace(selected_indexes[i], selected_tracks[i]);
+
+ addTracks(tracks);
+
+ m_reverted = !m_reverted;
+}
+
void GroupedContainer::updateIndex()
{
for(int i = 0; i < m_groups.count(); ++i)
@@ -311,4 +363,3 @@ void GroupedContainer::updateIndex()
}
}
}
-
diff --git a/src/qmmpui/groupedcontainer_p.h b/src/qmmpui/groupedcontainer_p.h
index c812c2fc9..51a7bb152 100644
--- a/src/qmmpui/groupedcontainer_p.h
+++ b/src/qmmpui/groupedcontainer_p.h
@@ -54,12 +54,15 @@ public:
void reverseList();
void randomizeList();
+ void sort(int mode);
+ void sortSelection(int mode);
private:
void addGroup(PlayListGroup *group);
void updateIndex();
QList<PlayListGroup *> m_groups;
QList<PlayListItem *> m_items;
+ bool m_reverted;
};
#endif // GROUPEDCONTAINER_P_H
diff --git a/src/qmmpui/normalcontainer.cpp b/src/qmmpui/normalcontainer.cpp
index 7267b09e6..9a939f83b 100644
--- a/src/qmmpui/normalcontainer.cpp
+++ b/src/qmmpui/normalcontainer.cpp
@@ -22,6 +22,7 @@
NormalContainer::NormalContainer()
{
+ m_reverted = false;
}
NormalContainer::~NormalContainer()
@@ -195,3 +196,33 @@ void NormalContainer::randomizeList()
for (int i = 0; i < m_items.size(); i++)
m_items.swap(qrand()%m_items.size(), qrand()%m_items.size());
}
+
+void NormalContainer::sort(int mode)
+{
+ QList<PlayListTrack *> tracks = takeAllTracks();
+ doSort(mode, tracks, m_reverted);
+ addTracks(tracks);
+ m_reverted = !m_reverted;
+}
+
+void NormalContainer::sortSelection(int mode)
+{
+ QList<PlayListTrack *> tracks = takeAllTracks();
+ QList<PlayListTrack *> selected_tracks;
+ QList<int> selected_indexes;
+ for(int i = 0; i < tracks.count(); ++i)
+ {
+ if(tracks[i]->isSelected())
+ {
+ selected_tracks.append(tracks[i]);
+ selected_indexes.append(i);
+ }
+ }
+ doSort(mode, selected_tracks, m_reverted);
+
+ for (int i = 0; i < selected_indexes.count(); i++)
+ tracks.replace(selected_indexes[i], selected_tracks[i]);
+
+ addTracks(tracks);
+ m_reverted = !m_reverted;
+}
diff --git a/src/qmmpui/normalcontainer_p.h b/src/qmmpui/normalcontainer_p.h
index b83762c27..370756ba1 100644
--- a/src/qmmpui/normalcontainer_p.h
+++ b/src/qmmpui/normalcontainer_p.h
@@ -53,9 +53,12 @@ public:
void reverseList();
void randomizeList();
+ void sort(int mode);
+ void sortSelection(int mode);
private:
QList<PlayListItem *> m_items;
+ bool m_reverted;
};
#endif // NORMALCONTAINER_P_H
diff --git a/src/qmmpui/playlistcontainer.cpp b/src/qmmpui/playlistcontainer.cpp
index 0952b2e9c..cb774726c 100644
--- a/src/qmmpui/playlistcontainer.cpp
+++ b/src/qmmpui/playlistcontainer.cpp
@@ -30,34 +30,6 @@ void PlayListContainer::addTracks(QList<PlayListTrack *> tracks)
addTrack(t);
}
-void PlayListContainer::sort(int mode)
-{
- QList<PlayListTrack *> tracks = takeAllTracks();
- doSort(mode, tracks);
- addTracks(tracks);
-}
-
-void PlayListContainer::sortSelection(int mode)
-{
- QList<PlayListTrack *> tracks = takeAllTracks();
- QList<PlayListTrack *> selected_tracks;
- QList<int> selected_indexes;
- for(int i = 0; i < tracks.count(); ++i)
- {
- if(tracks[i]->isSelected())
- {
- selected_tracks.append(tracks[i]);
- selected_indexes.append(i);
- }
- }
- doSort(mode, selected_tracks);
-
- for (int i = 0; i < selected_indexes.count(); i++)
- tracks.replace(selected_indexes[i], selected_tracks[i]);
-
- addTracks(tracks);
-}
-
////===============THE BEGINNING OF SORT IMPLEMENTATION =======================////
// First we'll implement bundle of static compare procedures
@@ -168,7 +140,7 @@ static bool _fileModificationDateGreaterComparator(PlayListTrack* s1,PlayListTra
return QFileInfo(s1->value(Qmmp::URL)).lastModified() > QFileInfo(s2->value(Qmmp::URL)).lastModified();
}
-void PlayListContainer::doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort)
+void PlayListContainer::doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort, bool reverted)
{
QList<PlayListTrack*>::iterator begin;
QList<PlayListTrack*>::iterator end;
@@ -226,17 +198,10 @@ void PlayListContainer::doSort(int sort_mode, QList<PlayListTrack*>& list_to_sor
compareGreaterFunc = _titleGreaterComparator;
}
- static bool sorted_asc = false;
- if (!sorted_asc)
- {
- qStableSort(begin,end,compareLessFunc);
- sorted_asc = true;
- }
- else
- {
+ if(reverted)
qStableSort(begin,end,compareGreaterFunc);
- sorted_asc = false;
- }
+ else
+ qStableSort(begin,end,compareLessFunc);
}
////=============== THE END OF SORT IMPLEMENTATION =======================////
diff --git a/src/qmmpui/playlistcontainer_p.h b/src/qmmpui/playlistcontainer_p.h
index daf271172..0f5782521 100644
--- a/src/qmmpui/playlistcontainer_p.h
+++ b/src/qmmpui/playlistcontainer_p.h
@@ -57,14 +57,14 @@ public:
virtual void reverseList() = 0;
virtual void randomizeList() = 0;
- virtual void sort(int mode);
- virtual void sortSelection(int mode);
+ virtual void sort(int mode) = 0;
+ virtual void sortSelection(int mode) = 0;
protected:
/*!
* This internal method performs sorting of \b list_to_sort list of items.
*/
- void doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort);
+ void doSort(int sort_mode, QList<PlayListTrack*>& list_to_sort, bool reverted);
};
#endif // PLAYLISTCONTAINER_P_H
diff --git a/src/qmmpui/playlistgroup.cpp b/src/qmmpui/playlistgroup.cpp
index a23dc0efc..a4c7c51a7 100644
--- a/src/qmmpui/playlistgroup.cpp
+++ b/src/qmmpui/playlistgroup.cpp
@@ -54,6 +54,11 @@ void PlayListGroup::addTrack(PlayListTrack *track)
m_tracks.append(track);
}
+void PlayListGroup::addTracks(QList<PlayListTrack *> tracks)
+{
+ m_tracks.append(tracks);
+}
+
bool PlayListGroup::contains(PlayListTrack *track) const
{
return m_tracks.contains(track);
diff --git a/src/qmmpui/playlistgroup.h b/src/qmmpui/playlistgroup.h
index bd63b4cc7..a766919b1 100644
--- a/src/qmmpui/playlistgroup.h
+++ b/src/qmmpui/playlistgroup.h
@@ -36,6 +36,7 @@ public:
const QString formattedTitle();
void addTrack(PlayListTrack *track);
+ void addTracks(QList<PlayListTrack *> tracks);
bool contains(PlayListTrack *track) const;
bool isEmpty() const;
void remove(PlayListTrack *track);