-
Notifications
You must be signed in to change notification settings - Fork 6
/
qttest.nt
110 lines (100 loc) · 3.35 KB
/
qttest.nt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
module qttest;
import std.string;
extern(C) {
void qt_init();
void qt_fini();
void* alloc_binding(int);
void* lookup_class_method(char* classname, char* methodname);
void* stack_add_voidptr(void* prev, void* value);
void* call_method(void* method, void* object, void* stack);
void* make_binding(char* classid, void* object, void* stack);
void* alloc_string(char* ptr, int length);
}
void* call_method(void* object, string classid, string methid, void*[] args = void*[]:null) {
void* stack = stack_add_voidptr(null, null);
for auto arg <- args stack = stack_add_voidptr(stack, arg);
auto cm = lookup_class_method(toStringz classid, toStringz methid);
if (!cm) {
raise new Error "Method not found for $$classid ::$methid";
}
return .call_method(cm, object, stack);
}
pragma(linker, "qtbind.o");
pragma(lib, "stdc++");
pragma(lib, "smokeqtgui");
pragma(lib, "png");
shared void* binding;
void set_binding(void* obj, string classname) {
make_binding(toStringz classname, obj, null.stack_add_voidptr(null).stack_add_voidptr(binding));
}
void* allocate(string classname, flags = "", void*[] args = void*[]:null) {
auto obj = call_method(null, classname, "$classname$flags", args);
if (!obj) {
raise new Error "Unable to allocate $classname with $flags and $args";
}
set_binding (obj, classname);
return obj;
}
void* toQStr(string s) {
return alloc_string(s.ptr, s.length);
}
class QtObject {
string classname;
void* classp;
void init(string cn) {
classname = cn;
classp = allocate(classname);
}
void init(string cn, string str) {
classname = cn;
classp = allocate(classname, `$`, [toQStr str]);
}
void init(string cn, string code, void*[] arr) {
classname = cn;
classp = allocate(classname, code, arr);
}
void* call(string method) {
return call_method(classp, classname, method, null);
}
void* call(string method, void*[] args) {
return call_method(classp, classname, method, args);
}
void* call(string method, QtObject obj) {
return call_method(classp, classname, method, [obj.classp][]);
}
}
void main(string[] args) {
qt_init();
binding = alloc_binding(0);
args = string[]:null ~ "qttest" ~ args;
char** argv = [for arg <- args: toStringz arg].eval[].ptr;
int argc = args.length;
// set smoke binding
auto qapp = new QtObject ("QApplication", `$?`, [void*:&argc, void*:argv]);
auto qbutton = new QtObject ("QPushButton", "Hello World");
auto qlabel = new QtObject ("QLabel", "Hello <b>World</b>");
auto qgs = new QtObject "QGraphicsScene";
auto qgv = new QtObject ("QGraphicsView", `##`, [qgs.classp, null]);
auto qpm = new QtObject ("QPixmap", "smooth-rock-tex0-512.png");
auto qgpi = new QtObject ("QGraphicsPixmapItem", `###`, [qpm.classp, null, null]);
qgs.call(`addItem#`, qgpi);
auto prog = new QtObject ("QProgressBar");
prog.call(`setMinimum$`, [void*:0]);
prog.call(`setMaximum$`, [void*:100]);
prog.call(`setValue$`, [void*:60]);
using new QtObject("QSplitter", `$`, [void*:0]) {
using auto sp = new QtObject("QSplitter") {
that.call(`addWidget#`, qbutton);
that.call(`addWidget#`, qlabel);
that.call(`addWidget#`, qgv);
}
that.call(`addWidget#`, sp);
that.call(`addWidget#`, prog);
that.call(`show`);
}
writeln "exec";
int ret = int:qapp.call(`exec`);
writeln " => $ret";
qapp.call(`~QApplication`);
qt_fini();
}