TORCS  1.3.9
The Open Racing Car Simulator
guiobject.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  guiobject.cpp
3  -------------------
4  created : Fri Aug 13 22:25:06 CEST 1999
5  copyright : (C) 1999 by Eric Espie
6  email : torcs@free.fr
7  version : $Id$
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 
20 #ifdef WIN32
21 #include <windows.h>
22 #endif
23 #include <tgfclient.h>
24 #include "gui.h"
25 
26 void
28 {
29 }
30 
31 void
32 gfuiPrintString(int x, int y, GfuiFontClass *font, const char *string)
33 {
34  glEnable(GL_TEXTURE_2D);
35  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
36  glEnable(GL_ALPHA_TEST);
37  glAlphaFunc(GL_GREATER, 0.1) ;
38  font->output(x, y, string);
39  glDisable(GL_ALPHA_TEST);
40  glDisable(GL_TEXTURE_2D);
41 }
42 
43 void GfuiPrintString(const char *text, float *fgColor, int font, int x, int y, int align)
44 {
45  glEnable(GL_TEXTURE_2D);
46  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
47  glEnable(GL_ALPHA_TEST);
48  glAlphaFunc(GL_GREATER, 0.1) ;
49  glColor4fv(fgColor);
50  switch(align&0xF0) {
51  case 0x00 /* LEFT */:
52  gfuiFont[font]->output(x, y, text);
53  break;
54  case 0x10 /* CENTER */:
55  gfuiFont[font]->output(x - gfuiFont[font]->getWidth(text) / 2, y, text);
56  break;
57  case 0x20 /* RIGHT */:
58  gfuiFont[font]->output(x - gfuiFont[font]->getWidth(text), y, text);
59  break;
60  }
61  glDisable(GL_ALPHA_TEST);
62  glDisable(GL_TEXTURE_2D);
63 }
64 
65 int GfuiFontHeight(int font)
66 {
67  return gfuiFont[font]->getHeight();
68 }
69 
70 int GfuiFontWidth(int font, const char *text)
71 {
72  return gfuiFont[font]->getWidth(text);
73 }
74 
75 void
77 {
78  float xf = (float)(GfuiMouse.X);
79  float yf = (float)(GfuiMouse.Y);
80 
81 #define SCALE 1.3
82 
83  glColor4fv(GfuiScreen->mouseColor[0]) ;
84  glBegin(GL_TRIANGLES);
85  glVertex2f(xf, yf);
86  glVertex2f(xf + 4.8 * SCALE, yf - 10.4 * SCALE);
87  glVertex2f(xf + 6.4 * SCALE, yf - 6.4 * SCALE);
88  glEnd();
89 
90  glBegin(GL_QUADS);
91  glVertex2f(xf + 5.6 * SCALE, yf - 6.4 * SCALE);
92  glVertex2f(xf + 6 * SCALE, yf - 6 * SCALE);
93  glVertex2f(xf + 12.4 * SCALE, yf - 12.4 * SCALE);
94  glVertex2f(xf + 12 * SCALE, yf - 12.8 * SCALE);
95  glEnd();
96 
97  glColor4fv(GfuiScreen->mouseColor[1]) ;
98  glBegin(GL_TRIANGLES);
99  glVertex2f(xf, yf) ;
100  glVertex2f(xf + 10.4 * SCALE, yf - 4.8 * SCALE);
101  glVertex2f(xf + 6.4 * SCALE, yf - 6.4 * SCALE);
102  glEnd();
103 
104  glBegin(GL_QUADS);
105  glVertex2f(xf + 6 * SCALE, yf - 6 * SCALE);
106  glVertex2f(xf + 6.4 * SCALE, yf - 4.8 * SCALE);
107  glVertex2f(xf + 12.8 * SCALE, yf - 12 * SCALE);
108  glVertex2f(xf + 12.4 * SCALE, yf - 12.4 * SCALE);
109  glEnd();
110 
111 }
112 
113 void
115 {
116  if (obj->visible) {
117  switch (obj->widget){
118  case GFUI_LABEL:
119  gfuiDrawLabel(obj);
120  break;
121 
122  case GFUI_BUTTON:
123  gfuiDrawButton(obj);
124  break;
125 
126  case GFUI_GRBUTTON:
127  gfuiDrawGrButton(obj);
128  break;
129 
130  case GFUI_SCROLLIST:
131  gfuiDrawScrollist(obj);
132  break;
133 
134  case GFUI_EDITBOX:
135  gfuiDrawEditbox(obj);
136  break;
137 
138  case GFUI_IMAGE:
139  gfuiDrawImage(obj);
140  break;
141  }
142  }
143 }
144 
145 
146 static int
148 {
149  if ((GfuiMouse.X >= obj->xmin) &&
150  (GfuiMouse.X <= obj->xmax) &&
151  (GfuiMouse.Y >= obj->ymin) &&
152  (GfuiMouse.Y <= obj->ymax)) {
153  return 1;
154  }
155  return 0;
156 }
157 
161 void
163 {
164  tGfuiButton *button;
165  tGfuiEditbox *editbox;
166  tGfuiGrButton *grbutton;
167  tGfuiObject *obj;
168 
169  obj = GfuiScreen->hasFocus;
170  if (obj == NULL) {
171  return;
172  }
173  GfuiScreen->hasFocus = (tGfuiObject*)NULL;
174  obj->focus = 0;
175  switch (obj->widget) {
176  case GFUI_BUTTON:
177  button = &(obj->u.button);
178  button->state = GFUI_BTN_RELEASED;
179  if (button->onFocusLost != NULL) {
180  button->onFocusLost(button->userDataOnFocus);
181  }
182  break;
183  case GFUI_GRBUTTON:
184  grbutton = &(obj->u.grbutton);
185  grbutton->state = GFUI_BTN_RELEASED;
186  if (grbutton->onFocusLost != NULL) {
187  grbutton->onFocusLost(grbutton->userDataOnFocus);
188  }
189  break;
190  case GFUI_EDITBOX:
191  editbox = &(obj->u.editbox);
192  editbox->state = GFUI_BTN_RELEASED;
193  if (editbox->onFocusLost != NULL) {
194  editbox->onFocusLost(editbox->userDataOnFocus);
195  }
196  break;
197  }
198 }
199 
200 static void
202 {
203  if (obj->state == GFUI_DISABLE) {
204  return;
205  }
206 
207  tGfuiButton *button;
208  tGfuiEditbox *editbox;
209  tGfuiGrButton *grbutton;
210 
211  GfuiScreen->hasFocus = (tGfuiObject*)NULL;
212  obj->focus = 0;
213  switch (obj->widget) {
214  case GFUI_BUTTON:
215  button = &(obj->u.button);
216  button->state = GFUI_BTN_RELEASED;
217  if (button->onFocusLost != NULL) {
218  button->onFocusLost(button->userDataOnFocus);
219  }
220  break;
221  case GFUI_GRBUTTON:
222  grbutton = &(obj->u.grbutton);
223  grbutton->state = GFUI_BTN_RELEASED;
224  if (grbutton->onFocusLost != NULL) {
225  grbutton->onFocusLost(grbutton->userDataOnFocus);
226  }
227  break;
228  case GFUI_EDITBOX:
229  editbox = &(obj->u.editbox);
230  editbox->state = GFUI_BTN_RELEASED;
231  if (editbox->onFocusLost != NULL) {
232  editbox->onFocusLost(editbox->userDataOnFocus);
233  }
234  break;
235  }
236 }
237 
238 static void
240 {
241  if (obj->state == GFUI_DISABLE) {
242  return;
243  }
244 
245  tGfuiButton *button;
246  tGfuiEditbox *editbox;
247  tGfuiGrButton *grbutton;
248 
249  if (GfuiScreen->hasFocus != NULL) {
251  }
252  GfuiScreen->hasFocus = obj;
253  obj->focus = 1;
254  switch (obj->widget) {
255  case GFUI_BUTTON:
256  button = &(obj->u.button);
257  if (button->onFocus != NULL) {
258  button->onFocus(button->userDataOnFocus);
259  }
260  break;
261  case GFUI_GRBUTTON:
262  grbutton = &(obj->u.grbutton);
263  if (grbutton->onFocus != NULL) {
264  grbutton->onFocus(grbutton->userDataOnFocus);
265  }
266  break;
267  case GFUI_EDITBOX:
268  editbox = &(obj->u.editbox);
269  if (editbox->onFocus != NULL) {
270  editbox->onFocus(editbox->userDataOnFocus);
271  }
272  break;
273  }
274 }
275 
276 void
278 {
279  tGfuiObject *curObject;
280 
281  curObject = GfuiScreen->hasFocus;
282  if (curObject != NULL) {
283  if (gfuiMouseIn(curObject)) {
284  return; /* focus has not changed */
285  }
286  if (curObject->focusMode != GFUI_FOCUS_MOUSE_CLICK) {
288  GfuiScreen->hasFocus = (tGfuiObject*)NULL;
289  }
290  }
291 
292  /* Search for a new focused object */
293  curObject = GfuiScreen->objects;
294  if (curObject != NULL) {
295  do {
296  curObject = curObject->next;
297  if ((curObject->visible == 0) ||
298  (curObject->focusMode == GFUI_FOCUS_NONE) ||
299  ((curObject->focusMode == GFUI_FOCUS_MOUSE_CLICK) && (GfuiScreen->mouse == 0))) {
300  continue;
301  }
302  if (gfuiMouseIn(curObject)) {
303  gfuiSetFocus(curObject);
304  break;
305  }
306  } while (curObject != GfuiScreen->objects);
307  }
308 }
309 
310 void
311 gfuiSelectNext(void * /* dummy */)
312 {
313  tGfuiObject *startObject;
314  tGfuiObject *curObject;
315 
316  startObject = GfuiScreen->hasFocus;
317  if (startObject == NULL) {
318  startObject = GfuiScreen->objects;
319  }
320  if (startObject == NULL) {
321  return;
322  }
323  curObject = startObject;
324  do {
325  switch (curObject->widget) {
326  case GFUI_SCROLLIST:
327  gfuiScrollListNextElt(curObject);
328  break;
329 
330  default:
331  curObject = curObject->next;
332  if ((curObject->focusMode != GFUI_FOCUS_NONE) &&
333  (curObject->state != GFUI_DISABLE) &&
334  (curObject->visible)) {
335  gfuiSetFocus(curObject);
336  return;
337  }
338  break;
339  }
340  } while (curObject != startObject);
341 }
342 
343 void
344 gfuiSelectPrev(void * /* dummy */)
345 {
346  tGfuiObject *startObject;
347  tGfuiObject *curObject;
348 
349  startObject = GfuiScreen->hasFocus;
350  if (startObject == NULL) {
351  startObject = GfuiScreen->objects;
352  if (startObject == NULL) {
353  return;
354  }
355  startObject = startObject->next;
356  }
357  curObject = startObject;
358  do {
359  switch (curObject->widget) {
360  case GFUI_SCROLLIST:
361  gfuiScrollListPrevElt(curObject);
362  break;
363 
364  default:
365  curObject = curObject->prev;
366  if ((curObject->focusMode != GFUI_FOCUS_NONE) &&
367  (curObject->state != GFUI_DISABLE) &&
368  (curObject->visible)) {
369  gfuiSetFocus(curObject);
370  return;
371  }
372  break;
373  }
374  } while (curObject != startObject);
375 }
376 
377 void
378 gfuiSelectId(void *scr, int id)
379 {
380  tGfuiObject *curObject;
381  tGfuiScreen *screen = (tGfuiScreen*)scr;
382 
383  curObject = screen->objects;
384  if (curObject != NULL) {
385  do {
386  curObject = curObject->next;
387  if (curObject->id == id) {
388  gfuiSetFocus(curObject);
389  break;
390  }
391  } while (curObject != screen->objects);
392  }
393 }
394 
403 int
404 GfuiVisibilitySet(void *scr, int id, int visible)
405 {
406  tGfuiObject *curObject;
407 
408  curObject = gfuiGetObject(scr, id);
409  if (curObject == NULL) {
410  return -1;
411  }
412  switch(visible) {
413  case GFUI_VISIBLE:
414  curObject->visible = GFUI_VISIBLE;
415  break;
416  case GFUI_INVISIBLE:
417  curObject->visible = GFUI_INVISIBLE;
418  break;
419  default:
420  return -1;
421  }
422  return 0;
423 }
424 
433 int
434 GfuiEnable(void *scr, int id, int flag)
435 {
436  tGfuiObject *curObject;
437 
438  curObject = gfuiGetObject(scr, id);
439  if (curObject == NULL) {
440  return -1;
441  }
442  switch(flag) {
443  case GFUI_ENABLE:
444  curObject->state = GFUI_ENABLE;
445  break;
446  case GFUI_DISABLE:
447  curObject->state = GFUI_DISABLE;
448  break;
449  default:
450  return -1;
451  }
452  return 0;
453 }
454 
455 void
456 gfuiMouseAction(void *vaction)
457 {
458  tGfuiObject *curObject;
459  long action = (long)vaction;
460 
461  curObject = GfuiScreen->hasFocus;
462  if (curObject != NULL) {
463  if (curObject->state == GFUI_DISABLE) {
464  return;
465  }
466 
467  switch (curObject->widget) {
468  case GFUI_BUTTON:
469  gfuiButtonAction((int)action);
470  break;
471  case GFUI_GRBUTTON:
472  gfuiGrButtonAction((int)action);
473  break;
474  case GFUI_SCROLLIST:
475  gfuiScrollListAction((int)action);
476  break;
477  case GFUI_EDITBOX:
478  gfuiEditboxAction((int)action);
479  break;
480  }
481  }
482 }
483 
484 void
486 {
487  if (screen->objects == NULL) {
488  screen->objects = object;
489  object->next = object;
490  object->prev = object;
491  } else {
492  object->next = screen->objects->next;
493  object->prev = screen->objects;
494  screen->objects->next = object;
495  object->next->prev = object;
496  screen->objects = object;
497  }
498 }
499 
500 tGfuiObject *
501 gfuiGetObject(void *scr, int id)
502 {
503  tGfuiObject *curObject;
504  tGfuiScreen *screen = (tGfuiScreen*)scr;
505 
506  curObject = screen->objects;
507  if (curObject != NULL) {
508  do {
509  curObject = curObject->next;
510  if (curObject->id == id) {
511  return curObject;
512  }
513  } while (curObject != screen->objects);
514  }
515  return (tGfuiObject *)NULL;
516 }
517 
518 
519 void
521 {
522  switch (curObject->widget){
523  case GFUI_LABEL:
524  gfuiReleaseLabel(curObject);
525  break;
526 
527  case GFUI_BUTTON:
528  gfuiReleaseButton(curObject);
529  break;
530 
531  case GFUI_GRBUTTON:
532  gfuiReleaseGrButton(curObject);
533  break;
534 
535  case GFUI_SCROLLIST:
536  gfuiReleaseScrollist(curObject);
537  break;
538 
539  case GFUI_SCROLLBAR:
540  gfuiReleaseScrollbar(curObject);
541  break;
542 
543  case GFUI_EDITBOX:
544  gfuiReleaseEditbox(curObject);
545  break;
546  case GFUI_IMAGE:
547  gfuiReleaseImage(curObject);
548  break;
549  }
550 }
int focus
Definition: gui.h:203
void output(int x, int y, const char *text)
Definition: guifont.cpp:280
struct GfuiObject * prev
Definition: gui.h:218
void gfuiReleaseGrButton(tGfuiObject *obj)
Definition: guibutton.cpp:636
tfuiCallback onFocusLost
Definition: gui.h:129
void GfuiUnSelectCurrent(void)
Remove the focus on the current element.
Definition: guiobject.cpp:162
tGfuiEditbox editbox
Definition: gui.h:214
tfuiCallback onFocus
Definition: gui.h:111
void * userDataOnFocus
Definition: gui.h:110
void gfuiObjectInit(void)
Definition: guiobject.cpp:27
tfuiCallback onFocus
Definition: gui.h:188
int id
Definition: gui.h:200
int focusMode
Definition: gui.h:202
#define GFUI_SCROLLBAR
Definition: tgfclient.h:65
void gfuiReleaseImage(tGfuiObject *obj)
Definition: guiimage.cpp:109
void gfuiPrintString(int x, int y, GfuiFontClass *font, const char *string)
Definition: guiobject.cpp:32
void GfuiDraw(tGfuiObject *obj)
Definition: guiobject.cpp:114
#define GFUI_BUTTON
Definition: tgfclient.h:62
int mouse
Definition: gui.h:260
void gfuiDrawLabel(tGfuiObject *obj)
Definition: guilabel.cpp:260
void gfuiAddObject(tGfuiScreen *screen, tGfuiObject *object)
Definition: guiobject.cpp:485
tGfuiGrButton grbutton
Definition: gui.h:211
int ymin
Definition: gui.h:205
The Gaming Framework API (client part).
int state
Definition: gui.h:182
#define GFUI_EDITBOX
Definition: tgfclient.h:66
float * mouseColor[2]
Definition: gui.h:262
#define SCALE
void gfuiButtonAction(int action)
Definition: guibutton.cpp:551
#define GFUI_SCROLLIST
Definition: tgfclient.h:64
tGfuiButton button
Definition: gui.h:210
GfuiFontClass * gfuiFont[FONT_NB]
Definition: guifont.cpp:43
tGfuiObject * gfuiGetObject(void *scr, int id)
Definition: guiobject.cpp:501
#define GFUI_ENABLE
Definition: tgfclient.h:162
static int gfuiMouseIn(tGfuiObject *obj)
Definition: guiobject.cpp:147
#define GFUI_GRBUTTON
Definition: tgfclient.h:63
int xmax
Definition: gui.h:206
void gfuiDrawGrButton(tGfuiObject *obj)
Definition: guibutton.cpp:453
#define GFUI_IMAGE
Definition: gui.h:48
void gfuiDrawImage(tGfuiObject *obj)
Definition: guiimage.cpp:119
int visible
Definition: gui.h:201
#define GFUI_BTN_RELEASED
Definition: gui.h:91
#define GFUI_FOCUS_NONE
Definition: gui.h:132
int GfuiFontHeight(int font)
Definition: guiobject.cpp:65
void gfuiDrawEditbox(tGfuiObject *obj)
Definition: guiedit.cpp:161
tMouseInfo GfuiMouse
Definition: gui.cpp:37
unsigned int state
Definition: gui.h:105
void gfuiUpdateFocus(void)
Definition: guiobject.cpp:277
tfuiCallback onFocusLost
Definition: gui.h:112
void gfuiSelectPrev(void *)
Definition: guiobject.cpp:344
void gfuiReleaseEditbox(tGfuiObject *curObject)
Definition: guiedit.cpp:404
void GfuiPrintString(const char *text, float *fgColor, int font, int x, int y, int align)
Definition: guiobject.cpp:43
void gfuiEditboxAction(int action)
Definition: guiedit.cpp:215
void gfuiDrawScrollist(tGfuiObject *obj)
union GfuiObject::@17 u
tGfuiScreen * GfuiScreen
Definition: gui.cpp:35
tfuiCallback onFocus
Definition: gui.h:128
void GfuiDrawCursor()
Definition: guiobject.cpp:76
#define GFUI_FOCUS_MOUSE_CLICK
Definition: gui.h:134
unsigned int state
Definition: gui.h:117
void gfuiScrollListNextElt(tGfuiObject *object)
struct GfuiObject * next
Definition: gui.h:217
static void gfuiLoseFocus(tGfuiObject *obj)
Definition: guiobject.cpp:201
#define GFUI_INVISIBLE
Object invisibility flag.
Definition: tgfclient.h:159
int GfuiEnable(void *scr, int id, int flag)
Enable / Disable an object.
Definition: guiobject.cpp:434
int GfuiFontWidth(int font, const char *text)
Definition: guiobject.cpp:70
void gfuiReleaseObject(tGfuiObject *curObject)
Definition: guiobject.cpp:520
#define GFUI_DISABLE
Definition: tgfclient.h:161
void gfuiReleaseButton(tGfuiObject *obj)
Definition: guibutton.cpp:622
void gfuiDrawButton(tGfuiObject *obj)
Definition: guibutton.cpp:409
void gfuiScrollListPrevElt(tGfuiObject *object)
void gfuiReleaseLabel(tGfuiObject *obj)
Definition: guilabel.cpp:279
void * userDataOnFocus
Definition: gui.h:187
static Vector y[4]
Definition: Convex.cpp:56
int getHeight() const
Definition: guifont.cpp:261
void gfuiReleaseScrollist(tGfuiObject *curObject)
#define GFUI_LABEL
Definition: tgfclient.h:61
tGfuiObject * hasFocus
Definition: gui.h:244
int ymax
Definition: gui.h:206
tGfuiObject * objects
Definition: gui.h:243
static void gfuiSetFocus(tGfuiObject *obj)
Definition: guiobject.cpp:239
int state
Definition: gui.h:204
tfuiCallback onFocusLost
Definition: gui.h:189
void * userDataOnFocus
Definition: gui.h:127
void gfuiReleaseScrollbar(tGfuiObject *curObject)
int GfuiVisibilitySet(void *scr, int id, int visible)
Set/unset the visibility attribute of an object.
Definition: guiobject.cpp:404
void gfuiMouseAction(void *vaction)
Definition: guiobject.cpp:456
void gfuiScrollListAction(int mouse)
void gfuiGrButtonAction(int action)
Definition: guibutton.cpp:476
int widget
Definition: gui.h:199
int xmin
Definition: gui.h:205
void gfuiSelectNext(void *)
Definition: guiobject.cpp:311
#define GFUI_VISIBLE
Object visibility flag.
Definition: tgfclient.h:158
void gfuiSelectId(void *scr, int id)
Definition: guiobject.cpp:378
int getWidth(const char *text)
Definition: guifont.cpp:222