]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implemented grouping-related slots to match sorting in some obscure places.
authorZakhar Afonin <zakharafoniam@gmail.com>
Sat, 22 Jun 2024 12:12:38 +0000 (15:12 +0300)
committerZakhar Afonin <zakharafoniam@gmail.com>
Sat, 22 Jun 2024 12:12:38 +0000 (15:12 +0300)
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/settings/viewpropertiesdialog.cpp
src/settings/viewpropertiesdialog.h
src/views/dolphinviewactionhandler.cpp

index 960847ea7f8aaca66beebd36912c53e75559c4ce..b7598401b5179eb3c931d662d0c00c33cf5f2109 100644 (file)
@@ -946,6 +946,15 @@ QList<KFileItemModel::RoleInfo> KFileItemModel::rolesInformation()
     return rolesInfo;
 }
 
+QList<KFileItemModel::RoleInfo> KFileItemModel::extraGroupingInformation()
+{
+    static QList<RoleInfo> 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)
index feb90d4a8909e4036408b80eff35aa1514c1c1de..001c8470129a01bb7da8d2d94025194bd49f9450 100644 (file)
@@ -211,6 +211,13 @@ public:
      */
     static QList<RoleInfo> rolesInformation();
 
+    /**
+     * @return Provides static information for all available grouping
+     *         behaviors supported by KFileItemModel but not directly
+     *         mapped to roles of KFileItemModel.
+     */
+    static QList<RoleInfo> extraGroupingInformation();
+
     /** set to true to hide application/x-trash files */
     void setShowTrashMime(bool show);
 
index 52cd49bfbadba9802cb5bf542bbbfb8a87688065..45f5851bf5d6c2e06bd592c09350058fea35a2a8 100644 (file)
@@ -1481,6 +1481,26 @@ void KItemListView::slotSortRoleChanged(const QByteArray &current, 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 &current, 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()));
     }
index 8812eb8cc45d3b9fdb07649daece70f4b83d79f9..04d48bd4777f4bee788ba4ddb1cd3d00a1bc8eb9 100644 (file)
@@ -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 &current, const QByteArray &previous);
+    virtual void slotGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous);
+    virtual void slotGroupRoleChanged(const QByteArray &current, const QByteArray &previous);
     virtual void slotCurrentChanged(int current, int previous);
     virtual void slotSelectionChanged(const KItemSet &current, 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();
index 37c3d539b3bd305d6d980f76730a5f68ba6a4f22..a13b0b117bbee5b8f43f0d37e958b5f1ecc7d802 100644 (file)
@@ -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<KFileItemModel::RoleInfo> 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<KFileItemModel::RoleInfo> 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());
index d1f056fbbfe562e05675b2e2a6bc2a1d421b3ebb..49536dcc7b48cd85d20b2bd4a7430ab36147007c 100644 (file)
@@ -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;
index ccf4ca11942506df1fcf17d20f956a3a64c3b7d3..815b0f63e685c7c525de99fb0bd1a154caf030a7 100644 (file)
@@ -302,18 +302,6 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac
     // View -> Group By
     QActionGroup *groupByActionGroup = createFileItemRolesActionGroup(QStringLiteral("group_by_"));
 
-    KToggleAction *groupAsNone = m_actionCollection->add<KToggleAction>(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<KToggleAction>(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<KActionMenu>(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<KFileItemModel::RoleInfo> rolesInfo = KFileItemModel::rolesInformation();
+    if (isGroupGroup) {
+        rolesInfo += KFileItemModel::extraGroupingInformation();
+    }
 
     for (const KFileItemModel::RoleInfo &info : rolesInfo) {
         if (!isSortGroup && !isGroupGroup && info.role == "text") {