• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

Kross

  • kross
  • qts
values_p.h
Go to the documentation of this file.
1/***************************************************************************
2 * plugin.cpp
3 * This file is part of the KDE project
4 * copyright (C)2007 by Sebastian Sauer (mail@dipe.org)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this program; see the file COPYING. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 ***************************************************************************/
19
20#include "plugin.h"
21
22#include "../core/manager.h"
23#include "../core/object.h"
24
25#include <QByteArray>
26#include <QUrl>
27#include <QColor>
28#include <QRect>
29#include <QPoint>
30#include <QSize>
31#include <QWidget>
32#include <QLayout>
33#include <QVBoxLayout>
34#include <QUiLoader>
35#include <QAbstractItemView>
36#include <QAbstractItemModel>
37#include <QStringListModel>
38#include <QScriptClass>
39#include <QScriptContext>
40#include <QScriptValueIterator>
41#include <QDebug>
42
43#include <kurl.h>
44#include <klocale.h>
45
46using namespace Kross;
47
48namespace Kross {
49
54 class EcmaObject : public QScriptClass, public Kross::Object
55 {
56 public:
57 explicit EcmaObject(QScriptEngine* engine, const QScriptValue& object = QScriptValue())
58 : QScriptClass(engine), Kross::Object(), m_object(object) {}
59 virtual ~EcmaObject() {}
60 virtual QString name() const { return "KrossObject"; }
61 virtual QScriptValue prototype() const { return m_object; }
62
63 virtual QVariant callMethod(const QString& name, const QVariantList& args = QVariantList())
64 {
65 QScriptValue function = m_object.property(name);
66 if( ! function.isFunction() ) {
67 krosswarning( QString("EcmaScript::callFunction No such function \"%1\"").arg(name) );
68 if( QScriptContext* context = engine()->currentContext() )
69 context->throwError(QScriptContext::ReferenceError, i18n("No such function \"%1\"", name));
70 return QVariant();
71 }
72 QScriptValueList arguments;
73 foreach(const QVariant &v, args)
74 arguments << engine()->toScriptValue(v);
75 QScriptValue result = function.call(m_object, arguments);
76 return result.toVariant();
77 }
78
79 virtual QStringList methodNames()
80 {
81 QStringList methods;
82 QScriptValueIterator it( m_object );
83 while( it.hasNext() ) {
84 it.next();
85 if( it.value().isFunction() )
86 methods << it.name();
87 }
88 return methods;
89 }
90
91 private:
92 QScriptValue m_object;
93 };
94
95 QScriptValue toByteArray(QScriptEngine *e, const QByteArray &ba) {
96 return ba.isNull() ? e->nullValue() : e->newVariant(ba);
97 }
98 void fromByteArray(const QScriptValue &v, QByteArray &ba) {
99 ba = v.isNull() ? QByteArray() : v.toString().toUtf8();
100 }
101
102 QScriptValue toUrl(QScriptEngine *e, const QUrl &url) {
103 return e->newVariant( url.toString() );
104 }
105 void fromUrl(const QScriptValue &v, QUrl &url) {
106 url.setUrl( v.toString() );
107 }
108
109 QScriptValue toKUrl(QScriptEngine *e, const KUrl &url) {
110 return e->newVariant( url.url() );
111 }
112 void fromKUrl(const QScriptValue &v, KUrl &url) {
113 url.setUrl( v.toString() );
114 }
115
116 QScriptValue toColor(QScriptEngine *e, const QColor &c) {
117 return c.isValid() ? e->newVariant(c.name()) : e->nullValue();
118 }
119 void fromColor(const QScriptValue &v, QColor &c) {
120 c.setNamedColor( v.isNull() ? QString() : v.toString() );
121 }
122
123 QScriptValue toRect(QScriptEngine *e, const QRect &r) {
124 return e->toScriptValue( QVariantList() << r.x() << r.y() << r.width() << r.height() );
125 }
126 void fromRect(const QScriptValue &v, QRect &r) {
127 r = v.isArray() ? QRect(v.property(0).toInt32(),v.property(1).toInt32(),v.property(2).toInt32(),v.property(3).toInt32()) : QRect();
128 }
129 QScriptValue toRectF(QScriptEngine *e, const QRectF &r) {
130 return e->toScriptValue( QVariantList() << r.x() << r.y() << r.width() << r.height() );
131 }
132 void fromRectF(const QScriptValue &v, QRectF &r) {
133 r = v.isArray() ? QRectF(v.property(0).toNumber(),v.property(1).toNumber(),v.property(2).toNumber(),v.property(3).toNumber()) : QRectF();
134 }
135
136 QScriptValue toPoint(QScriptEngine *e, const QPoint &p) {
137 return e->toScriptValue( QVariantList() << p.x() << p.y() );
138 }
139 void fromPoint(const QScriptValue &v, QPoint &p) {
140 p = v.isArray() ? QPoint(v.property(0).toInt32(),v.property(1).toInt32()) : QPoint();
141 }
142 QScriptValue toPointF(QScriptEngine *e, const QPointF &p) {
143 return e->toScriptValue( QVariantList() << p.x() << p.y() );
144 }
145 void fromPointF(const QScriptValue &v, QPointF &p) {
146 p = v.isArray() ? QPointF(v.property(0).toNumber(),v.property(1).toNumber()) : QPointF();
147 }
148
149 QScriptValue toSize(QScriptEngine *e, const QSize &s) {
150 return e->toScriptValue( QVariantList() << s.width() << s.height() );
151 }
152 void fromSize(const QScriptValue &v, QSize &s) {
153 s = v.isArray() ? QSize(v.property(0).toInt32(),v.property(1).toInt32()) : QSize();
154 }
155 QScriptValue toSizeF(QScriptEngine *e, const QSizeF &s) {
156 return e->toScriptValue( QVariantList() << s.width() << s.height() );
157 }
158 void fromSizeF(const QScriptValue &v, QSizeF &s) {
159 s = v.isArray() ? QSizeF(v.property(0).toNumber(),v.property(1).toNumber()) : QSizeF();
160 }
161
162 /*
163 QScriptValue toVariantList(QScriptEngine *e, const QVariantList &l) {
164 const int len = l.size();
165 QScriptValue a = e->newArray(len);
166 for(int i = 0; i < len; ++i)
167 a.setProperty(i, e->toScriptValue(l[i]));
168 return a;
169 }
170 void fromVariantList(const QScriptValue &v, QVariantList &l) {
171 l.clear();
172 const int len = v.isArray() ? v.property("length").toInt32() : 0;
173 for(int i = 0; i < len; ++i)
174 l << v.property(i).toVariant();
175 }
176 */
177
178 QScriptValue toObjPtr(QScriptEngine *e, const Kross::Object::Ptr &ptr) {
179 const EcmaObject* obj = dynamic_cast<const EcmaObject*>( ptr.data() );
180 return obj ? obj->prototype() : e->nullValue();
181 }
182 void fromObjPtr(const QScriptValue &v, Kross::Object::Ptr &ptr) {
183 ptr = new EcmaObject(v.engine(), v);
184 }
185
186 QScriptValue createWidget(QScriptContext *context, QScriptEngine *engine) {
187 const QString widgetname = context->callee().prototype().property("className").toString();
188 Q_ASSERT( ! widgetname.isEmpty() );
189 QWidget *parent = qscriptvalue_cast<QWidget*>(context->argument(0));
190 QUiLoader loader;
191 QWidget *widget = loader.createWidget(widgetname, parent);
192 if( ! widget )
193 return context->throwError(QScriptContext::TypeError, QString("No such QWidget \"%1\"").arg(widgetname));
194 if( parent && parent->layout() )
195 parent->layout()->addWidget(widget);
196 QScriptEngine::ValueOwnership owner = parent ? QScriptEngine::QtOwnership : QScriptEngine::ScriptOwnership;
197 QScriptValue result = engine->newQObject(widget, owner);
198 //result.setPrototype(context->callee().prototype());
199 return result;
200 }
201
202 QScriptValue addWidgetLayout(QScriptContext *c, QScriptEngine *engine) {
203 if( QLayout *layout = dynamic_cast<QLayout*>( qscriptvalue_cast<QObject*>(c->thisObject()) ) ) {
204 QGridLayout *gridLayout = dynamic_cast<QGridLayout*>(layout);
205 QObject *obj = qscriptvalue_cast<QObject*>( c->argument(0) );
206 if( QWidget *w = dynamic_cast<QWidget*>(obj) ) {
207 if( gridLayout )
208 gridLayout->addWidget(w, c->argument(1).toInt32(), c->argument(2).toInt32(), (Qt::Alignment)c->argument(3).toInt32());
209 else
210 layout->addWidget(w);
211 }
212 else if( QLayout *l = dynamic_cast<QLayout*>( qscriptvalue_cast<QObject*>(c->argument(0)) ) ) {
213 if( gridLayout )
214 gridLayout->addLayout(l, c->argument(1).toInt32(), c->argument(2).toInt32(), (Qt::Alignment)c->argument(3).toInt32());
215 else if( QBoxLayout *bl = dynamic_cast<QBoxLayout*>(layout) )
216 bl->addLayout(l);
217 }
218 }
219 return engine->nullValue();
220 }
221 QScriptValue createLayout(QScriptContext *context, QScriptEngine *engine, QLayout *layout) {
222 QObject *parent = qscriptvalue_cast<QObject*>(context->argument(0));
223 if( QWidget *parentWidget = dynamic_cast<QWidget*>(parent) )
224 parentWidget->setLayout(layout);
225 else if( QBoxLayout *parentLayout = dynamic_cast<QBoxLayout*>(parent) )
226 parentLayout->addLayout(layout);
227 QScriptValue obj = engine->newQObject(layout);
228 obj.setProperty("addWidget", engine->newFunction(addWidgetLayout));
229 obj.setProperty("addLayout", engine->newFunction(addWidgetLayout));
230 return obj;
231 }
232 QScriptValue createVBoxLayout(QScriptContext *context, QScriptEngine *engine) {
233 return createLayout(context, engine, new QVBoxLayout());
234 }
235 QScriptValue createHBoxLayout(QScriptContext *context, QScriptEngine *engine) {
236 return createLayout(context, engine, new QHBoxLayout());
237 }
238 QScriptValue createGridLayout(QScriptContext *context, QScriptEngine *engine) {
239 return createLayout(context, engine, new QGridLayout());
240 }
241 QScriptValue includeFunction(QScriptContext *context, QScriptEngine *engine) {
242 if (context->argumentCount() < 1)
243 return engine->nullValue();
244 return engine->importExtension(context->argument(0).toString());
245 }
246
251 void initializeCore(QScriptEngine *engine) {
252 QScriptValue global = engine->globalObject();
253
254 // compatibility to kjs/kjsembed
255 if( ! global.property("println").isValid() )
256 global.setProperty("println", global.property("print"));
257
258 // register common used types
259 qScriptRegisterMetaType< QByteArray >(engine, toByteArray, fromByteArray);
260 qScriptRegisterMetaType< QUrl >(engine, toUrl, fromUrl);
261 qScriptRegisterMetaType< KUrl >(engine, toKUrl, fromKUrl);
262 qScriptRegisterMetaType< QColor >(engine, toColor, fromColor);
263 qScriptRegisterMetaType< QRect >(engine, toRect, fromRect);
264 qScriptRegisterMetaType< QRectF >(engine, toRectF, fromRectF);
265 qScriptRegisterMetaType< QPoint >(engine, toPoint, fromPoint);
266 qScriptRegisterMetaType< QPointF >(engine, toPointF, fromPointF);
267 qScriptRegisterMetaType< QSize >(engine, toSize, fromSize);
268 qScriptRegisterMetaType< QSizeF >(engine, toSizeF, fromSizeF);
269
270 // we should probably go with an own wrapper for QVariant/QObject...
271 //qScriptRegisterMetaType< QVariant >(engine, toVariant, fromVariant);
272 //qScriptRegisterMetaType< QVariantList >(engine, toVariantList, fromVariantList);
273
274 // register the Kross::Object::Ptr wrapper
275 qScriptRegisterMetaType< Kross::Object::Ptr >(engine, toObjPtr, fromObjPtr);
276
277 // register the include function that allows to importExtension
278 global.setProperty("include", engine->newFunction(includeFunction));
279 }
280
285 void initializeGui(QScriptEngine *engine) {
286 QScriptValue global = engine->globalObject();
287
288 // register UI widgets
289 QUiLoader loader;
290 foreach(const QString &widgetname, loader.availableWidgets()) {
291 QScriptValue proto = engine->newObject();
292 proto.setProperty("className", QScriptValue(engine, widgetname));
293 QScriptValue func = engine->newFunction(createWidget);
294 func.setPrototype(proto);
295 global.setProperty(widgetname, func);
296 }
297
298 // register layouts
299 global.setProperty("QVBoxLayout", engine->newFunction(createVBoxLayout));
300 global.setProperty("QHBoxLayout", engine->newFunction(createHBoxLayout));
301 global.setProperty("QGridLayout", engine->newFunction(createGridLayout));
302 }
303
304}
KSharedPtr
KSharedPtr::data
T * data()
KUrl
KUrl::url
QString url(AdjustPathOption trailing=LeaveTrailingSlash) const
Kross::EcmaObject
The EcmaObject implements QScriptClass and Kross::Object to provide custom behavior to QtScript objec...
Definition: values_p.h:55
Kross::EcmaObject::methodNames
virtual QStringList methodNames()
Return a list of supported callable objects.
Definition: values_p.h:79
Kross::EcmaObject::prototype
virtual QScriptValue prototype() const
Definition: values_p.h:61
Kross::EcmaObject::name
virtual QString name() const
Definition: values_p.h:60
Kross::EcmaObject::EcmaObject
EcmaObject(QScriptEngine *engine, const QScriptValue &object=QScriptValue())
Definition: values_p.h:57
Kross::EcmaObject::~EcmaObject
virtual ~EcmaObject()
Definition: values_p.h:59
Kross::EcmaObject::callMethod
virtual QVariant callMethod(const QString &name, const QVariantList &args=QVariantList())
Pass a call to the object and evaluated it.
Definition: values_p.h:63
Kross::Object
The class Object does provide us scripting objects like class instances to the C++ world.
Definition: object.h:70
QObject
QScriptClass
QUrl
QWidget
klocale.h
i18n
QString i18n(const char *text)
kurl.h
Kross
Definition: action.cpp:36
Kross::fromPointF
void fromPointF(const QScriptValue &v, QPointF &p)
Definition: values_p.h:145
Kross::toUrl
QScriptValue toUrl(QScriptEngine *e, const QUrl &url)
Definition: values_p.h:102
Kross::fromSize
void fromSize(const QScriptValue &v, QSize &s)
Definition: values_p.h:152
Kross::addWidgetLayout
QScriptValue addWidgetLayout(QScriptContext *c, QScriptEngine *engine)
Definition: values_p.h:202
Kross::toByteArray
QScriptValue toByteArray(QScriptEngine *e, const QByteArray &ba)
Definition: values_p.h:95
Kross::krosswarning
void krosswarning(const QString &s)
Warning function.
Definition: krossconfig.cpp:34
Kross::createWidget
QScriptValue createWidget(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:186
Kross::toObjPtr
QScriptValue toObjPtr(QScriptEngine *e, const Kross::Object::Ptr &ptr)
Definition: values_p.h:178
Kross::fromByteArray
void fromByteArray(const QScriptValue &v, QByteArray &ba)
Definition: values_p.h:98
Kross::toPointF
QScriptValue toPointF(QScriptEngine *e, const QPointF &p)
Definition: values_p.h:142
Kross::createLayout
QScriptValue createLayout(QScriptContext *context, QScriptEngine *engine, QLayout *layout)
Definition: values_p.h:221
Kross::toRectF
QScriptValue toRectF(QScriptEngine *e, const QRectF &r)
Definition: values_p.h:129
Kross::fromUrl
void fromUrl(const QScriptValue &v, QUrl &url)
Definition: values_p.h:105
Kross::fromPoint
void fromPoint(const QScriptValue &v, QPoint &p)
Definition: values_p.h:139
Kross::toKUrl
QScriptValue toKUrl(QScriptEngine *e, const KUrl &url)
Definition: values_p.h:109
Kross::toSizeF
QScriptValue toSizeF(QScriptEngine *e, const QSizeF &s)
Definition: values_p.h:155
Kross::createGridLayout
QScriptValue createGridLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:238
Kross::fromColor
void fromColor(const QScriptValue &v, QColor &c)
Definition: values_p.h:119
Kross::initializeGui
void initializeGui(QScriptEngine *engine)
Initialize GUI functionality like widgets the QUiLoader provides and some layout-managers.
Definition: values_p.h:285
Kross::fromSizeF
void fromSizeF(const QScriptValue &v, QSizeF &s)
Definition: values_p.h:158
Kross::toPoint
QScriptValue toPoint(QScriptEngine *e, const QPoint &p)
Definition: values_p.h:136
Kross::toRect
QScriptValue toRect(QScriptEngine *e, const QRect &r)
Definition: values_p.h:123
Kross::includeFunction
QScriptValue includeFunction(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:241
Kross::toSize
QScriptValue toSize(QScriptEngine *e, const QSize &s)
Definition: values_p.h:149
Kross::fromKUrl
void fromKUrl(const QScriptValue &v, KUrl &url)
Definition: values_p.h:112
Kross::toColor
QScriptValue toColor(QScriptEngine *e, const QColor &c)
Definition: values_p.h:116
Kross::createVBoxLayout
QScriptValue createVBoxLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:232
Kross::fromRect
void fromRect(const QScriptValue &v, QRect &r)
Definition: values_p.h:126
Kross::fromObjPtr
void fromObjPtr(const QScriptValue &v, Kross::Object::Ptr &ptr)
Definition: values_p.h:182
Kross::initializeCore
void initializeCore(QScriptEngine *engine)
Initialize some core functionality like common used types we like to use within scripts.
Definition: values_p.h:251
Kross::fromRectF
void fromRectF(const QScriptValue &v, QRectF &r)
Definition: values_p.h:132
Kross::createHBoxLayout
QScriptValue createHBoxLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:235
plugin.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Kross

Skip menu "Kross"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal