Make the desktop scripting activity aware:

adapt the desktop scripting from the time when Containment == activity to creating actual activities

* activities() -> desktops()
* activityById() -> desktopById()
* activityForScreen() -> desktopForScreen()

To create a new activity, there is the new global function
createActivity(activtyName, containmentPlugin (optional))

when you want to access the actual containments created by the activity, you do

Array[containments] = desktopsForActivity(activityId)
This commit is contained in:
Marco Martin 2014-03-27 21:37:18 +01:00
parent 04bf0ddaed
commit abdca6f189
10 changed files with 135 additions and 30 deletions

View File

@ -161,6 +161,11 @@ void Activity::setDefaultPlugin(const QString &plugin)
//FIXME save&restore this setting //FIXME save&restore this setting
} }
QString Activity::defaultPlugin() const
{
return m_plugin;
}
const KActivities::Info * Activity::info() const const KActivities::Info * Activity::info() const
{ {
return m_info; return m_info;

View File

@ -87,6 +87,11 @@ public:
*/ */
void setDefaultPlugin(const QString &plugin); void setDefaultPlugin(const QString &plugin);
/**
* The plugin to use when creating new containments
*/
QString defaultPlugin() const;
/** /**
* @returns the info object for this activity * @returns the info object for this activity
*/ */

View File

@ -47,18 +47,18 @@
#include <KTextEditor/View> #include <KTextEditor/View>
#include <KToolBar> #include <KToolBar>
#include <Plasma/Corona>
#include <Plasma/Package> #include <Plasma/Package>
#include "scripting/desktopscriptengine.h" #include "scripting/desktopscriptengine.h"
#include "shellpluginloader.h" #include "shellpluginloader.h"
#include "shellcorona.h"
//TODO: //TODO:
// interative help? // interative help?
static const QString s_autosaveFileName("interactiveconsoleautosave.js"); static const QString s_autosaveFileName("interactiveconsoleautosave.js");
static const QString s_kwinService = "org.kde.kwin.Scripting"; static const QString s_kwinService = "org.kde.kwin.Scripting";
InteractiveConsole::InteractiveConsole(Plasma::Corona *corona, QWidget *parent) InteractiveConsole::InteractiveConsole(ShellCorona *corona, QWidget *parent)
: QDialog(parent), : QDialog(parent),
m_corona(corona), m_corona(corona),
m_splitter(new QSplitter(Qt::Vertical, this)), m_splitter(new QSplitter(Qt::Vertical, this)),

View File

@ -36,6 +36,8 @@ class QMenu;
class KTextEdit; class KTextEdit;
class QTextBrowser; class QTextBrowser;
class ShellCorona;
namespace KTextEditor namespace KTextEditor
{ {
class Document; class Document;
@ -53,7 +55,7 @@ class InteractiveConsole : public QDialog
Q_OBJECT Q_OBJECT
public: public:
InteractiveConsole(Plasma::Corona *corona, QWidget *parent = 0); InteractiveConsole(ShellCorona *corona, QWidget *parent = 0);
~InteractiveConsole(); ~InteractiveConsole();
void loadScript(const QString &path); void loadScript(const QString &path);
@ -93,7 +95,7 @@ private:
void onClose(); void onClose();
void saveScript(const QUrl &url); void saveScript(const QUrl &url);
Plasma::Corona *m_corona; ShellCorona *m_corona;
QSplitter *m_splitter; QSplitter *m_splitter;
KTextEditor::Document *m_editorPart; KTextEditor::Document *m_editorPart;
KTextEdit *m_editor; KTextEdit *m_editor;

View File

@ -31,7 +31,7 @@
namespace WorkspaceScripting namespace WorkspaceScripting
{ {
DesktopScriptEngine::DesktopScriptEngine(Plasma::Corona *corona, bool startup, QObject *parent) DesktopScriptEngine::DesktopScriptEngine(ShellCorona *corona, bool startup, QObject *parent)
: ScriptEngine(corona, parent), : ScriptEngine(corona, parent),
m_startup(startup) m_startup(startup)
{ {

View File

@ -22,6 +22,8 @@
#include "scriptengine.h" #include "scriptengine.h"
class ShellCorona;
namespace WorkspaceScripting namespace WorkspaceScripting
{ {
@ -30,7 +32,7 @@ class DesktopScriptEngine : public ScriptEngine
Q_OBJECT Q_OBJECT
public: public:
DesktopScriptEngine(Plasma::Corona *corona, bool isStartup = true, QObject *parent = 0); DesktopScriptEngine(ShellCorona *corona, bool isStartup = true, QObject *parent = 0);
QScriptValue wrap(Plasma::Containment *c); QScriptValue wrap(Plasma::Containment *c);
QScriptValue wrap(Containment *c); QScriptValue wrap(Containment *c);
int defaultPanelScreen() const; int defaultPanelScreen() const;

View File

@ -27,6 +27,7 @@
#include <QFileInfo> #include <QFileInfo>
#include <QScriptValueIterator> #include <QScriptValueIterator>
#include <QStandardPaths> #include <QStandardPaths>
#include <QFutureWatcher>
#include <QDebug> #include <QDebug>
#include <klocalizedstring.h> #include <klocalizedstring.h>
@ -39,7 +40,6 @@
#include <Plasma/Applet> #include <Plasma/Applet>
#include <Plasma/Containment> #include <Plasma/Containment>
#include <Plasma/Corona>
#include <Plasma/Package> #include <Plasma/Package>
#include <Plasma/PluginLoader> #include <Plasma/PluginLoader>
#include <qstandardpaths.h> #include <qstandardpaths.h>
@ -50,13 +50,15 @@
#include "i18n.h" #include "i18n.h"
//#include "packages.h" //#include "packages.h"
#include "widget.h" #include "widget.h"
#include "../activity.h"
#include "../shellcorona.h"
QScriptValue constructQRectFClass(QScriptEngine *engine); QScriptValue constructQRectFClass(QScriptEngine *engine);
namespace WorkspaceScripting namespace WorkspaceScripting
{ {
ScriptEngine::ScriptEngine(Plasma::Corona *corona, QObject *parent) ScriptEngine::ScriptEngine(ShellCorona *corona, QObject *parent)
: QScriptEngine(parent), : QScriptEngine(parent),
m_corona(corona) m_corona(corona)
{ {
@ -75,7 +77,7 @@ ScriptEngine::~ScriptEngine()
{ {
} }
QScriptValue ScriptEngine::activityById(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::desktopById(QScriptContext *context, QScriptEngine *engine)
{ {
if (context->argumentCount() == 0) { if (context->argumentCount() == 0) {
return context->throwError(i18n("activityById requires an id")); return context->throwError(i18n("activityById requires an id"));
@ -92,7 +94,29 @@ QScriptValue ScriptEngine::activityById(QScriptContext *context, QScriptEngine *
return engine->undefinedValue(); return engine->undefinedValue();
} }
QScriptValue ScriptEngine::activityForScreen(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptEngine *engine)
{
if (context->argumentCount() == 0) {
return context->throwError(i18n("containmentsByActivity requires an id"));
}
QScriptValue containments = engine->newArray();
int count = 0;
const QString id = context->argument(0).toString();
ScriptEngine *env = envFor(engine);
foreach (Plasma::Containment *c, env->m_corona->containments()) {
if (c->activity() == id && !isPanel(c)) {
containments.setProperty(count, env->wrap(c));
++count;
}
}
containments.setProperty("length", count);
return containments;
}
QScriptValue ScriptEngine::desktopForScreen(QScriptContext *context, QScriptEngine *engine)
{ {
if (context->argumentCount() == 0) { if (context->argumentCount() == 0) {
return context->throwError(i18n("activityForScreen requires a screen id")); return context->throwError(i18n("activityForScreen requires a screen id"));
@ -103,9 +127,37 @@ QScriptValue ScriptEngine::activityForScreen(QScriptContext *context, QScriptEng
return env->wrap(env->m_corona->containmentForScreen(screen)); return env->wrap(env->m_corona->containmentForScreen(screen));
} }
QScriptValue ScriptEngine::newActivity(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::createActivity(QScriptContext *context, QScriptEngine *engine)
{ {
return createContainment("Desktop", "org.kde.desktopcontainment", context, engine); //return createContainment("Desktop", "org.kde.desktopcontainment", context, engine);
if (context->argumentCount() < 0) {
return context->throwError(i18n("createActivity required the activity name"));
}
const QString name = context->argument(0).toString();
const QString plugin = context->argument(1).toString();
KActivities::Controller controller;
QFuture<QString> id = controller.addActivity(name);
QEventLoop loop;
QFutureWatcher<QString> *watcher = new QFutureWatcher<QString>();
connect(watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit);
watcher->setFuture(id);
loop.exec();
ScriptEngine *env = envFor(engine);
Activity *a = new Activity(id, env->m_corona);
if (!plugin.isEmpty()) {
a->setDefaultPlugin(plugin);
}
env->m_corona->insertActivity(id, a);
return QScriptValue(id.result());
} }
QScriptValue ScriptEngine::newPanel(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::newPanel(QScriptContext *context, QScriptEngine *engine)
@ -197,7 +249,7 @@ ScriptEngine *ScriptEngine::envFor(QScriptEngine *engine)
QScriptValue ScriptEngine::panelById(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::panelById(QScriptContext *context, QScriptEngine *engine)
{ {
if (context->argumentCount() == 0) { if (context->argumentCount() == 0) {
return context->throwError(i18n("activityById requires an id")); return context->throwError(i18n("panelById requires an id"));
} }
const uint id = context->argument(0).toInt32(); const uint id = context->argument(0).toInt32();
@ -604,11 +656,12 @@ void ScriptEngine::setupEngine()
} }
m_scriptSelf.setProperty("QRectF", constructQRectFClass(this)); m_scriptSelf.setProperty("QRectF", constructQRectFClass(this));
m_scriptSelf.setProperty("Activity", newFunction(ScriptEngine::newActivity)); m_scriptSelf.setProperty("createActivity", newFunction(ScriptEngine::createActivity));
m_scriptSelf.setProperty("Panel", newFunction(ScriptEngine::newPanel, newObject())); m_scriptSelf.setProperty("Panel", newFunction(ScriptEngine::newPanel, newObject()));
m_scriptSelf.setProperty("activities", newFunction(ScriptEngine::activities)); m_scriptSelf.setProperty("desktopsForActivity", newFunction(ScriptEngine::desktopsForActivity));
m_scriptSelf.setProperty("activityById", newFunction(ScriptEngine::activityById)); m_scriptSelf.setProperty("desktops", newFunction(ScriptEngine::desktops));
m_scriptSelf.setProperty("activityForScreen", newFunction(ScriptEngine::activityForScreen)); m_scriptSelf.setProperty("desktopById", newFunction(ScriptEngine::desktopById));
m_scriptSelf.setProperty("desktopForScreen", newFunction(ScriptEngine::desktopForScreen));
m_scriptSelf.setProperty("panelById", newFunction(ScriptEngine::panelById)); m_scriptSelf.setProperty("panelById", newFunction(ScriptEngine::panelById));
m_scriptSelf.setProperty("panels", newFunction(ScriptEngine::panels)); m_scriptSelf.setProperty("panels", newFunction(ScriptEngine::panels));
m_scriptSelf.setProperty("fileExists", newFunction(ScriptEngine::fileExists)); m_scriptSelf.setProperty("fileExists", newFunction(ScriptEngine::fileExists));
@ -633,7 +686,7 @@ bool ScriptEngine::isPanel(const Plasma::Containment *c)
c->containmentType() == Plasma::Types::CustomPanelContainment; c->containmentType() == Plasma::Types::CustomPanelContainment;
} }
QScriptValue ScriptEngine::activities(QScriptContext *context, QScriptEngine *engine) QScriptValue ScriptEngine::desktops(QScriptContext *context, QScriptEngine *engine)
{ {
Q_UNUSED(context) Q_UNUSED(context)
@ -652,7 +705,7 @@ QScriptValue ScriptEngine::activities(QScriptContext *context, QScriptEngine *en
return containments; return containments;
} }
Plasma::Corona *ScriptEngine::corona() const ShellCorona *ScriptEngine::corona() const
{ {
return m_corona; return m_corona;
} }
@ -680,7 +733,7 @@ void ScriptEngine::exception(const QScriptValue &value)
emit printError(value.toVariant().toString()); emit printError(value.toVariant().toString());
} }
QStringList ScriptEngine::pendingUpdateScripts(Plasma::Corona *corona) QStringList ScriptEngine::pendingUpdateScripts(ShellCorona *corona)
{ {
if (!corona->package().metadata().isValid()) { if (!corona->package().metadata().isValid()) {
qWarning() << "Warning: corona package invalid"; qWarning() << "Warning: corona package invalid";

View File

@ -23,13 +23,17 @@
#include <QScriptEngine> #include <QScriptEngine>
#include <QScriptValue> #include <QScriptValue>
#include <kactivities/controller.h>
#include "../shellcorona.h"
namespace Plasma namespace Plasma
{ {
class Applet; class Applet;
class Containment; class Containment;
class Corona;
} // namespace Plasma } // namespace Plasma
namespace WorkspaceScripting namespace WorkspaceScripting
{ {
@ -40,12 +44,12 @@ class ScriptEngine : public QScriptEngine
Q_OBJECT Q_OBJECT
public: public:
ScriptEngine(Plasma::Corona *corona, QObject *parent = 0); ScriptEngine(ShellCorona *corona, QObject *parent = 0);
~ScriptEngine(); ~ScriptEngine();
static QStringList pendingUpdateScripts(Plasma::Corona *corona); static QStringList pendingUpdateScripts(ShellCorona *corona);
Plasma::Corona *corona() const; ShellCorona *corona() const;
bool evaluateScript(const QString &script, const QString &path = QString()); bool evaluateScript(const QString &script, const QString &path = QString());
QScriptValue wrap(Plasma::Applet *w); QScriptValue wrap(Plasma::Applet *w);
virtual QScriptValue wrap(Plasma::Containment *c); virtual QScriptValue wrap(Plasma::Containment *c);
@ -65,11 +69,12 @@ private:
// containment accessors // containment accessors
static QStringList availableContainments(const QString &type); static QStringList availableContainments(const QString &type);
static QScriptValue newActivity(QScriptContext *context, QScriptEngine *engine); static QScriptValue createActivity(QScriptContext *context, QScriptEngine *engine);
static QScriptValue newPanel(QScriptContext *context, QScriptEngine *engine); static QScriptValue newPanel(QScriptContext *context, QScriptEngine *engine);
static QScriptValue activities(QScriptContext *context, QScriptEngine *engine); static QScriptValue desktopsForActivity(QScriptContext *context, QScriptEngine *engine);
static QScriptValue activityById(QScriptContext *context, QScriptEngine *engine); static QScriptValue desktops(QScriptContext *context, QScriptEngine *engine);
static QScriptValue activityForScreen(QScriptContext *context, QScriptEngine *engine); static QScriptValue desktopById(QScriptContext *context, QScriptEngine *engine);
static QScriptValue desktopForScreen(QScriptContext *context, QScriptEngine *engine);
static QScriptValue panelById(QScriptContext *context, QScriptEngine *engine); static QScriptValue panelById(QScriptContext *context, QScriptEngine *engine);
static QScriptValue panels(QScriptContext *context, QScriptEngine *engine); static QScriptValue panels(QScriptContext *context, QScriptEngine *engine);
static QScriptValue fileExists(QScriptContext *context, QScriptEngine *engine); static QScriptValue fileExists(QScriptContext *context, QScriptEngine *engine);
@ -89,7 +94,7 @@ private Q_SLOTS:
void exception(const QScriptValue &value); void exception(const QScriptValue &value);
private: private:
Plasma::Corona *m_corona; ShellCorona *m_corona;
QScriptValue m_scriptSelf; QScriptValue m_scriptSelf;
}; };

View File

@ -2,6 +2,7 @@
* Copyright 2008 Aaron Seigo <aseigo@kde.org> * Copyright 2008 Aaron Seigo <aseigo@kde.org>
* Copyright 2013 Sebastian Kügler <sebas@kde.org> * Copyright 2013 Sebastian Kügler <sebas@kde.org>
* Copyright 2013 Ivan Cukic <ivan.cukic@kde.org> * Copyright 2013 Ivan Cukic <ivan.cukic@kde.org>
* Copyright 2013 Marco Martin <mart@kde.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -58,6 +59,8 @@
#include "plasmashelladaptor.h" #include "plasmashelladaptor.h"
static const int s_configSyncDelay = 10000; // 10 seconds static const int s_configSyncDelay = 10000; // 10 seconds
class ShellCorona::Private { class ShellCorona::Private {
@ -100,6 +103,7 @@ public:
QTimer appConfigSyncTimer; QTimer appConfigSyncTimer;
}; };
WorkspaceScripting::DesktopScriptEngine * ShellCorona::scriptEngine() const WorkspaceScripting::DesktopScriptEngine * ShellCorona::scriptEngine() const
{ {
return d->scriptEngine; return d->scriptEngine;
@ -388,7 +392,18 @@ void ShellCorona::screenAdded(QScreen *screen)
Plasma::Containment* ShellCorona::createContainmentForActivity(const QString& activity, int screenNum) Plasma::Containment* ShellCorona::createContainmentForActivity(const QString& activity, int screenNum)
{ {
Plasma::Containment* containment = createContainment(d->desktopDefaultsConfig.readEntry("Containment", "org.kde.desktopcontainment")); if (d->desktopContainments.contains(activity) &&
d->desktopContainments[activity].contains(screenNum) &&
d->desktopContainments.value(activity).value(screenNum)) {
return d->desktopContainments[activity][screenNum];
}
QString plugin = "org.kde.desktopcontainment";
if (d->activities.contains(activity)) {
// plugin = d->activities.value(activity)->defaultPlugin();
}
Plasma::Containment* containment = createContainment(d->desktopDefaultsConfig.readEntry("Containment", plugin));
containment->setActivity(activity); containment->setActivity(activity);
insertContainment(activity, screenNum, containment); insertContainment(activity, screenNum, containment);
@ -583,6 +598,7 @@ void ShellCorona::activityAdded(const QString &id)
Activity *a = new Activity(id, this); Activity *a = new Activity(id, this);
d->activities.insert(id, a); d->activities.insert(id, a);
createContainmentForActivity(id, -1);
} }
void ShellCorona::activityRemoved(const QString &id) void ShellCorona::activityRemoved(const QString &id)
@ -591,6 +607,17 @@ void ShellCorona::activityRemoved(const QString &id)
a->deleteLater(); a->deleteLater();
} }
Activity *ShellCorona::activity(const QString &id)
{
return d->activities.value(id);
}
void ShellCorona::insertActivity(const QString &id, Activity *activity)
{
d->activities.insert(id, activity);
createContainmentForActivity(id, -1);
}
void ShellCorona::checkAddPanelAction(const QStringList &sycocaChanges) void ShellCorona::checkAddPanelAction(const QStringList &sycocaChanges)
{ {
if (!sycocaChanges.isEmpty() && !sycocaChanges.contains("services")) { if (!sycocaChanges.isEmpty() && !sycocaChanges.contains("services")) {

View File

@ -1,5 +1,7 @@
/* /*
* Copyright 2008 Aaron Seigo <aseigo@kde.org> * Copyright 2008 Aaron Seigo <aseigo@kde.org>
* Copyright 2013 Sebastian Kügler <sebas@kde.org>
* Copyright 2013 Ivan Cukic <ivan.cukic@kde.org>
* Copyright 2013 Marco Martin <mart@kde.org> * Copyright 2013 Marco Martin <mart@kde.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -25,6 +27,7 @@
#include <Plasma/Package> #include <Plasma/Package>
namespace Plasma namespace Plasma
{ {
class Applet; class Applet;
@ -69,6 +72,9 @@ public:
Plasma::Package lookAndFeelPackage() const; Plasma::Package lookAndFeelPackage() const;
Activity *activity(const QString &id);
void insertActivity(const QString &id, Activity *activity);
public Q_SLOTS: public Q_SLOTS:
/** /**
* Request saving applicationConfig on disk, it's event compressed, not immediate * Request saving applicationConfig on disk, it's event compressed, not immediate