/** * @brief Destroys a widget in a window. * * @param wid Window to destroy widget in. * @param wgtname Name of the widget to destroy. */ void window_destroyWidget( unsigned int wid, const char* wgtname ) { Window *wdw; Widget *wgt; /* Get the window. */ wdw = window_wget( wid ); if (wdw == NULL) return; /* Get the widget. */ /* get widget. */ for (wgt=wdw->widgets; wgt!=NULL; wgt=wgt->next) { if (strcmp(wgt->name, wgtname)==0) { break; } } if (wgt == NULL) { WARN("Widget '%s' not found in window '%s'", wgtname, wdw->name ); return; } /* Defocus. */ if (wdw->focus == wgt->id) wdw->focus = -1; /* There's dead stuff now. */ window_dead = 1; wgt_setFlag( wgt, WGT_FLAG_KILL ); }
/** * @brief Adds an input widget to a window. * * Position origin is 0,0 at bottom left. If you use negative X or Y * positions. They actually count from the opposite side in. * * @param wid ID of the window to add the widget to. * @param x X position within the window to use. * @param y Y position within the window to use. * @param w Width of the widget. * @param h Height of the widget. * @param name Name of the widget to use internally. * @param max Max amount of characters that can be written. * @param oneline Whether widget should only be one line long. * @param font Font to use. */ void window_addInput( const unsigned int wid, const int x, const int y, /* position */ const int w, const int h, /* size */ char* name, const int max, const int oneline, glFont *font ) { Window *wdw = window_wget(wid); Widget *wgt = window_newWidget(wdw, name); if (wgt == NULL) return; /* generic */ wgt->type = WIDGET_INPUT; /* specific */ wgt->render = inp_render; wgt->cleanup = inp_cleanup; wgt_setFlag(wgt, WGT_FLAG_CANFOCUS); wgt->keyevent = inp_key; wgt->textevent = inp_text; /*wgt->keyevent = inp_key;*/ wgt->dat.inp.font = (font != NULL) ? font : &gl_smallFont; wgt->dat.inp.max = max+1; wgt->dat.inp.oneline = oneline; wgt->dat.inp.pos = 0; wgt->dat.inp.view = 0; wgt->dat.inp.input = malloc(sizeof(char)*wgt->dat.inp.max); memset(wgt->dat.inp.input, 0, wgt->dat.inp.max*sizeof(char)); /* position/size */ wgt->w = (double) w; wgt->h = (double) h; toolkit_setPos( wdw, wgt, x, y ); }
/** * @brief Adds an Image Array widget. * * Position origin is 0,0 at bottom left. If you use negative X or Y * positions. They actually count from the opposite side in. * * @param wid Window to add to. * @param x X position. * @param y Y position. * @param w Width. * @param h Height. * @param name Internal widget name. * @param iw Image width to use. * @param ih Image height to use. * @param tex Texture array to use (not freed). * @param caption Caption array to use (freed). * @param nelem Elements in tex and caption. * @param call Callback when modified. */ void window_addImageArray( const unsigned int wid, const int x, const int y, /* position */ const int w, const int h, /* size */ char* name, const int iw, const int ih, glTexture** tex, char** caption, int nelem, void (*call) (unsigned int wdw, char* wgtname), void (*rmcall) (unsigned int wdw, char* wgtname) ) { Window *wdw = window_wget(wid); Widget *wgt = window_newWidget(wdw, name); if (wgt == NULL) return; /* generic */ wgt->type = WIDGET_IMAGEARRAY; /* position/size */ wgt->w = (double) w; wgt->h = (double) h; toolkit_setPos( wdw, wgt, x, y ); /* specific */ wgt->render = iar_render; wgt->renderOverlay = iar_renderOverlay; wgt->cleanup = iar_cleanup; wgt_setFlag(wgt, WGT_FLAG_CANFOCUS); wgt->keyevent = iar_key; wgt->mclickevent = iar_mclick; wgt->mmoveevent = iar_mmove; wgt_setFlag(wgt, WGT_FLAG_ALWAYSMMOVE); wgt->dat.iar.images = tex; wgt->dat.iar.captions = caption; wgt->dat.iar.nelements = nelem; wgt->dat.iar.selected = 0; wgt->dat.iar.pos = 0; wgt->dat.iar.alt = -1; wgt->dat.iar.iw = iw; wgt->dat.iar.ih = ih; wgt->dat.iar.fptr = call; wgt->dat.iar.rmptr = rmcall; wgt->dat.iar.xelem = floor((w - 10.) / (double)(wgt->dat.iar.iw+10)); wgt->dat.iar.yelem = (wgt->dat.iar.xelem == 0) ? 0 : (int)wgt->dat.iar.nelements / wgt->dat.iar.xelem + 1; if (wdw->focus == -1) /* initialize the focus */ toolkit_nextFocus( wdw ); }
/** * @brief Adds a button widget to a window. * * Position origin is 0,0 at bottom left. If you use negative X or Y * positions. They actually count from the opposite side in. * * @param wid ID of the window to add the widget to. * @param x X position within the window to use. * @param y Y position within the window to use. * @param w Width of the widget. * @param h Height of the widget. * @param name Name of the widget to use internally. * @param ntabs Number of tabs in the widget. * @param tabnames Name of the tabs in the widget. * @return List of created windows. */ unsigned int* window_addTabbedWindow( const unsigned int wid, const int x, const int y, /* position */ const int w, const int h, /* size */ const char* name, int ntabs, const char **tabnames ) { int i; Window *wdw, *wtmp; Widget *wgt; /* Create the Widget. */ wdw = window_wget(wid); wgt = window_newWidget(wdw, name); if (wgt == NULL) return NULL; /* generic */ wgt->type = WIDGET_TABBEDWINDOW; /* specific */ wgt_setFlag( wgt, WGT_FLAG_RAWINPUT ); wgt->rawevent = tab_raw; wgt->render = tab_render; wgt->renderOverlay = tab_renderOverlay; wgt->cleanup = tab_cleanup; wgt->dat.tab.ntabs = ntabs; /* position/size */ wgt->w = (double) w; wgt->h = (double) h; toolkit_setPos( wdw, wgt, x, y ); /* Copy tab information. */ wgt->dat.tab.tabnames = malloc( sizeof(char*) * ntabs ); wgt->dat.tab.windows = malloc( sizeof(unsigned int) * ntabs ); wgt->dat.tab.namelen = malloc( sizeof(int) * ntabs ); for (i=0; i<ntabs; i++) { /* Hack to get around possible reallocs. */ wdw = window_wget(wid); /* Get name and length. */ wgt->dat.tab.tabnames[i] = strdup( tabnames[i] ); wgt->dat.tab.namelen[i] = gl_printWidthRaw( &gl_defFont, wgt->dat.tab.tabnames[i] ); /* Create windows. */ wgt->dat.tab.windows[i] = window_create( tabnames[i], wdw->x + x, wdw->y + y + TAB_HEIGHT, wdw->w, wdw->h - TAB_HEIGHT ); wtmp = window_wget( wgt->dat.tab.windows[i] ); /* Set flags. */ window_setFlag( wtmp, WINDOW_NOFOCUS ); window_setFlag( wtmp, WINDOW_NORENDER ); window_setFlag( wtmp, WINDOW_NOINPUT ); window_setFlag( wtmp, WINDOW_NOBORDER ); } /* Return list of windows. */ return wgt->dat.tab.windows; }
/** * @brief Enables a button. * * @param wid ID of the window to get widget from. * @param name Name of the button to enable. */ void window_enableButton( const unsigned int wid, char *name ) { Widget *wgt; /* Get the widget. */ wgt = btn_get( wid, name ); if (wgt == NULL) return; /* Enable button. */ wgt->dat.btn.disabled = 0; wgt_setFlag(wgt, WGT_FLAG_CANFOCUS); }
/** * @brief Adds a button widget to a window, with a hotkey that enables the button to be activated with that key. * * Position origin is 0,0 at bottom left. If you use negative X or Y * positions. They actually count from the opposite side in. * * @param wid ID of the window to add the widget to. * @param x X position within the window to use. * @param y Y position within the window to use. * @param w Width of the widget. * @param h Height of the widget. * @param name Name of the widget to use internally. * @param display Text displayed on the button (centered). * @param call Function to call when button is pressed. Parameter passed * is the name of the button. * @param key Hotkey for using the button without it being focused. */ void window_addButtonKey( const unsigned int wid, const int x, const int y, const int w, const int h, char* name, char* display, void (*call) (unsigned int wgt, char* wdwname), SDLKey key ) { Window *wdw = window_wget(wid); Widget *wgt = window_newWidget(wdw, name); if (wgt == NULL) return; /* generic */ wgt->type = WIDGET_BUTTON; /* specific */ wgt->keyevent = btn_key; wgt->render = btn_render; wgt->cleanup = btn_cleanup; wgt_setFlag(wgt, WGT_FLAG_CANFOCUS); wgt->dat.btn.display = strdup(display); wgt->dat.btn.disabled = 0; /* initially enabled */ wgt->dat.btn.fptr = call; if (key != 0) { wgt->dat.btn.key = key; btn_updateHotkey(wgt); } /* position/size */ wgt->w = (double) w; wgt->h = (double) h; toolkit_setPos( wdw, wgt, x, y ); if (wgt->dat.btn.fptr == NULL) { /* Disable if function is NULL. */ wgt->dat.btn.disabled = 1; wgt_rmFlag(wgt, WGT_FLAG_CANFOCUS); } if (wdw->focus == -1) /* initialize the focus */ toolkit_nextFocus( wdw ); }
/** * @brief Adds a list widget to a window. * * Position origin is 0,0 at bottom left. If you use negative X or Y * positions. They actually count from the opposite side in. * * @param wid ID of the window to add the widget to. * @param x X position within the window to use. * @param y Y position within the window to use. * @param w Width of the widget. * @param h Height of the widget. * @param name Name of the widget to use internally. * @param items Items in the list (will be freed automatically). * @param nitems Number of items in items parameter. * @param defitem Default item to select. * @param call Function to call when new item is selected. Parameter passed * is the name of the list. */ void window_addList( const unsigned int wid, const int x, const int y, const int w, const int h, char* name, char **items, int nitems, int defitem, void (*call) (unsigned int wdw, char* wgtname) ) { Window *wdw = window_wget(wid); Widget *wgt = window_newWidget(wdw, name); if (wgt == NULL) return; /* generic */ wgt->type = WIDGET_LIST; /* specific */ wgt->render = lst_render; wgt->cleanup = lst_cleanup; wgt_setFlag(wgt, WGT_FLAG_CANFOCUS); wgt->keyevent = lst_key; wgt->mclickevent = lst_mclick; wgt->mmoveevent = lst_mmove; wgt->dat.lst.options = items; wgt->dat.lst.noptions = nitems; wgt->dat.lst.selected = defitem; /* -1 would be none */ wgt->dat.lst.pos = 0; wgt->dat.lst.fptr = call; /* position/size */ wgt->w = (double) w; wgt->h = (double) h - ((h % (gl_defFont.h+2)) - 2); toolkit_setPos( wdw, wgt, x, y ); /* check if needs scrollbar. */ if (2 + (nitems * (gl_defFont.h + 2)) > (int)wgt->h) wgt->dat.lst.height = (2 + gl_defFont.h) * nitems + 2; else wgt->dat.lst.height = 0; if (wdw->focus == -1) /* initialize the focus */ toolkit_nextFocus(); }