mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-29 10:49:53 +02:00
error_ui: wrap text and change message box height to fit
Stops banned user message overflowing out of message box
This commit is contained in:
@@ -99,6 +99,7 @@ void textnpos(char *s, int n, int w, int *cx, int *cy);
|
|||||||
int textwidthx(char *s, int w);
|
int textwidthx(char *s, int w);
|
||||||
|
|
||||||
int textposxy(char *s, int width, int w, int h);
|
int textposxy(char *s, int width, int w, int h);
|
||||||
|
int textwrapheight(char *s, int width);
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__)
|
#if defined(WIN32) && !defined(__GNUC__)
|
||||||
_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a);
|
_inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a);
|
||||||
|
@@ -1104,6 +1104,45 @@ int textposxy(char *s, int width, int w, int h)
|
|||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
int textwrapheight(char *s, int width)
|
||||||
|
{
|
||||||
|
int x=0, height=FONT_H+2, cw;
|
||||||
|
int wordlen;
|
||||||
|
int charspace;
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
wordlen = strcspn(s," .,!?\n");
|
||||||
|
charspace = textwidthx(s, width-x);
|
||||||
|
if (charspace<wordlen && wordlen && width-x<width/3)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
height += FONT_H+2;
|
||||||
|
}
|
||||||
|
for (; *s && --wordlen>=-1; s++)
|
||||||
|
{
|
||||||
|
if (*s == '\n')
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
height += FONT_H+2;
|
||||||
|
}
|
||||||
|
else if (*s == '\b')
|
||||||
|
{
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
|
if (x+cw>=width)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
height += FONT_H+2;
|
||||||
|
}
|
||||||
|
x += cw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
//the most used function for drawing a pixel, because it has OpenGL support, which is not fully implemented.
|
//the most used function for drawing a pixel, because it has OpenGL support, which is not fully implemented.
|
||||||
#if defined(WIN32) && !defined(__GNUC__)
|
#if defined(WIN32) && !defined(__GNUC__)
|
||||||
|
@@ -613,7 +613,7 @@ void draw_svf_ui(pixel *vid_buf)// all the buttons at the bottom
|
|||||||
|
|
||||||
void error_ui(pixel *vid_buf, int err, char *txt)
|
void error_ui(pixel *vid_buf, int err, char *txt)
|
||||||
{
|
{
|
||||||
int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my;
|
int x0=(XRES-240)/2,y0=YRES/2,b=1,bq,mx,my,textheight;
|
||||||
char *msg;
|
char *msg;
|
||||||
|
|
||||||
msg = malloc(strlen(txt)+16);
|
msg = malloc(strlen(txt)+16);
|
||||||
@@ -621,6 +621,12 @@ void error_ui(pixel *vid_buf, int err, char *txt)
|
|||||||
sprintf(msg, "%03d %s", err, txt);
|
sprintf(msg, "%03d %s", err, txt);
|
||||||
else
|
else
|
||||||
sprintf(msg, "%s", txt);
|
sprintf(msg, "%s", txt);
|
||||||
|
textheight = textwrapheight(msg, 240);
|
||||||
|
y0 -= (52+textheight)/2;
|
||||||
|
if (y0<2)
|
||||||
|
y0 = 2;
|
||||||
|
if (y0+50+textheight>YRES)
|
||||||
|
textheight = YRES-50-y0;
|
||||||
|
|
||||||
while (!sdl_poll())
|
while (!sdl_poll())
|
||||||
{
|
{
|
||||||
@@ -636,18 +642,18 @@ void error_ui(pixel *vid_buf, int err, char *txt)
|
|||||||
mx /= sdl_scale;
|
mx /= sdl_scale;
|
||||||
my /= sdl_scale;
|
my /= sdl_scale;
|
||||||
|
|
||||||
clearrect(vid_buf, x0-2, y0-2, 244, 64);
|
clearrect(vid_buf, x0-2, y0-2, 244, 52+textheight);
|
||||||
drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255);
|
drawrect(vid_buf, x0, y0, 240, 48+textheight, 192, 192, 192, 255);
|
||||||
if (err)
|
if (err)
|
||||||
drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255);
|
drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255);
|
||||||
else
|
else
|
||||||
drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255);
|
drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255);
|
||||||
drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255);
|
drawtextwrap(vid_buf, x0+8, y0+26, 224, msg, 255, 255, 255, 255);
|
||||||
drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255);
|
drawtext(vid_buf, x0+5, y0+textheight+37, "Dismiss", 255, 255, 255, 255);
|
||||||
drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255);
|
drawrect(vid_buf, x0, y0+textheight+32, 240, 16, 192, 192, 192, 255);
|
||||||
sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
|
sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE));
|
||||||
|
|
||||||
if (b && !bq && mx>=x0 && mx<x0+240 && my>=y0+44 && my<=y0+60)
|
if (b && !bq && mx>=x0 && mx<x0+240 && my>=y0+textheight+32 && my<=y0+textheight+48)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (sdl_key==SDLK_RETURN)
|
if (sdl_key==SDLK_RETURN)
|
||||||
|
Reference in New Issue
Block a user