// #define KFILEITEMMODEL_DEBUG
KFileItemModel::KFileItemModel(QObject *parent)
- : KItemModelBase("text", "text", parent)
+ : KItemModelBase("text", "none", parent)
, m_dirLister(nullptr)
, m_sortDirsFirst(true)
, m_sortHiddenLast(false)
QElapsedTimer timer;
timer.start();
#endif
- switch (typeForRole(groupRole())) {
+ QByteArray role = groupRole();
+ if (typeForRole(role) == NoRole) {
+ // Handle extra grouping information
+ if (m_groupExtraInfo == "followSort") {
+ role = sortRole();
+ }
+ }
+ switch (typeForRole(role)) {
case NoRole:
m_groups.clear();
break;
m_groups = ratingRoleGroups();
break;
default:
- m_groups = genericStringRoleGroups(groupRole());
+ m_groups = genericStringRoleGroups(role);
break;
}
{
Q_UNUSED(previous)
m_sortRole = typeForRole(current);
+ if (m_sortRole == NoRole) {
+ // Requested role not in list of roles. This could
+ // be used for indicating non-trivial sorting behavior
+ m_sortExtraInfo = current;
+ } else {
+ m_sortExtraInfo.clear();
+ }
if (!m_requestRole[m_sortRole]) {
QSet<QByteArray> newRoles = m_roles;
{
Q_UNUSED(previous)
m_groupRole = typeForRole(current);
+ if (m_groupRole == NoRole) {
+ // Requested role not in list of roles. This could
+ // be used for indicating non-trivial grouping behavior
+ m_groupExtraInfo = current;
+ } else {
+ m_groupExtraInfo.clear();
+ }
- if (!m_requestRole[m_sortRole]) {
+ if (!m_requestRole[m_groupRole]) {
QSet<QByteArray> newRoles = m_roles;
newRoles << current;
setRoles(newRoles);
int groupA, groupB;
switch (m_groupRole) {
case NoRole:
- break;
+ // Non-trivial grouping behavior might be handled there in the future.
+ return 0;
case NameRole:
groupA = nameRoleGroup(a, false).comparable;
groupB = nameRoleGroup(b, false).comparable;
RoleType m_sortRole;
RoleType m_groupRole;
+ QByteArray m_sortExtraInfo;
+ QByteArray m_groupExtraInfo;
+
int m_sortingProgressPercent; // Value of directorySortingProgress() signal
QSet<QByteArray> m_roles;
const int groupIndex = groupIndexForItem(index);
Q_ASSERT(groupIndex >= 0);
groupHeader->setData(groups.at(groupIndex).second);
- groupHeader->setRole(model()->sortRole());
+ groupHeader->setRole(model()->groupRole());
groupHeader->setStyleOption(m_styleOption);
groupHeader->setScrollOrientation(scrollOrientation());
groupHeader->setItemIndex(index);
// 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"));
#endif
QList<KFileItemModel::RoleInfo> rolesInfo = KFileItemModel::rolesInformation();
- // Unlike sorting, grouping is optional. If creating for group_by_, include a None role.
- if (isGroupGroup)
- rolesInfo.append(KFileItemModel::roleInformation(nullptr));
for (const KFileItemModel::RoleInfo &info : rolesInfo) {
if (!isSortGroup && !isGroupGroup && info.role == "text") {
setGroupedSorting(props.groupedSorting());
setSortRole(props.sortRole());
setSortOrder(props.sortOrder());
+ setGroupRole(props.groupRole());
+ setGroupOrder(props.groupOrder());
setSortFoldersFirst(props.sortFoldersFirst());
setSortHiddenLast(props.sortHiddenLast());
setVisibleRoles(props.visibleRoles());