[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kjsembed
From:       Erik Lloyd Bunce <kde () bunce ! us>
Date:       2006-12-13 22:29:47
Message-ID: 1166048987.835819.31962.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 613489 by bunce:

Add binding for QUiLoader.  
Make sure QWidget/QAction/QActionGroup/QLayout return a valid binding
from ctor to make createQObject() work despite current design
limitations.
Add test cases for QUiLoader and the objects create/returned by it.



 M  +4 -0      TODO-KDE4  
 M  +2 -1      kjsembed/CMakeLists.txt  
 M  +4 -0      kjsembed/kjsembed.cpp  
 M  +1 -1      kjsembed/object_binding.h  
 M  +12 -19    kjsembed/qaction_binding.cpp  
 M  +10 -2     kjsembed/qlayout_binding.cpp  
 M  +10 -4     kjsembed/qobject_binding.cpp  
 AM            kjsembed/quiloader_binding.cpp   [License: LGPL (v2+)]
 AM            kjsembed/quiloader_binding.h   [License: LGPL (v2+)]
 M  +10 -3     kjsembed/qwidget_binding.cpp  
 M  +1 -1      tests/test.ui  
 M  +23 -4     tests/uitest.js  
 A             tests/uitest2.js  


--- trunk/KDE/kdelibs/kjsembed/TODO-KDE4 #613488:613489
@@ -71,6 +71,10 @@
 <richmoore> even now, we don't really do much with the internals of kjs - we just \
use a small number of bits of the api  
 Erik's List:
+* Make it so bindings can be instantiated without containing objects for use in
+	auto-binding-assignment done by createQObject without having to create a 
+	temporary throw-away object.
+
 * Load sub-sets of the built-in bindings
   - core, file access, gui, etc.
 
--- trunk/KDE/kdelibs/kjsembed/kjsembed/CMakeLists.txt #613488:613489
@@ -41,6 +41,7 @@
    bind_qtimer.cpp
    brush.cpp
    QBrush_bind.cpp
+   quiloader_binding.cpp
    )
 
 kde4_automoc(${kjsembed_LIB_SRCS} ) 
@@ -72,7 +73,7 @@
                settings.h svg_binding.h filedialog_binding.h
                brush.h color.h dom.h font.h image.h pen.h
                pixmap.h point.h rect.h size.h url.h pointer.h
-               bind_qlcdnumber.h bind_qtimer.h
+               bind_qlcdnumber.h bind_qtimer.h quiloader_binding.h
          DESTINATION  ${INCLUDE_INSTALL_DIR}/kjsembed )
 
 
--- trunk/KDE/kdelibs/kjsembed/kjsembed/kjsembed.cpp #613488:613489
@@ -25,7 +25,10 @@
 #include "static_binding.h"
 
 #include "iosupport.h"
+#include "quiloader_binding.h"
+#ifdef KJSEMBED_FORMBUILDER_BINDING
 #include "qformbuilder_binding.h"
+#endif
 #include "qpainter_binding.h"
 #include "qwidget_binding.h"
 #include "qaction_binding.h"
@@ -117,6 +120,7 @@
 #ifdef KJSEMBED_FORMBUILDER_BINDING
     StaticConstructor::add( exec, parent, FormBuilder::constructor() ); // Ctor
 #endif
+    StaticConstructor::add( exec, parent, UiLoaderBinding::constructor() ); // Ctor
     StaticConstructor::add( exec, parent, QWidgetBinding::constructor() ); // Ctor
     StaticConstructor::add( exec, parent, Layout::constructor() ); // Ctor
     StaticConstructor::add( exec, parent, Action::constructor() ); // Ctor
