summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/designer/uilib
diff options
context:
space:
mode:
Diffstat (limited to 'qtruby/rubylib/designer/uilib')
-rw-r--r--qtruby/rubylib/designer/uilib/Makefile.am7
-rw-r--r--qtruby/rubylib/designer/uilib/extconf.rb6
-rw-r--r--qtruby/rubylib/designer/uilib/qui.cpp175
-rw-r--r--qtruby/rubylib/designer/uilib/test/test.rb20
4 files changed, 208 insertions, 0 deletions
diff --git a/qtruby/rubylib/designer/uilib/Makefile.am b/qtruby/rubylib/designer/uilib/Makefile.am
new file mode 100644
index 00000000..e7f21bea
--- /dev/null
+++ b/qtruby/rubylib/designer/uilib/Makefile.am
@@ -0,0 +1,7 @@
+INCLUDES = -I$(top_srcdir)/smoke -I$(top_srcdir)/qtruby/rubylib/qtruby $(all_includes) -I$(RUBY_ARCHDIR)
+
+rubylibdir = $(RUBY_SITEARCHDIR)
+rubylib_LTLIBRARIES = qui.la
+qui_la_SOURCES = qui.cpp
+qui_la_LDFLAGS = -module -export-dynamic $(all_libraries) -version-info 0:0:0
+qui_la_LIBADD = -lqui \ No newline at end of file
diff --git a/qtruby/rubylib/designer/uilib/extconf.rb b/qtruby/rubylib/designer/uilib/extconf.rb
new file mode 100644
index 00000000..fa742b9a
--- /dev/null
+++ b/qtruby/rubylib/designer/uilib/extconf.rb
@@ -0,0 +1,6 @@
+require 'mkmf'
+dir_config('smoke')
+dir_config('qt')
+$CPPFLAGS += " -I../../../../smoke -I../../qtruby "
+$LOCAL_LIBS += '-bundle_loader ../../qtruby/qtruby.bundle -lsmokeqt -lqui -lqt-mt -lstdc++'
+create_makefile("qui")
diff --git a/qtruby/rubylib/designer/uilib/qui.cpp b/qtruby/rubylib/designer/uilib/qui.cpp
new file mode 100644
index 00000000..9aa7513f
--- /dev/null
+++ b/qtruby/rubylib/designer/uilib/qui.cpp
@@ -0,0 +1,175 @@
+/***************************************************************************
+ qui.cpp - A ruby wrapper for the QWidgetFactory class
+ -------------------
+ begin : Wed Mar 14 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qwidgetfactory.h>
+#include <qwidget.h>
+
+#include "smoke.h"
+
+#undef DEBUG
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#ifndef __USE_POSIX
+#define __USE_POSIX
+#endif
+#ifndef __USE_XOPEN
+#define __USE_XOPEN
+#endif
+#include <ruby.h>
+
+#include "qtruby.h"
+#include "smokeruby.h"
+
+extern Smoke *qt_Smoke;
+extern bool isDerivedFrom(Smoke *smoke, Smoke::Index classId, Smoke::Index baseId);
+
+extern "C" {
+extern VALUE set_obj_info(const char * className, smokeruby_object * o);
+
+static VALUE qui_module;
+static VALUE qwidget_factory_class;
+
+static VALUE
+create(int argc, VALUE * argv, VALUE /*klass*/)
+{
+ QWidget * topLevelWidget = 0;
+ VALUE result = Qnil;
+
+ if (argc == 0 || argc > 4) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d)\n", argc);
+ }
+
+ QObject * connector = 0;
+ if (argc >= 2) {
+ if (TYPE(argv[1]) == T_DATA) {
+ smokeruby_object *o = value_obj_info(argv[1]);
+ if (o != 0) {
+ connector = (QObject *) o->ptr;
+ }
+ } else {
+ rb_raise(rb_eArgError, "invalid argument type\n");
+ }
+ }
+
+ QWidget * parent = 0;
+ if (argc >= 3) {
+ if (TYPE(argv[2]) == T_DATA) {
+ smokeruby_object *o = value_obj_info(argv[2]);
+ if (o != 0) {
+ parent = (QWidget *) o->ptr;
+ }
+ } else {
+ rb_raise(rb_eArgError, "invalid argument type\n");
+ }
+ }
+
+ const char * name = 0;
+ if (argc >= 4) {
+ if (TYPE(argv[3]) == T_STRING) {
+ name = StringValuePtr(argv[3]);
+ } else {
+ rb_raise(rb_eArgError, "invalid argument type\n");
+ }
+ }
+
+ if (TYPE(argv[0]) == T_STRING) {
+ topLevelWidget = QWidgetFactory::create(QString(StringValuePtr(argv[0])), connector, parent, name);
+ } else if (TYPE(argv[0]) == T_DATA) {
+ QIODevice * dev = 0;
+ smokeruby_object *o = value_obj_info(argv[0]);
+
+ if (o != 0 && o->ptr != 0 && o->classId == qt_Smoke->idClass("QIODevice")) {
+ dev = (QIODevice *) o->ptr;
+ } else {
+ rb_raise(rb_eArgError, "invalid argument type\n");
+ }
+
+ topLevelWidget = QWidgetFactory::create(dev, connector, parent, name);
+ } else {
+ rb_raise(rb_eArgError, "invalid argument type\n");
+ }
+
+ if (topLevelWidget != 0) {
+ smokeruby_object * o = (smokeruby_object *) malloc(sizeof(smokeruby_object));
+ o->smoke = qt_Smoke;
+ o->classId = qt_Smoke->idClass(topLevelWidget->className());
+ o->ptr = topLevelWidget;
+ o->allocated = false;
+
+ const char * className = qt_Smoke->binding->className(o->classId);
+ result = set_obj_info(className, o);
+ }
+
+ return result;
+}
+
+static VALUE
+load_images(VALUE klass, VALUE dir)
+{
+ QWidgetFactory::loadImages(QString(StringValuePtr(dir)));
+ return klass;
+}
+
+static VALUE
+widgets(VALUE /*self*/)
+{
+ VALUE result = rb_ary_new();
+ QStringList widgetList = QWidgetFactory::widgets();
+
+ for (QStringList::Iterator it = widgetList.begin(); it != widgetList.end(); ++it) {
+ QString widgetName = *it;
+ if (widgetName.startsWith("Q")) {
+ widgetName.replace(0, 1, QString("Qt::"));
+ } else if (widgetName.startsWith("K")) {
+ widgetName.replace(0, 1, QString("KDE::"));
+ }
+ rb_ary_push(result, rb_str_new2(widgetName.latin1()));
+ }
+
+ return result;
+}
+
+static VALUE
+supports_widget(VALUE /*self*/, VALUE widget)
+{
+ QString widgetName(StringValuePtr(widget));
+
+ if (widgetName.startsWith("Qt::")) {
+ widgetName.replace(0, 4, QString("Q"));
+ } else if (widgetName.startsWith("KDE::")) {
+ widgetName.replace(0, 5, QString("K"));
+ }
+
+ return QWidgetFactory::supportsWidget(widgetName) ? Qtrue : Qfalse;
+}
+
+void
+Init_qui()
+{
+ qui_module = rb_define_module("QUI");
+ qwidget_factory_class = rb_define_class_under(qui_module, "WidgetFactory", rb_cObject);
+
+ rb_define_singleton_method(qwidget_factory_class, "create", (VALUE (*) (...)) create, -1);
+ rb_define_singleton_method(qwidget_factory_class, "loadImages", (VALUE (*) (...)) load_images, 1);
+ rb_define_singleton_method(qwidget_factory_class, "load_images", (VALUE (*) (...)) load_images, 1);
+ rb_define_singleton_method(qwidget_factory_class, "widgets", (VALUE (*) (...)) widgets, 0);
+ rb_define_singleton_method(qwidget_factory_class, "supportsWidget", (VALUE (*) (...)) supports_widget, 1);
+ rb_define_singleton_method(qwidget_factory_class, "supports_widget", (VALUE (*) (...)) supports_widget, 1);
+}
+
+};
diff --git a/qtruby/rubylib/designer/uilib/test/test.rb b/qtruby/rubylib/designer/uilib/test/test.rb
new file mode 100644
index 00000000..628f1270
--- /dev/null
+++ b/qtruby/rubylib/designer/uilib/test/test.rb
@@ -0,0 +1,20 @@
+require 'Qt'
+require 'qui'
+
+a = Qt::Application.new(ARGV)
+if ARGV.length == 0
+ puts "Usage: test.rb <image dir> <ui file>"
+ exit
+end
+
+if ARGV.length == 2
+ QUI::WidgetFactory.loadImages( ARGV[ 0 ] )
+ w = QUI::WidgetFactory.create( ARGV[ 1 ] )
+ if w.nil?
+ puts "Failed to create top level widget"
+ exit
+ end
+ w.show()
+ a.connect( a, SIGNAL('lastWindowClosed()'), a, SLOT('quit()') )
+ a.exec()
+end