diff --git a/applets/kicker/CMakeLists.txt b/applets/kicker/CMakeLists.txt --- a/applets/kicker/CMakeLists.txt +++ b/applets/kicker/CMakeLists.txt @@ -71,6 +71,7 @@ KF5::KDELibs4Support # FIXME: New Solid power management API doesn't exist yet, so we need to use deprecated stuff. KF5::KIOCore KF5::KIOWidgets + KF5::KIOFileWidgets KF5::People KF5::PeopleWidgets KF5::PlasmaQuick diff --git a/applets/kicker/plugin/recentusagemodel.h b/applets/kicker/plugin/recentusagemodel.h --- a/applets/kicker/plugin/recentusagemodel.h +++ b/applets/kicker/plugin/recentusagemodel.h @@ -24,6 +24,7 @@ #include #include +#include class GroupSortProxy : public QSortFilterProxyModel { @@ -110,6 +111,7 @@ Ordering m_ordering; bool m_complete; + KFilePlacesModel *m_placesModel; }; #endif diff --git a/applets/kicker/plugin/recentusagemodel.cpp b/applets/kicker/plugin/recentusagemodel.cpp --- a/applets/kicker/plugin/recentusagemodel.cpp +++ b/applets/kicker/plugin/recentusagemodel.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #if HAVE_X11 #include #endif @@ -41,6 +42,7 @@ #include #include #include +#include #include #include @@ -127,6 +129,7 @@ , m_usage(usage) , m_ordering((Ordering)ordering) , m_complete(false) +, m_placesModel(new KFilePlacesModel(this)) { refresh(); } @@ -256,13 +259,39 @@ } if (role == Qt::DisplayRole) { + const auto index = m_placesModel->closestItem(fileItem.url()); + if (index.isValid()) { + const auto parentUrl = m_placesModel->url(index); + if (parentUrl == fileItem.url()) { + return m_placesModel->text(index); + } + } return fileItem.text(); } else if (role == Qt::DecorationRole) { return QIcon::fromTheme(fileItem.iconName(), QIcon::fromTheme(QStringLiteral("unknown"))); } else if (role == Kicker::GroupRole) { return i18n("Documents"); } else if (role == Kicker::FavoriteIdRole || role == Kicker::UrlRole) { return url.toString(); + } else if (role == Kicker::DescriptionRole) { + QString desc = fileItem.localPath(); + + const auto index = m_placesModel->closestItem(fileItem.url()); + if (index.isValid()) { + // the current file has a parent in placesModel + const auto parentUrl = m_placesModel->url(index); + if (parentUrl == fileItem.url()) { + // if the current item is a place + return QString(); + } + desc.truncate(desc.lastIndexOf(QChar('/'))); + const auto text = m_placesModel->text(index); + desc.replace(0, parentUrl.path().length(), text); + } else { + // remove filename + desc.truncate(desc.lastIndexOf(QChar('/'))); + } + return desc; } else if (role == Kicker::UrlRole) { return url; } else if (role == Kicker::HasActionListRole) { @@ -272,6 +301,9 @@ actionList << Kicker::createSeparatorActionItem(); + const QVariantMap &openParentFolder = Kicker::createActionItem(i18n("Open Containing Folder"), QStringLiteral("openParentFolder")); + actionList << openParentFolder; + const QVariantMap &forgetAction = Kicker::createActionItem(i18n("Forget Document"), QStringLiteral("forget")); actionList << forgetAction; @@ -347,6 +379,9 @@ } return false; + } else if (actionId == QLatin1String("openParentFolder") && withinBounds) { + const auto url = QUrl::fromUserInput(resourceAt(row)); + KIO::highlightInFileManager({url}); } else if (actionId == QLatin1String("forgetAll")) { if (m_activitiesModel) { static_cast(m_activitiesModel.data())->forgetAllResources();