diff --git a/src/common/dbus/org.kde.ActivityManager.Activities.xml b/src/common/dbus/org.kde.ActivityManager.Activities.xml --- a/src/common/dbus/org.kde.ActivityManager.Activities.xml +++ b/src/common/dbus/org.kde.ActivityManager.Activities.xml @@ -9,6 +9,12 @@ + + + + + + diff --git a/src/service/Activities.h b/src/service/Activities.h --- a/src/service/Activities.h +++ b/src/service/Activities.h @@ -78,6 +78,16 @@ */ bool SetCurrentActivity(const QString &activity); + /** + * Switches to the previous activity + */ + bool PreviousActivity(); + + /** + * Switches to the next activity + */ + bool NextActivity(); + /** * Adds a new activity * @param name name of the activity diff --git a/src/service/Activities.cpp b/src/service/Activities.cpp --- a/src/service/Activities.cpp +++ b/src/service/Activities.cpp @@ -204,6 +204,42 @@ return true; } +static +bool infoLessThan(const ActivityInfo &info, const ActivityInfo &other) +{ + const auto comp = + QString::compare(info.name, other.name, Qt::CaseInsensitive); + return comp < 0 || (comp == 0 && info.id < other.id); +} + +bool Activities::Private::previousActivity() +{ + auto a = q->ListActivitiesWithInformation(); + std::sort(a.begin(), a.end(), &infoLessThan); + + for (int i = 0; i < a.count(); ++i) { + if (a[i].id == currentActivity) { + return setCurrentActivity(a[(i + a.size() - 1) % a.size()].id); + } + } + + return false; +} + +bool Activities::Private::nextActivity() +{ + auto a = q->ListActivitiesWithInformation(); + std::sort(a.begin(), a.end(), &infoLessThan); + + for (int i = 0; i < a.count(); ++i) { + if (a[i].id == currentActivity) { + return setCurrentActivity(a[(i + 1) % a.size()].id); + } + } + + return false; +} + QString Activities::Private::addActivity(const QString &name) { QString activity; @@ -471,6 +507,16 @@ return d->setCurrentActivity(activity); } +bool Activities::PreviousActivity() +{ + return d->previousActivity(); +} + +bool Activities::NextActivity() +{ + return d->nextActivity(); +} + QString Activities::AddActivity(const QString &name) { // We do not care about authorization if this is the first start @@ -596,4 +642,3 @@ QReadLocker lock(&d->activitiesLock); return d->activities.contains(activity) ? d->activities[activity] : Invalid; } - diff --git a/src/service/Activities_p.h b/src/service/Activities_p.h --- a/src/service/Activities_p.h +++ b/src/service/Activities_p.h @@ -54,6 +54,8 @@ public Q_SLOTS: bool setCurrentActivity(const QString &activity); + bool previousActivity(); + bool nextActivity(); public: void setActivityState(const QString &activity, Activities::State state);