--- trunk/KDE/kdelibs/kjsembed/kjsembed/object_binding.h #613488:613489
@@ -132,7 +132,7 @@
             {
                 if( m_owner == JSOwned )
                 {
-                    qDebug("object cleans up");
+                  //qDebug("object cleans up");
                     m_value->cleanup();
                 }
                 delete m_value;
--- trunk/KDE/kdelibs/kjsembed/kjsembed/qaction_binding.cpp #613488:613489
@@ -43,26 +43,19 @@
 NO_STATICS( Action )
 
 START_CTOR( Action, QAction, 0 )
-    if( args.size() == 2 )
-    {
-        QObject *parent = KJSEmbed::extractObject<QObject>(exec, args, 0, 0);
-        QString actionName = KJSEmbed::extractQString(exec, args, 1);
+    QObject *parent = KJSEmbed::extractObject<QObject>(exec, args, 0, 0);
+    QString actionName = KJSEmbed::extractQString(exec, args, 1);
 
-        QAction *action = uiLoader()->createAction(parent, actionName);
-        if( action )
-        {
-            KJS::JSObject *actionObject = KJSEmbed::createQObject( exec, action );
-            return actionObject;
-        }
-        else
-        {
-            return KJS::throwError(exec, KJS::GeneralError, i18n("Action takes 2 \
                args."));
-            // return KJSEmbed::throwError(exec, i18n("Action takes 2 args."));
-        }
+    QAction *action = uiLoader()->createAction(parent, actionName);
+    if( action )
+    {
+        KJS::JSObject *actionObject = new Action( exec, action );
+        return actionObject;
     }
-    // Trow error incorrect args
-    return KJS::throwError(exec, KJS::GeneralError, i18n("Must supply a valid \
                parent."));
-    // return KJSEmbed::throwError(exec, i18n("Must supply a valid parent."));
+    else
+    {
+        return KJS::throwError(exec, KJS::GeneralError, i18n("Action takes 2 \
args.")); +		}
 END_CTOR
 
 
@@ -81,7 +74,7 @@
         QActionGroup *action = uiLoader()->createActionGroup(parent, actionName);
         if( action )
         {
-            KJS::JSObject *actionObject = KJSEmbed::createQObject( exec, action );
+            KJS::JSObject *actionObject = new ActionGroup( exec, action );
             return actionObject;
         }
         else
--- trunk/KDE/kdelibs/kjsembed/kjsembed/qlayout_binding.cpp #613488:613489
@@ -68,6 +68,7 @@
 
 START_CTOR( Layout, QLayout, 0 )
 //  qDebug("Layout::CTOR(): args.size()=%d", args.size());
+    QLayout *layout = 0;
     if( args.size() > 0 )
     {
         QString layoutName = args[0]->toString(exec).qstring();
@@ -88,8 +89,15 @@
                                                              layoutName));
         // return KJSEmbed::throwError(exec, i18n("'%1' is not a valid \
QLayout.").arg(layoutName));  }
-    // Trow error incorrect args
-    return KJS::throwError(exec, KJS::GeneralError, i18n("Must supply a layout \
name.")); +    else
+    {
+      // ZBTODO: This is purely a hack to work around the binding constructor \
nonsense +      layout = new QGridLayout(); 
+      return new Layout(exec, layout);
+    }
+
+    // should Trow error incorrect args
+    //return KJS::throwError(exec, KJS::GeneralError, i18n("Must supply a layout \
                name."));
     // return KJSEmbed::throwError(exec, i18n("Must supply a layout name."));
 END_CTOR
 
--- trunk/KDE/kdelibs/kjsembed/kjsembed/qobject_binding.cpp #613488:613489
@@ -36,6 +36,8 @@
 #include <kjs/array_instance.h>
 #include <kjs/function_object.h>
 
+//#define CREATEQOBJ_DIAG
+
 using namespace KJSEmbed;
 
 QByteArray createSignal( const QByteArray &sig )
@@ -552,7 +554,7 @@
 }
 
 
