1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-06-30 23:46:46 +00:00

Implemented grouping-related slots to match sorting in some obscure places.

This commit is contained in:
Zakhar Afonin 2024-06-22 15:12:38 +03:00
parent f631747a0c
commit f1da070fd5
7 changed files with 101 additions and 15 deletions

View 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)

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

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

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

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

View 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;

View 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") {