diff --git a/src/toolkit.c b/src/toolkit.c index 7ba7213..6e715f0 100644 --- a/src/toolkit.c +++ b/src/toolkit.c @@ -147,6 +147,7 @@ static void toolkit_drawOutline(double x, double y, double w, static void toolkit_drawRect(double x, double y, double w, double h, glColour* c, glColour* lc); // Dialogues.. +static glFont* dialogue_getSize(char* msg, int* w, int* h); static void dialogue_alertClose(char* str); static void dialogue_msgClose(char* str); static void dialogue_YesNoClose(char* str); @@ -1420,12 +1421,28 @@ static void dialogue_alertClose(char* str) { window_destroy(window_get("Warning")); } +static glFont* dialogue_getSize(char* msg, int* w, int* h) { + glFont* font; + + font = &gl_smallFont; // Try to use smallfont. + (*h) = gl_printHeight(font, (*w)-40, msg); + if(strlen(msg) > 100) { + // Make font bigger for large text area's. + font = &gl_defFont; + (*h) = gl_printHeight(font, (*w)-40, msg); + if((*h) > 200) (*w) += MIN((*h)-200, 600); // Too big, so we make it wider. + (*h) = gl_printHeight(font, (*w)-40, msg); + } + return font; +} + // Display an alert popup with only an OK button and a message. static unsigned int msg_wid = 0; void dialogue_msg(char* caption, const char* fmt, ...) { char msg[4096]; va_list ap; - int h; + int w, h; + glFont* font; if(msg_wid) return; @@ -1437,14 +1454,15 @@ void dialogue_msg(char* caption, const char* fmt, ...) { va_end(ap); } - h = gl_printHeight(&gl_smallFont, 260, msg); + w = 300; // Default width. + font = dialogue_getSize(msg, &w, &h); // Create the window. - msg_wid = window_create(caption, -1, -1, 300, 90+h); - window_addText(msg_wid, 20, -30, 260, h, 0, "txtMsg", - &gl_smallFont, &cBlack, msg); + msg_wid = window_create(caption, -1, -1, w, 110+h); + window_addText(msg_wid, 20, -40, w-40, h, 0, "txtMsg", + font, &cBlack, msg); - window_addButton(msg_wid, 135, 20, 50, 30, "btnOK", "OK", + window_addButton(msg_wid, (w-50)/2, 20, 50, 30, "btnOK", "OK", dialogue_msgClose); toolkit_loop(); @@ -1463,7 +1481,8 @@ static unsigned int yesno_wid = 0; int dialogue_YesNo(char* caption, const char* fmt, ...) { char msg[4096]; va_list ap; - int h; + int w, h; + glFont* font; if(yesno_wid) return -1; @@ -1475,19 +1494,19 @@ int dialogue_YesNo(char* caption, const char* fmt, ...) { va_end(ap); } - // Get the text height. - h = gl_printHeight(&gl_smallFont, 260, msg); + w = 300; + font = dialogue_getSize(msg, &w, &h); // Create window. - yesno_wid = window_create(caption, -1, -1, 300, h+90); + yesno_wid = window_create(caption, -1, -1, w, h+110); // Text. - window_addText(yesno_wid, 20, -30, 260, h, 0, "txtYesNo", - &gl_smallFont, &cBlack, msg); + window_addText(yesno_wid, 20, -40, w-40, h, 0, "txtYesNo", + font, &cBlack, msg); // Buttons. - window_addButton(yesno_wid, 300/2-50-10, 20, 50, 30, "btnYes", "Yes", + window_addButton(yesno_wid, w/2-50-10, 20, 50, 30, "btnYes", "Yes", dialogue_YesNoClose); - window_addButton(yesno_wid, 300/2+50+10, 20, 50, 30, "btnNo", "No", + window_addButton(yesno_wid, w/2+50+10, 20, 50, 30, "btnNo", "No", dialogue_YesNoClose); // Tricky secondary loop.