TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
guiedit.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : guiedit.cpp
4 created : Mon Apr 24 10:23:28 CEST 2000
5 copyright : (C) 2000-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
23
24#include <stdlib.h>
25#ifdef WIN32
26#include <windows.h>
27#endif
28#include <tgfclient.h>
29#include "gui.h"
30#include "guifont.h"
31
32void
34{
35}
36
52int
53GfuiEditboxCreateAction(void *scr, const char *text, int font, int x, int y, int width, int maxlen,
54 const tGfuiAction &onFocus, const tGfuiAction &onFocusLost, int margin)
55{
56 tGfuiEditbox *editbox;
57 tGfuiLabel *label;
58 tGfuiObject *object;
59 tGfuiScreen *screen = (tGfuiScreen*)scr;
60
61
62 object = (tGfuiObject*)calloc(1, sizeof(tGfuiObject));
63 object->widget = GFUI_EDITBOX;
64 object->focusMode = GFUI_FOCUS_MOUSE_CLICK;
65 object->id = screen->curId++;
66 object->visible = 1;
67
68 editbox = &(object->u.editbox);
69 editbox->state = GFUI_BTN_RELEASED;
70 editbox->onFocusAction = gfuiCreateAction(onFocus);
72
73 editbox->bgColor[0] = &(GfuiColor[GFUI_BGBTNDISABLED][0]);
74 editbox->bgColor[1] = &(GfuiColor[GFUI_BGBTNENABLED][0]);
75 editbox->bgColor[2] = &(GfuiColor[GFUI_BGBTNCLICK][0]);
76 editbox->bgFocusColor[0] = &(GfuiColor[GFUI_BGBTNDISABLED][0]);
77 editbox->bgFocusColor[1] = &(GfuiColor[GFUI_BGBTNFOCUS][0]);
78 editbox->bgFocusColor[2] = &(GfuiColor[GFUI_BGBTNCLICK][0]);
79 editbox->fgColor[0] = &(GfuiColor[GFUI_BTNDISABLED][0]);
80 editbox->fgColor[1] = &(GfuiColor[GFUI_BTNENABLED][0]);
81 editbox->fgColor[2] = &(GfuiColor[GFUI_BTNCLICK][0]);
82 editbox->fgFocusColor[0] = &(GfuiColor[GFUI_BTNDISABLED][0]);
83 editbox->fgFocusColor[1] = &(GfuiColor[GFUI_BTNFOCUS][0]);
84 editbox->fgFocusColor[2] = &(GfuiColor[GFUI_BTNCLICK][0]);
85 editbox->cursorColor[0] = &(GfuiColor[GFUI_EDITCURSORCLR][0]);
86 editbox->cursorColor[1] = &(GfuiColor[GFUI_EDITCURSORCLR][1]);
87 editbox->cursorColor[2] = &(GfuiColor[GFUI_EDITCURSORCLR][2]);
88
89
90 label = &(editbox->label);
91 if (maxlen == 0) maxlen = strlen(text);
92 label->text = (char*)calloc(1, maxlen+1);
93 strncpy(label->text, text, maxlen);
94 label->text[maxlen] = '\0';
95 label->font = gfuiFont[font];
96 label->maxlen = maxlen;
97
98 if (width == 0) {
99 char *buf;
100 int i;
101 buf = (char*)malloc(maxlen+1);
102 if (buf == NULL) return -1; // Memory leak does not matter, this must not happen
103 for (i = 0; i < maxlen; i++) buf[i] = 'W';
104 buf[i] = '\0';
105 width = gfuiFont[font]->getWidth((const char *)buf);
106 free(buf);
107 }
108
109 label->align = GFUI_ALIGN_HL_VC;
110 label->x = object->xmin = x;
111 label->y = y - 2 * gfuiFont[font]->getDescender();
112 object->ymin = y;
113 object->xmax = x + width;
114 object->ymax = y + gfuiFont[font]->getHeight() - gfuiFont[font]->getDescender();
115 editbox->cursory1 = object->ymin + 2;
116 editbox->cursory2 = object->ymax - 2;
117 editbox->cursorx = label->x;
118
119 object->xmin -= margin;
120 object->xmax += margin;
121
122 gfuiAddObject(screen, object);
123 return object->id;
124}
125
126int
127GfuiEditboxCreate(void *scr, const char *text, int font, int x, int y, int width, int maxlen,
128 void *userDataOnFocus, tfuiCallback onFocus, tfuiCallback onFocusLost, int margin)
129{
130 return GfuiEditboxCreateAction(scr, text, font, x, y, width, maxlen,
131 gfuiMakeAction(userDataOnFocus, onFocus),
132 gfuiMakeAction(userDataOnFocus, onFocusLost), margin);
133}
134
135
141int
143{
144 tGfuiObject *curObject;
145
146 if (GfuiScreen != NULL) {
147 curObject = GfuiScreen->objects;
148 if (curObject != NULL) {
149 do {
150 curObject = curObject->next;
151 if (curObject->focus) {
152 if (curObject->widget == GFUI_EDITBOX) {
153 return curObject->id;
154 }
155 return -1;
156 }
157 } while (curObject != GfuiScreen->objects);
158 }
159 }
160 return -1;
161}
162
163
164void
166{
167 tGfuiLabel *label;
168 tGfuiEditbox *editbox;
169 float *fgColor;
170 float *bgColor;
171
172 editbox = &(obj->u.editbox);
173 if (obj->state == GFUI_DISABLE) {
174 editbox->state = GFUI_BTN_DISABLE;
175 } else {
176 editbox->state = GFUI_BTN_RELEASED;
177 }
178 if (obj->focus) {
179 fgColor = editbox->fgFocusColor[editbox->state];
180 bgColor = editbox->bgFocusColor[editbox->state];
181 } else {
182 fgColor = editbox->fgColor[editbox->state];
183 bgColor = editbox->bgColor[editbox->state];
184 }
185
186 glColor4fv(bgColor);
187 glBegin(GL_QUADS);
188 glVertex2i(obj->xmin, obj->ymin);
189 glVertex2i(obj->xmin, obj->ymax);
190 glVertex2i(obj->xmax, obj->ymax);
191 glVertex2i(obj->xmax, obj->ymin);
192 glEnd();
193
194 glColor4fv(fgColor);
195 glBegin(GL_LINE_STRIP);
196 glVertex2i(obj->xmin, obj->ymin);
197 glVertex2i(obj->xmin, obj->ymax);
198 glVertex2i(obj->xmax, obj->ymax);
199 glVertex2i(obj->xmax, obj->ymin);
200 glVertex2i(obj->xmin, obj->ymin);
201 glEnd();
202
203 label = &(editbox->label);
204 glColor4fv(fgColor);
205 gfuiPrintString(label->x, label->y, label->font, label->text);
206
207 if ((obj->state != GFUI_DISABLE) && (obj->focus)) {
208 /* draw cursor */
209 glColor3fv(editbox->cursorColor[editbox->state]);
210 glBegin(GL_LINES);
211 glVertex2i(editbox->cursorx, editbox->cursory1);
212 glVertex2i(editbox->cursorx, editbox->cursory2);
213 glEnd();
214 }
215}
216
217
218void
220{
221 tGfuiObject *object;
222 tGfuiLabel *label;
223 tGfuiEditbox *editbox;
224 int relX;
225 char buf[256];
226 uint i;
227
228 object = GfuiScreen->hasFocus;
229 if (object->state == GFUI_DISABLE) {
230 return;
231 }
232
233 if (mouse == 2) { /* enter key */
235 } else if (mouse == 0) { /* mouse down */
236 editbox = &(object->u.editbox);
237 label = &(editbox->label);
238 /* Set the cursor position */
239 relX = GfuiMouse.X - label->x;
240 for (i = 0; i < strlen(label->text); i++){
241 buf[i] = label->text[i];
242 buf[i+1] = '\0';
243 if (relX < label->font->getWidth((const char *)buf)) {
244 break;
245 }
246 }
247 editbox->cursorIdx = i;
248 if (i == 0) {
249 editbox->cursorx = label->x;
250 } else {
251 buf[i] = '\0';
252 editbox->cursorx = label->x + label->font->getWidth((const char *)buf);
253 }
254 }
255}
256
257/* recalc cursorx with cursorIdx */
258static void
260{
261 char buf[256];
262 tGfuiEditbox *editbox;
263 tGfuiLabel *label;
264
265 editbox = &(obj->u.editbox);
266 label = &(editbox->label);
267 strncpy(buf, label->text, editbox->cursorIdx);
268 buf[editbox->cursorIdx] = '\0';
269 editbox->cursorx = label->x + label->font->getWidth((const char *)buf);
270}
271
272
273void
274gfuiEditboxKey(tGfuiObject *obj, int key, int modifier)
275{
276 tGfuiEditbox *editbox;
277 tGfuiLabel *label;
278 char *p1, *p2;
279 int i1, i2;
280
281 if (obj->state == GFUI_DISABLE) {
282 return;
283 }
284
285 editbox = &(obj->u.editbox);
286 label = &(editbox->label);
287
288 switch (modifier) {
289 case 0:
290 case GLUT_ACTIVE_SHIFT:
291 switch (key) {
292 case 256 + GLUT_KEY_RIGHT:
293 editbox->cursorIdx++;
294 if (editbox->cursorIdx > (int)strlen(label->text)) {
295 editbox->cursorIdx--;
296 }
297 break;
298 case 256 + GLUT_KEY_LEFT:
299 editbox->cursorIdx--;
300 if (editbox->cursorIdx < 0) {
301 editbox->cursorIdx = 0;
302 }
303 break;
304 case 256 + GLUT_KEY_HOME:
305 editbox->cursorIdx = 0;
306 break;
307 case 256 + GLUT_KEY_END:
308 editbox->cursorIdx = (int)strlen(label->text);
309 break;
310 case 0x7F : /* DEL */
311 if (editbox->cursorIdx < (int)strlen(label->text)) {
312 p1 = &(label->text[editbox->cursorIdx]);
313 p2 = &(label->text[editbox->cursorIdx+1]);
314 while ( *p1 != '\0' ) {
315 *p1++ = *p2++;
316 }
317 }
318 break;
319 case '\b' : /* Backspace */
320 if (editbox->cursorIdx > 0) {
321 p1 = &(label->text[editbox->cursorIdx-1]);
322 p2 = &(label->text[editbox->cursorIdx]);
323 while ( *p1 != '\0' ) {
324 *p1++ = *p2++;
325 }
326 editbox->cursorIdx--;
327 }
328 break;
329 }
330 if (key >= ' ' && key < 127) {
331 if ((int)strlen(label->text) < label->maxlen) {
332 i2 = (int)strlen(label->text) + 1;
333 i1 = i2 - 1;
334 while (i2 > editbox->cursorIdx) {
335 label->text[i2] = label->text[i1];
336 i1--;
337 i2--;
338 }
339 label->text[editbox->cursorIdx] = key;
340 editbox->cursorIdx++;
341 }
342 }
343 break;
344
345 case GLUT_ACTIVE_CTRL:
346 break;
347
348 case GLUT_ACTIVE_ALT:
349 break;
350 }
351
353}
354
363char *
364GfuiEditboxGetString(void *scr, int id)
365{
366 tGfuiObject *curObject;
367 tGfuiEditbox *editbox;
368 tGfuiLabel *label;
369
370 curObject = gfuiGetObject(scr, id);
371
372 if ((curObject == NULL) || (curObject->widget != GFUI_EDITBOX)) {
373 return (char*)NULL;
374 }
375
376 editbox = &(curObject->u.editbox);
377 label = &(editbox->label);
378
379 return label->text;
380}
381
390void GfuiEditboxSetString(void *scr, int id, const char *text)
391{
392 tGfuiObject *curObject;
393 tGfuiEditbox *editbox;
394 tGfuiLabel *label;
395
396 curObject = gfuiGetObject(scr, id);
397
398 if ((curObject == NULL) || (curObject->widget != GFUI_EDITBOX)) {
399 return;
400 }
401
402 editbox = &(curObject->u.editbox);
403 label = &(editbox->label);
404
405 strncpy(label->text, text, label->maxlen);
406 label->text[label->maxlen] = '\0';
407}
408
409
410void
412{
413 tGfuiEditbox *editbox;
414 tGfuiLabel *label;
415
416 editbox = &(curObject->u.editbox);
417 label = &(editbox->label);
420 free(label->text);
421 free(curObject);
422}
static Vector y[4]
Definition Convex.cpp:56
int getWidth(const char *text)
Definition guifont.cpp:222
static void onFocusLost(void)
int GfuiEditboxGetFocused(void)
Get the Id of the editbox focused in the current screen.
Definition guiedit.cpp:142
int GfuiEditboxCreateAction(void *scr, const char *text, int font, int x, int y, int width, int maxlen, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost, int margin)
Add an edit box to a screen.
Definition guiedit.cpp:53
int GfuiEditboxCreate(void *scr, const char *text, int font, int x, int y, int width, int maxlen, void *userDataOnFocus, tfuiCallback onFocus, tfuiCallback onFocusLost, int margin)
Create an edit box using callbacks with caller-supplied data.
Definition guiedit.cpp:127
void GfuiEditboxSetString(void *scr, int id, const char *text)
Set a new string.
Definition guiedit.cpp:390
char * GfuiEditboxGetString(void *scr, int id)
Get the current text of an edit box.
Definition guiedit.cpp:364
tGfuiScreen * GfuiScreen
Definition gui.cpp:32
void gfuiReleaseAction(tGfuiAction *action)
Definition gui.cpp:79
tGfuiAction gfuiMakeAction(void *userData, tfuiCallback callback)
Definition gui.cpp:48
float GfuiColor[GFUI_COLORNB][4]
Definition gui.cpp:38
tGfuiAction * gfuiCreateAction(const tGfuiAction &action)
Definition gui.cpp:60
tMouseInfo GfuiMouse
Definition gui.cpp:34
#define GFUI_BTNCLICK
Definition gui.h:34
#define GFUI_EDITCURSORCLR
Definition gui.h:47
#define GFUI_BTN_RELEASED
Definition gui.h:91
#define GFUI_BTN_DISABLE
Definition gui.h:90
#define GFUI_BGBTNENABLED
Definition gui.h:31
#define GFUI_BGBTNDISABLED
Definition gui.h:32
#define GFUI_BTNFOCUS
Definition gui.h:33
void gfuiPrintString(int x, int y, GfuiFontClass *font, const char *string)
Definition guiobject.cpp:32
#define GFUI_BGBTNCLICK
Definition gui.h:30
void gfuiSelectNext(void *)
#define GFUI_BGBTNFOCUS
Definition gui.h:29
void gfuiAddObject(tGfuiScreen *screen, tGfuiObject *object)
struct GfuiObject tGfuiObject
#define GFUI_BTNENABLED
Definition gui.h:35
tGfuiObject * gfuiGetObject(void *scr, int id)
#define GFUI_BTNDISABLED
Definition gui.h:36
#define GFUI_FOCUS_MOUSE_CLICK
Definition gui.h:130
void gfuiEditboxKey(tGfuiObject *obj, int key, int modifier)
Definition guiedit.cpp:274
void gfuiEditboxAction(int mouse)
Definition guiedit.cpp:219
void gfuiDrawEditbox(tGfuiObject *obj)
Definition guiedit.cpp:165
void gfuiEditboxInit(void)
Definition guiedit.cpp:33
void gfuiReleaseEditbox(tGfuiObject *curObject)
Definition guiedit.cpp:411
static void gfuiEditboxRecalcCursor(tGfuiObject *obj)
Definition guiedit.cpp:259
GfuiFontClass * gfuiFont[FONT_NB]
Definition guifont.cpp:43
tGfuiEditbox editbox
Definition gui.h:208
int ymin
Definition gui.h:199
int xmin
Definition gui.h:199
int xmax
Definition gui.h:200
int ymax
Definition gui.h:200
int state
Definition gui.h:198
int id
Definition gui.h:194
union GfuiObject::@107216344126174123112226307372375007210201317144 u
int widget
Definition gui.h:193
int focus
Definition gui.h:197
struct GfuiObject * next
Definition gui.h:211
float * bgColor[3]
Definition gui.h:173
tGfuiAction * onFocusLostAction
Definition gui.h:183
float * cursorColor[3]
Definition gui.h:172
int cursorIdx
Definition gui.h:181
int cursory1
Definition gui.h:179
int state
Definition gui.h:177
float * fgColor[3]
Definition gui.h:174
tGfuiLabel label
Definition gui.h:171
float * fgFocusColor[3]
Definition gui.h:176
float * bgFocusColor[3]
Definition gui.h:175
int cursory2
Definition gui.h:180
tGfuiAction * onFocusAction
Definition gui.h:182
int cursorx
Definition gui.h:178
char * text
Definition gui.h:80
int maxlen
Definition gui.h:86
int y
Definition gui.h:84
int align
Definition gui.h:85
int x
Definition gui.h:84
GfuiFontClass * font
Definition gui.h:83
int curId
Definition gui.h:238
The Gaming Framework API (client part).
void(* tfuiCallback)(void *)
Definition tgfclient.h:108
std::function< void()> tGfuiAction
Definition tgfclient.h:107
#define GFUI_EDITBOX
Definition tgfclient.h:68
#define GFUI_DISABLE
Definition tgfclient.h:241
#define GFUI_ALIGN_HL_VC
Definition tgfclient.h:72