diff --git a/scriptengines/javascript/simplebindings/graphicsitem.cpp b/scriptengines/javascript/simplebindings/graphicsitem.cpp new file mode 100644 index 000000000..09592b0d3 --- /dev/null +++ b/scriptengines/javascript/simplebindings/graphicsitem.cpp @@ -0,0 +1,412 @@ +/* + * Copyright 2007 Richard J. Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include "../backportglobal.h" + +Q_DECLARE_METATYPE(QScript::Pointer::wrapped_pointer_type) +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QPainterPath) +#ifndef QT_NO_CURSOR +Q_DECLARE_METATYPE(QCursor) +#endif +Q_DECLARE_METATYPE(QGraphicsItemGroup*) +Q_DECLARE_METATYPE(QPainter*) +Q_DECLARE_METATYPE(QStyleOptionGraphicsItem*) + +Q_DECLARE_METATYPE(QGraphicsPathItem*) +Q_DECLARE_METATYPE(QGraphicsRectItem*) +Q_DECLARE_METATYPE(QGraphicsEllipseItem*) +Q_DECLARE_METATYPE(QGraphicsPolygonItem*) +Q_DECLARE_METATYPE(QGraphicsLineItem*) +Q_DECLARE_METATYPE(QGraphicsPixmapItem*) +Q_DECLARE_METATYPE(QGraphicsTextItem*) +Q_DECLARE_METATYPE(QGraphicsSimpleTextItem*) + +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, acceptDrops, setAcceptDrops) +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, acceptsHoverEvents, setAcceptsHoverEvents) +DECLARE_GET_METHOD(QGraphicsItem, boundingRect) +DECLARE_GET_METHOD(QGraphicsItem, children) +DECLARE_GET_METHOD(QGraphicsItem, childrenBoundingRect) +#ifndef QT_NO_CURSOR +DECLARE_GET_SET_METHODS(QGraphicsItem, QCursor, cursor, setCursor) +DECLARE_BOOLEAN_GET_METHOD(QGraphicsItem, hasCursor) +#endif +DECLARE_GET_SET_METHODS(QGraphicsItem, QGraphicsItemGroup*, group, setGroup) +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, handlesChildEvents, setHandlesChildEvents) +DECLARE_BOOLEAN_GET_METHOD(QGraphicsItem, hasFocus) +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, isEnabled, setEnabled) +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, isSelected, setSelected) +DECLARE_BOOLEAN_GET_SET_METHODS(QGraphicsItem, isVisible, setVisible) +DECLARE_GET_METHOD(QGraphicsItem, opaqueArea) +DECLARE_GET_METHOD(QGraphicsItem, pos) +DECLARE_QOBJECT_GET_METHOD(QGraphicsItem, scene) +DECLARE_GET_METHOD(QGraphicsItem, sceneBoundingRect) +DECLARE_GET_METHOD(QGraphicsItem, scenePos) +DECLARE_GET_METHOD(QGraphicsItem, sceneTransform) +DECLARE_GET_METHOD(QGraphicsItem, shape) +#ifndef QT_NO_TOOLTIP +DECLARE_STRING_GET_SET_METHODS(QGraphicsItem, toolTip, setToolTip) +#endif +DECLARE_GET_METHOD(QGraphicsItem, topLevelItem) +DECLARE_GET_SET_METHODS(QGraphicsItem, QTransform, transform, setTransform) +DECLARE_NUMBER_GET_METHOD(QGraphicsItem, type) +DECLARE_NUMBER_GET_METHOD(QGraphicsItem, x) +DECLARE_NUMBER_GET_METHOD(QGraphicsItem, y) +DECLARE_NUMBER_GET_SET_METHODS(QGraphicsItem, zValue, setZValue) + +DECLARE_BOOLEAN_1ARG_METHOD(QGraphicsItem, QPointF, contains) +DECLARE_VOID_METHOD(QGraphicsItem, clearFocus) +DECLARE_VOID_METHOD(QGraphicsItem, hide) +DECLARE_BOOLEAN_1ARG_METHOD(QGraphicsItem, QGraphicsItem*, isAncestorOf) +DECLARE_BOOLEAN_1ARG_METHOD(QGraphicsItem, QGraphicsItem*, isObscuredBy) +DECLARE_VOID_NUMBER_NUMBER_METHOD(QGraphicsItem, moveBy) +DECLARE_VOID_METHOD(QGraphicsItem, resetTransform) +#ifndef QT_NO_CURSOR +DECLARE_VOID_METHOD(QGraphicsItem, unsetCursor) +#endif +DECLARE_VOID_METHOD(QGraphicsItem, show) +DECLARE_VOID_NUMBER_NUMBER_METHOD(QGraphicsItem, translate) +DECLARE_VOID_NUMBER_NUMBER_METHOD(QGraphicsItem, scale) +DECLARE_VOID_NUMBER_NUMBER_METHOD(QGraphicsItem, shear) +DECLARE_VOID_1ARG_METHOD(QGraphicsItem, QGraphicsItem*, installSceneEventFilter) +DECLARE_VOID_1ARG_METHOD(QGraphicsItem, QGraphicsItem*, removeSceneEventFilter) +DECLARE_VOID_NUMBER_METHOD(QGraphicsItem, rotate) + +///////////////////////////////////////////////////////////// + +static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *) +{ + return ctx->throwError("QGraphicsItem cannot be instantiated"); +} + +BEGIN_DECLARE_METHOD(QGraphicsItem, acceptedMouseButtons) { + return QScriptValue(eng, static_cast(self->acceptedMouseButtons())); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, advance) { + self->advance(ctx->argument(0).toInt32()); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, collidesWithItem) { + QGraphicsItem *other = qscriptvalue_cast(ctx->argument(0)); + if (!other) { + return ctx->throwError(QScriptContext::TypeError, + "QGraphicsItem.prototype.collidesWithItem: argument is not a GraphicsItem"); + } + if (ctx->argument(1).isUndefined()) + return QScriptValue(eng, self->collidesWithItem(other)); + else + return QScriptValue(eng, self->collidesWithItem(other, static_cast(ctx->argument(1).toInt32()))); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, collidesWithPath) { + QPainterPath path = qscriptvalue_cast(ctx->argument(0)); + if (ctx->argument(1).isUndefined()) + return QScriptValue(eng, self->collidesWithPath(path)); + else + return QScriptValue(eng, self->collidesWithPath(path, static_cast(ctx->argument(1).toInt32()))); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, collidingItems) { + if (ctx->argument(0).isUndefined()) + return qScriptValueFromValue(eng, self->collidingItems()); + else + return qScriptValueFromValue(eng, self->collidingItems(static_cast(ctx->argument(0).toInt32()))); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, data) { + return eng->newVariant(self->data(ctx->argument(0).toInt32())); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, ensureVisible) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.ensureVisible is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, flags) { + return QScriptValue(eng, static_cast(self->flags())); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, isObscured) { + if (ctx->argumentCount() == 0) { + return QScriptValue(eng, self->isObscured()); + } else if (ctx->argumentCount() > 1) { + return QScriptValue(eng, self->isObscured(ctx->argument(0).toInt32(), + ctx->argument(1).toInt32(), + ctx->argument(2).toInt32(), + ctx->argument(3).toInt32())); + } else { + return QScriptValue(eng, self->isObscured(qscriptvalue_cast(ctx->argument(0)))); + } +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapFromItem) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapFromItem is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapFromParent) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapFromParent is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapFromScene) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapFromScene is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapToItem) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapToItem is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapToParent) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapToParent is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, mapToScene) { + Q_UNUSED(eng); + return ctx->throwError("QGraphicsItem.prototype.mapToScene is not implemented"); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, paint) { + self->paint(qscriptvalue_cast(ctx->argument(0)), + qscriptvalue_cast(ctx->argument(1)), + qscriptvalue_cast(ctx->argument(2))); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, parentItem) { + QGraphicsItem *parent = self->parentItem(); + if (!parent) + return eng->nullValue(); + QScriptValue ret = qScriptValueFromValue(eng, parent); + QScriptValue proto; + switch (parent->type()) { + case 2: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 3: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 4: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 5: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 6: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 7: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 8: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 9: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + case 10: + proto = eng->defaultPrototype(qMetaTypeId()); + break; + } + if (proto.isValid()) + ret.setPrototype(proto); + return ret; +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setAcceptedMouseButtons) { + self->setAcceptedMouseButtons(static_cast(ctx->argument(0).toInt32())); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setData) { + self->setData(ctx->argument(0).toInt32(), ctx->argument(1).toVariant()); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setFlag) { + QGraphicsItem::GraphicsItemFlag flag = static_cast(ctx->argument(0).toInt32()); + if (ctx->argument(1).isUndefined()) + self->setFlag(flag); + else + self->setFlag(flag, ctx->argument(1).toBoolean()); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setFlags) { + self->setFlags(static_cast(ctx->argument(0).toInt32())); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setFocus) { + if (ctx->argument(0).isUndefined()) + self->setFocus(); + else + self->setFocus(static_cast(ctx->argument(0).toInt32())); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setParentItem) { + QScriptValue arg = ctx->argument(0); + QGraphicsItem *item = qscriptvalue_cast(arg); + self->setParentItem(item); + if (item) + QScript::maybeReleaseOwnership(ctx->thisObject()); + else if (!self->scene()) + QScript::maybeTakeOwnership(ctx->thisObject()); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, setPos) { + if (ctx->argumentCount() > 1) + self->setPos(ctx->argument(0).toNumber(), ctx->argument(1).toNumber()); + else + self->setPos(qscriptvalue_cast(ctx->argument(0))); + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, update) { + if (ctx->argumentCount() > 1) { + self->update(ctx->argument(0).toNumber(), + ctx->argument(1).toNumber(), + ctx->argument(2).toNumber(), + ctx->argument(3).toNumber()); + } else { + self->update(qscriptvalue_cast(ctx->argument(0))); + } + return eng->undefinedValue(); +} END_DECLARE_METHOD + +BEGIN_DECLARE_METHOD(QGraphicsItem, toString) { + return QScriptValue(eng, "QGraphicsItem"); +} END_DECLARE_METHOD + +///////////////////////////////////////////////////////////// + +class PrototypeGraphicsItem : public QGraphicsItem +{ +public: + PrototypeGraphicsItem() + { } + QRectF boundingRect() const + { return QRectF(); } + void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) + { } +}; + +QScriptValue constructGraphicsItemClass(QScriptEngine *eng) +{ + QScriptValue proto = QScript::wrapGVPointer(eng, new PrototypeGraphicsItem()); + ADD_GET_SET_METHODS(proto, acceptDrops, setAcceptDrops); + ADD_GET_SET_METHODS(proto, acceptsHoverEvents, setAcceptsHoverEvents); + ADD_GET_METHOD(proto, boundingRect); + ADD_GET_METHOD(proto, children); + ADD_GET_METHOD(proto, childrenBoundingRect); +#ifndef QT_NO_CURSOR + ADD_GET_SET_METHODS(proto, cursor, setCursor); + ADD_GET_METHOD(proto, hasCursor); +#endif + ADD_GET_SET_METHODS(proto, group, setGroup); + ADD_GET_SET_METHODS(proto, handlesChildEvents, setHandlesChildEvents); + ADD_GET_METHOD(proto, hasFocus); + ADD_GET_SET_METHODS(proto, isEnabled, setEnabled); + ADD_GET_SET_METHODS(proto, isSelected, setSelected); + ADD_GET_SET_METHODS(proto, isVisible, setVisible); + ADD_GET_METHOD(proto, opaqueArea); + ADD_GET_METHOD(proto, pos); + ADD_GET_METHOD(proto, scene); + ADD_GET_METHOD(proto, sceneBoundingRect); + ADD_GET_METHOD(proto, scenePos); + ADD_GET_METHOD(proto, sceneTransform); + ADD_GET_METHOD(proto, shape); +#ifndef QT_NO_TOOLTIP + ADD_GET_SET_METHODS(proto, toolTip, setToolTip); +#endif + ADD_GET_METHOD(proto, topLevelItem); + ADD_GET_SET_METHODS(proto, transform, setTransform); + ADD_GET_METHOD(proto, type); + ADD_GET_METHOD(proto, x); + ADD_GET_METHOD(proto, y); + ADD_GET_SET_METHODS(proto, zValue, setZValue); + + ADD_METHOD(proto, acceptedMouseButtons); + ADD_METHOD(proto, advance); + ADD_METHOD(proto, clearFocus); + ADD_METHOD(proto, collidesWithItem); + ADD_METHOD(proto, collidesWithPath); + ADD_METHOD(proto, collidingItems); + ADD_METHOD(proto, contains); + ADD_METHOD(proto, data); + ADD_METHOD(proto, ensureVisible); + ADD_METHOD(proto, flags); + ADD_METHOD(proto, hide); + ADD_METHOD(proto, installSceneEventFilter); + ADD_METHOD(proto, isAncestorOf); + ADD_METHOD(proto, isObscured); + ADD_METHOD(proto, isObscuredBy); + ADD_METHOD(proto, mapFromItem); + ADD_METHOD(proto, mapFromParent); + ADD_METHOD(proto, mapFromScene); + ADD_METHOD(proto, mapToItem); + ADD_METHOD(proto, mapToParent); + ADD_METHOD(proto, mapToScene); + ADD_METHOD(proto, moveBy); + ADD_METHOD(proto, paint); + ADD_METHOD(proto, parentItem); + ADD_METHOD(proto, removeSceneEventFilter); + ADD_METHOD(proto, resetTransform); + ADD_METHOD(proto, rotate); + ADD_METHOD(proto, scale); + ADD_METHOD(proto, setAcceptedMouseButtons); + ADD_METHOD(proto, setData); + ADD_METHOD(proto, setFlag); + ADD_METHOD(proto, setFlags); + ADD_METHOD(proto, setFocus); + ADD_METHOD(proto, setParentItem); + ADD_METHOD(proto, setPos); + ADD_METHOD(proto, shear); + ADD_METHOD(proto, show); + ADD_METHOD(proto, toString); + ADD_METHOD(proto, translate); +#ifndef QT_NO_CURSOR + ADD_METHOD(proto, unsetCursor); +#endif + ADD_METHOD(proto, update); + + QScript::registerPointerMetaType(eng, proto); + + QScriptValue ctorFun = eng->newFunction(ctor, proto); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemIsMovable); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemIsSelectable); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemIsFocusable); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemClipsToShape); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemClipsChildrenToShape); + ADD_ENUM_VALUE(ctorFun, QGraphicsItem, ItemIgnoresTransformations); + + return ctorFun; +}