/** * @brief Runs a dialogue with both yes and no options. * * @param caption Caption to use for the dialogue. * @param msg Message to display. * @return 1 if yes is clicked or 0 if no is clicked. */ int dialogue_YesNoRaw( const char* caption, const char *msg ) { unsigned int wid; int w,h; glFont* font; int done[2]; font = dialogue_getSize( caption, msg, &w, &h ); /* create window */ wid = window_create( caption, -1, -1, w, h+110 ); window_setData( wid, &done ); /* text */ window_addText( wid, 20, -40, w-40, h, 0, "txtYesNo", font, &cBlack, msg ); /* buttons */ window_addButton( wid, w/2-50-10, 20, 50, 30, "btnYes", "Yes", dialogue_YesNoClose ); window_addButton( wid, w/2+10, 20, 50, 30, "btnNo", "No", dialogue_YesNoClose ); /* tricky secondary loop */ dialogue_open++; done[1] = -1; /* Default to negative. */ toolkit_loop( done ); /* Close the dialogue. */ dialogue_close( wid, NULL ); /* return the result */ return done[1]; }
/** * @brief Add a choice to the dialog. * * @param caption Caption to use for the dialogue (for sizing). * @param msg Message to display (for sizing). * @param *opt The value of the option. */ void dialogue_addChoice( const char *caption, const char *msg, const char *opt) { int w,h; if (choice_nopts < 1) return; dialogue_getSize( caption, msg, &w, &h ); /* buttons. Add one for each option in the menu. */ window_addButton( choice_wid, w/2-125, choice_nopts*40, 250, 30, (char *) opt, (char *) opt, dialogue_choiceClose ); choice_nopts --; }
/** * @brief Create the choice dialog. Need to add choices with below method. * * @param caption Caption to use for the dialogue. * @param msg Message to display. * @param opts The number of options. */ void dialogue_makeChoice( const char *caption, const char *msg, int opts ) { int w,h; glFont* font; choice_result = NULL; choice_nopts = opts; font = dialogue_getSize( caption, msg, &w, &h ); /* create window */ choice_wid = window_create( caption, -1, -1, w, h+100+40*choice_nopts ); /* text */ window_addText( choice_wid, 20, -40, w-40, h, 0, "txtChoice", font, &cBlack, msg ); }
/** * @brief Opens a dialogue window with an ok button, a fixed message and an image. * * @param caption Window title. * @param msg Message to display. * @param width Width of the image. Negative uses image width. * @param height Height of the image. Negative uses image height. */ void dialogue_msgImgRaw( const char* caption, const char *msg, const char *img, int width, int height ) { int w, h, img_width, img_height; glFont* font; unsigned int msg_wid; int done; glTexture *gfx; char buf[PATH_MAX]; /* Get the desired texture */ /* IMPORTANT : texture must not be freed here, it will be freed when the widget closes */ nsnprintf( buf, sizeof(buf), "%s%s", GFX_PATH, img ); gfx = gl_newImage( buf, 0 ); /* Find the popup's dimensions from text and image */ img_width = (width < 0) ? gfx->w : width; img_height = (height < 0) ? gfx->h : height; font = dialogue_getSize( caption, msg, &w, &h ); if (h < img_width) { h = img_width; } /* Create the window */ msg_wid = window_create( caption, -1, -1, img_width + w, 110 + h ); window_setData( msg_wid, &done ); /* Add the text box */ window_addText( msg_wid, img_width+40, -40, w-40, h, 0, "txtMsg", font, &cBlack, msg ); /* Add a placeholder rectangle for the image */ window_addRect( msg_wid, 20, -40, img_width, img_height, "rctGFX", &cGrey10, 1 ); /* Actually add the texture in the rectangle */ window_addImage( msg_wid, 20, -40, img_width, img_height, "ImgGFX", gfx, 0 ); /* Add the OK button */ window_addButton( msg_wid, (img_width+w -50)/2, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }
/** * @brief Opens a dialogue window with an ok button and a fixed message. * * @param caption Window title. * @param msg Message to display. */ void dialogue_msgRaw( const char* caption, const char *msg ) { int w,h; glFont* font; unsigned int msg_wid; int done; font = dialogue_getSize( caption, msg, &w, &h ); /* create the window */ msg_wid = window_create( caption, -1, -1, w, 110 + h ); window_setData( msg_wid, &done ); window_addText( msg_wid, 20, -40, w-40, h, 0, "txtMsg", font, &cBlack, msg ); window_addButton( msg_wid, (w-50)/2, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }
/** * @brief Creates a list dialogue with OK and Cancel buttons, with a fixed message, * as well as a small extra area for the list to react to item selected events. * * @param title Title of the dialogue. * @param items Items in the list (should be all malloced, automatically freed). * @param nitems Number of items. * @param extrawidth Width of area to add for select_call callback. * @param minheight Minimum height for the window. * @param add_widgets This function is called with the new window as an argument * allowing for initial population of the extra area. * @param select_call (optional) This function is called when a new item in the list * is selected, receiving the window's id and the selected widgets name as * arguments. * @param msg string with text to display. */ int dialogue_listPanelRaw( const char* title, char **items, int nitems, int extrawidth, int minheight, void (*add_widgets) (unsigned int wid, int x, int y, int w, int h), void (*select_call) (unsigned int wid, char* wgtname, int x, int y, int w, int h), const char *msg ) { int i; int w, h, winw, winh; glFont* font; unsigned int wid; int list_width, list_height; int text_height, text_width; int done; if (input_dialogue.input_wid) return -1; font = dialogue_getSize( title, msg, &text_width, &text_height ); /* Calculate size stuff. */ list_width = 0; list_height = 0; for (i=0; i<nitems; i++) { list_width = MAX( list_width, gl_printWidthRaw( &gl_defFont, items[i] ) ); list_height += gl_defFont.h + 5; } list_height += 100; if (list_height > 500) h = (list_height*8)/10; else h = MAX( 300, list_height ); h = MIN( (SCREEN_H*2)/3, h ); w = MAX( list_width + 60, 200 ); winw = w + extrawidth; winh = MAX( h, minheight ); h = winh; /* Create the window. */ wid = window_create( title, -1, -1, winw, winh ); window_setData( wid, &done ); window_addText( wid, 20, -40, w-40, text_height, 0, "txtMsg", font, &cDConsole, msg ); window_setAccept( wid, dialogue_listClose ); window_setCancel( wid, dialogue_listCancel ); if(add_widgets) add_widgets(wid, w, 0, winw, winh); if(select_call) { input_dialogue.x = w; input_dialogue.y = 0; input_dialogue.w = winw; input_dialogue.h = winh; input_dialogue.item_select_cb = select_call; } /* Create the list. */ window_addList( wid, 20, -40-text_height-20, w-40, h - (40+text_height+20) - (20+30+20), "lstDialogue", items, nitems, 0, select_call_wrapper ); /* Create the buttons. */ window_addButton( wid, -20, 20, 60, 30, "btnOK", "OK", dialogue_listClose ); window_addButton( wid, -20-60-20, 20, 60, 30, "btnCancel", "Cancel", dialogue_listCancel ); dialogue_open++; toolkit_loop( &done ); /* cleanup */ input_dialogue.x = 0; input_dialogue.y = 0; input_dialogue.w = 0; input_dialogue.h = 0; input_dialogue.item_select_cb = NULL; return dialogue_listSelected; }