┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/views
diff options
context:
space:
mode:
Diffstat (limited to 'src/views')
-rw-r--r--src/views/dolphinview.cpp33
-rw-r--r--src/views/dolphinview.h10
-rw-r--r--src/views/dolphinviewactionhandler.cpp106
-rw-r--r--src/views/dolphinviewactionhandler.h22
-rw-r--r--src/views/viewproperties.cpp14
-rw-r--r--src/views/viewproperties.h3
6 files changed, 160 insertions, 28 deletions
diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp
index 6882df5d3..e14227198 100644
--- a/src/views/dolphinview.cpp
+++ b/src/views/dolphinview.cpp
@@ -549,6 +549,33 @@ QByteArray DolphinView::sortRole() const
return model->sortRole();
}
+void DolphinView::setGroupRole(const QByteArray &role)
+{
+ KItemModelBase *model = m_container->controller()->model();
+ if (role == model->rawGroupRole()) {
+ return;
+ }
+
+ ViewProperties props(viewPropertiesUrl());
+ props.setGroupRole(role);
+
+ model->setGroupRole(role);
+
+ Q_EMIT groupRoleChanged(role);
+}
+
+QByteArray DolphinView::groupRole() const
+{
+ const KItemModelBase *model = m_container->controller()->model();
+ return model->groupRole();
+}
+
+QByteArray DolphinView::rawGroupRole() const
+{
+ const KItemModelBase *model = m_container->controller()->model();
+ return model->rawGroupRole();
+}
+
void DolphinView::setSortOrder(Qt::SortOrder order)
{
if (sortOrder() != order) {
@@ -2405,6 +2432,12 @@ void DolphinView::applyViewProperties(const ViewProperties &props)
Q_EMIT sortRoleChanged(sortRole);
}
+ const QByteArray groupRole = props.groupRole();
+ if (groupRole != m_model->rawGroupRole()) {
+ m_model->setGroupRole(groupRole);
+ Q_EMIT groupRoleChanged(groupRole);
+ }
+
const Qt::SortOrder sortOrder = props.sortOrder();
if (sortOrder != m_model->sortOrder()) {
m_model->setSortOrder(sortOrder);
diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h
index 35276f9ac..b0ab6ab6a 100644
--- a/src/views/dolphinview.h
+++ b/src/views/dolphinview.h
@@ -218,6 +218,10 @@ public:
void setSortRole(const QByteArray &role);
QByteArray sortRole() const;
+ void setGroupRole(const QByteArray &role);
+ QByteArray groupRole() const;
+ QByteArray rawGroupRole() const;
+
/**
* Updates the view properties of the current URL to the
* sort order given by \a order.
@@ -578,6 +582,12 @@ Q_SIGNALS:
/** Is emitted if the sorting by name, size or date has been changed. */
void sortRoleChanged(const QByteArray &role);
+ /**
+ * Is emitted when the explicit group role changes. Passes the raw role —
+ * an empty byte array means grouping follows the sort role (see rawGroupRole()).
+ */
+ void groupRoleChanged(const QByteArray &role);
+
/** Is emitted if the sort order (ascending or descending) has been changed. */
void sortOrderChanged(Qt::SortOrder order);
diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp
index 7317ca79c..2aed32d8e 100644
--- a/src/views/dolphinviewactionhandler.cpp
+++ b/src/views/dolphinviewactionhandler.cpp
@@ -59,6 +59,7 @@ void DolphinViewActionHandler::setCurrentView(DolphinView *view)
connect(view, &DolphinView::sortHiddenLastChanged, this, &DolphinViewActionHandler::slotSortHiddenLastChanged);
connect(view, &DolphinView::visibleRolesChanged, this, &DolphinViewActionHandler::slotVisibleRolesChanged);
connect(view, &DolphinView::groupedSortingChanged, this, &DolphinViewActionHandler::slotGroupedSortingChanged);
+ connect(view, &DolphinView::groupRoleChanged, this, &DolphinViewActionHandler::slotGroupRoleChanged);
connect(view, &DolphinView::hiddenFilesShownChanged, this, &DolphinViewActionHandler::slotHiddenFilesShownChanged);
connect(view, &DolphinView::sortRoleChanged, this, &DolphinViewActionHandler::slotSortRoleChanged);
connect(view, &DolphinView::zoomLevelChanged, this, &DolphinViewActionHandler::slotZoomLevelChanged);
@@ -327,11 +328,40 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac
visibleRolesMenu->addAction(action);
}
- KToggleAction *showInGroups = m_actionCollection->add<KToggleAction>(QStringLiteral("show_in_groups"));
- showInGroups->setIcon(QIcon::fromTheme(QStringLiteral("view-group")));
- showInGroups->setText(i18nc("@action:inmenu View", "Show in Groups"));
- showInGroups->setWhatsThis(i18nc("@info:whatsthis", "This groups files and folders by their first letter."));
- connect(showInGroups, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleGroupedSorting);
+ KActionMenu *groupByActionMenu = m_actionCollection->add<KActionMenu>(QStringLiteral("group_by"));
+ groupByActionMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-group")));
+ groupByActionMenu->setText(i18nc("@action:inmenu View", "Group By"));
+ groupByActionMenu->setWhatsThis(i18nc("@info:whatsthis",
+ "This groups files and folders by a chosen attribute. "
+ "\"None\" disables grouping. "
+ "\"Same as Sort\" groups by the active sort criterion."));
+ groupByActionMenu->setPopupMode(QToolButton::InstantPopup);
+
+ QActionGroup *groupByActionGroup = new QActionGroup(m_actionCollection);
+ groupByActionGroup->setExclusive(true);
+ connect(groupByActionGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::slotGroupByTriggered);
+
+ KToggleAction *groupByNone = m_actionCollection->add<KToggleAction>(QStringLiteral("group_by_none"));
+ groupByNone->setActionGroup(groupByActionGroup);
+ groupByNone->setText(i18nc("@action:inmenu Group By", "None"));
+ groupByNone->setData(QByteArray());
+ m_groupByActions.insert(QByteArray(), groupByNone);
+ groupByActionMenu->addAction(groupByNone);
+
+ KToggleAction *groupBySameAsSort = m_actionCollection->add<KToggleAction>(QStringLiteral("group_by_same_as_sort"));
+ groupBySameAsSort->setActionGroup(groupByActionGroup);
+ groupBySameAsSort->setText(i18nc("@action:inmenu Group By", "Same as Sort"));
+ groupBySameAsSort->setData(QByteArray("same_as_sort"));
+ m_groupByActions.insert(QByteArray("same_as_sort"), groupBySameAsSort);
+ groupByActionMenu->addAction(groupBySameAsSort);
+
+ groupByActionMenu->addSeparator();
+
+ QActionGroup *groupRolesGroup = createFileItemRolesActionGroup(QStringLiteral("group_"));
+ const auto groupRolesGroupActions = groupRolesGroup->actions();
+ for (QAction *action : groupRolesGroupActions) {
+ groupByActionMenu->addAction(action);
+ }
KToggleAction *showHiddenFiles = m_actionCollection->add<KToggleAction>(QStringLiteral("show_hidden_files"));
showHiddenFiles->setIcon(QIcon::fromTheme(QStringLiteral("view-visible")));
@@ -370,9 +400,9 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac
viewSettings->addSeparator();
viewSettings->addAction(zoomWidgetAction);
viewSettings->addAction(sortByActionMenu);
+ viewSettings->addAction(groupByActionMenu);
viewSettings->addAction(visibleRolesMenu);
viewSettings->addAction(showPreview);
- viewSettings->addAction(showInGroups);
viewSettings->addAction(showHiddenFiles);
viewSettings->addAction(adjustViewProps);
viewSettings->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);
@@ -384,14 +414,18 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac
QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QString &groupPrefix)
{
const bool isSortGroup = (groupPrefix == QLatin1String("sort_by_"));
- Q_ASSERT(isSortGroup || groupPrefix == QLatin1String("show_"));
+ const bool isGroupGroup = (groupPrefix == QLatin1String("group_"));
+ Q_ASSERT(isSortGroup || isGroupGroup || groupPrefix == QLatin1String("show_"));
QActionGroup *rolesActionGroup = new QActionGroup(m_actionCollection);
- rolesActionGroup->setExclusive(isSortGroup);
+ rolesActionGroup->setExclusive(isSortGroup || isGroupGroup);
KActionCategory *category;
if (isSortGroup) {
connect(rolesActionGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::slotSortTriggered);
category = new KActionCategory(i18nc("@item:intable, Heading of a list of fields", "Sort by Field"), m_actionCollection);
+ } else if (isGroupGroup) {
+ connect(rolesActionGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::slotGroupByTriggered);
+ category = new KActionCategory(i18nc("@item:intable, Heading of a list of fields", "Group by Field"), m_actionCollection);
} else {
connect(rolesActionGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::toggleVisibleRole);
category = new KActionCategory(i18nc("@item:intable, Heading of a list of fields", "Show Field"), m_actionCollection);
@@ -409,7 +443,7 @@ QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt
const QList<KFileItemModel::RoleInfo> rolesInfo = KFileItemModel::rolesInformation();
for (const KFileItemModel::RoleInfo &info : rolesInfo) {
- if (!isSortGroup && info.role == "text") {
+ if (!isSortGroup && !isGroupGroup && info.role == "text") {
// It should not be possible to hide the "text" role
continue;
}
@@ -427,9 +461,11 @@ QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt
groupMenu->setActionGroup(rolesActionGroup);
groupMenuGroup = new QActionGroup(groupMenu);
- groupMenuGroup->setExclusive(isSortGroup);
+ groupMenuGroup->setExclusive(isSortGroup || isGroupGroup);
if (isSortGroup) {
connect(groupMenuGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::slotSortTriggered);
+ } else if (isGroupGroup) {
+ connect(groupMenuGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::slotGroupByTriggered);
} else {
connect(groupMenuGroup, &QActionGroup::triggered, this, &DolphinViewActionHandler::toggleVisibleRole);
}
@@ -447,6 +483,8 @@ QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt
if (isSortGroup) {
m_sortByActions.insert(info.role, action);
+ } else if (isGroupGroup) {
+ m_groupByActions.insert(info.role, action);
} else {
m_visibleRoles.insert(info.role, action);
}
@@ -555,7 +593,7 @@ void DolphinViewActionHandler::updateViewActions()
slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst());
slotSortHiddenLastChanged(m_currentView->sortHiddenLast());
slotVisibleRolesChanged(m_currentView->visibleRoles(), QList<QByteArray>());
- slotGroupedSortingChanged(m_currentView->groupedSorting());
+ updateGroupByActions();
slotSortRoleChanged(m_currentView->sortRole());
slotZoomLevelChanged(m_currentView->zoomLevel(), -1);
@@ -652,15 +690,51 @@ void DolphinViewActionHandler::slotVisibleRolesChanged(const QList<QByteArray> &
}
}
-void DolphinViewActionHandler::toggleGroupedSorting(bool grouped)
+void DolphinViewActionHandler::slotGroupByTriggered(QAction *action)
+{
+ const QByteArray data = action->data().toByteArray();
+ if (data.isEmpty()) {
+ m_currentView->setGroupedSorting(false);
+ } else if (data == "same_as_sort") {
+ m_currentView->setGroupedSorting(true);
+ m_currentView->setGroupRole(QByteArray());
+ } else {
+ m_currentView->setGroupedSorting(true);
+ m_currentView->setGroupRole(data);
+ }
+}
+
+void DolphinViewActionHandler::slotGroupedSortingChanged(bool /*groupedSorting*/)
{
- m_currentView->setGroupedSorting(grouped);
+ updateGroupByActions();
}
-void DolphinViewActionHandler::slotGroupedSortingChanged(bool groupedSorting)
+void DolphinViewActionHandler::slotGroupRoleChanged(const QByteArray & /*role*/)
{
- QAction *showInGroupsAction = m_actionCollection->action(QStringLiteral("show_in_groups"));
- showInGroupsAction->setChecked(groupedSorting);
+ updateGroupByActions();
+}
+
+void DolphinViewActionHandler::updateGroupByActions()
+{
+ if (!m_currentView) {
+ return;
+ }
+
+ const bool grouped = m_currentView->groupedSorting();
+ const QByteArray rawRole = m_currentView->rawGroupRole();
+
+ QByteArray checkedKey;
+ if (!grouped) {
+ checkedKey = QByteArray();
+ } else if (rawRole.isEmpty()) {
+ checkedKey = "same_as_sort";
+ } else {
+ checkedKey = rawRole;
+ }
+
+ for (const auto &[key, action] : m_groupByActions.asKeyValueRange()) {
+ action->setChecked(key == checkedKey);
+ }
}
void DolphinViewActionHandler::toggleShowHiddenFiles(bool show)
diff --git a/src/views/dolphinviewactionhandler.h b/src/views/dolphinviewactionhandler.h
index 20d62cf64..b15a73933 100644
--- a/src/views/dolphinviewactionhandler.h
+++ b/src/views/dolphinviewactionhandler.h
@@ -186,15 +186,9 @@ private Q_SLOTS:
*/
void slotVisibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &previous);
- /**
- * Switches between sorting by groups or not.
- */
- void toggleGroupedSorting(bool);
-
- /**
- * Updates the state of the 'Categorized sorting' menu action.
- */
- void slotGroupedSortingChanged(bool sortCategorized);
+ void slotGroupByTriggered(QAction *action);
+ void slotGroupedSortingChanged(bool groupedSorting);
+ void slotGroupRoleChanged(const QByteArray &role);
/**
* Switches between showing and hiding of hidden marked files
@@ -252,10 +246,11 @@ private:
/**
* Creates an action-group out of all roles from KFileItemModel.
* Dependent on the group-prefix either a radiobutton-group is
- * created for sorting (prefix is "sort_by_") or a checkbox-group
+ * created for sorting (prefix is "sort_by_"), a radiobutton-group
+ * is created for group-by (prefix is "group_"), or a checkbox-group
* is created for additional information (prefix is "show_").
- * The changes of actions are reported to slotSortTriggered() or
- * toggleAdditionalInfo().
+ * The changes of actions are reported to slotSortTriggered(),
+ * slotGroupByTriggered(), or toggleAdditionalInfo() respectively.
*/
QActionGroup *createFileItemRolesActionGroup(const QString &groupPrefix);
@@ -277,11 +272,14 @@ private:
*/
KToggleAction *detailsModeAction();
+ void updateGroupByActions();
+
KActionCollection *m_actionCollection;
DolphinView *m_currentView;
QHash<QByteArray, KToggleAction *> m_sortByActions;
QHash<QByteArray, KToggleAction *> m_visibleRoles;
+ QHash<QByteArray, KToggleAction *> m_groupByActions;
};
#endif /* DOLPHINVIEWACTIONHANDLER_H */
diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp
index 9cd834991..f392f45c5 100644
--- a/src/views/viewproperties.cpp
+++ b/src/views/viewproperties.cpp
@@ -353,6 +353,19 @@ QByteArray ViewProperties::sortRole() const
return m_node->sortRole().toLatin1();
}
+void ViewProperties::setGroupRole(const QByteArray &role)
+{
+ if (m_node->groupRole() != role) {
+ m_node->setGroupRole(role);
+ update();
+ }
+}
+
+QByteArray ViewProperties::groupRole() const
+{
+ return m_node->groupRole().toLatin1();
+}
+
void ViewProperties::setSortOrder(Qt::SortOrder sortOrder)
{
if (m_node->sortOrder() != sortOrder) {
@@ -510,6 +523,7 @@ void ViewProperties::setDirProperties(const ViewProperties &props)
setHiddenFilesShown(props.hiddenFilesShown());
setGroupedSorting(props.groupedSorting());
setSortRole(props.sortRole());
+ setGroupRole(props.groupRole());
setSortOrder(props.sortOrder());
setSortFoldersFirst(props.sortFoldersFirst());
setSortHiddenLast(props.sortHiddenLast());
diff --git a/src/views/viewproperties.h b/src/views/viewproperties.h
index 622a1c87e..801d33845 100644
--- a/src/views/viewproperties.h
+++ b/src/views/viewproperties.h
@@ -60,6 +60,9 @@ public:
void setSortRole(const QByteArray &role);
QByteArray sortRole() const;
+ void setGroupRole(const QByteArray &role);
+ QByteArray groupRole() const;
+
void setSortOrder(Qt::SortOrder sortOrder);
Qt::SortOrder sortOrder() const;