diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 960847ea7f..b7598401b5 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -946,6 +946,15 @@ QList KFileItemModel::rolesInformation() return rolesInfo; } +QList KFileItemModel::extraGroupingInformation() +{ + static QList rolesInfo{ + {QByteArray("none"), kli18nc("@label", "No grouping").toString(), nullptr, nullptr, false, false}, + {QByteArray("followSort"), kli18nc("@label", "Follow sorting").toString(), nullptr, nullptr, false, false} + }; + return rolesInfo; +} + void KFileItemModel::onGroupedSortingChanged(bool current) { Q_UNUSED(current) diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index feb90d4a89..001c847012 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -211,6 +211,13 @@ public: */ static QList rolesInformation(); + /** + * @return Provides static information for all available grouping + * behaviors supported by KFileItemModel but not directly + * mapped to roles of KFileItemModel. + */ + static QList extraGroupingInformation(); + /** set to true to hide application/x-trash files */ void setShowTrashMime(bool show); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 52cd49bfba..45f5851bf5 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -1481,6 +1481,26 @@ void KItemListView::slotSortRoleChanged(const QByteArray ¤t, const QByteAr } } +void KItemListView::slotGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) +{ + Q_UNUSED(current) + Q_UNUSED(previous) + if (m_grouped) { + updateVisibleGroupHeaders(); + doLayout(NoAnimation); + } +} + +void KItemListView::slotGroupRoleChanged(const QByteArray ¤t, const QByteArray &previous) +{ + Q_UNUSED(current) + Q_UNUSED(previous) + if (m_grouped) { + updateVisibleGroupHeaders(); + doLayout(NoAnimation); + } +} + void KItemListView::slotCurrentChanged(int current, int previous) { Q_UNUSED(previous) @@ -1743,6 +1763,8 @@ void KItemListView::setModel(KItemModelBase *model) disconnect(m_model, &KItemModelBase::groupedSortingChanged, this, &KItemListView::slotGroupedSortingChanged); disconnect(m_model, &KItemModelBase::sortOrderChanged, this, &KItemListView::slotSortOrderChanged); disconnect(m_model, &KItemModelBase::sortRoleChanged, this, &KItemListView::slotSortRoleChanged); + disconnect(m_model, &KItemModelBase::groupOrderChanged, this, &KItemListView::slotGroupOrderChanged); + disconnect(m_model, &KItemModelBase::groupRoleChanged, this, &KItemListView::slotGroupRoleChanged); m_sizeHintResolver->itemsRemoved(KItemRangeList() << KItemRange(0, m_model->count())); } diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 8812eb8cc4..04d48bd477 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -430,6 +430,8 @@ protected Q_SLOTS: virtual void slotGroupedSortingChanged(bool current); virtual void slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); virtual void slotSortRoleChanged(const QByteArray ¤t, const QByteArray &previous); + virtual void slotGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); + virtual void slotGroupRoleChanged(const QByteArray ¤t, const QByteArray &previous); virtual void slotCurrentChanged(int current, int previous); virtual void slotSelectionChanged(const KItemSet ¤t, const KItemSet &previous); @@ -552,8 +554,9 @@ private: void recycleGroupHeaderForWidget(KItemListWidget *widget); /** - * Helper method for slotGroupedSortingChanged(), slotSortOrderChanged() - * and slotSortRoleChanged(): Iterates through all visible items and updates + * Helper method for slotGroupedSortingChanged(), slotSortOrderChanged(), + * slotSortRoleChanged(), slotGroupOrderChanged() and slotGroupRoleChanged(): + * Iterates through all visible items and updates * the group-header widgets. */ void updateVisibleGroupHeaders(); diff --git a/src/settings/viewpropertiesdialog.cpp b/src/settings/viewpropertiesdialog.cpp index 37c3d539b3..a13b0b117b 100644 --- a/src/settings/viewpropertiesdialog.cpp +++ b/src/settings/viewpropertiesdialog.cpp @@ -44,6 +44,8 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView *dolphinView) , m_viewMode(nullptr) , m_sortOrder(nullptr) , m_sorting(nullptr) + , m_groupOrder(nullptr) + , m_grouping(nullptr) , m_sortFoldersFirst(nullptr) , m_sortHiddenLast(nullptr) , m_previewsShown(nullptr) @@ -67,7 +69,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView *dolphinView) // Otherwise the dialog won't resize when we collapse the KCollapsibleGroupBox. layout->setSizeConstraint(QLayout::SetFixedSize); - // create 'Properties' group containing view mode, sorting, sort order and show hidden files + // create 'Properties' group containing view mode, sorting/grouping, sort/group order and show hidden files m_viewMode = new QComboBox(); m_viewMode->addItem(QIcon::fromTheme(QStringLiteral("view-list-icons")), i18nc("@item:inlistbox", "Icons"), DolphinView::IconsView); m_viewMode->addItem(QIcon::fromTheme(QStringLiteral("view-list-details")), i18nc("@item:inlistbox", "Compact"), DolphinView::CompactView); @@ -83,6 +85,16 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView *dolphinView) m_sorting->addItem(info.translation, info.role); } + m_groupOrder = new QComboBox(); + m_groupOrder->addItem(i18nc("@item:inlistbox Group", "Ascending")); + m_groupOrder->addItem(i18nc("@item:inlistbox Group", "Descending")); + + m_grouping = new QComboBox(); + const QList combinedGroupingInfo = rolesInfo + KFileItemModel::extraGroupingInformation(); + for (const KFileItemModel::RoleInfo &info : combinedGroupingInfo) { + m_grouping->addItem(info.translation, info.role); + } + 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")); @@ -139,8 +151,14 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView *dolphinView) sortingLayout->addWidget(m_sortOrder); sortingLayout->addWidget(m_sorting); + QHBoxLayout *groupingLayout = new QHBoxLayout(); + groupingLayout->setContentsMargins(0, 0, 0, 0); + groupingLayout->addWidget(m_groupOrder); + groupingLayout->addWidget(m_grouping); + layout->addRow(i18nc("@label:listbox", "View mode:"), m_viewMode); layout->addRow(i18nc("@label:listbox", "Sorting:"), sortingLayout); + layout->addRow(i18nc("@label:listbox", "Grouping:"), groupingLayout); layout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed)); @@ -153,6 +171,8 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView *dolphinView) connect(m_viewMode, &QComboBox::currentIndexChanged, this, &ViewPropertiesDialog::slotViewModeChanged); connect(m_sorting, &QComboBox::currentIndexChanged, this, &ViewPropertiesDialog::slotSortingChanged); connect(m_sortOrder, &QComboBox::currentIndexChanged, this, &ViewPropertiesDialog::slotSortOrderChanged); + connect(m_grouping, &QComboBox::currentIndexChanged, this, &ViewPropertiesDialog::slotGroupingChanged); + connect(m_groupOrder, &QComboBox::currentIndexChanged, this, &ViewPropertiesDialog::slotGroupOrderChanged); connect(m_sortFoldersFirst, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotSortFoldersFirstChanged); connect(m_sortHiddenLast, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotSortHiddenLastChanged); connect(m_previewsShown, &QCheckBox::clicked, this, &ViewPropertiesDialog::slotShowPreviewChanged); @@ -259,6 +279,20 @@ void ViewPropertiesDialog::slotSortOrderChanged(int index) markAsDirty(true); } +void ViewPropertiesDialog::slotGroupingChanged(int index) +{ + const QByteArray role = m_grouping->itemData(index).toByteArray(); + m_viewProps->setGroupRole(role); + markAsDirty(true); +} + +void ViewPropertiesDialog::slotGroupOrderChanged(int index) +{ + const Qt::SortOrder groupOrder = (index == 0) ? Qt::AscendingOrder : Qt::DescendingOrder; + m_viewProps->setGroupOrder(groupOrder); + markAsDirty(true); +} + void ViewPropertiesDialog::slotGroupedSortingChanged() { m_viewProps->setGroupedSorting(m_showInGroups->isChecked()); @@ -377,6 +411,8 @@ void ViewPropertiesDialog::applyViewProperties() m_dolphinView->setViewMode(m_viewProps->viewMode()); m_dolphinView->setSortRole(m_viewProps->sortRole()); m_dolphinView->setSortOrder(m_viewProps->sortOrder()); + m_dolphinView->setGroupRole(m_viewProps->groupRole()); + m_dolphinView->setGroupOrder(m_viewProps->groupOrder()); m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst()); m_dolphinView->setSortHiddenLast(m_viewProps->sortHiddenLast()); m_dolphinView->setGroupedSorting(m_viewProps->groupedSorting()); @@ -423,6 +459,20 @@ void ViewPropertiesDialog::loadSettings() m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst()); m_sortHiddenLast->setChecked(m_viewProps->sortHiddenLast()); + // Load group order and sorting + const int groupOrderIndex = (m_viewProps->groupOrder() == Qt::AscendingOrder) ? 0 : 1; + m_groupOrder->setCurrentIndex(groupOrderIndex); + + const QList combinedGroupingInfo = rolesInfo + KFileItemModel::extraGroupingInformation(); + int groupRoleIndex = 0; + for (int i = 0; i < combinedGroupingInfo.count(); ++i) { + if (combinedGroupingInfo[i].role == m_viewProps->groupRole()) { + groupRoleIndex = i; + break; + } + } + m_grouping->setCurrentIndex(groupRoleIndex); + // Load show preview, show in groups and show hidden files settings m_previewsShown->setChecked(m_viewProps->previewsShown()); m_showInGroups->setChecked(m_viewProps->groupedSorting()); diff --git a/src/settings/viewpropertiesdialog.h b/src/settings/viewpropertiesdialog.h index d1f056fbbf..49536dcc7b 100644 --- a/src/settings/viewpropertiesdialog.h +++ b/src/settings/viewpropertiesdialog.h @@ -44,6 +44,8 @@ private Q_SLOTS: void slotViewModeChanged(int index); void slotSortingChanged(int index); void slotSortOrderChanged(int index); + void slotGroupingChanged(int index); + void slotGroupOrderChanged(int index); void slotGroupedSortingChanged(); void slotSortFoldersFirstChanged(); void slotSortHiddenLastChanged(); @@ -67,6 +69,8 @@ private: QComboBox *m_viewMode; QComboBox *m_sortOrder; QComboBox *m_sorting; + QComboBox *m_groupOrder; + QComboBox *m_grouping; QCheckBox *m_sortFoldersFirst; QCheckBox *m_sortHiddenLast; QCheckBox *m_previewsShown; diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index ccf4ca1194..815b0f63e6 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -302,18 +302,6 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac // View -> Group By QActionGroup *groupByActionGroup = createFileItemRolesActionGroup(QStringLiteral("group_by_")); - KToggleAction *groupAsNone = m_actionCollection->add(QStringLiteral("group_none")); - groupAsNone->setData("none"); - groupAsNone->setActionGroup(groupByActionGroup); - groupAsNone->setText(i18nc("@label", "No grouping")); - m_groupByActions.insert("none", groupAsNone); - - KToggleAction *groupAsFollowSort = m_actionCollection->add(QStringLiteral("group_followSort")); - groupAsFollowSort->setData("followSort"); - groupAsFollowSort->setActionGroup(groupByActionGroup); - groupAsFollowSort->setText(i18nc("@label", "Follow sorting")); - m_groupByActions.insert("followSort", groupAsFollowSort); - KActionMenu *groupByActionMenu = m_actionCollection->add(QStringLiteral("group")); groupByActionMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-group"))); groupByActionMenu->setText(i18nc("@action:inmenu View", "Group By")); @@ -416,6 +404,9 @@ QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt #endif QList rolesInfo = KFileItemModel::rolesInformation(); + if (isGroupGroup) { + rolesInfo += KFileItemModel::extraGroupingInformation(); + } for (const KFileItemModel::RoleInfo &info : rolesInfo) { if (!isSortGroup && !isGroupGroup && info.role == "text") {