/** * @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 Displays an alert popup with only an ok button and a message. * * @param fmt Printf style message to display. */ void dialogue_alert( const char *fmt, ... ) { char msg[512]; va_list ap; unsigned int wdw; int h, done; if (fmt == NULL) return; else { /* get the message */ va_start(ap, fmt); vsnprintf(msg, 512, fmt, ap); va_end(ap); } h = gl_printHeightRaw( &gl_smallFont, 260, msg ); /* create the window */ wdw = window_create( "Warning", -1, -1, 300, 90 + h ); window_setData( wdw, &done ); window_addText( wdw, 20, -30, 260, h, 0, "txtAlert", &gl_smallFont, &cBlack, msg ); window_addButton( wdw, 135, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }
/** * @brief Creates a dialogue that allows the player to write a message. * * You must free the result if it's not null. * * @param title Title of the dialogue window. * @param min Minimum length of the message (must be non-zero). * @param max Maximum length of the message (must be non-zero). * @param msg Message to be displayed. * @return The message the player typed or NULL if it was cancelled. */ char* dialogue_inputRaw( const char* title, int min, int max, const char *msg ) { char *input; int h, done; /* get text height */ h = gl_printHeightRaw( &gl_smallFont, 200, msg ); /* create window */ input_dialogue.input_wid = window_create( title, -1, -1, 240, h+140 ); window_setData( input_dialogue.input_wid, &done ); window_setAccept( input_dialogue.input_wid, dialogue_inputClose ); window_setCancel( input_dialogue.input_wid, dialogue_cancel ); /* text */ window_addText( input_dialogue.input_wid, 30, -30, 200, h, 0, "txtInput", &gl_smallFont, &cDConsole, msg ); /* input */ window_addInput( input_dialogue.input_wid, 20, -50-h, 200, 20, "inpInput", max, 1, NULL ); window_setInputFilter( input_dialogue.input_wid, "inpInput", "/" ); /* Remove illegal stuff. */ /* button */ window_addButton( input_dialogue.input_wid, -20, 20, 80, 30, "btnClose", "Done", dialogue_inputClose ); /* tricky secondary loop */ dialogue_open++; done = 0; input = NULL; while ((done >= 0) && (!input || ((int)strlen(input) < min))) { /* must be longer than min */ if (input) { dialogue_alert( "Input must be at least %d character%s long!", min, (min==1) ? "s" : "" ); free(input); input = NULL; } if (toolkit_loop( &done ) != 0) /* error in loop -> quit */ return NULL; /* save the input */ if (done < 0) input = NULL; else input = strdup( window_getInput( input_dialogue.input_wid, "inpInput" ) ); } /* cleanup */ if (input != NULL) { window_destroy( input_dialogue.input_wid ); dialogue_open--; } input_dialogue.input_wid = 0; /* return the result */ return input; }
/** * @brief Run the dialog and return the clicked string. * * @note You must free the return value. * * @return The string chosen. */ char *dialogue_runChoice (void) { int done; char *res; /* tricky secondary loop */ window_setData( choice_wid, &done ); dialogue_open++; toolkit_loop( &done ); /* Save value. */ res = choice_result; choice_result = NULL; return res; }
/** * @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; }