From 16cd227083330d7893e3e0208eb361f265cc2352 Mon Sep 17 00:00:00 2001 From: "Aaron J. Seigo" Date: Tue, 23 Feb 2010 09:41:14 +0000 Subject: [PATCH] fix the extraction of the layout items svn path=/trunk/KDE/kdebase/runtime/; revision=1094811 --- .../simplebindings/anchorlayout.cpp | 42 +++-------- .../javascript/simplebindings/gridlayout.cpp | 30 ++------ .../simplebindings/linearlayout.cpp | 72 +++++++++++++------ 3 files changed, 65 insertions(+), 79 deletions(-) diff --git a/scriptengines/javascript/simplebindings/anchorlayout.cpp b/scriptengines/javascript/simplebindings/anchorlayout.cpp index 27fcfa1f0..eda2a3f06 100644 --- a/scriptengines/javascript/simplebindings/anchorlayout.cpp +++ b/scriptengines/javascript/simplebindings/anchorlayout.cpp @@ -43,33 +43,11 @@ DECLARE_VOID_NUMBER_METHOD(QGraphicsAnchorLayout, removeAt) ///////////////////////////////////////////////////////////// -QGraphicsLayoutItem *convertToLayoutItem (QScriptContext *ctx, int index = 0) -{ - QObject *object = ctx->argument(index).toQObject(); - QGraphicsLayoutItem *item = qobject_cast(object); - - if (!item) { - item = qscriptvalue_cast(ctx->argument(index)); - } - - if (!item) { - AppletInterface *interface = qobject_cast(object); - - if (!interface) { - interface = qobject_cast(ctx->engine()->globalObject().property("plasmoid").toQObject()); - } - - if (interface) { - item = interface->applet(); - } - } - - return item; -} +QGraphicsLayoutItem *extractLayoutItem (QScriptContext *ctx, int index = 0); static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *eng) { - QGraphicsLayoutItem *parent = convertToLayoutItem(ctx); + QGraphicsLayoutItem *parent = extractLayoutItem(ctx); if (!parent) { return ctx->throwError(i18n("The parent must be a QGraphicsLayoutItem")); @@ -79,8 +57,8 @@ static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *eng) } BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, addAnchor) { - QGraphicsLayoutItem *item1 = convertToLayoutItem(ctx, 0); - QGraphicsLayoutItem *item2 = convertToLayoutItem(ctx, 2); + QGraphicsLayoutItem *item1 = extractLayoutItem(ctx, 0); + QGraphicsLayoutItem *item2 = extractLayoutItem(ctx, 2); if (!item1 || !item2) { return eng->undefinedValue(); @@ -93,8 +71,8 @@ BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, addAnchor) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, anchor) { - QGraphicsLayoutItem *item1 = convertToLayoutItem(ctx, 0); - QGraphicsLayoutItem *item2 = convertToLayoutItem(ctx, 2); + QGraphicsLayoutItem *item1 = extractLayoutItem(ctx, 0); + QGraphicsLayoutItem *item2 = extractLayoutItem(ctx, 2); if (!item1 || !item2) { return eng->undefinedValue(); @@ -107,8 +85,8 @@ BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, anchor) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, addCornerAnchors) { - QGraphicsLayoutItem *item1 = convertToLayoutItem(ctx, 0); - QGraphicsLayoutItem *item2 = convertToLayoutItem(ctx, 2); + QGraphicsLayoutItem *item1 = extractLayoutItem(ctx, 0); + QGraphicsLayoutItem *item2 = extractLayoutItem(ctx, 2); if (!item1 || !item2) { return eng->undefinedValue(); @@ -121,8 +99,8 @@ BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, addCornerAnchors) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsAnchorLayout, addAnchors) { - QGraphicsLayoutItem *item1 = convertToLayoutItem(ctx, 0); - QGraphicsLayoutItem *item2 = convertToLayoutItem(ctx, 1); + QGraphicsLayoutItem *item1 = extractLayoutItem(ctx, 0); + QGraphicsLayoutItem *item2 = extractLayoutItem(ctx, 1); if (!item1 || !item2) { return eng->undefinedValue(); diff --git a/scriptengines/javascript/simplebindings/gridlayout.cpp b/scriptengines/javascript/simplebindings/gridlayout.cpp index ebfed978e..5b2c9df05 100644 --- a/scriptengines/javascript/simplebindings/gridlayout.cpp +++ b/scriptengines/javascript/simplebindings/gridlayout.cpp @@ -72,33 +72,11 @@ DECLARE_INT_NUMBER_SET_METHOD(QGraphicsGridLayout, setColumnFixedWidth) ///////////////////////////////////////////////////////////// -QGraphicsLayoutItem *getLayoutItem(QScriptContext *ctx, int index = 0) -{ - QObject *object = ctx->argument(index).toQObject(); - QGraphicsLayoutItem *item = qobject_cast(object); - - if (!item) { - item = qscriptvalue_cast(ctx->argument(index)); - } - - if (!item) { - AppletInterface *interface = qobject_cast(object); - - if (!interface) { - interface = qobject_cast(ctx->engine()->globalObject().property("plasmoid").toQObject()); - } - - if (interface) { - item = interface->applet(); - } - } - - return item; -} +QGraphicsLayoutItem *extractLayoutItem(QScriptContext *ctx, int index = 0); static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *eng) { - QGraphicsLayoutItem *parent = getLayoutItem(ctx); + QGraphicsLayoutItem *parent = extractLayoutItem(ctx); if (!parent) { return ctx->throwError(i18n("The parent must be a QGraphicsLayoutItem")); @@ -108,7 +86,7 @@ static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *eng) } BEGIN_DECLARE_METHOD(QGraphicsGridLayout, setAlignment) { - QGraphicsLayoutItem *item = getLayoutItem(ctx); + QGraphicsLayoutItem *item = extractLayoutItem(ctx); if (!item) { return eng->undefinedValue(); @@ -119,7 +97,7 @@ BEGIN_DECLARE_METHOD(QGraphicsGridLayout, setAlignment) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsGridLayout, addItem) { - QGraphicsLayoutItem *item = getLayoutItem(ctx); + QGraphicsLayoutItem *item = extractLayoutItem(ctx); if (!item) { return eng->undefinedValue(); diff --git a/scriptengines/javascript/simplebindings/linearlayout.cpp b/scriptengines/javascript/simplebindings/linearlayout.cpp index f5c57f2bc..79b0d4e65 100644 --- a/scriptengines/javascript/simplebindings/linearlayout.cpp +++ b/scriptengines/javascript/simplebindings/linearlayout.cpp @@ -19,9 +19,11 @@ #include #include #include -#include -#include +#include #include +#include +#include +#include #include @@ -32,6 +34,8 @@ Q_DECLARE_METATYPE(QScript::Pointer::wrapped_pointer_type) Q_DECLARE_METATYPE(QGraphicsWidget*) Q_DECLARE_METATYPE(QGraphicsLayout*) Q_DECLARE_METATYPE(QGraphicsLayoutItem*) +Q_DECLARE_METATYPE(QGraphicsAnchorLayout*) +Q_DECLARE_METATYPE(QGraphicsGridLayout*) DECLARE_POINTER_METATYPE(QGraphicsLinearLayout) DECLARE_VOID_NUMBER_METHOD(QGraphicsLinearLayout, removeAt) @@ -42,24 +46,45 @@ DECLARE_VOID_QUAD_NUMBER_METHOD(QGraphicsLinearLayout, setContentsMargins) ///////////////////////////////////////////////////////////// -QGraphicsLayoutItem *layoutItem(QScriptContext *ctx, int index = 0) +// Q_DECLARE_METATYPE(QGraphicsLayoutItem*) +QGraphicsLayoutItem *extractLayoutItem(QScriptContext *ctx, int index = 0) { - QObject *object = ctx->argument(index).toQObject(); - QGraphicsLayoutItem *item = qobject_cast(object); + QScriptValue v = ctx->argument(index); + if (ctx->argumentCount() == 0 || v.isQObject()) { + QObject *object = v.toQObject(); + QGraphicsWidget *w = qobject_cast(object); + if (!w) { + AppletInterface *interface = qobject_cast(object); + if (!interface) { + interface = qobject_cast(ctx->engine()->globalObject().property("plasmoid").toQObject()); + } - if (!item) { - item = qscriptvalue_cast(ctx->argument(index)); - } - - if (!item) { - AppletInterface *interface = qobject_cast(object); - - if (!interface) { - interface = qobject_cast(ctx->engine()->globalObject().property("plasmoid").toQObject()); + if (interface) { + w = interface->applet(); + } } - if (interface) { - item = interface->applet(); + return w; + } + + QVariant variant = v.toVariant(); + QGraphicsLayoutItem *item = variant.value(); + //this is horribly ugly code, but when a QLinearLayout* is stuffed into a QVariant, + //QVariant does not know that it is a QGraphicsLayoutItem. repeat for all subclasses + //of same + if (!item) { + item = variant.value(); + + if (!item) { + item = variant.value(); + + if (!item) { + item = variant.value(); + + if (!item) { + item = variant.value(); + } + } } } @@ -68,7 +93,7 @@ QGraphicsLayoutItem *layoutItem(QScriptContext *ctx, int index = 0) static QScriptValue ctor(QScriptContext *ctx, QScriptEngine *eng) { - QGraphicsLayoutItem *parent = layoutItem(ctx); + QGraphicsLayoutItem *parent = extractLayoutItem(ctx); if (!parent) { return ctx->throwError(i18n("The parent must be a QGraphicsLayoutItem")); @@ -86,7 +111,7 @@ BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, orientation) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, setAlignment) { - QGraphicsLayoutItem *item = layoutItem(ctx); + QGraphicsLayoutItem *item = extractLayoutItem(ctx); if (!item) { return eng->undefinedValue(); @@ -97,7 +122,7 @@ BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, setAlignment) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, insertItem) { - QGraphicsLayoutItem *item = layoutItem(ctx, 1); + QGraphicsLayoutItem *item = extractLayoutItem(ctx, 1); if (!item) { return eng->undefinedValue(); @@ -108,7 +133,7 @@ BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, insertItem) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, removeItem) { - QGraphicsLayoutItem *item = layoutItem(ctx); + QGraphicsLayoutItem *item = extractLayoutItem(ctx); if (!item) { return eng->undefinedValue(); @@ -130,7 +155,7 @@ BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, setStretchFactor) { } END_DECLARE_METHOD BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, addItem) { - QGraphicsLayoutItem *item = layoutItem(ctx); + QGraphicsLayoutItem *item = extractLayoutItem(ctx); if (!item) { return ctx->throwError(QScriptContext::TypeError, "QGraphicsLinearLayout.prototype.addItem: argument is not a GraphicsLayoutItem"); @@ -171,6 +196,11 @@ BEGIN_DECLARE_METHOD(QGraphicsLinearLayout, spacing) { QScriptValue constructLinearLayoutClass(QScriptEngine *eng) { // QScriptValue proto = QScript::wrapGVPointer(eng, new QGraphicsLinearLayout(), ); + qRegisterMetaType(); + QGraphicsLayoutItem * i = new QGraphicsLinearLayout; + QVariant v; + ///v.setValue(i); + v.setValue(i); QScriptValue proto = QScript::wrapPointer(eng, new QGraphicsLinearLayout(), QScript::UserOwnership); const QScriptValue::PropertyFlags getter = QScriptValue::PropertyGetter; const QScriptValue::PropertyFlags setter = QScriptValue::PropertySetter;