source: project/release/4/qt/main.cpp @ 15640

Last change on this file since 15640 was 15639, checked in by felix winkelmann, 11 years ago

ported to CHICKEN 4

File size: 10.7 KB
Line 
1/* main.cpp */
2
3
4#include <QtGui>
5#include <QtUiTools>
6#include <QGLWidget>
7#include <chicken.h>
8
9
10#define ___safe
11#define ___bool         int
12#define ___out
13
14
15class SimpleReceiver: public QObject
16{
17  Q_OBJECT
18
19  void *thunk;
20
21public:
22
23  SimpleReceiver(char *name, C_word proc) { 
24    setObjectName(name);
25    thunk = CHICKEN_new_gc_root(); 
26    CHICKEN_gc_root_set(thunk, proc);
27  }
28
29  ~SimpleReceiver() { CHICKEN_delete_gc_root(thunk); }
30
31public slots:
32  void slot() { C_callback(CHICKEN_gc_root_ref(thunk), 0); }
33};
34
35
36class GLWidget: public QGLWidget
37{
38  void *thunk;
39
40public:
41  GLWidget(char *name, QWidget *parent, C_word proc) : QGLWidget(parent) {
42    setObjectName(name);
43    thunk = CHICKEN_new_gc_root(); 
44    CHICKEN_gc_root_set(thunk, proc);
45  }
46
47  ~GLWidget() { CHICKEN_delete_gc_root(thunk); }
48
49protected:
50  // Set up the rendering context, define display lists etc.:
51  void initializeGL() { C_save(C_fix(0)); C_callback(CHICKEN_gc_root_ref(thunk), 1); }
52  // setup viewport, projection etc.:
53  void resizeGL(int w, int h) { C_save(C_fix(1)); C_save(C_fix(w)); C_save(C_fix(h)); C_callback(CHICKEN_gc_root_ref(thunk), 3); }
54  // draw the scene:
55  void paintGL() { C_save(C_fix(2)); C_callback(CHICKEN_gc_root_ref(thunk), 1); }
56};
57
58
59#define qtobject          QObject *
60#define qtapplication     QApplication *
61#define qtreceiver        SimpleReceiver *
62#define qtwidget          QWidget *
63#define qtpixmap           QPixmap *
64#define qttimer           QTimer *
65#define qtsound           QSound *
66
67extern "C" {
68#include "prototypes.h"
69}
70
71
72#include "main.moc"
73
74
75QApplication *qt_init()
76{
77  QApplication *app = new QApplication(C_main_argc, C_main_argv);
78  QObject::connect(app, SIGNAL(lastWindowClosed()), app, SLOT(quit()));
79  return qApp;
80}
81
82
83QWidget *qt_create(char *string, QWidget *parent)
84{
85  QUiLoader loader;
86  QBuffer buf;
87  buf.open(QBuffer::ReadWrite);
88  buf.write(string);
89  buf.seek(0);
90  QWidget *w = loader.load(&buf, parent);
91  buf.close();
92  return w;
93}
94
95
96___bool qt_run(___bool once)
97{
98  if(once) {
99    qApp->processEvents();
100    return 1;
101  }
102  else return qApp->exec();
103}
104
105
106void qt_show(QWidget *w) { w->show(); }
107void qt_hide(QWidget *w) { w->show(); }
108void qt_deleteobject(QObject *o) { delete o; }
109void qt_deletepixmap(QPixmap *o) { delete o; }
110___bool qt_connect(QWidget *w1, char *sig, QObject *w2, char *slot) { return QObject::connect(w1, sig, w2, slot); }
111QWidget *qt_find(QWidget *parent, char *name) { return parent->findChild<QWidget *>(QString(name)); }
112QObject *qt_receiver(char *name, C_word proc) { return new SimpleReceiver(name, proc); }
113
114
115qtpixmap qt_pixmap(char *filename)
116{
117  QPixmap *px = new QPixmap(filename);
118 
119  if(px->isNull()) {
120    delete px;
121    return 0;
122  }
123 
124  return px;
125}
126
127
128int qt_message(char *caption, char *text, QWidget *parent, char *b0, char *b1, char *b2)
129{
130  return QMessageBox::information(parent, caption, text, b0, b1, b2);
131}
132
133
134#define propsetter(name, type)                                       \
135___bool qt_set ## name ## property(QWidget *w, char *prop, type val) \
136{ \
137  const QMetaObject *mo = w->metaObject(); \
138  int i = mo->indexOfProperty(prop); \
139  if(i == -1) return 0; \
140  else return mo->property(i).write(w, val); \
141}
142
143
144propsetter(string, char *)
145propsetter(bool, ___bool)
146propsetter(int, int)
147propsetter(float, double)
148propsetter(char, char)
149
150
151___bool qt_setpixmapproperty(QWidget *w, char *prop, qtpixmap val)
152{
153  const QMetaObject *mo = w->metaObject();
154  int i = mo->indexOfProperty(prop);
155  if(i == -1) return 0;
156  else return mo->property(i).write(w, *val);
157}
158
159
160___bool qt_setpointproperty(QWidget *w, char *prop, int *val)
161{
162  const QMetaObject *mo = w->metaObject();
163  int i = mo->indexOfProperty(prop);
164  if(i == -1) return 0;
165  else {
166    switch(mo->property(i).type()) {
167    case QVariant::Point: return mo->property(i).write(w, QPoint(val[ 0 ], val[ 1 ]));
168    case QVariant::Size: return mo->property(i).write(w, QSize(val[ 0 ], val[ 1 ]));
169    default: return false;
170    }
171  }
172}
173
174
175___bool qt_setpointfproperty(QWidget *w, char *prop, double *val)
176{
177  const QMetaObject *mo = w->metaObject();
178  int i = mo->indexOfProperty(prop);
179  if(i == -1) return 0;
180  else {
181    switch(mo->property(i).type()) {
182    case QVariant::PointF: return mo->property(i).write(w, QPointF(val[ 0 ], val[ 1 ]));
183    case QVariant::SizeF: return mo->property(i).write(w, QSizeF(val[ 0 ], val[ 1 ]));
184    default: return false;
185    }
186  }
187}
188
189
190___bool qt_setrectproperty(QWidget *w, char *prop, int *val)
191{
192  const QMetaObject *mo = w->metaObject();
193  int i = mo->indexOfProperty(prop);
194  if(i == -1) return 0;
195  else return mo->property(i).write(w, QRect(val[ 0 ], val[ 1 ], val[ 2 ], val[ 3 ]));
196}
197
198
199___bool qt_setrectfproperty(QWidget *w, char *prop, double *val)
200{
201  const QMetaObject *mo = w->metaObject();
202  int i = mo->indexOfProperty(prop);
203  if(i == -1) return 0;
204  else return mo->property(i).write(w, QRectF(val[ 0 ], val[ 1 ], val[ 2 ], val[ 3 ]));
205}
206
207
208char *qt_getstringproperty(QWidget *w, char *prop) 
209{
210  const QMetaObject *mo = w->metaObject();
211  int i = mo->indexOfProperty(prop);           
212  return mo->property(i).read(w).toString().toLatin1().data();
213}
214
215
216char qt_getcharproperty(QWidget *w, char *prop) 
217{
218  const QMetaObject *mo = w->metaObject();
219  int i = mo->indexOfProperty(prop);           
220  return mo->property(i).read(w).toChar().toLatin1();
221}
222
223
224int qt_getintproperty(QWidget *w, char *prop) 
225{
226  const QMetaObject *mo = w->metaObject();
227  int i = mo->indexOfProperty(prop);           
228  return mo->property(i).read(w).toInt();
229}
230
231
232double qt_getfloatproperty(QWidget *w, char *prop) 
233{
234  const QMetaObject *mo = w->metaObject();
235  int i = mo->indexOfProperty(prop);           
236  return mo->property(i).read(w).toDouble();
237}
238
239
240___bool qt_getboolproperty(QWidget *w, char *prop) 
241{
242  const QMetaObject *mo = w->metaObject();
243  int i = mo->indexOfProperty(prop);           
244  return mo->property(i).read(w).toBool();
245}
246
247
248qtpixmap qt_getpixmapproperty(QWidget *w, char *prop) 
249{
250  const QMetaObject *mo = w->metaObject();
251  int i = mo->indexOfProperty(prop);           
252  return new QPixmap(mo->property(i).read(w).value<QPixmap>());
253}
254
255
256C_word qt_getpointfproperty(QWidget *w, char *prop, C_word pt) 
257{
258  const QMetaObject *mo = w->metaObject();
259  int i = mo->indexOfProperty(prop);           
260  QPointF qpt = mo->property(i).read(w).toPointF();
261  *((double *)C_data_pointer(C_block_item(pt, 1))) = qpt.x();
262  ((double *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.y();
263  return pt;
264}
265
266
267C_word qt_getpointproperty(QWidget *w, char *prop, C_word pt) 
268{
269  const QMetaObject *mo = w->metaObject();
270  int i = mo->indexOfProperty(prop);           
271  QPoint qpt = mo->property(i).read(w).toPoint();
272  *((int *)C_data_pointer(C_block_item(pt, 1))) = qpt.x();
273  ((int *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.y();
274  return pt;
275}
276
277
278C_word qt_getrectfproperty(QWidget *w, char *prop, C_word pt) 
279{
280  const QMetaObject *mo = w->metaObject();
281  int i = mo->indexOfProperty(prop);           
282  QRectF qpt = mo->property(i).read(w).toRectF();
283  *((double *)C_data_pointer(C_block_item(pt, 1))) = qpt.x();
284  ((double *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.y();
285  ((double *)C_data_pointer(C_block_item(pt, 1)))[ 2 ] = qpt.width();
286  ((double *)C_data_pointer(C_block_item(pt, 1)))[ 3 ] = qpt.height();
287  return pt;
288}
289
290
291C_word qt_getrectproperty(QWidget *w, char *prop, C_word pt) 
292{
293  const QMetaObject *mo = w->metaObject();
294  int i = mo->indexOfProperty(prop);           
295  QRect qpt = mo->property(i).read(w).toRect();
296  *((int *)C_data_pointer(C_block_item(pt, 1))) = qpt.x();
297  ((int *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.y();
298  ((int *)C_data_pointer(C_block_item(pt, 1)))[ 2 ] = qpt.width();
299  ((int *)C_data_pointer(C_block_item(pt, 1)))[ 3 ] = qpt.height();
300  return pt;
301}
302
303
304C_word qt_getsizefproperty(QWidget *w, char *prop, C_word pt) 
305{
306  const QMetaObject *mo = w->metaObject();
307  int i = mo->indexOfProperty(prop);           
308  QSizeF qpt = mo->property(i).read(w).toSizeF();
309  *((double *)C_data_pointer(C_block_item(pt, 1))) = qpt.width();
310  ((double *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.height();
311  return pt;
312}
313
314
315C_word qt_getsizeproperty(QWidget *w, char *prop, C_word pt) 
316{
317  const QMetaObject *mo = w->metaObject();
318  int i = mo->indexOfProperty(prop);           
319  QSize qpt = mo->property(i).read(w).toSize();
320  *((int *)C_data_pointer(C_block_item(pt, 1))) = qpt.width();
321  ((int *)C_data_pointer(C_block_item(pt, 1)))[ 1 ] = qpt.height();
322  return pt;
323}
324
325
326int qt_propertytype(qtwidget w, char *prop)
327{
328  const QMetaObject *mo = w->metaObject();
329  int i = mo->indexOfProperty(prop);
330
331  if(i == -1) return 0;
332  else {
333    switch(mo->property(i).type()) {
334    case QVariant::Bool: return 1;
335    case QVariant::Char: return 2;
336    case QVariant::Double: return 3;
337    case QVariant::Int:
338    case QVariant::UInt: return 4;
339    case QVariant::LongLong:
340    case QVariant::ULongLong: return 3;
341    case QVariant::String: return 5;
342    case QVariant::Pixmap: return 6;
343    case QVariant::PointF: return 7;
344    case QVariant::RectF: return 8;
345    case QVariant::SizeF: return 9;
346    case QVariant::Point: return 10;
347    case QVariant::Size: return 11;
348    case QVariant::Rect: return 12;
349    default: return 0;
350    }
351  }
352}
353
354
355const char *qt_classname(qtobject w) { return w->metaObject()->className(); }
356qtwidget qt_gl(char *name, qtwidget parent, C_word proc) { return new GLWidget(name, parent, proc); }
357void qt_update(qtwidget w) { w->update(); }
358
359
360qttimer qt_timer(double secs)
361{
362  QTimer *tm = new QTimer();
363  tm->setInterval((int)(secs * 1000));
364  return tm;
365}
366
367
368void qt_start(qttimer t) { t->start(); }
369void qt_stoptimer(qttimer t) { t->stop(); }
370void qt_stopsound(qtsound t) { t->stop(); }
371void qt_clearlistwidget(qtwidget w) { ((QListWidget *)w)->clear(); }
372void qt_addcomboboxitem(qtwidget w, char *s) { ((QComboBox *)w)->addItem(s); }
373void qt_addlistwidgetitem(qtwidget w, char *s) { ((QListWidget *)w)->addItem(s); }
374
375void qt_addtreewidgetitem(qtwidget w, char *s)
376{ 
377  QStringList lst = QString(s).split("|");
378  ((QTreeWidget *)w)->addTopLevelItem(new QTreeWidgetItem(lst)); 
379}
380
381char *qt_listwidgetitem(qtwidget w, int i) { return ((QListWidget *)w)->item(i)->text().toLatin1().data(); }
382qtsound qt_sound(char *filename) { return new QSound(filename); }
383void qt_play(qtsound s) { s->play(); }
384
385
386char *qt_getexistingdirectory(qtwidget p, char *cap, char *dir, int opts)
387{
388  return QFileDialog::getExistingDirectory(p, cap, dir, (QFileDialog::Option)opts).toLatin1().data(); 
389}
390
391
392char *qt_getopenfilename(qtwidget p, char *cap, char *dir, char *filter, int opts)
393{
394  return QFileDialog::getOpenFileName(p, cap, dir, filter, 0, (QFileDialog::Options)opts).toLatin1().data();
395}
396
397
398char *qt_getsavefilename(qtwidget p, char *cap, char *dir, char *filter, int opts)
399{
400  return QFileDialog::getSaveFileName(p, cap, dir, filter, 0, (QFileDialog::Options)opts).toLatin1().data();
401}
402
403
404void qt_setheaders(qtwidget w, char *s) { ((QTreeWidget *)w)->setHeaderLabels(QString(s).split("|")); }
Note: See TracBrowser for help on using the repository browser.