From 50149d6abb8a0a978db3c6afb5238bc42a4a89c8 Mon Sep 17 00:00:00 2001 From: Gaston Haro Date: Sun, 1 Aug 2021 13:00:05 -0400 Subject: [PATCH] Configurable Show hidden files and folders last toggle CCBUG: 241227 Revision: https://phabricator.kde.org/D29115 --- src/kitemviews/kfileitemmodel.cpp | 28 ++++++++++++++---- src/kitemviews/kfileitemmodel.h | 7 +++++ ...dolphin_directoryviewpropertysettings.kcfg | 5 ++++ src/settings/viewpropertiesdialog.cpp | 14 +++++++++ src/settings/viewpropertiesdialog.h | 2 ++ src/views/dolphinview.cpp | 29 +++++++++++++++++++ src/views/dolphinview.h | 15 ++++++++++ src/views/dolphinviewactionhandler.cpp | 19 ++++++++++++ src/views/dolphinviewactionhandler.h | 10 +++++++ src/views/viewproperties.cpp | 14 +++++++++ src/views/viewproperties.h | 3 ++ 11 files changed, 140 insertions(+), 6 deletions(-) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index e03ec7c0e9..ef80b4edbd 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -34,6 +34,7 @@ KFileItemModel::KFileItemModel(QObject* parent) : KItemModelBase("text", parent), m_dirLister(nullptr), m_sortDirsFirst(true), + m_sortHiddenLast(true), m_sortRole(NameRole), m_sortingProgressPercent(-1), m_roles(), @@ -212,6 +213,19 @@ bool KFileItemModel::sortDirectoriesFirst() const return m_sortDirsFirst; } +void KFileItemModel::setSortHiddenLast(bool hiddenLast) +{ + if (hiddenLast != m_sortHiddenLast) { + m_sortHiddenLast = hiddenLast; + resortAllItems(); + } +} + +bool KFileItemModel::sortHiddenLast() const +{ + return m_sortHiddenLast; +} + void KFileItemModel::setShowHiddenFiles(bool show) { m_dirLister->setShowingDotFiles(show); @@ -1734,12 +1748,14 @@ bool KFileItemModel::lessThan(const ItemData* a, const ItemData* b, const QColla } // Show hidden files and folders last - const bool isHiddenA = a->item.isHidden(); - const bool isHiddenB = b->item.isHidden(); - if (isHiddenA && !isHiddenB) { - return false; - } else if (!isHiddenA && isHiddenB) { - return true; + if (m_sortHiddenLast) { + const bool isHiddenA = a->item.isHidden(); + const bool isHiddenB = b->item.isHidden(); + if (isHiddenA && !isHiddenB) { + return false; + } else if (!isHiddenA && isHiddenB) { + return true; + } } if (m_sortDirsFirst || (DetailsModeSettings::directorySizeCount() && m_sortRole == SizeRole)) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index acf4b761cf..33838853df 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -80,6 +80,12 @@ public: void setSortDirectoriesFirst(bool dirsFirst); bool sortDirectoriesFirst() const; + /** + * Sets a separate sorting with hidden files and folders last (true) or not (false). + */ + void setSortHiddenLast(bool hiddenLast); + bool sortHiddenLast() const; + void setShowHiddenFiles(bool show); bool showHiddenFiles() const; @@ -463,6 +469,7 @@ private: QCollator m_collator; bool m_naturalSorting; bool m_sortDirsFirst; + bool m_sortHiddenLast; RoleType m_sortRole; int m_sortingProgressPercent; // Value of directorySortingProgress() signal diff --git a/src/settings/dolphin_directoryviewpropertysettings.kcfg b/src/settings/dolphin_directoryviewpropertysettings.kcfg index 6bcf3cd02b..9846326b94 100644 --- a/src/settings/dolphin_directoryviewpropertysettings.kcfg +++ b/src/settings/dolphin_directoryviewpropertysettings.kcfg @@ -57,6 +57,11 @@ true + + + true + + diff --git a/src/settings/viewpropertiesdialog.cpp b/src/settings/viewpropertiesdialog.cpp index 82d182d1d0..6659d79b63 100644 --- a/src/settings/viewpropertiesdialog.cpp +++ b/src/settings/viewpropertiesdialog.cpp @@ -44,6 +44,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : m_sortOrder(nullptr), m_sorting(nullptr), m_sortFoldersFirst(nullptr), + m_sortHiddenLast(nullptr), m_previewsShown(nullptr), m_showInGroups(nullptr), m_showHiddenFiles(nullptr), @@ -82,6 +83,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : } m_sortFoldersFirst = new QCheckBox(i18nc("@option:check", "Show folders first")); + m_sortHiddenLast = new QCheckBox(i18nc("@option:check", "Show hidden files last")); m_previewsShown = new QCheckBox(i18nc("@option:check", "Show preview")); m_showInGroups = new QCheckBox(i18nc("@option:check", "Show in groups")); m_showHiddenFiles = new QCheckBox(i18nc("@option:check", "Show hidden files")); @@ -146,6 +148,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : layout->addRow(QString(), m_previewsShown); layout->addRow(QString(), m_showInGroups); layout->addRow(QString(), m_showHiddenFiles); + layout->addRow(QString(), m_sortHiddenLast); connect(m_viewMode, QOverload::of(&QComboBox::currentIndexChanged), this, &ViewPropertiesDialog::slotViewModeChanged); @@ -155,6 +158,8 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : this, &ViewPropertiesDialog::slotSortOrderChanged); connect(m_sortFoldersFirst, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotSortFoldersFirstChanged); + connect(m_sortHiddenLast, &QCheckBox::clicked, + this, &ViewPropertiesDialog::slotSortHiddenLastChanged); connect(m_previewsShown, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotShowPreviewChanged); connect(m_showInGroups, &QCheckBox::clicked, @@ -282,6 +287,13 @@ void ViewPropertiesDialog::slotSortFoldersFirstChanged() markAsDirty(true); } +void ViewPropertiesDialog::slotSortHiddenLastChanged() +{ + const bool hiddenLast = m_sortHiddenLast->isChecked(); + m_viewProps->setSortHiddenLast(hiddenLast); + markAsDirty(true); +} + void ViewPropertiesDialog::slotShowPreviewChanged() { const bool show = m_previewsShown->isChecked(); @@ -383,6 +395,7 @@ void ViewPropertiesDialog::applyViewProperties() m_dolphinView->setSortRole(m_viewProps->sortRole()); m_dolphinView->setSortOrder(m_viewProps->sortOrder()); m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst()); + m_dolphinView->setSortHiddenLast(m_viewProps->sortHiddenLast()); m_dolphinView->setGroupedSorting(m_viewProps->groupedSorting()); m_dolphinView->setVisibleRoles(m_viewProps->visibleRoles()); m_dolphinView->setPreviewsShown(m_viewProps->previewsShown()); @@ -418,6 +431,7 @@ void ViewPropertiesDialog::loadSettings() m_sorting->setCurrentIndex(sortRoleIndex); m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst()); + m_sortHiddenLast->setChecked(m_viewProps->sortHiddenLast()); // Load show preview, show in groups and show hidden files settings m_previewsShown->setChecked(m_viewProps->previewsShown()); diff --git a/src/settings/viewpropertiesdialog.h b/src/settings/viewpropertiesdialog.h index f07bb8088f..c58fda5c00 100644 --- a/src/settings/viewpropertiesdialog.h +++ b/src/settings/viewpropertiesdialog.h @@ -46,6 +46,7 @@ private Q_SLOTS: void slotSortOrderChanged(int index); void slotGroupedSortingChanged(); void slotSortFoldersFirstChanged(); + void slotSortHiddenLastChanged(); void slotShowPreviewChanged(); void slotShowHiddenFilesChanged(); void slotItemChanged(QListWidgetItem *item); @@ -67,6 +68,7 @@ private: QComboBox* m_sortOrder; QComboBox* m_sorting; QCheckBox* m_sortFoldersFirst; + QCheckBox* m_sortHiddenLast; QCheckBox* m_previewsShown; QCheckBox* m_showInGroups; QCheckBox* m_showHiddenFiles; diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index f5c21a2c55..57ed73a3a6 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -463,6 +463,18 @@ bool DolphinView::sortFoldersFirst() const return m_model->sortDirectoriesFirst(); } +void DolphinView::setSortHiddenLast(bool hiddenLast) +{ + if (sortHiddenLast() != hiddenLast) { + updateSortHiddenLast(hiddenLast); + } +} + +bool DolphinView::sortHiddenLast() const +{ + return m_model->sortHiddenLast(); +} + void DolphinView::setVisibleRoles(const QList& roles) { const QList previousRoles = roles; @@ -1373,6 +1385,17 @@ void DolphinView::updateSortFoldersFirst(bool foldersFirst) Q_EMIT sortFoldersFirstChanged(foldersFirst); } +void DolphinView::updateSortHiddenLast(bool hiddenLast) +{ + ViewProperties props(viewPropertiesUrl()); + props.setSortHiddenLast(hiddenLast); + + m_model->setSortHiddenLast(hiddenLast); + + Q_EMIT sortHiddenLastChanged(hiddenLast); +} + + QPair DolphinView::pasteInfo() const { const QMimeData *mimeData = QApplication::clipboard()->mimeData(); @@ -1903,6 +1926,12 @@ void DolphinView::applyViewProperties(const ViewProperties& props) Q_EMIT sortFoldersFirstChanged(sortFoldersFirst); } + const bool sortHiddenLast = props.sortHiddenLast(); + if (sortHiddenLast != m_model->sortHiddenLast()) { + m_model->setSortHiddenLast(sortHiddenLast); + Q_EMIT sortHiddenLastChanged(sortHiddenLast); + } + const QList visibleRoles = props.visibleRoles(); if (visibleRoles != m_visibleRoles) { const QList previousVisibleRoles = m_visibleRoles; diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index e4d7798300..75c9dd9856 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -206,6 +206,10 @@ public: void setSortFoldersFirst(bool foldersFirst); bool sortFoldersFirst() const; + /** Sets a separate sorting with hidden files and folders last (true) or not (false). */ + void setSortHiddenLast(bool hiddenLast); + bool sortHiddenLast() const; + /** Sets the additional information which should be shown for the items. */ void setVisibleRoles(const QList& roles); @@ -470,6 +474,11 @@ Q_SIGNALS: */ void sortFoldersFirstChanged(bool foldersFirst); + /** + * Is emitted if the sorting of hidden files has been changed. + */ + void sortHiddenLastChanged(bool hiddenLast); + /** Is emitted if the additional information shown for this view has been changed. */ void visibleRolesChanged(const QList& current, const QList& previous); @@ -679,6 +688,12 @@ private Q_SLOTS: */ void updateSortFoldersFirst(bool foldersFirst); + /** + * Updates the view properties of the current URL to the + * sorting of hidden files given by \a hiddenLast. + */ + void updateSortHiddenLast(bool hiddenLast); + /** * Indicates in the status bar that the delete operation * of the job \a job has been finished. diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index c9bab5f82f..90109605b6 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -57,6 +57,8 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) this, &DolphinViewActionHandler::slotSortOrderChanged); connect(view, &DolphinView::sortFoldersFirstChanged, this, &DolphinViewActionHandler::slotSortFoldersFirstChanged); + connect(view, &DolphinView::sortHiddenLastChanged, + this, &DolphinViewActionHandler::slotSortHiddenLastChanged); connect(view, &DolphinView::visibleRolesChanged, this, &DolphinViewActionHandler::slotVisibleRolesChanged); connect(view, &DolphinView::groupedSortingChanged, @@ -253,6 +255,10 @@ void DolphinViewActionHandler::createActions() sortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First")); connect(sortFoldersFirst, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortFoldersFirst); + KToggleAction* sortHiddenLast = m_actionCollection->add(QStringLiteral("hidden_last")); + sortHiddenLast->setText(i18nc("@action:inmenu Sort", "Hidden Files Last")); + connect(sortHiddenLast, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortHiddenLast); + // View -> Sort By QActionGroup* sortByActionGroup = createFileItemRolesActionGroup(QStringLiteral("sort_by_")); @@ -287,6 +293,7 @@ void DolphinViewActionHandler::createActions() sortByActionMenu->addAction(descendingAction); sortByActionMenu->addSeparator(); sortByActionMenu->addAction(sortFoldersFirst); + sortByActionMenu->addAction(sortHiddenLast); // View -> Additional Information QActionGroup* visibleRolesGroup = createFileItemRolesActionGroup(QStringLiteral("show_")); @@ -481,6 +488,7 @@ void DolphinViewActionHandler::updateViewActions() slotSortOrderChanged(m_currentView->sortOrder()); slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst()); + slotSortHiddenLastChanged(m_currentView->sortHiddenLast()); slotVisibleRolesChanged(m_currentView->visibleRoles(), QList()); slotGroupedSortingChanged(m_currentView->groupedSorting()); slotSortRoleChanged(m_currentView->sortRole()); @@ -516,6 +524,12 @@ void DolphinViewActionHandler::toggleSortFoldersFirst() m_currentView->setSortFoldersFirst(!sortFirst); } +void DolphinViewActionHandler::toggleSortHiddenLast() +{ + const bool sortHiddenLast = m_currentView->sortHiddenLast(); + m_currentView->setSortHiddenLast(!sortHiddenLast); +} + void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order) { QAction* descending = m_actionCollection->action(QStringLiteral("descending")); @@ -530,6 +544,11 @@ void DolphinViewActionHandler::slotSortFoldersFirstChanged(bool foldersFirst) m_actionCollection->action(QStringLiteral("folders_first"))->setChecked(foldersFirst); } +void DolphinViewActionHandler::slotSortHiddenLastChanged(bool hiddenLast) +{ + m_actionCollection->action(QStringLiteral("hidden_last"))->setChecked(hiddenLast); +} + void DolphinViewActionHandler::toggleVisibleRole(QAction* action) { Q_EMIT actionBeingHandled(); diff --git a/src/views/dolphinviewactionhandler.h b/src/views/dolphinviewactionhandler.h index 3f73153ea6..6e9b4a432b 100644 --- a/src/views/dolphinviewactionhandler.h +++ b/src/views/dolphinviewactionhandler.h @@ -136,6 +136,16 @@ private Q_SLOTS: */ void slotSortFoldersFirstChanged(bool foldersFirst); + /** + * Switches between showing hidden files last or not. + */ + void toggleSortHiddenLast(); + + /** + * Updates the state of the 'Sort Hidden Last' action. + */ + void slotSortHiddenLastChanged(bool hiddenLast); + /** * Updates the state of the 'Sort by' actions. */ diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 1f73f3b33b..4b8d017c72 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -245,6 +245,19 @@ bool ViewProperties::sortFoldersFirst() const return m_node->sortFoldersFirst(); } +void ViewProperties::setSortHiddenLast(bool hiddenLast) +{ + if (m_node->sortHiddenLast() != hiddenLast) { + m_node->setSortHiddenLast(hiddenLast); + update(); + } +} + +bool ViewProperties::sortHiddenLast() const +{ + return m_node->sortHiddenLast(); +} + void ViewProperties::setVisibleRoles(const QList& roles) { if (roles == visibleRoles()) { @@ -353,6 +366,7 @@ void ViewProperties::setDirProperties(const ViewProperties& props) setSortRole(props.sortRole()); setSortOrder(props.sortOrder()); setSortFoldersFirst(props.sortFoldersFirst()); + setSortHiddenLast(props.sortHiddenLast()); setVisibleRoles(props.visibleRoles()); setHeaderColumnWidths(props.headerColumnWidths()); m_node->setVersion(props.m_node->version()); diff --git a/src/views/viewproperties.h b/src/views/viewproperties.h index a9daafc87a..def8aa7381 100644 --- a/src/views/viewproperties.h +++ b/src/views/viewproperties.h @@ -62,6 +62,9 @@ public: void setSortFoldersFirst(bool foldersFirst); bool sortFoldersFirst() const; + void setSortHiddenLast(bool hiddenLast); + bool sortHiddenLast() const; + /** * Sets the additional information for the current set view-mode. * Note that the additional-info property is the only property where