diff --git a/src/models/abstractmediaproxymodel.h b/src/models/abstractmediaproxymodel.h --- a/src/models/abstractmediaproxymodel.h +++ b/src/models/abstractmediaproxymodel.h @@ -41,6 +41,10 @@ WRITE setFilterRating NOTIFY filterRatingChanged) + Q_PROPERTY(bool sortedAscending + READ sortedAscending + NOTIFY sortedAscendingChanged) + public: explicit AbstractMediaProxyModel(QObject *parent = nullptr); @@ -51,18 +55,24 @@ int filterRating() const; + bool sortedAscending() const; + public Q_SLOTS: void setFilterText(const QString &filterText); void setFilterRating(int filterRating); + void sortModel(Qt::SortOrder order); + Q_SIGNALS: void filterTextChanged(const QString &filterText); void filterRatingChanged(int filterRating); + void sortedAscendingChanged(); + protected: virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override = 0; diff --git a/src/models/abstractmediaproxymodel.cpp b/src/models/abstractmediaproxymodel.cpp --- a/src/models/abstractmediaproxymodel.cpp +++ b/src/models/abstractmediaproxymodel.cpp @@ -74,4 +74,15 @@ Q_EMIT filterRatingChanged(filterRating); } +bool AbstractMediaProxyModel::sortedAscending() const +{ + return sortOrder() ? false : true; +} + +void AbstractMediaProxyModel::sortModel(Qt::SortOrder order) +{ + this->sort(0,order); + Q_EMIT sortedAscendingChanged(); +} + #include "moc_abstractmediaproxymodel.cpp" diff --git a/src/models/allalbumsproxymodel.cpp b/src/models/allalbumsproxymodel.cpp --- a/src/models/allalbumsproxymodel.cpp +++ b/src/models/allalbumsproxymodel.cpp @@ -27,6 +27,9 @@ AllAlbumsProxyModel::AllAlbumsProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { + this->setSortRole(AllAlbumsModel::TitleRole); + this->setSortCaseSensitivity(Qt::CaseInsensitive); + this->sortModel(Qt::AscendingOrder); } AllAlbumsProxyModel::~AllAlbumsProxyModel() diff --git a/src/models/allartistsproxymodel.cpp b/src/models/allartistsproxymodel.cpp --- a/src/models/allartistsproxymodel.cpp +++ b/src/models/allartistsproxymodel.cpp @@ -26,6 +26,9 @@ AllArtistsProxyModel::AllArtistsProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { + this->setSortRole(AllArtistsModel::NameRole); + this->setSortCaseSensitivity(Qt::CaseInsensitive); + this->sortModel(Qt::AscendingOrder); } AllArtistsProxyModel::~AllArtistsProxyModel() diff --git a/src/models/alltracksproxymodel.cpp b/src/models/alltracksproxymodel.cpp --- a/src/models/alltracksproxymodel.cpp +++ b/src/models/alltracksproxymodel.cpp @@ -26,6 +26,9 @@ AllTracksProxyModel::AllTracksProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { + this->setSortRole(AllTracksModel::TitleRole); + this->setSortCaseSensitivity(Qt::CaseInsensitive); + this->sortModel(Qt::AscendingOrder); } AllTracksProxyModel::~AllTracksProxyModel() diff --git a/src/models/singleartistproxymodel.cpp b/src/models/singleartistproxymodel.cpp --- a/src/models/singleartistproxymodel.cpp +++ b/src/models/singleartistproxymodel.cpp @@ -27,6 +27,9 @@ SingleArtistProxyModel::SingleArtistProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { + this->setSortRole(AllAlbumsModel::TitleRole); + this->setSortCaseSensitivity(Qt::CaseInsensitive); + this->sortModel(Qt::AscendingOrder); } SingleArtistProxyModel::~SingleArtistProxyModel() = default; diff --git a/src/qml/GridBrowserView.qml b/src/qml/GridBrowserView.qml --- a/src/qml/GridBrowserView.qml +++ b/src/qml/GridBrowserView.qml @@ -62,6 +62,7 @@ secondaryTitle: gridView.secondaryTitle image: gridView.image enableGoBack: isSubPage + sortOrder: contentModel.sortedAscending height: elisaTheme.navigationBarHeight Layout.preferredHeight: height @@ -88,6 +89,8 @@ onGoBack: gridView.goBack() onFilterViewChanged: gridView.filterViewChanged(expandedFilterView) + + onSort: contentModel.sortModel(order) } Rectangle { diff --git a/src/qml/ListBrowserView.qml b/src/qml/ListBrowserView.qml --- a/src/qml/ListBrowserView.qml +++ b/src/qml/ListBrowserView.qml @@ -61,6 +61,8 @@ id: navigationBar enableGoBack: listView.isSubPage + sortOrder: contentModel.sortedAscending + height: elisaTheme.navigationBarHeight Layout.preferredHeight: height Layout.minimumHeight: height @@ -88,6 +90,8 @@ onGoBack: listView.goBack() onShowArtist: listView.showArtist(listView.contentModel.sourceModel.author) + + onSort: contentModel.sortModel(order) } Rectangle { diff --git a/src/qml/NavigationActionBar.qml b/src/qml/NavigationActionBar.qml --- a/src/qml/NavigationActionBar.qml +++ b/src/qml/NavigationActionBar.qml @@ -37,12 +37,15 @@ property alias filterRating: ratingFilter.starRating property bool enableGoBack: true property bool expandedFilterView: false + property bool enableSorting: true + property bool sortOrder signal enqueue(); signal replaceAndPlay(); signal goBack(); signal showArtist(); signal filterViewChanged(bool expandedFilterView); + signal sort(var order); Controls1.Action { id: goPreviousAction @@ -58,6 +61,13 @@ onTriggered: filterViewChanged(!navigationBar.expandedFilterView) } + Controls1.Action { + id: sortAction + text: i18nc("Toggle between ascending and descending order", "Toggle sort order") + iconName: sortOrder ? "view-sort-ascending" : "view-sort-descending" + onTriggered: sortOrder ? sort(Qt.DescendingOrder) : sort(Qt.AscendingOrder) + } + ColumnLayout { anchors.fill: parent spacing: 0 @@ -318,6 +328,20 @@ Layout.bottomMargin: 0 } + + Item { + Layout.fillWidth: true + } + + Controls1.ToolButton { + action: sortAction + objectName: 'sortAscendingButton' + + Layout.alignment: Qt.AlignRight + Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + visible: enableSorting + } } }