]> icculus.org git repositories - btb/d2x.git/blob - ui/gadget.c
more header cleanup
[btb/d2x.git] / ui / gadget.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 #ifdef HAVE_CONFIG_H
15 #include "conf.h"
16 #endif
17
18 #include <stdio.h>
19 #include <stdlib.h>
20
21 #include "u_mem.h"
22 #include "fix.h"
23 #include "gr.h"
24 #include "ui.h"
25 #include "key.h"
26
27
28 UI_GADGET * selected_gadget;
29
30 UI_GADGET * ui_gadget_add( UI_WINDOW * wnd, short kind, short x1, short y1, short x2, short y2 )
31 {
32         UI_GADGET * gadget;
33
34         gadget = (UI_GADGET *) d_malloc(sizeof(UI_GADGET));
35         if (gadget==NULL) exit(1);
36
37         if (wnd->gadget == NULL )
38         {
39                 wnd->gadget = gadget;
40                 gadget->prev = gadget;
41                 gadget->next = gadget;
42         } else {
43                 wnd->gadget->prev->next = gadget;
44                 gadget->next = wnd->gadget;
45                 gadget->prev = wnd->gadget->prev;
46                 wnd->gadget->prev = gadget;
47         }
48
49         gadget->when_tab = NULL;
50         gadget->when_btab = NULL;
51         gadget->when_up = NULL;
52         gadget->when_down = NULL;
53         gadget->when_left = NULL;
54         gadget->when_right = NULL;
55         gadget->kind = kind;
56         gadget->status = 1;
57         gadget->oldstatus = 0;
58         if ( x1==0 && x2==0 && y1==0 && y2== 0 )
59                 gadget->canvas = NULL;
60         else
61                 gadget->canvas = gr_create_sub_canvas( wnd->canvas, x1, y1, x2-x1+1, y2-y1+1 );
62         gadget->x1 = gadget->canvas->cv_bitmap.bm_x;
63         gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
64         gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1;
65         gadget->y2 = gadget->canvas->cv_bitmap.bm_y+y2-y1+1;
66         gadget->parent = NULL;
67         gadget->hotkey = -1;
68         return gadget;
69
70 }
71
72 void ui_gadget_delete_all( UI_WINDOW * wnd )
73 {
74         UI_GADGET * tmp;
75
76         ui_pad_deactivate();
77
78         while( wnd->gadget != NULL )
79         {
80                 tmp = wnd->gadget;
81                 if (tmp->next == tmp )
82                 {
83                         wnd->gadget = NULL;
84                 } else {
85                         tmp->next->prev = tmp->prev;
86                         tmp->prev->next = tmp->next;
87                         wnd->gadget = tmp->next;
88                 }
89                 if (tmp->canvas)
90                         gr_free_sub_canvas( tmp->canvas );
91
92
93                 if (tmp->kind == 1 )    // Button
94                 {
95                         UI_GADGET_BUTTON * but1 = (UI_GADGET_BUTTON *)tmp;
96                         if (but1->text)
97                                 d_free( but1->text );
98                 }
99
100                 if (tmp->kind == 6 )    // Inputbox
101                 {
102                         UI_GADGET_INPUTBOX * but1 = (UI_GADGET_INPUTBOX *)tmp;
103                         d_free( but1->text );
104                 }
105
106                 if (tmp->kind == 5 )    // Checkbox
107                 {
108                         UI_GADGET_CHECKBOX * but1 = (UI_GADGET_CHECKBOX *)tmp;
109                         d_free( but1->text );
110                 }
111                 
112                 if (tmp->kind == 9 )    // Icon
113                 {
114                         UI_GADGET_ICON * but1 = (UI_GADGET_ICON *)tmp;
115                         d_free( but1->text );
116                 }
117
118
119                 d_free( tmp );
120         }
121 }
122
123
124 int is_under_another_window( UI_WINDOW * win, UI_GADGET * gadget )
125 {
126         UI_WINDOW * temp;
127
128         temp = win->next;
129
130         while( temp != NULL )   {
131                 if (    ( gadget->x1 > temp->x)                                         &&
132                                 ( gadget->x1 < (temp->x+temp->width) )  &&
133                                 ( gadget->y1 > temp->y)                                         && 
134                                 ( gadget->y1 < (temp->y+temp->height) )
135                         )       
136                 {
137                                 //gadget->status =1;
138                                 return 1;
139                 }
140                 
141
142                 if (    ( gadget->x2 > temp->x)                                         &&
143                                 ( gadget->x2 < (temp->x+temp->width) )  &&
144                                 ( gadget->y2 > temp->y)                                         && 
145                                 ( gadget->y2 < (temp->y+temp->height) )
146                         )
147                 {
148                                 //gadget->status =1;
149                                 return 1;
150                 }
151                 
152
153                 temp = temp->next;
154         }
155         return 0;
156 }
157
158
159 int ui_mouse_on_gadget( UI_GADGET * gadget )
160 {
161         if ((Mouse.x >= gadget->x1) && (Mouse.x <= gadget->x2-1) &&     (Mouse.y >= gadget->y1) &&      (Mouse.y <= gadget->y2-1) )     {
162                 if (is_under_another_window(CurWindow, gadget))
163                         return 0;
164                 return 1;
165         } else
166                 return 0;
167 }
168
169 void ui_window_do_gadgets( UI_WINDOW * wnd )
170 {
171         int keypress;
172         UI_GADGET * tmp, * tmp1;
173
174         CurWindow = wnd;
175
176         keypress = last_keypress;
177
178         tmp = wnd->gadget;
179
180         if (tmp == NULL ) return;
181
182         if (selected_gadget==NULL)
183                 selected_gadget = tmp;
184
185         tmp1 = wnd->keyboard_focus_gadget;
186
187         do
188         {
189                 if (ui_mouse_on_gadget(tmp) && B1_JUST_PRESSED )
190                 {
191                         selected_gadget = tmp;
192                         if (tmp->parent!=NULL)
193                         {
194                                 while (tmp->parent != NULL )
195                                         tmp = tmp->parent;
196                                 wnd->keyboard_focus_gadget = tmp;
197                                 break;
198                         }
199                         else
200                         {
201                                 wnd->keyboard_focus_gadget = tmp;
202                                 break;
203                         }
204                 }
205                 if ( tmp->hotkey == keypress )
206                 {
207                         wnd->keyboard_focus_gadget = tmp;
208                         break;
209                 }
210                 tmp = tmp->next;
211         } while( tmp != wnd->gadget );
212
213         if (wnd->keyboard_focus_gadget != NULL)
214         {
215                 switch (keypress )
216                 {
217                         case (KEY_TAB):
218                                 if ( wnd->keyboard_focus_gadget->when_tab != NULL )
219                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_tab;
220                                 break;
221                         case (KEY_TAB+KEY_SHIFTED):
222                                 if ( wnd->keyboard_focus_gadget->when_btab != NULL )
223                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_btab;
224                                 break;
225                         case (KEY_UP):
226                                 if ( wnd->keyboard_focus_gadget->when_up != NULL )
227                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_up;
228                                 break;
229                         case (KEY_DOWN):
230                                 if ( wnd->keyboard_focus_gadget->when_down != NULL )
231                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_down;
232                                 break;
233                         case (KEY_LEFT):
234                                 if ( wnd->keyboard_focus_gadget->when_left != NULL )
235                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_left;
236                                 break;
237                         case (KEY_RIGHT):
238                                 if ( wnd->keyboard_focus_gadget->when_right != NULL )
239                                         wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_right;
240                                 break;
241                 }
242         }
243
244         if (wnd->keyboard_focus_gadget != tmp1)
245         {
246                 if (wnd->keyboard_focus_gadget != NULL )
247                         wnd->keyboard_focus_gadget->status = 1;
248                 if (tmp1 != NULL )
249                         tmp1->status = 1;
250         }
251
252         tmp = wnd->gadget;
253         do
254         {
255                 if (!is_under_another_window( CurWindow, tmp )) {
256                         UI_WINDOW *curwindow_save=CurWindow;
257
258                         switch( tmp->kind )
259                         {
260                         case 1:
261                                 ui_button_do( (UI_GADGET_BUTTON *)tmp, keypress );
262                                 break;
263                         case 2:
264                                 ui_listbox_do( (UI_GADGET_LISTBOX *)tmp, keypress );
265                                 break;
266                         case 3:
267                                 ui_scrollbar_do( (UI_GADGET_SCROLLBAR *)tmp, keypress );
268                                 break;
269                         case 4:
270                                 ui_radio_do( (UI_GADGET_RADIO *)tmp, keypress );
271                                 break;
272                         case 5:
273                                 ui_checkbox_do( (UI_GADGET_CHECKBOX *)tmp, keypress );
274                                 break;
275                         case 6:
276                                 ui_inputbox_do( (UI_GADGET_INPUTBOX *)tmp, keypress );
277                                 break;
278                         case 7:
279                                 ui_userbox_do( (UI_GADGET_USERBOX *)tmp, keypress );
280                                 break;
281                         case 8:
282                                 ui_keytrap_do( (UI_GADGET_KEYTRAP *)tmp, keypress );
283                                 break;
284                         case 9:
285                                 ui_icon_do( (UI_GADGET_ICON *)tmp, keypress );
286                                 break;
287                         }
288
289                         CurWindow=curwindow_save;
290                 }
291
292                 tmp = tmp->next;
293         } while( tmp != wnd->gadget );
294 }
295
296
297
298 UI_GADGET * ui_gadget_get_next( UI_GADGET * gadget )
299 {
300         UI_GADGET * tmp;
301
302         tmp = gadget->next;
303
304         while( tmp != gadget && (tmp->parent!=NULL) )
305                 tmp = tmp->next;
306
307         return tmp;
308 }
309
310 UI_GADGET * ui_gadget_get_prev( UI_GADGET * gadget )
311 {
312         UI_GADGET * tmp;
313
314         tmp = gadget->prev;
315
316         while( tmp != gadget && (tmp->parent!=NULL) )
317                 tmp = tmp->prev;
318
319         return tmp;
320 }
321
322 void ui_gadget_calc_keys( UI_WINDOW * wnd)
323 {
324         UI_GADGET * tmp;
325
326         tmp = wnd->gadget;
327
328         if (tmp==NULL) return;
329
330         do
331         {
332                 tmp->when_tab = ui_gadget_get_next(tmp);
333                 tmp->when_btab = ui_gadget_get_prev(tmp);
334
335                 tmp = tmp->next;
336         } while( tmp != wnd->gadget );
337
338 }