-KJS::JSObject *KJSEmbed::createQObject(KJS::ExecState *exec, QObject *value, \
KJSEmbed::ObjectBinding::Ownership owner) +KJS::JSObject* \
KJSEmbed::createQObject(KJS::ExecState *exec, QObject *value, \
KJSEmbed::ObjectBinding::Ownership owner)  {
     if ( 0 == value )
         return new KJS::JSObject();
@@ -567,12 +569,14 @@
         clazz = meta->className();
         if ( parent->hasProperty( exec, KJS::Identifier(clazz) ) )
         {
-//          qDebug() << "createQObject(): clazz=" << clazz << " value=" << value;// \
<< " typeid(T)=" << typeid(T).name(); +#ifdef CREATEQOBJ_DIAG
+          qDebug() << "createQObject(): clazz=" << clazz << " value=" << value;// << \
" typeid(T)=" << typeid(T).name(); +#endif
             returnValue = StaticConstructor::construct( exec, parent, clazz );
             if( returnValue )
             {
                 // If its a value type setValue
-                KJSEmbed::QObjectBinding *imp = \
extractBindingImp<KJSEmbed::QObjectBinding>(exec, returnValue ); +                \
KJSEmbed::QObjectBinding *imp = extractBindingImp<QObjectBinding>(exec, returnValue \
);  if( imp )
                 {
                     imp->setObject( value );
@@ -595,7 +599,9 @@
         }
         else
         {
-//            qDebug("%s not a bound type, move up the chain", meta->className() );
+#ifdef CREATEQOBJ_DIAG
+            qDebug("%s not a bound type, move up the chain", meta->className() );
+#endif
             meta = meta->superClass();
         }
 
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.cpp #property svn:eol-style
   + native
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.cpp #property svn:keywords
   + author id date revision
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.cpp #property svn:mime-type
   + text/plain
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.h #property svn:eol-style
   + native
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.h #property svn:keywords
   + author id date revision
** trunk/KDE/kdelibs/kjsembed/kjsembed/quiloader_binding.h #property svn:mime-type
   + text/plain
--- trunk/KDE/kdelibs/kjsembed/kjsembed/qwidget_binding.cpp #613488:613489
@@ -143,6 +143,7 @@
 NO_STATICS( QWidgetBinding )
 
 START_CTOR( QWidgetBinding, QWidget, 0 )
+    //qDebug() << "QWidgetBinding::CTOR args.size()=" << args.size();
     if( args.size() > 0 )
     {
         QString widgetName = args[0]->toString(exec).qstring();
@@ -153,13 +154,19 @@
             parentWidget = parentImp->object<QWidget>();
         }
 
-        QWidget *widget = uiLoader()->createWidget(widgetName, parentWidget, \
"QWidget"); +        QWidget* widget = uiLoader()->createWidget(widgetName, \
parentWidget, "QWidget");  if( widget )
-        {
             return new QWidgetBinding(exec, widget);
-        }
+
         return KJS::throwError(exec, KJS::TypeError, i18n("'%1' is not a valid \
QWidget.", widgetName));  }
+    else
+    {
+        QWidget* widget = new QWidget();
+        if (widget)
+            return new QWidgetBinding(exec, widget);
+    }
+
     return KJS::throwError(exec, KJS::GeneralError, i18n("Must supply a widget \
name."));  END_CTOR
 
--- trunk/KDE/kdelibs/kjsembed/tests/test.ui #613488:613489
@@ -3,7 +3,7 @@
  <comment></comment>
  <exportmacro></exportmacro>
  <class>Form</class>
- <widget class="QWidget" name="Form" >
+ <widget class="QWidget" name="TestUI" >
   <property name="geometry" >
    <rect>
     <x>0</x>
--- trunk/KDE/kdelibs/kjsembed/tests/uitest.js #613488:613489
@@ -19,10 +19,29 @@
     Boston, MA 02110-1301, USA.
 */
 
+// create the loader
+var loader = new QUiLoader();
 
-var widget = new Form("test.ui", this);
-print( "widget value: " + widget );
-for( y in widget ) print("widget property: " + y);
+// display loader info
+println( "loader value: " + loader );
+for( y in loader ) println("loader property: " + y);
+
+// get and display the UILoader's pluginPaths
+paths = loader.pluginPaths();
+println( "pluginPath value:" + paths );
+println( "pluginPath len:" + paths.length );
+for ( var x = 0; x < paths.length; x++ ) 
+	println( "path " + x + ": " + paths[x] );
+
+// load a UI from test.ui
+var widget = loader.load("test.ui");
+println( "widget value: " + widget );
+
+// iterate through the base widgets properties
+for( y in widget ) println("widget property: " + y);
+
+// show it
 widget.show();
 
-exec()
+// give the user time to see it
+exec();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic