diff --git a/app/browsemainpage.h b/app/browsemainpage.h --- a/app/browsemainpage.h +++ b/app/browsemainpage.h @@ -77,6 +77,7 @@ void slotDirModelReset(); void slotSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void updateSortOrder(); + void updateSortFoldersFirst(); void updateThumbnailDetails(); void slotUrlsDropped(const QUrl &destUrl, QDropEvent*); void showMenuForDroppedUrls(const QList&, const QUrl &destUrl); diff --git a/app/browsemainpage.cpp b/app/browsemainpage.cpp --- a/app/browsemainpage.cpp +++ b/app/browsemainpage.cpp @@ -80,6 +80,7 @@ KActionMenu* mSortActionMenu; QActionGroup* mSortAction; KToggleAction* mSortDescendingAction; + KToggleAction* mSortFoldersFirst; QActionGroup* mThumbnailDetailsActionGroup; PreviewItemDelegate* mDelegate; @@ -170,11 +171,18 @@ QObject::connect(mSortDescendingAction, SIGNAL(toggled(bool)), q, SLOT(updateSortOrder())); + mSortFoldersFirst = view->add("sort_folders_first"); + mSortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First")); + mSortFoldersFirst->setChecked(true); + QObject::connect(mSortFoldersFirst, SIGNAL(toggled(bool)), + q, SLOT(updateSortFoldersFirst())); + for(auto action : mSortAction->actions()) { mSortActionMenu->addAction(action); } mSortActionMenu->addSeparator(); mSortActionMenu->addAction(mSortDescendingAction); + mSortActionMenu->addAction(mSortFoldersFirst); mThumbnailDetailsActionGroup = new QActionGroup(q); mThumbnailDetailsActionGroup->setExclusive(false); @@ -320,6 +328,7 @@ d->setupFilterController(); loadConfig(); updateSortOrder(); + updateSortFoldersFirst(); updateThumbnailDetails(); // Set up connections for document count @@ -361,6 +370,7 @@ } } d->mSortDescendingAction->setChecked(GwenviewConfig::sortDescending()); + d->mSortFoldersFirst->setChecked(GwenviewConfig::sortFoldersFirst()); d->updateContextBarActions(); } @@ -372,6 +382,7 @@ GwenviewConfig::setThumbnailSize(d->mThumbnailSlider->value()); GwenviewConfig::setSorting(sortingFromSortAction(d->mSortAction->checkedAction())); GwenviewConfig::setSortDescending(d->mSortDescendingAction->isChecked()); + GwenviewConfig::setSortFoldersFirst(d->mSortFoldersFirst->isChecked()); GwenviewConfig::setThumbnailDetails(d->mDelegate->thumbnailDetails()); } @@ -472,6 +483,12 @@ d->mDirModel->sort(sortingFromSortAction(action), order); } +void BrowseMainPage::updateSortFoldersFirst() +{ + d->mDirModel->setSortFoldersFirst(d->mSortFoldersFirst->isChecked()); + d->mDirModel->invalidate(); +} + void BrowseMainPage::updateThumbnailDetails() { PreviewItemDelegate::ThumbnailDetails details = 0; diff --git a/lib/gwenviewconfig.kcfg b/lib/gwenviewconfig.kcfg --- a/lib/gwenviewconfig.kcfg +++ b/lib/gwenviewconfig.kcfg @@ -221,6 +221,10 @@ false + + + true + 1 diff --git a/lib/semanticinfo/sorteddirmodel.h b/lib/semanticinfo/sorteddirmodel.h --- a/lib/semanticinfo/sorteddirmodel.h +++ b/lib/semanticinfo/sorteddirmodel.h @@ -118,7 +118,6 @@ protected: bool filterAcceptsRow(int row, const QModelIndex& parent) const Q_DECL_OVERRIDE; - bool lessThan(const QModelIndex& left, const QModelIndex& right) const Q_DECL_OVERRIDE; private Q_SLOTS: void doApplyFilters(); diff --git a/lib/semanticinfo/sorteddirmodel.cpp b/lib/semanticinfo/sorteddirmodel.cpp --- a/lib/semanticinfo/sorteddirmodel.cpp +++ b/lib/semanticinfo/sorteddirmodel.cpp @@ -256,28 +256,6 @@ QSortFilterProxyModel::invalidateFilter(); } -bool SortedDirModel::lessThan(const QModelIndex& left, const QModelIndex& right) const -{ - const KFileItem leftItem = itemForSourceIndex(left); - const KFileItem rightItem = itemForSourceIndex(right); - - const bool leftIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(leftItem); - const bool rightIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(rightItem); - - if (leftIsDirOrArchive != rightIsDirOrArchive) { - return leftIsDirOrArchive; - } - - if (sortColumn() != KDirModel::ModifiedTime) { - return KDirSortFilterProxyModel::lessThan(left, right); - } - - const QDateTime leftDate = TimeUtils::dateTimeForFileItem(leftItem); - const QDateTime rightDate = TimeUtils::dateTimeForFileItem(rightItem); - - return leftDate < rightDate; -} - bool SortedDirModel::hasDocuments() const { const int count = rowCount();