1 /***************************************************************************
2
3 file : guiscrollbar.cpp
4 created : Mon Aug 23 22:11:37 CEST 1999
5 copyright : (C) 1999 by Eric Espie
6 email : torcs@free.fr
7 version : $Id: guiscrollbar.cpp,v 1.3.2.3 2012/05/20 11:59:32 berniw Exp $
8
9 ***************************************************************************/
10
11 /***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 ***************************************************************************/
19
20 /** @file
21 GUI scrollbar management.
22 @author <a href=mailto:torcs@free.fr>Eric Espie</a>
23 @version $Id: guiscrollbar.cpp,v 1.3.2.3 2012/05/20 11:59:32 berniw Exp $
24 @ingroup gui
25 */
26
27 #include <stdlib.h>
28 #ifdef WIN32
29 #include <windows.h>
30 #endif
31 #include <tgfclient.h>
32 #include "gui.h"
33
34 void
gfuiScrollBarInit(void)35 gfuiScrollBarInit(void)
36 {
37 }
38
39 static void
gfuiScrollPlus(void * idv)40 gfuiScrollPlus(void *idv)
41 {
42 tGfuiObject *object;
43 tGfuiScrollBar *scrollbar;
44 tScrollBarInfo info;
45
46 object = (tGfuiObject *) idv;
47
48 if(object == NULL) {
49 return;
50 }
51
52 scrollbar = &(object->u.scrollbar);
53 scrollbar->pos++;
54
55 if(scrollbar->pos > scrollbar->max) {
56 scrollbar->pos = scrollbar->max;
57 } else if(scrollbar->onScroll != NULL) {
58 info.pos = scrollbar->pos;
59 info.userData = scrollbar->userData;
60 scrollbar->onScroll(&info);
61 }
62 }
63
64 static void
gfuiScrollMinus(void * idv)65 gfuiScrollMinus(void *idv)
66 {
67 tGfuiObject *object;
68 tGfuiScrollBar *scrollbar;
69 tScrollBarInfo info;
70
71 object = (tGfuiObject *) idv;
72
73 if(object == NULL) {
74 return;
75 }
76
77 scrollbar = &(object->u.scrollbar);
78 scrollbar->pos--;
79
80 if(scrollbar->pos < scrollbar->min) {
81 scrollbar->pos = scrollbar->min;
82 } else if(scrollbar->onScroll != NULL) {
83 info.pos = scrollbar->pos;
84 info.userData = scrollbar->userData;
85 scrollbar->onScroll(&info);
86 }
87 }
88
89 /** Create a new scroll bar.
90 @ingroup gui
91 @param scr Screen where to create the scroll bar
92 @param x X position
93 @param y Y position
94 @param align Position of the specified point:
95 <br>GFUI_ALIGN_HR_VB horizontal right, vertical bottom
96 <br>GFUI_ALIGN_HR_VC horizontal right, vertical center
97 <br>GFUI_ALIGN_HR_VT horizontal right, vertical top
98 <br>GFUI_ALIGN_HC_VB horizontal center, vertical bottom
99 <br>GFUI_ALIGN_HC_VC horizontal center, vertical center
100 <br>GFUI_ALIGN_HC_VT horizontal center, vertical top
101 <br>GFUI_ALIGN_HL_VB horizontal left, vertical bottom
102 <br>GFUI_ALIGN_HL_VC horizontal left, vertical center
103 <br>GFUI_ALIGN_HL_VT horizontal left, vertical top
104 @param width width including the arrows
105 @param orientation Scroll bar orientation:
106 <br>GFUI_HORI_SCROLLBAR Horizontal
107 <br>GFUI_VERT_SCROLLBAR Vertical
108 @param min Minimum value
109 @param max Maximum value
110 @param len Visible length
111 @param start Starting position
112 @param userData User data given to the call back function
113 @param onScroll Call back function called when the position change
114 @return Scroll Bar Id
115 <br>-1 Error
116 */
117 int
GfuiScrollBarCreate(void * scr,int x,int y,int align,int width,int orientation,int min,int max,int len,int start,void * userData,tfuiSBCallback onScroll)118 GfuiScrollBarCreate(void *scr, int x, int y, int align, int width, int orientation,
119 int min, int max, int len, int start,
120 void *userData, tfuiSBCallback onScroll)
121 {
122 tGfuiObject *object;
123 tGfuiScrollBar *scrollbar;
124 tGfuiScreen *screen = (tGfuiScreen *)scr;
125
126 object = (tGfuiObject *)calloc(1, sizeof(tGfuiObject));
127 object->widget = GFUI_SCROLLBAR;
128 object->focusMode = GFUI_FOCUS_MOUSE_CLICK;
129 object->id = screen->curId++;
130 object->visible = 1;
131
132 scrollbar = &(object->u.scrollbar);
133 scrollbar->userData = userData;
134 scrollbar->onScroll = onScroll;
135
136 switch(orientation) {
137 case GFUI_HORI_SCROLLBAR:
138
139 switch(align) {
140 case GFUI_ALIGN_HR_VB:
141 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
142 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
143 x, y, GFUI_ALIGN_HR_VB, 1,
144 (void *)(object), gfuiScrollPlus,
145 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
146 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
147 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
148 x - width, y, GFUI_ALIGN_HL_VB, 1,
149 (void *)(object), gfuiScrollMinus,
150 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
151 break;
152 case GFUI_ALIGN_HR_VC:
153 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
154 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
155 x, y, GFUI_ALIGN_HR_VC, 1,
156 (void *)(object), gfuiScrollPlus,
157 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
158 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
159 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
160 x - width, y, GFUI_ALIGN_HL_VC, 1,
161 (void *)(object), gfuiScrollMinus,
162 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
163 break;
164 case GFUI_ALIGN_HR_VT:
165 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
166 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
167 x, y, GFUI_ALIGN_HR_VT, 1,
168 (void *)(object), gfuiScrollPlus,
169 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
170 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
171 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
172 x - width, y, GFUI_ALIGN_HL_VT, 1,
173 (void *)(object), gfuiScrollMinus,
174 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
175 break;
176 case GFUI_ALIGN_HC_VB:
177 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
178 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
179 x + width / 2, y, GFUI_ALIGN_HR_VB, 1,
180 (void *)(object), gfuiScrollPlus,
181 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
182 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
183 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
184 x - width / 2, y, GFUI_ALIGN_HL_VB, 1,
185 (void *)(object), gfuiScrollMinus,
186 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
187 break;
188 case GFUI_ALIGN_HC_VC:
189 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
190 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
191 x + width / 2, y, GFUI_ALIGN_HR_VC, 1,
192 (void *)(object), gfuiScrollPlus,
193 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
194 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
195 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
196 x - width / 2, y, GFUI_ALIGN_HL_VC, 1,
197 (void *)(object), gfuiScrollMinus,
198 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
199 break;
200 case GFUI_ALIGN_HC_VT:
201 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
202 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
203 x + width / 2, y, GFUI_ALIGN_HR_VT, 1,
204 (void *)(object), gfuiScrollPlus,
205 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
206 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
207 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
208 x - width / 2, y, GFUI_ALIGN_HL_VT, 1,
209 (void *)(object), gfuiScrollMinus,
210 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
211 break;
212 case GFUI_ALIGN_HL_VB:
213 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
214 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
215 x + width, y, GFUI_ALIGN_HR_VB, 1,
216 (void *)(object), gfuiScrollPlus,
217 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
218 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
219 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
220 x, y, GFUI_ALIGN_HL_VB, 1,
221 (void *)(object), gfuiScrollMinus,
222 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
223 break;
224 case GFUI_ALIGN_HL_VC:
225 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
226 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
227 x + width, y, GFUI_ALIGN_HR_VC, 1,
228 (void *)(object), gfuiScrollPlus,
229 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
230 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
231 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
232 x, y, GFUI_ALIGN_HL_VC, 1,
233 (void *)(object), gfuiScrollMinus,
234 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
235 break;
236 case GFUI_ALIGN_HL_VT:
237 GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png",
238 "data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
239 x + width, y, GFUI_ALIGN_HR_VT, 1,
240 (void *)(object), gfuiScrollPlus,
241 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
242 GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png",
243 "data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
244 x, y, GFUI_ALIGN_HL_VT, 1,
245 (void *)(object), gfuiScrollMinus,
246 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
247 break;
248 default:
249 break;
250 }
251
252 break;
253 case GFUI_VERT_SCROLLBAR:
254
255 switch(align) {
256 case GFUI_ALIGN_HR_VB:
257 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
258 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
259 x, y + width, GFUI_ALIGN_HR_VT, 1,
260 (void *)(object), gfuiScrollMinus,
261 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
262 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
263 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
264 x, y, GFUI_ALIGN_HR_VB, 1,
265 (void *)(object), gfuiScrollPlus,
266 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
267 break;
268 case GFUI_ALIGN_HR_VC:
269 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
270 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
271 x, y + width / 2, GFUI_ALIGN_HR_VT, 1,
272 (void *)(object), gfuiScrollMinus,
273 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
274 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
275 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
276 x, y - width / 2, GFUI_ALIGN_HR_VB, 1,
277 (void *)(object), gfuiScrollPlus,
278 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
279 break;
280 case GFUI_ALIGN_HR_VT:
281 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
282 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
283 x, y, GFUI_ALIGN_HR_VT, 1,
284 (void *)(object), gfuiScrollMinus,
285 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
286 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
287 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
288 x, y - width, GFUI_ALIGN_HR_VB, 1,
289 (void *)(object), gfuiScrollPlus,
290 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
291 break;
292 case GFUI_ALIGN_HC_VB:
293 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
294 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
295 x, y + width, GFUI_ALIGN_HC_VT, 1,
296 (void *)(object), gfuiScrollMinus,
297 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
298 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
299 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
300 x, y, GFUI_ALIGN_HC_VB, 1,
301 (void *)(object), gfuiScrollPlus,
302 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
303 break;
304 case GFUI_ALIGN_HC_VC:
305 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
306 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
307 x, y + width / 2, GFUI_ALIGN_HC_VT, 1,
308 (void *)(object), gfuiScrollMinus,
309 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
310 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
311 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
312 x, y - width / 2, GFUI_ALIGN_HC_VB, 1,
313 (void *)(object), gfuiScrollPlus,
314 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
315 break;
316 case GFUI_ALIGN_HC_VT:
317 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
318 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
319 x, y, GFUI_ALIGN_HC_VT, 1,
320 (void *)(object), gfuiScrollMinus,
321 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
322 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
323 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
324 x, y - width, GFUI_ALIGN_HC_VB, 1,
325 (void *)(object), gfuiScrollPlus,
326 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
327 break;
328 case GFUI_ALIGN_HL_VB:
329 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
330 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
331 x, y + width, GFUI_ALIGN_HL_VT, 1,
332 (void *)(object), gfuiScrollMinus,
333 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
334 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
335 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
336 x, y, GFUI_ALIGN_HL_VB, 1,
337 (void *)(object), gfuiScrollPlus,
338 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
339 break;
340 case GFUI_ALIGN_HL_VC:
341 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
342 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
343 x, y + width / 2, GFUI_ALIGN_HL_VT, 1,
344 (void *)(object), gfuiScrollMinus,
345 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
346 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
347 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
348 x, y - width / 2, GFUI_ALIGN_HL_VB, 1,
349 (void *)(object), gfuiScrollPlus,
350 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
351 break;
352 case GFUI_ALIGN_HL_VT:
353 GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png",
354 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
355 x, y, GFUI_ALIGN_HL_VT, 1,
356 (void *)(object), gfuiScrollMinus,
357 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
358 GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png",
359 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
360 x, y - width, GFUI_ALIGN_HL_VB, 1,
361 (void *)(object), gfuiScrollPlus,
362 NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
363 break;
364 default:
365 break;
366 }
367
368 break;
369 default:
370 break;
371 }
372
373
374 gfuiAddObject(screen, object);
375 GfuiScrollBarPosSet(scr, object->id, min, max, len, start);
376 return object->id;
377 }
378
379 /** Get the current position of a scroll bar.
380 @ingroup gui
381 @param scr Screen
382 @param id Scroll bar Id
383 @return Current position
384 <br>-1 Error
385 */
386 int
GfuiScrollBarPosGet(void * scr,int id)387 GfuiScrollBarPosGet(void *scr, int id)
388 {
389 tGfuiObject *object;
390 tGfuiScrollBar *scrollbar;
391
392 object = gfuiGetObject(scr, id);
393
394 if(object == NULL) {
395 return -1;
396 }
397
398 scrollbar = &(object->u.scrollbar);
399
400 return scrollbar->pos;
401 }
402
403 /** Set new values for position.
404 @ingroup gui
405 @param scr Screen
406 @param id Scroll bar Id
407 @param min New minimum value
408 @param max New maximum value
409 @param len New visible length
410 @param start New starting position
411 */
412 void
GfuiScrollBarPosSet(void * scr,int id,int min,int max,int len,int start)413 GfuiScrollBarPosSet(void *scr, int id, int min, int max, int len, int start)
414 {
415 tGfuiObject *object;
416 tGfuiScrollBar *scrollbar;
417
418 object = gfuiGetObject(scr, id);
419
420 if(object == NULL) {
421 return;
422 }
423
424 scrollbar = &(object->u.scrollbar);
425
426 scrollbar->min = min;
427 scrollbar->max = max;
428 scrollbar->len = len;
429 scrollbar->pos = start;
430 }
431
432 void
gfuiReleaseScrollbar(tGfuiObject * curObject)433 gfuiReleaseScrollbar(tGfuiObject *curObject)
434 {
435 free(curObject);
436 }
437