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());