/*************************************************************************** file : guiscrollbar.cpp created : Mon Aug 23 22:11:37 CEST 1999 copyright : (C) 1999 by Eric Espie email : torcs@free.fr version : $Id: guiscrollbar.cpp,v 1.3 2003/10/19 18:59:38 torcs Exp $ ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /** @file GUI scrollbar management. @author Eric Espie @version $Id: guiscrollbar.cpp,v 1.3 2003/10/19 18:59:38 torcs Exp $ @ingroup gui */ #include #include #ifdef WIN32 #include #endif #include #include "gui.h" void gfuiScrollBarInit(void) { } static void gfuiScrollPlus(void *idv) { tGfuiObject *object; tGfuiScrollBar *scrollbar; tScrollBarInfo info; object = gfuiGetObject(GfuiScreen, (long)idv); if (object == NULL) { return; } scrollbar = &(object->u.scrollbar); scrollbar->pos++; if (scrollbar->pos > scrollbar->max) { scrollbar->pos = scrollbar->max; } else if (scrollbar->onScroll != NULL) { info.pos = scrollbar->pos; info.userData = scrollbar->userData; scrollbar->onScroll(&info); } } static void gfuiScrollMinus(void *idv) { tGfuiObject *object; tGfuiScrollBar *scrollbar; tScrollBarInfo info; object = gfuiGetObject(GfuiScreen, (long)idv); if (object == NULL) { return; } scrollbar = &(object->u.scrollbar); scrollbar->pos--; if (scrollbar->pos < scrollbar->min) { scrollbar->pos = scrollbar->min; } else if (scrollbar->onScroll != NULL) { info.pos = scrollbar->pos; info.userData = scrollbar->userData; scrollbar->onScroll(&info); } } /** Create a new scroll bar. @ingroup gui @param scr Screen where to create the scroll bar @param x X position @param y Y position @param align Position of the specified point:
GFUI_ALIGN_HR_VB horizontal right, vertical bottom
GFUI_ALIGN_HR_VC horizontal right, vertical center
GFUI_ALIGN_HR_VT horizontal right, vertical top
GFUI_ALIGN_HC_VB horizontal center, vertical bottom
GFUI_ALIGN_HC_VC horizontal center, vertical center
GFUI_ALIGN_HC_VT horizontal center, vertical top
GFUI_ALIGN_HL_VB horizontal left, vertical bottom
GFUI_ALIGN_HL_VC horizontal left, vertical center
GFUI_ALIGN_HL_VT horizontal left, vertical top @param width width including the arrows @param orientation Scroll bar orientation:
GFUI_HORI_SCROLLBAR Horizontal
GFUI_VERT_SCROLLBAR Vertical @param min Minimum value @param max Maximum value @param len Visible length @param start Starting position @param userData User data given to the call back function @param onScroll Call back function called when the position change @return Scroll Bar Id
-1 Error */ 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) { tGfuiObject *object; tGfuiScrollBar *scrollbar; tGfuiScreen *screen = (tGfuiScreen*)scr; object = (tGfuiObject*)calloc(1, sizeof(tGfuiObject)); object->widget = GFUI_SCROLLBAR; object->focusMode = GFUI_FOCUS_MOUSE_CLICK; object->id = screen->curId++; object->visible = 1; scrollbar = &(object->u.scrollbar); scrollbar->userData = userData; scrollbar->onScroll = onScroll; switch (orientation) { case GFUI_HORI_SCROLLBAR: switch (align) { case GFUI_ALIGN_HR_VB: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x, y, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width, y, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HR_VC: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x, y, GFUI_ALIGN_HR_VC, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width, y, GFUI_ALIGN_HL_VC, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HR_VT: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x, y, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width, y, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VB: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width / 2, y, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width / 2, y, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VC: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width / 2, y, GFUI_ALIGN_HR_VC, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width / 2, y, GFUI_ALIGN_HL_VC, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VT: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width / 2, y, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x - width / 2, y, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VB: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width, y, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x, y, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VC: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width, y, GFUI_ALIGN_HR_VC, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x, y, GFUI_ALIGN_HL_VC, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VT: GfuiGrButtonCreate(scr, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", x + width, y, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", x, y, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; default: break; } break; case GFUI_VERT_SCROLLBAR: switch (align) { case GFUI_ALIGN_HR_VB: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HR_VC: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width / 2, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width / 2, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HR_VT: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y, GFUI_ALIGN_HR_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width, GFUI_ALIGN_HR_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VB: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width, GFUI_ALIGN_HC_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y, GFUI_ALIGN_HC_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VC: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width / 2, GFUI_ALIGN_HC_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width / 2, GFUI_ALIGN_HC_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HC_VT: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y, GFUI_ALIGN_HC_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width, GFUI_ALIGN_HC_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VB: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VC: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y + width / 2, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width / 2, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; case GFUI_ALIGN_HL_VT: GfuiGrButtonCreate(scr, "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up.png", "data/img/arrow-up-pushed.png", x, y, GFUI_ALIGN_HL_VT, 1, (void*)(object->id), gfuiScrollMinus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scr, "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down.png", "data/img/arrow-down-pushed.png", x, y - width, GFUI_ALIGN_HL_VB, 1, (void*)(object->id), gfuiScrollPlus, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); break; default: break; } break; default: break; } gfuiAddObject(screen, object); GfuiScrollBarPosSet(scr, object->id, min, max, len, start); return object->id; } /** Get the current position of a scroll bar. @ingroup gui @param scr Screen @param id Scroll bar Id @return Current position
-1 Error */ int GfuiScrollBarPosGet(void *scr, int id) { tGfuiObject *object; tGfuiScrollBar *scrollbar; object = gfuiGetObject(scr, id); if (object == NULL) { return -1; } scrollbar = &(object->u.scrollbar); return scrollbar->pos; } /** Set new values for position. @ingroup gui @param scr Screen @param id Scroll bar Id @param min New minimum value @param max New maximum value @param len New visible length @param start New starting position */ void GfuiScrollBarPosSet(void *scr, int id, int min, int max, int len, int start) { tGfuiObject *object; tGfuiScrollBar *scrollbar; object = gfuiGetObject(scr, id); if (object == NULL) { return; } scrollbar = &(object->u.scrollbar); scrollbar->min = min; scrollbar->max = max; scrollbar->len = len; scrollbar->pos = start; } void gfuiReleaseScrollbar(tGfuiObject *curObject) { free(curObject); }