From ca799b08bfe3aeddd700fd291e5e0958c0949ecd Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Tue, 19 Feb 2013 11:52:51 +0100 Subject: [PATCH] containmentActions logic is in ContainmentInterface a copy is still in Containment, will be cleaned in next commit --- src/plasma/containment.cpp | 19 ++++---- src/plasma/containment.h | 4 -- src/plasma/containmentactions.cpp | 36 +++++++++++++++- src/plasma/containmentactions.h | 31 +++++++++++++ src/plasma/private/containment_p.cpp | 8 ++-- src/plasma/private/containment_p.h | 10 ++--- src/plasma/private/containmentactions_p.h | 6 ++- .../qml/plasmoid/containmentinterface.cpp | 43 ++++++++++++++++--- 8 files changed, 125 insertions(+), 32 deletions(-) diff --git a/src/plasma/containment.cpp b/src/plasma/containment.cpp index 533ff60f7..18e753b7c 100644 --- a/src/plasma/containment.cpp +++ b/src/plasma/containment.cpp @@ -219,21 +219,21 @@ void Containment::restore(KConfigGroup &group) //don't let global desktop actions conflict with panels //this also prevents panels from sharing config with each other //but the panels aren't configurable anyways, and I doubt that'll change. - d->containmentActionsSource = ContainmentPrivate::Local; + d->containmentActionsSource = ContainmentActions::Local; cfg = KConfigGroup(&group, "ActionPlugins"); } else { const QString source = group.readEntry("ActionPluginsSource", QString()); if (source == "Global") { cfg = KConfigGroup(corona()->config(), "ActionPlugins"); - d->containmentActionsSource = ContainmentPrivate::Global; + d->containmentActionsSource = ContainmentActions::Global; } else if (source == "Activity") { cfg = KConfigGroup(corona()->config(), "Activities"); cfg = KConfigGroup(&cfg, d->activityId); cfg = KConfigGroup(&cfg, "ActionPlugins"); - d->containmentActionsSource = ContainmentPrivate::Activity; + d->containmentActionsSource = ContainmentActions::Activity; } else if (source == "Local") { cfg = group; - d->containmentActionsSource = ContainmentPrivate::Local; + d->containmentActionsSource = ContainmentActions::Local; } else { //default to global //but, if there is no global config, try copying it from local. @@ -241,7 +241,7 @@ void Containment::restore(KConfigGroup &group) if (!cfg.exists()) { cfg = KConfigGroup(&group, "ActionPlugins"); } - d->containmentActionsSource = ContainmentPrivate::Global; + d->containmentActionsSource = ContainmentActions::Global; group.writeEntry("ActionPluginsSource", "Global"); } } @@ -643,9 +643,9 @@ void Containment::addContainmentActions(const QString &trigger, const QString &p plugin->setContainment(0); } else { switch (d->containmentActionsSource) { - case ContainmentPrivate::Activity: + case ContainmentActions::Activity: //FIXME - case ContainmentPrivate::Local: + case ContainmentActions::Local: plugin = PluginLoader::self()->loadContainmentActions(this, pluginName); break; default: @@ -654,6 +654,7 @@ void Containment::addContainmentActions(const QString &trigger, const QString &p if (plugin) { cfg.writeEntry(trigger, pluginName); + plugin->setSource(d->containmentActionsSource); d->actionPlugins()->insert(trigger, plugin); } else { //bad plugin... gets removed. is this a feature or a bug? @@ -667,9 +668,9 @@ void Containment::addContainmentActions(const QString &trigger, const QString &p QHash Containment::containmentActions() { switch (d->containmentActionsSource) { - case ContainmentPrivate::Activity: + case ContainmentActions::Activity: //FIXME - case ContainmentPrivate::Local: + case ContainmentActions::Local: return d->localActionPlugins; default: return d->globalActionPlugins; diff --git a/src/plasma/containment.h b/src/plasma/containment.h index fe9aa40f9..93a5980e9 100644 --- a/src/plasma/containment.h +++ b/src/plasma/containment.h @@ -34,13 +34,9 @@ namespace Plasma { -class AccessAppletJob; -class AppletHandle; class DataEngine; class Package; class Corona; -class View; -class Wallpaper; class ContainmentActions; class ContainmentPrivate; diff --git a/src/plasma/containmentactions.cpp b/src/plasma/containmentactions.cpp index 7c159db62..673f44e4e 100644 --- a/src/plasma/containmentactions.cpp +++ b/src/plasma/containmentactions.cpp @@ -102,6 +102,39 @@ QString ContainmentActions::pluginName() const return d->containmentActionsDescription.pluginName(); } +void ContainmentActions::setSource(ContainmentActionsSource source) +{ + d->containmentActionsSource = source; +} + +ContainmentActions::ContainmentActionsSource ContainmentActions::source() const +{ + return d->containmentActionsSource; +} + +KConfigGroup ContainmentActions::config() const +{ + KConfigGroup cfg; + if (!d->containment) { + return cfg; + } + + switch (d->containmentActionsSource) { + case Local: + cfg = d->containment->config(); + cfg = KConfigGroup(&cfg, "ActionPlugins"); + break; + case Activity: + cfg = KConfigGroup(d->containment->corona()->config(), "Activities"); + cfg = KConfigGroup(&cfg, d->containment->activity()); + cfg = KConfigGroup(&cfg, "ActionPlugins"); + break; + default: + cfg = KConfigGroup(d->containment->corona()->config(), "ActionPlugins"); + } + return cfg; +} + void ContainmentActions::restore(const KConfigGroup &config) { init(config); @@ -211,7 +244,8 @@ QString ContainmentActions::eventToString(QEvent *event) return trigger; } -void ContainmentActions::setContainment(Containment *newContainment) { +void ContainmentActions::setContainment(Containment *newContainment) +{ d->containment = newContainment; } diff --git a/src/plasma/containmentactions.h b/src/plasma/containmentactions.h index 18a5e5be8..b8dc359ef 100644 --- a/src/plasma/containmentactions.h +++ b/src/plasma/containmentactions.h @@ -60,6 +60,18 @@ class PLASMA_EXPORT ContainmentActions : public QObject Q_PROPERTY(bool configurationRequired READ configurationRequired NOTIFY configurationRequiredChanged) public: + /** + * Where the actions come from. + * Containments can use a global set of actions or a personalized set, + * with granularity to Activity or Containment + */ + enum ContainmentActionsSource { + Global = 0, + Activity, + Local + }; + Q_ENUMS(ContainmentActionsSource) + /** * Default constructor for an empty or null containmentactions */ @@ -85,6 +97,25 @@ class PLASMA_EXPORT ContainmentActions : public QObject **/ QString icon() const; + /** + * Returns the configurations of this containmentactions + * @since 5.0 + */ + KConfigGroup config() const; + + /** + * Sets the source, for this containmentactions Global, Activity or Local + * @param source @see ContainmentActionsSource + * @since 5.0 + */ + void setSource(ContainmentActionsSource source); + + /** + * @return the source of this containmentactions + * @since 5.0 + */ + ContainmentActionsSource source() const; + /** * This method should be called once the plugin is loaded or settings are changed. * @param config Config group to load settings diff --git a/src/plasma/private/containment_p.cpp b/src/plasma/private/containment_p.cpp index efb310d8d..2614db174 100644 --- a/src/plasma/private/containment_p.cpp +++ b/src/plasma/private/containment_p.cpp @@ -394,11 +394,11 @@ KConfigGroup ContainmentPrivate::containmentActionsConfig() const { KConfigGroup cfg; switch (containmentActionsSource) { - case ContainmentPrivate::Local: + case ContainmentActions::Local: cfg = q->config(); cfg = KConfigGroup(&cfg, "ActionPlugins"); break; - case ContainmentPrivate::Activity: + case ContainmentActions::Activity: cfg = KConfigGroup(q->corona()->config(), "Activities"); cfg = KConfigGroup(&cfg, activityId); cfg = KConfigGroup(&cfg, "ActionPlugins"); @@ -456,9 +456,9 @@ bool ContainmentPrivate::prepareContainmentActions(const QString &trigger, const QHash * ContainmentPrivate::actionPlugins() { switch (containmentActionsSource) { - case Activity: + case ContainmentActions::Activity: //FIXME - case Local: + case ContainmentActions::Local: return &localActionPlugins; default: return &globalActionPlugins; diff --git a/src/plasma/private/containment_p.h b/src/plasma/private/containment_p.h index 442ab9159..bfe466e67 100644 --- a/src/plasma/private/containment_p.h +++ b/src/plasma/private/containment_p.h @@ -27,6 +27,7 @@ #include "plasma.h" #include "applet.h" #include "corona.h" +#include "containmentactions.h" static const int INTER_CONTAINMENT_MARGIN = 6; static const int CONTAINMENT_COLUMNS = 2; @@ -55,7 +56,7 @@ public: screen(-1), // no screen type(Containment::NoContainmentType), drawWallpaper(false), - containmentActionsSource(Global) + containmentActionsSource(ContainmentActions::Global) { } @@ -134,12 +135,7 @@ public: Containment::Type type; bool drawWallpaper : 1; - enum ContainmentActionsSource { - Global = 0, - Activity, - Local - }; - ContainmentActionsSource containmentActionsSource; + ContainmentActions::ContainmentActionsSource containmentActionsSource; static QHash globalActionPlugins; static const char defaultWallpaper[]; static const char defaultWallpaperMode[]; diff --git a/src/plasma/private/containmentactions_p.h b/src/plasma/private/containmentactions_p.h index bddb4b433..6fb3d73b7 100644 --- a/src/plasma/private/containmentactions_p.h +++ b/src/plasma/private/containmentactions_p.h @@ -33,11 +33,15 @@ public: containmentActionsDescription(service), package(0), containment(0), - needsConfig(false) + needsConfig(false), + containmentActionsSource(ContainmentActions::Global) { }; ContainmentActions *q; + + ContainmentActions::ContainmentActionsSource containmentActionsSource; + QString currentTrigger; KPluginInfo containmentActionsDescription; Package *package; KServiceAction mode; diff --git a/src/scriptengines/qml/plasmoid/containmentinterface.cpp b/src/scriptengines/qml/plasmoid/containmentinterface.cpp index fe2c7687d..fa459be42 100644 --- a/src/scriptengines/qml/plasmoid/containmentinterface.cpp +++ b/src/scriptengines/qml/plasmoid/containmentinterface.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -315,12 +316,42 @@ void ContainmentInterface::addContainmentActions(KMenu &desktopMenu, QEvent *eve return; } - //STUB - desktopMenu.addAction("Containment Menu Item 1"); - desktopMenu.addAction("Containment Menu Item 2"); - //TODO: reenable ContainmentActions plugins - /*const QString trigger = ContainmentActions::eventToString(event); - prepareContainmentActions(trigger, QPoint(), &desktopMenu);*/ + //this is what ContainmentPrivate::prepareContainmentActions was + const QString trigger = Plasma::ContainmentActions::eventToString(event); + Plasma::ContainmentActions *plugin = containment()->containmentActions().value(trigger); + + if (!plugin) { + return; + } + + if (plugin->containment() != containment()) { + plugin->setContainment(containment()); + + // now configure it + KConfigGroup cfg = plugin->config(); + KConfigGroup pluginConfig = KConfigGroup(&cfg, trigger); + plugin->restore(pluginConfig); + } + + if (plugin->configurationRequired()) { + desktopMenu.addTitle(i18n("This plugin needs to be configured")); + desktopMenu.addAction(containment()->action("configure")); + + return; + } else { + QList actions = plugin->contextualActions(); + if (actions.isEmpty()) { + //it probably didn't bother implementing the function. give the user a chance to set + //a better plugin. note that if the user sets no-plugin this won't happen... + if ((containment()->containmentType() != Plasma::Containment::PanelContainment && containment()->containmentType() != Plasma::Containment::CustomPanelContainment) && containment()->action("configure")) { + desktopMenu.addAction(containment()->action("configure")); + } + } else { + desktopMenu.addActions(actions); + } + } + + return; } #include "moc_containmentinterface.cpp"