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

Kross

  • sources
  • kde-4.12
  • kdelibs
  • 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 
46 using namespace Kross;
47 
48 namespace 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 }
QVariant
Kross::createGridLayout
QScriptValue createGridLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:238
Kross::toKUrl
QScriptValue toKUrl(QScriptEngine *e, const KUrl &url)
Definition: values_p.h:109
QColor
i18n
QString i18n(const char *text)
Kross::includeFunction
QScriptValue includeFunction(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:241
KSharedPtr
Kross::createWidget
QScriptValue createWidget(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:186
Kross::fromUrl
void fromUrl(const QScriptValue &v, QUrl &url)
Definition: values_p.h:105
Kross::createVBoxLayout
QScriptValue createVBoxLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:232
QScriptClass
KSharedPtr::data
T * data()
kurl.h
Kross::EcmaObject
The EcmaObject implements QScriptClass and Kross::Object to provide custom behavior to QtScript objec...
Definition: values_p.h:54
Kross::EcmaObject::~EcmaObject
virtual ~EcmaObject()
Definition: values_p.h:59
Kross::fromByteArray
void fromByteArray(const QScriptValue &v, QByteArray &ba)
Definition: values_p.h:98
QWidget
Kross::fromPointF
void fromPointF(const QScriptValue &v, QPointF &p)
Definition: values_p.h:145
Kross::fromSizeF
void fromSizeF(const QScriptValue &v, QSizeF &s)
Definition: values_p.h:158
QUrl
QString
QObject
klocale.h
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
KUrl
Kross::EcmaObject::name
virtual QString name() const
Definition: values_p.h:60
Kross::fromKUrl
void fromKUrl(const QScriptValue &v, KUrl &url)
Definition: values_p.h:112
Kross::fromRectF
void fromRectF(const QScriptValue &v, QRectF &r)
Definition: values_p.h:132
Kross::toSizeF
QScriptValue toSizeF(QScriptEngine *e, const QSizeF &s)
Definition: values_p.h:155
Kross::toColor
QScriptValue toColor(QScriptEngine *e, const QColor &c)
Definition: values_p.h:116
Kross::toRectF
QScriptValue toRectF(QScriptEngine *e, const QRectF &r)
Definition: values_p.h:129
QStringList
Kross::toObjPtr
QScriptValue toObjPtr(QScriptEngine *e, const Kross::Object::Ptr &ptr)
Definition: values_p.h:178
Kross::addWidgetLayout
QScriptValue addWidgetLayout(QScriptContext *c, QScriptEngine *engine)
Definition: values_p.h:202
Kross::krosswarning
void krosswarning(const QString &s)
Warning function.
Definition: krossconfig.cpp:34
Kross::fromRect
void fromRect(const QScriptValue &v, QRect &r)
Definition: values_p.h:126
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::fromColor
void fromColor(const QScriptValue &v, QColor &c)
Definition: values_p.h:119
Kross::EcmaObject::methodNames
virtual QStringList methodNames()
Return a list of supported callable objects.
Definition: values_p.h:79
Kross::toByteArray
QScriptValue toByteArray(QScriptEngine *e, const QByteArray &ba)
Definition: values_p.h:95
Kross::initializeGui
void initializeGui(QScriptEngine *engine)
Initialize GUI functionality like widgets the QUiLoader provides and some layout-managers.
Definition: values_p.h:285
Kross::toSize
QScriptValue toSize(QScriptEngine *e, const QSize &s)
Definition: values_p.h:149
QPoint
plugin.h
Kross::toRect
QScriptValue toRect(QScriptEngine *e, const QRect &r)
Definition: values_p.h:123
QRect
Kross::fromPoint
void fromPoint(const QScriptValue &v, QPoint &p)
Definition: values_p.h:139
Kross::createLayout
QScriptValue createLayout(QScriptContext *context, QScriptEngine *engine, QLayout *layout)
Definition: values_p.h:221
Kross::toPointF
QScriptValue toPointF(QScriptEngine *e, const QPointF &p)
Definition: values_p.h:142
Kross::Object
The class Object does provide us scripting objects like class instances to the C++ world...
Definition: object.h:69
Kross::EcmaObject::EcmaObject
EcmaObject(QScriptEngine *engine, const QScriptValue &object=QScriptValue())
Definition: values_p.h:57
QSize
KUrl::url
QString url(AdjustPathOption trailing=LeaveTrailingSlash) const
Kross::toUrl
QScriptValue toUrl(QScriptEngine *e, const QUrl &url)
Definition: values_p.h:102
Kross::EcmaObject::prototype
virtual QScriptValue prototype() const
Definition: values_p.h:61
Kross::fromSize
void fromSize(const QScriptValue &v, QSize &s)
Definition: values_p.h:152
Kross::toPoint
QScriptValue toPoint(QScriptEngine *e, const QPoint &p)
Definition: values_p.h:136
Kross::createHBoxLayout
QScriptValue createHBoxLayout(QScriptContext *context, QScriptEngine *engine)
Definition: values_p.h:235
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:49:54 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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