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