editbox is now easier to edit

This commit is contained in:
Jakob Fries 2007-07-28 17:44:12 +00:00
parent c24b86c1f4
commit e6d5379a72
3 changed files with 51 additions and 12 deletions

View file

@ -731,12 +731,18 @@ void gfx_pretty_text(float x, float y, float size, const char *text)
gfx_quads_end(); gfx_quads_end();
} }
float gfx_pretty_text_width(float size, const char *text) float gfx_pretty_text_width(float size, const char *text, int length)
{ {
const float spacing = 0.05f; const float spacing = 0.05f;
float w = 0.0f; float w = 0.0f;
while (*text) const char *stop;
if (length == -1)
stop = text + strlen(text);
else
stop = text + length;
while (text < stop)
{ {
const int c = *text; const int c = *text;
const float width = current_font->m_CharEndTable[c] - current_font->m_CharStartTable[c]; const float width = current_font->m_CharEndTable[c] - current_font->m_CharStartTable[c];

View file

@ -750,7 +750,7 @@ float client_intratick();
int client_tickspeed(); int client_tickspeed();
void gfx_pretty_text(float x, float y, float size, const char *text); void gfx_pretty_text(float x, float y, float size, const char *text);
float gfx_pretty_text_width(float size, const char *text); float gfx_pretty_text_width(float size, const char *text, int length = -1);
void gfx_getscreen(float *tl_x, float *tl_y, float *br_x, float *br_y); void gfx_getscreen(float *tl_x, float *tl_y, float *br_x, float *br_y);

View file

@ -140,7 +140,6 @@ struct pretty_font
}; };
extern pretty_font *current_font; extern pretty_font *current_font;
float gfx_pretty_text_width(float size, const char *text);
void render_sun(float x, float y); void render_sun(float x, float y);
@ -415,6 +414,7 @@ int ui_do_edit_box(void *id, float x, float y, float w, float h, char *str, int
{ {
int inside = ui_mouse_inside(x, y, w, h); int inside = ui_mouse_inside(x, y, w, h);
int r = 0; int r = 0;
static int at_index = 0;
if(ui_last_active_item() == id) if(ui_last_active_item() == id)
{ {
@ -422,22 +422,50 @@ int ui_do_edit_box(void *id, float x, float y, float w, float h, char *str, int
int k = input::last_key(); int k = input::last_key();
int len = strlen(str); int len = strlen(str);
if (inside && ui_mouse_button(0))
{
int mx_rel = ui_mouse_x() - x;
for (int i = 1; i <= len; i++)
{
if (gfx_pretty_text_width(36.0f, str, i) + 10 > mx_rel)
{
at_index = i - 1;
break;
}
if (i == len)
at_index = len;
}
}
if (at_index > len)
at_index = len;
if (c >= 32 && c < 128) if (c >= 32 && c < 128)
{ {
if (len < str_size - 1) if (len < str_size - 1 && at_index < str_size - 1)
{ {
str[len] = c; memmove(str + at_index + 1, str + at_index, len - at_index + 1);
str[len+1] = 0; str[at_index] = c;
at_index++;
} }
} }
if (k == input::backspace) if (k == input::backspace)
{ {
if (len > 0) if (at_index > 0)
str[len-1] = 0; {
memmove(str + at_index - 1, str + at_index, len - at_index + 1);
at_index--;
}
} }
else if (k == input::enter) else if (k == input::enter)
ui_clear_last_active_item(); ui_clear_last_active_item();
else if (k == input::left && at_index > 0)
at_index--;
else if (k == input::right && at_index < len)
at_index++;
r = 1; r = 1;
} }
@ -447,6 +475,8 @@ int ui_do_edit_box(void *id, float x, float y, float w, float h, char *str, int
box_type = GUI_BOX_SCREEN_INFO; box_type = GUI_BOX_SCREEN_INFO;
else else
box_type = GUI_BOX_SCREEN_TEXTBOX; box_type = GUI_BOX_SCREEN_TEXTBOX;
bool just_got_active = false;
if(ui_active_item() == id) if(ui_active_item() == id)
{ {
@ -456,20 +486,23 @@ int ui_do_edit_box(void *id, float x, float y, float w, float h, char *str, int
else if(ui_hot_item() == id) else if(ui_hot_item() == id)
{ {
if(ui_mouse_button(0)) if(ui_mouse_button(0))
{
if (ui_last_active_item() != id)
just_got_active = true;
ui_set_active_item(id); ui_set_active_item(id);
}
} }
if(inside) if(inside)
ui_set_hot_item(id); ui_set_hot_item(id);
draw_box(box_type, tileset_regular, x, y, w, h); draw_box(box_type, tileset_regular, x, y, w, h);
ui_do_label(x + 10, y, str, 36); ui_do_label(x + 10, y, str, 36);
if (ui_last_active_item() == id) if (ui_last_active_item() == id && !just_got_active)
{ {
float w = gfx_pretty_text_width(36.0f, str); float w = gfx_pretty_text_width(36.0f, str, at_index);
ui_do_label(x + 10 + w, y, "_", 36); ui_do_label(x + 10 + w, y, "_", 36);
} }