diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -92,6 +92,13 @@ void setSortDirectoriesFirst(bool dirsFirst); bool sortDirectoriesFirst() const; + /** + * Sets a separate sorting with hidden files last (true) or a mixed + * sorting of hidden files mixed with regular files (false). + */ + void setSortHiddenFilesLast(bool hiddenFilesLast); + bool sortHiddenFilesLast() const; + void setShowHiddenFiles(bool show); bool showHiddenFiles() const; @@ -466,6 +473,7 @@ QCollator m_collator; bool m_naturalSorting; bool m_sortDirsFirst; + bool m_sortHiddenFilesLast; RoleType m_sortRole; int m_sortingProgressPercent; // Value of directorySortingProgress() signal diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -44,6 +44,7 @@ KItemModelBase("text", parent), m_dirLister(0), m_sortDirsFirst(true), + m_sortHiddenFilesLast(false), m_sortRole(NameRole), m_sortingProgressPercent(-1), m_roles(), @@ -217,6 +218,19 @@ return m_sortDirsFirst; } +void KFileItemModel::setSortHiddenFilesLast(bool hiddenFilesLast) +{ + if (hiddenFilesLast != m_sortHiddenFilesLast) { + m_sortHiddenFilesLast = hiddenFilesLast; + resortAllItems(); + } +} + +bool KFileItemModel::sortHiddenFilesLast() const +{ + return m_sortHiddenFilesLast; +} + void KFileItemModel::setShowHiddenFiles(bool show) { m_dirLister->setShowingDotFiles(show); @@ -1694,6 +1708,16 @@ } } + if (m_sortHiddenFilesLast) { + const bool hiddenFileA = a->item.isHidden(); + const bool hiddenFileB = b->item.isHidden(); + if (hiddenFileA && !hiddenFileB) { + return false; + } else if (!hiddenFileA && hiddenFileB) { + return true; + } + } + if (m_sortDirsFirst || m_sortRole == SizeRole) { const bool isDirA = a->item.isDir(); const bool isDirB = b->item.isDir(); diff --git a/src/settings/dolphin_directoryviewpropertysettings.kcfg b/src/settings/dolphin_directoryviewpropertysettings.kcfg --- a/src/settings/dolphin_directoryviewpropertysettings.kcfg +++ b/src/settings/dolphin_directoryviewpropertysettings.kcfg @@ -57,6 +57,11 @@ true + + + false + + diff --git a/src/settings/viewpropertiesdialog.h b/src/settings/viewpropertiesdialog.h --- a/src/settings/viewpropertiesdialog.h +++ b/src/settings/viewpropertiesdialog.h @@ -57,6 +57,7 @@ void slotSortOrderChanged(int index); void slotGroupedSortingChanged(); void slotSortFoldersFirstChanged(); + void slotSortHiddenFilesLastChanged(); void slotShowPreviewChanged(); void slotShowHiddenFilesChanged(); void markAsDirty(bool isDirty); @@ -78,6 +79,7 @@ KComboBox* m_sortOrder; KComboBox* m_sorting; QCheckBox* m_sortFoldersFirst; + QCheckBox* m_sortHiddenFilesLast; QCheckBox* m_previewsShown; QCheckBox* m_showInGroups; QCheckBox* m_showHiddenFiles; diff --git a/src/settings/viewpropertiesdialog.cpp b/src/settings/viewpropertiesdialog.cpp --- a/src/settings/viewpropertiesdialog.cpp +++ b/src/settings/viewpropertiesdialog.cpp @@ -57,6 +57,7 @@ m_sortOrder(0), m_sorting(0), m_sortFoldersFirst(0), + m_sortHiddenFilesLast(0), m_previewsShown(0), m_showInGroups(0), m_showHiddenFiles(0), @@ -109,6 +110,7 @@ } m_sortFoldersFirst = new QCheckBox(i18nc("@option:check", "Show folders first")); + m_sortHiddenFilesLast = 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")); @@ -133,6 +135,7 @@ propsBoxLayout->addWidget(m_previewsShown); propsBoxLayout->addWidget(m_showInGroups); propsBoxLayout->addWidget(m_showHiddenFiles); + propsBoxLayout->addWidget(m_sortHiddenFilesLast); propsBoxLayout->addWidget(m_additionalInfo); connect(m_viewMode, static_cast(&KComboBox::currentIndexChanged), @@ -151,6 +154,8 @@ this, &ViewPropertiesDialog::slotGroupedSortingChanged); connect(m_showHiddenFiles, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotShowHiddenFilesChanged); + connect(m_sortHiddenFilesLast, &QCheckBox::clicked, + this, &ViewPropertiesDialog::slotSortHiddenFilesLastChanged); // Only show the following settings if the view properties are remembered // for each directory: @@ -270,6 +275,13 @@ markAsDirty(true); } +void ViewPropertiesDialog::slotSortHiddenFilesLastChanged() +{ + const bool hiddenFilesLast = m_sortHiddenFilesLast->isChecked(); + m_viewProps->setSortHiddenFilesLast(hiddenFilesLast); + markAsDirty(true); +} + void ViewPropertiesDialog::slotShowPreviewChanged() { const bool show = m_previewsShown->isChecked(); @@ -372,6 +384,7 @@ m_dolphinView->setSortRole(m_viewProps->sortRole()); m_dolphinView->setSortOrder(m_viewProps->sortOrder()); m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst()); + m_dolphinView->setSortHiddenFilesLast(m_viewProps->sortHiddenFilesLast()); m_dolphinView->setGroupedSorting(m_viewProps->groupedSorting()); m_dolphinView->setVisibleRoles(m_viewProps->visibleRoles()); m_dolphinView->setPreviewsShown(m_viewProps->previewsShown()); @@ -407,6 +420,7 @@ m_sorting->setCurrentIndex(sortRoleIndex); m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst()); + m_sortHiddenFilesLast->setChecked(m_viewProps->sortHiddenFilesLast()); // Load show preview, show in groups and show hidden files settings m_previewsShown->setChecked(m_viewProps->previewsShown()); diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -204,6 +204,10 @@ void setSortFoldersFirst(bool foldersFirst); bool sortFoldersFirst() const; + /** Sets a seperate sorting with hidden files last (true) or a mixed sorting of hidden files mixed with regular files (false). */ + void setSortHiddenFilesLast(bool hiddenFilesLast); + bool sortHiddenFilesLast() const; + /** Sets the additional information which should be shown for the items. */ void setVisibleRoles(const QList& roles); @@ -429,6 +433,12 @@ */ void sortFoldersFirstChanged(bool foldersFirst); + /** + * Is emitted if the sorting of files and folders (separate with hidden files + * last or mixed) has been changed. + */ + void sortHiddenFilesLastChanged(bool hiddenFilesLast); + /** Is emitted if the additional information shown for this view has been changed. */ void visibleRolesChanged(const QList& current, const QList& previous); @@ -620,6 +630,12 @@ void updateSortFoldersFirst(bool foldersFirst); /** + * Updates the view properties of the current URL to the + * sorting of hidden files (separate with hidden files last or mixed) given by \a hiddenFilesLast. + */ + void updateSortHiddenFilesLast(bool hiddenFilesLast); + + /** * Indicates in the status bar that the delete operation * of the job \a job has been finished. */ diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -431,6 +431,18 @@ return m_model->sortDirectoriesFirst(); } +void DolphinView::setSortHiddenFilesLast(bool hiddenFilesLast) +{ + if (sortHiddenFilesLast() != hiddenFilesLast) { + updateSortHiddenFilesLast(hiddenFilesLast); + } +} + +bool DolphinView::sortHiddenFilesLast() const +{ + return m_model->sortHiddenFilesLast(); +} + void DolphinView::setVisibleRoles(const QList& roles) { const QList previousRoles = roles; @@ -1172,6 +1184,16 @@ emit sortFoldersFirstChanged(foldersFirst); } +void DolphinView::updateSortHiddenFilesLast(bool hiddenFilesLast) +{ + ViewProperties props(viewPropertiesUrl()); + props.setSortHiddenFilesLast(hiddenFilesLast); + + m_model->setSortHiddenFilesLast(hiddenFilesLast); + + emit sortHiddenFilesLastChanged(hiddenFilesLast); +} + QPair DolphinView::pasteInfo() const { const QMimeData *mimeData = QApplication::clipboard()->mimeData(); @@ -1627,6 +1649,12 @@ emit sortFoldersFirstChanged(sortFoldersFirst); } + const bool sortHiddenFilesLast = props.sortHiddenFilesLast(); + if (sortHiddenFilesLast != m_model->sortHiddenFilesLast()) { + m_model->setSortHiddenFilesLast(sortHiddenFilesLast); + emit sortHiddenFilesLastChanged(sortHiddenFilesLast); + } + const QList visibleRoles = props.visibleRoles(); if (visibleRoles != m_visibleRoles) { const QList previousVisibleRoles = m_visibleRoles; diff --git a/src/views/dolphinviewactionhandler.h b/src/views/dolphinviewactionhandler.h --- a/src/views/dolphinviewactionhandler.h +++ b/src/views/dolphinviewactionhandler.h @@ -137,6 +137,9 @@ /** Switches between a separate sorting and a mixed sorting of files and folders. */ void toggleSortFoldersFirst(); + /** Switches between a separate sorting and a mixed sorting of hidden files and regular files. */ + void toggleSortHiddenFilesLast(); + /** * Updates the state of the 'Sort Ascending/Descending' action. */ @@ -148,6 +151,11 @@ void slotSortFoldersFirstChanged(bool foldersFirst); /** + * Updates the state of the 'Sort Hidden Files Last' action. + */ + void slotSortHiddenFilesLastChanged(bool hiddenFilesLast); + + /** * Updates the state of the 'Sort by' actions. */ void slotSortRoleChanged(const QByteArray& role); diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -75,6 +75,8 @@ this, &DolphinViewActionHandler::slotSortOrderChanged); connect(view, &DolphinView::sortFoldersFirstChanged, this, &DolphinViewActionHandler::slotSortFoldersFirstChanged); + connect(view, &DolphinView::sortHiddenFilesLastChanged, + this, &DolphinViewActionHandler::slotSortHiddenFilesLastChanged); connect(view, &DolphinView::visibleRolesChanged, this, &DolphinViewActionHandler::slotVisibleRolesChanged); connect(view, &DolphinView::groupedSortingChanged, @@ -165,6 +167,10 @@ sortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First")); connect(sortFoldersFirst, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortFoldersFirst); + KToggleAction* sortHiddenFilesLast = m_actionCollection->add(QStringLiteral("hidden_files_last")); + sortHiddenFilesLast->setText(i18nc("@action:inmenu Sort", "Hidden Files Last")); + connect(sortHiddenFilesLast, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortHiddenFilesLast); + // View -> Sort By QActionGroup* sortByActionGroup = createFileItemRolesActionGroup(QStringLiteral("sort_by_")); @@ -360,6 +366,7 @@ slotSortOrderChanged(m_currentView->sortOrder()); slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst()); + slotSortHiddenFilesLastChanged(m_currentView->sortHiddenFilesLast()); slotVisibleRolesChanged(m_currentView->visibleRoles(), QList()); slotGroupedSortingChanged(m_currentView->groupedSorting()); slotSortRoleChanged(m_currentView->sortRole()); @@ -397,6 +404,12 @@ m_currentView->setSortFoldersFirst(!sortFirst); } +void DolphinViewActionHandler::toggleSortHiddenFilesLast() +{ + const bool hiddenFilesLast = m_currentView->sortHiddenFilesLast(); + m_currentView->setSortHiddenFilesLast(!hiddenFilesLast); +} + void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order) { QAction* descending = m_actionCollection->action(QStringLiteral("descending")); @@ -409,6 +422,11 @@ m_actionCollection->action(QStringLiteral("folders_first"))->setChecked(foldersFirst); } +void DolphinViewActionHandler::slotSortHiddenFilesLastChanged(bool hiddenFilesLast) +{ + m_actionCollection->action(QStringLiteral("hidden_files_last"))->setChecked(hiddenFilesLast); +} + void DolphinViewActionHandler::toggleVisibleRole(QAction* action) { emit actionBeingHandled(); diff --git a/src/views/viewproperties.h b/src/views/viewproperties.h --- a/src/views/viewproperties.h +++ b/src/views/viewproperties.h @@ -74,6 +74,9 @@ void setSortFoldersFirst(bool foldersFirst); bool sortFoldersFirst() const; + void setSortHiddenFilesLast(bool hiddenFilesLast); + bool sortHiddenFilesLast() const; + /** * Sets the additional information for the current set view-mode. * Note that the additional-info property is the only property where diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -235,6 +235,19 @@ return m_node->sortFoldersFirst(); } +void ViewProperties::setSortHiddenFilesLast(bool hiddenFilesLast) +{ + if (m_node->sortHiddenFilesLast() != hiddenFilesLast) { + m_node->setSortHiddenFilesLast(hiddenFilesLast); + update(); + } +} + +bool ViewProperties::sortHiddenFilesLast() const +{ + return m_node->sortHiddenFilesLast(); +} + void ViewProperties::setVisibleRoles(const QList& roles) { if (roles == visibleRoles()) { @@ -343,6 +356,7 @@ setSortRole(props.sortRole()); setSortOrder(props.sortOrder()); setSortFoldersFirst(props.sortFoldersFirst()); + setSortHiddenFilesLast(props.sortHiddenFilesLast()); setVisibleRoles(props.visibleRoles()); setHeaderColumnWidths(props.headerColumnWidths()); m_node->setVersion(props.m_node->version());