b4840d139d5c6d9285e12820de522836bab8f330
[retroray] / src / rtk.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "rtk_impl.h"
4
5 rtk_widget *rtk_create_widget(void)
6 {
7         rtk_widget *w;
8
9         if(!(w = calloc(1, sizeof *w))) {
10                 return 0;
11         }
12         w->any.visible = w->any.enabled = 1;
13         return w;
14 }
15
16 void rtk_free_widget(rtk_widget *w)
17 {
18         if(!w) return;
19
20         if(w->type == RTK_WIN) {
21                 while(w->win.clist) {
22                         rtk_widget *c = w->win.clist;
23                         w->win.clist = w->win.clist->any.next;
24                         rtk_free_widget(c);
25                 }
26         }
27
28         free(w->any.text);
29         free(w);
30 }
31
32 int rtk_type(rtk_widget *w)
33 {
34         return w->type;
35 }
36
37 void rtk_move(rtk_widget *w, int x, int y)
38 {
39         w->any.x = x;
40         w->any.y = y;
41 }
42
43 void rtk_pos(rtk_widget *w, int *xptr, int *yptr)
44 {
45         *xptr = w->any.x;
46         *yptr = w->any.y;
47 }
48
49 void rtk_resize(rtk_widget *w, int xsz, int ysz)
50 {
51         w->any.width = xsz;
52         w->any.height = ysz;
53 }
54
55 void rtk_size(rtk_widget *w, int *xptr, int *yptr)
56 {
57         *xptr = w->any.width;
58         *yptr = w->any.height;
59 }
60
61 int rtk_set_text(rtk_widget *w, const char *str)
62 {
63         char *s = strdup(str);
64         if(!s) return -1;
65
66         free(w->any.text);
67         w->any.text = s;
68         return 0;
69 }
70
71 const char *rtk_get_text(rtk_widget *w)
72 {
73         return w->any.text;
74 }
75
76 void rtk_set_callback(rtk_widget *w, rtk_callback cbfunc, void *cls)
77 {
78         w->any.cbfunc = cbfunc;
79         w->any.cbcls = cls;
80 }
81
82 void rtk_win_layout(rtk_widget *w, int layout)
83 {
84         w->win.layout = layout;
85 }
86
87 void rtk_win_clear(rtk_widget *w)
88 {
89         rtk_widget *tmp;
90
91         RTK_ASSERT_TYPE(w, RTK_WIN);
92
93         while(w->win.clist) {
94                 tmp = w->win.clist;
95                 w->win.clist = w->win.clist->any.next;
96                 rtk_free_widget(tmp);
97         }
98
99         w->win.clist = w->win.ctail = 0;
100 }
101
102 void rtk_win_add(rtk_widget *par, rtk_widget *child)
103 {
104         RTK_ASSERT_TYPE(par, RTK_WIN);
105
106         if(rtk_win_has(par, child)) {
107                 return;
108         }
109
110         if(child->any.par) {
111                 rtk_win_rm(child->any.par, child);
112         }
113
114         if(par->win.clist) {
115                 par->win.ctail->any.next = child;
116                 par->win.ctail = child;
117         } else {
118                 par->win.clist = par->win.ctail = child;
119         }
120         child->any.next = 0;
121
122         child->any.par = par;
123 }
124
125 void rtk_win_rm(rtk_widget *par, rtk_widget *child)
126 {
127         rtk_widget *prev, dummy;
128
129         RTK_ASSERT_TYPE(par, RTK_WIN);
130
131         dummy.any.next = par->win.clist;
132         prev = &dummy;
133         while(prev->any.next) {
134                 if(prev->any.next == child) {
135                         if(!child->any.next) {
136                                 par->win.ctail = prev;
137                         }
138                         prev->any.next = child->any.next;
139                         break;
140                 }
141                 prev = prev->any.next;
142         }
143         par->win.clist = dummy.any.next;
144 }
145
146 int rtk_win_has(rtk_widget *par, rtk_widget *child)
147 {
148         rtk_widget *w;
149
150         RTK_ASSERT_TYPE(par, RTK_WIN);
151
152         w = par->win.clist;
153         while(w) {
154                 if(w == child) {
155                         return 1;
156                 }
157                 w = w->any.next;
158         }
159         return 0;
160 }
161
162 rtk_widget *rtk_create_window(rtk_widget *par, const char *title, int x, int y, int w, int h)
163 {
164         return 0;
165 }
166
167 rtk_widget *rtk_create_button(rtk_widget *par, const char *str, rtk_callback cbfunc)
168 {
169         return 0;
170 }
171
172 rtk_widget *rtk_create_iconbutton(rtk_widget *par, struct image *img, rtk_callback cbfunc)
173 {
174         return 0;
175 }
176
177 rtk_widget *rtk_create_label(rtk_widget *par, const char *text)
178 {
179         return 0;
180 }
181
182 rtk_widget *rtk_create_checkbox(rtk_widget *par, const char *text, int chk, rtk_callback cbfunc)
183 {
184         return 0;
185 }