Sort library by author or title. Sort books by two levels.
[dorian] / model / sortedlibrary.cpp
index 3a0fb54..241dfe7 100644 (file)
@@ -1,4 +1,5 @@
 #include "sortedlibrary.h"
+#include "library.h"
 #include "book.h"
 #include "trace.h"
 
@@ -6,12 +7,23 @@ SortedLibrary::SortedLibrary(QObject *parent):
         QSortFilterProxyModel(parent), mSortBy(SortByTitle)
 {
     setSourceModel(Library::instance());
+    setDynamicSortFilter(true);
     sort(0);
 }
 
-void SortedLibrary::sortBy(SortBy key)
+void SortedLibrary::setSortBy(SortBy key)
 {
-    mSortBy = key;
+    TRACE;
+    if (mSortBy != key) {
+        mSortBy = key;
+        invalidate();
+        sort(0);
+    }
+}
+
+SortedLibrary::SortBy SortedLibrary::sortBy()
+{
+    return mSortBy;
 }
 
 bool SortedLibrary::lessThan(const QModelIndex &left,
@@ -19,20 +31,34 @@ bool SortedLibrary::lessThan(const QModelIndex &left,
 {
     Book *leftBook = Library::instance()->book(left);
     Book *rightBook = Library::instance()->book(right);
-
-    QString leftString;
-    QString rightString;
+    int ret = 0;
 
     switch (mSortBy) {
-    case SortByTitle:
-        leftString = leftBook->shortName();
-        rightString = rightBook->shortName();
+    case SortByAuthor:
+        ret = compareBy(SortByAuthor, leftBook, rightBook);
+        if (ret == 0) {
+            ret = compareBy(SortByTitle, leftBook, rightBook);
+        }
         break;
     default:
-        leftString = leftBook->creators[0];
-        rightString = rightBook->creators[0];
-        break;
+        ret = compareBy(SortByTitle, leftBook, rightBook);
+        if (ret == 0) {
+            ret = compareBy(SortByAuthor, leftBook, rightBook);
+        }
     }
 
-    return QString::localeAwareCompare(leftString, rightString) < 0;
+    return ret < 0;
+}
+
+int SortedLibrary::compareBy(SortBy key, Book *left, Book *right) const
+{
+    Q_ASSERT(left);
+    Q_ASSERT(right);
+    switch (key) {
+    case SortByAuthor:
+        return QString::localeAwareCompare(left->creators.join(" "),
+                                           right->creators.join(" "));
+    default:
+        return QString::localeAwareCompare(left->shortName(), right->shortName());
+    }
 }