TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
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-2026 by Eric EspiƩ, Bernhard Wymann
6 email : berniw@bluewin.ch
7
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
26void
28{
29}
30
31void
32gfuiPrintString(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
43void 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
65int GfuiFontHeight(int font)
66{
67 return gfuiFont[font]->getHeight();
68}
69
70int GfuiFontWidth(int font, const char *text)
71{
72 return gfuiFont[font]->getWidth(text);
73}
74
75void
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
113void
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:
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
146static 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
164void
166{
167 tGfuiButton *button;
168 tGfuiEditbox *editbox;
169 tGfuiGrButton *grbutton;
170 tGfuiObject *obj;
171
172 obj = GfuiScreen->hasFocus;
173 if (obj == NULL) {
174 return;
175 }
176 GfuiScreen->hasFocus = (tGfuiObject*)NULL;
177 obj->focus = 0;
178 switch (obj->widget) {
179 case GFUI_BUTTON:
180 button = &(obj->u.button);
181 button->state = GFUI_BTN_RELEASED;
183 break;
184 case GFUI_GRBUTTON:
185 grbutton = &(obj->u.grbutton);
186 grbutton->state = GFUI_BTN_RELEASED;
188 break;
189 case GFUI_EDITBOX:
190 editbox = &(obj->u.editbox);
191 editbox->state = GFUI_BTN_RELEASED;
193 break;
194 }
195}
196
197static void
199{
200 tGfuiButton *button;
201 tGfuiEditbox *editbox;
202 tGfuiGrButton *grbutton;
203
204 GfuiScreen->hasFocus = (tGfuiObject*)NULL;
205 obj->focus = 0;
206 switch (obj->widget) {
207 case GFUI_BUTTON:
208 button = &(obj->u.button);
209 button->state = GFUI_BTN_RELEASED;
211 break;
212 case GFUI_GRBUTTON:
213 grbutton = &(obj->u.grbutton);
214 grbutton->state = GFUI_BTN_RELEASED;
216 break;
217 case GFUI_EDITBOX:
218 editbox = &(obj->u.editbox);
219 editbox->state = GFUI_BTN_RELEASED;
221 break;
222 }
223}
224
225static void
227{
228 if (obj->state == GFUI_DISABLE &&
229 obj->widget != GFUI_BUTTON &&
230 obj->widget != GFUI_GRBUTTON) {
231 return;
232 }
233
234 tGfuiButton *button;
235 tGfuiEditbox *editbox;
236 tGfuiGrButton *grbutton;
237
238 if (GfuiScreen->hasFocus != NULL) {
239 gfuiLoseFocus(GfuiScreen->hasFocus);
240 }
241 GfuiScreen->hasFocus = obj;
242 obj->focus = 1;
243 switch (obj->widget) {
244 case GFUI_BUTTON:
245 button = &(obj->u.button);
247 break;
248 case GFUI_GRBUTTON:
249 grbutton = &(obj->u.grbutton);
250 gfuiRunAction(grbutton->onFocusAction);
251 break;
252 case GFUI_EDITBOX:
253 editbox = &(obj->u.editbox);
255 break;
256 }
257}
258
259void
261{
262 tGfuiObject *curObject;
263
264 curObject = GfuiScreen->hasFocus;
265 if (curObject != NULL) {
266 if (gfuiMouseIn(curObject)) {
267 return; /* focus has not changed */
268 }
269 if (curObject->focusMode != GFUI_FOCUS_MOUSE_CLICK) {
270 gfuiLoseFocus(GfuiScreen->hasFocus);
271 GfuiScreen->hasFocus = (tGfuiObject*)NULL;
272 }
273 }
274
275 /* Search for a new focused object */
276 curObject = GfuiScreen->objects;
277 if (curObject != NULL) {
278 do {
279 curObject = curObject->next;
280 if ((curObject->visible == 0) ||
281 (curObject->focusMode == GFUI_FOCUS_NONE) ||
282 ((curObject->focusMode == GFUI_FOCUS_MOUSE_CLICK) && (GfuiScreen->mouse == 0))) {
283 continue;
284 }
285 if (gfuiMouseIn(curObject)) {
286 gfuiSetFocus(curObject);
287 break;
288 }
289 } while (curObject != GfuiScreen->objects);
290 }
291}
292
293void
294gfuiSelectNext(void * /* dummy */)
295{
296 tGfuiObject *startObject;
297 tGfuiObject *curObject;
298
299 startObject = GfuiScreen->hasFocus;
300 if (startObject == NULL) {
301 startObject = GfuiScreen->objects;
302 }
303 if (startObject == NULL) {
304 return;
305 }
306 curObject = startObject;
307 do {
308 switch (curObject->widget) {
309 case GFUI_SCROLLIST:
310 gfuiScrollListNextElt(curObject);
311 break;
312
313 default:
314 curObject = curObject->next;
315 if ((curObject->focusMode != GFUI_FOCUS_NONE) &&
316 (curObject->state != GFUI_DISABLE) &&
317 (curObject->visible)) {
318 gfuiSetFocus(curObject);
319 return;
320 }
321 break;
322 }
323 } while (curObject != startObject);
324}
325
326void
327gfuiSelectPrev(void * /* dummy */)
328{
329 tGfuiObject *startObject;
330 tGfuiObject *curObject;
331
332 startObject = GfuiScreen->hasFocus;
333 if (startObject == NULL) {
334 startObject = GfuiScreen->objects;
335 if (startObject == NULL) {
336 return;
337 }
338 startObject = startObject->next;
339 }
340 curObject = startObject;
341 do {
342 switch (curObject->widget) {
343 case GFUI_SCROLLIST:
344 gfuiScrollListPrevElt(curObject);
345 break;
346
347 default:
348 curObject = curObject->prev;
349 if ((curObject->focusMode != GFUI_FOCUS_NONE) &&
350 (curObject->state != GFUI_DISABLE) &&
351 (curObject->visible)) {
352 gfuiSetFocus(curObject);
353 return;
354 }
355 break;
356 }
357 } while (curObject != startObject);
358}
359
360void
361gfuiSelectId(void *scr, int id)
362{
363 tGfuiObject *curObject;
364 tGfuiScreen *screen = (tGfuiScreen*)scr;
365
366 curObject = screen->objects;
367 if (curObject != NULL) {
368 do {
369 curObject = curObject->next;
370 if (curObject->id == id) {
371 gfuiSetFocus(curObject);
372 break;
373 }
374 } while (curObject != screen->objects);
375 }
376}
377
385int
386GfuiVisibilitySet(void *scr, int id, int visible)
387{
388 tGfuiObject *curObject;
389
390 curObject = gfuiGetObject(scr, id);
391 if (curObject == NULL) {
392 return -1;
393 }
394 switch(visible) {
395 case GFUI_VISIBLE:
396 curObject->visible = GFUI_VISIBLE;
397 break;
398 case GFUI_INVISIBLE:
399 curObject->visible = GFUI_INVISIBLE;
400 break;
401 default:
402 return -1;
403 }
404 return 0;
405}
406
414int
415GfuiEnable(void *scr, int id, int flag)
416{
417 tGfuiObject *curObject;
418
419 curObject = gfuiGetObject(scr, id);
420 if (curObject == NULL) {
421 return -1;
422 }
423 switch(flag) {
424 case GFUI_ENABLE:
425 curObject->state = GFUI_ENABLE;
426 break;
427 case GFUI_DISABLE:
428 curObject->state = GFUI_DISABLE;
429 break;
430 default:
431 return -1;
432 }
433 return 0;
434}
435
436void
438{
439 tGfuiObject *curObject;
440
441 curObject = GfuiScreen->hasFocus;
442 if (curObject != NULL) {
443 if (curObject->state == GFUI_DISABLE) {
444 return;
445 }
446
447 switch (curObject->widget) {
448 case GFUI_BUTTON:
449 gfuiButtonAction((int)action);
450 break;
451 case GFUI_GRBUTTON:
452 gfuiGrButtonAction((int)action);
453 break;
454 case GFUI_SCROLLIST:
455 gfuiScrollListAction((int)action);
456 break;
457 case GFUI_EDITBOX:
458 gfuiEditboxAction((int)action);
459 break;
460 }
461 }
462}
463
464void
466{
467 if (screen->objects == NULL) {
468 screen->objects = object;
469 object->next = object;
470 object->prev = object;
471 } else {
472 object->next = screen->objects->next;
473 object->prev = screen->objects;
474 screen->objects->next = object;
475 object->next->prev = object;
476 screen->objects = object;
477 }
478}
479
481gfuiGetObject(void *scr, int id)
482{
483 tGfuiObject *curObject;
484 tGfuiScreen *screen = (tGfuiScreen*)scr;
485
486 curObject = screen->objects;
487 if (curObject != NULL) {
488 do {
489 curObject = curObject->next;
490 if (curObject->id == id) {
491 return curObject;
492 }
493 } while (curObject != screen->objects);
494 }
495 return (tGfuiObject *)NULL;
496}
497
498
499void
501{
502 switch (curObject->widget){
503 case GFUI_LABEL:
504 gfuiReleaseLabel(curObject);
505 break;
506
507 case GFUI_BUTTON:
508 gfuiReleaseButton(curObject);
509 break;
510
511 case GFUI_GRBUTTON:
512 gfuiReleaseGrButton(curObject);
513 break;
514
515 case GFUI_SCROLLIST:
516 gfuiReleaseScrollist(curObject);
517 break;
518
519 case GFUI_SCROLLBAR:
520 gfuiReleaseScrollbar(curObject);
521 break;
522
523 case GFUI_EDITBOX:
524 gfuiReleaseEditbox(curObject);
525 break;
526 case GFUI_IMAGE:
527 gfuiReleaseImage(curObject);
528 break;
529 }
530}
static Vector y[4]
Definition Convex.cpp:56
void output(int x, int y, const char *text)
Definition guifont.cpp:280
int GfuiFontHeight(int font)
Get the height of an initialized GUI font.
Definition guiobject.cpp:65
int GfuiFontWidth(int font, const char *text)
Measure text using an initialized GUI font.
Definition guiobject.cpp:70
int GfuiVisibilitySet(void *scr, int id, int visible)
Set/unset the visibility attribute of an object.
int GfuiEnable(void *scr, int id, int flag)
Enable / Disable an object.
void GfuiUnSelectCurrent(void)
Remove focus from the active screen's current widget.
void GfuiPrintString(const char *text, float *fgColor, int font, int x, int y, int align)
Draw text immediately in the current OpenGL context without creating a widget.
Definition guiobject.cpp:43
tGfuiScreen * GfuiScreen
Definition gui.cpp:32
void gfuiRunAction(const tGfuiAction *action)
Definition gui.cpp:70
tMouseInfo GfuiMouse
Definition gui.cpp:34
void gfuiScrollListNextElt(tGfuiObject *object)
#define GFUI_FOCUS_NONE
Definition gui.h:128
void gfuiDrawImage(tGfuiObject *obj)
Definition guiimage.cpp:123
#define GFUI_BTN_RELEASED
Definition gui.h:91
void gfuiReleaseGrButton(tGfuiObject *obj)
void gfuiScrollListPrevElt(tGfuiObject *object)
void gfuiEditboxAction(int action)
Definition guiedit.cpp:219
#define GFUI_IMAGE
Definition gui.h:48
void gfuiReleaseLabel(tGfuiObject *obj)
Definition guilabel.cpp:261
void gfuiDrawLabel(tGfuiObject *obj)
Definition guilabel.cpp:242
void gfuiDrawGrButton(tGfuiObject *obj)
void gfuiScrollListAction(int mouse)
void gfuiReleaseImage(tGfuiObject *obj)
Definition guiimage.cpp:113
void gfuiReleaseScrollist(tGfuiObject *curObject)
struct GfuiObject tGfuiObject
void gfuiDrawScrollist(tGfuiObject *obj)
void gfuiButtonAction(int action)
void gfuiDrawButton(tGfuiObject *obj)
void gfuiDrawEditbox(tGfuiObject *obj)
Definition guiedit.cpp:165
void gfuiReleaseButton(tGfuiObject *obj)
void gfuiReleaseEditbox(tGfuiObject *curObject)
Definition guiedit.cpp:411
#define GFUI_FOCUS_MOUSE_CLICK
Definition gui.h:130
void gfuiGrButtonAction(int action)
void gfuiReleaseScrollbar(tGfuiObject *curObject)
GfuiFontClass * gfuiFont[FONT_NB]
Definition guifont.cpp:43
#define SCALE
void gfuiSelectPrev(void *)
void GfuiDrawCursor()
Definition guiobject.cpp:76
void GfuiDraw(tGfuiObject *obj)
void gfuiPrintString(int x, int y, GfuiFontClass *font, const char *string)
Definition guiobject.cpp:32
void gfuiSelectNext(void *)
void gfuiReleaseObject(tGfuiObject *curObject)
void gfuiAddObject(tGfuiScreen *screen, tGfuiObject *object)
static void gfuiLoseFocus(tGfuiObject *obj)
void gfuiUpdateFocus(void)
static void gfuiSetFocus(tGfuiObject *obj)
void gfuiObjectInit(void)
Definition guiobject.cpp:27
tGfuiObject * gfuiGetObject(void *scr, int id)
static int gfuiMouseIn(tGfuiObject *obj)
void gfuiMouseAction(int action)
void gfuiSelectId(void *scr, int id)
tGfuiButton button
Definition gui.h:204
tGfuiEditbox editbox
Definition gui.h:208
struct GfuiObject * prev
Definition gui.h:212
int ymin
Definition gui.h:199
int xmin
Definition gui.h:199
int visible
Definition gui.h:195
int xmax
Definition gui.h:200
int ymax
Definition gui.h:200
tGfuiGrButton grbutton
Definition gui.h:205
int state
Definition gui.h:198
int id
Definition gui.h:194
union GfuiObject::@107216344126174123112226307372375007210201317144 u
int widget
Definition gui.h:193
int focusMode
Definition gui.h:196
int focus
Definition gui.h:197
struct GfuiObject * next
Definition gui.h:211
unsigned int state
Definition gui.h:105
tGfuiAction * onFocusAction
Definition gui.h:109
tGfuiAction * onFocusLostAction
Definition gui.h:110
tGfuiAction * onFocusLostAction
Definition gui.h:183
int state
Definition gui.h:177
tGfuiAction * onFocusAction
Definition gui.h:182
tGfuiAction * onFocusLostAction
Definition gui.h:125
unsigned int state
Definition gui.h:115
tGfuiAction * onFocusAction
Definition gui.h:124
tGfuiObject * objects
Definition gui.h:236
The Gaming Framework API (client part).
#define GFUI_ENABLE
Definition tgfclient.h:242
#define GFUI_INVISIBLE
Object invisibility flag.
Definition tgfclient.h:239
#define GFUI_LABEL
Definition tgfclient.h:63
#define GFUI_GRBUTTON
Definition tgfclient.h:65
#define GFUI_SCROLLIST
Definition tgfclient.h:66
#define GFUI_BUTTON
Definition tgfclient.h:64
#define GFUI_EDITBOX
Definition tgfclient.h:68
#define GFUI_SCROLLBAR
Definition tgfclient.h:67
#define GFUI_VISIBLE
Object visibility flag.
Definition tgfclient.h:238
#define GFUI_DISABLE
Definition tgfclient.h:241