From 45b9d9667885a9a15c228f508a705c97948f4eea Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Tue, 31 Jul 2012 15:13:52 +0100 Subject: Add support for editing text input widget contents from arbitrary position in string (instead of just end). --- framebuffer/fbtk/text.c | 42 +++++++++++++++++++++++++++++++----------- framebuffer/fbtk/widget.h | 2 ++ 2 files changed, 33 insertions(+), 11 deletions(-) (limited to 'framebuffer') diff --git a/framebuffer/fbtk/text.c b/framebuffer/fbtk/text.c index 27968148f..f262546e2 100644 --- a/framebuffer/fbtk/text.c +++ b/framebuffer/fbtk/text.c @@ -238,7 +238,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) /* gain focus */ if (widget->u.text.text == NULL) widget->u.text.text = calloc(1,1); - widget->u.text.idx = strlen(widget->u.text.text); + widget->u.text.idx = widget->u.text.len; fbtk_request_redraw(widget); @@ -267,18 +267,30 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) case NSFB_KEY_BACKSPACE: if (widget->u.text.idx <= 0) break; + memmove(widget->u.text.text + widget->u.text.idx - 1, + widget->u.text.text + widget->u.text.idx, + widget->u.text.len - widget->u.text.idx); widget->u.text.idx--; - widget->u.text.text[widget->u.text.idx] = 0; + widget->u.text.len--; + widget->u.text.text[widget->u.text.len] = 0; break; case NSFB_KEY_RETURN: widget->u.text.enter(widget->u.text.pw, widget->u.text.text); break; - case NSFB_KEY_PAGEUP: - case NSFB_KEY_PAGEDOWN: case NSFB_KEY_RIGHT: + if (widget->u.text.idx < widget->u.text.len) + widget->u.text.idx++; + break; + case NSFB_KEY_LEFT: + if (widget->u.text.idx > 0) + widget->u.text.idx--; + break; + + case NSFB_KEY_PAGEUP: + case NSFB_KEY_PAGEDOWN: case NSFB_KEY_UP: case NSFB_KEY_DOWN: /* Not handling any of these correctly yet, but avoid putting @@ -295,14 +307,21 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) default: /* allow for new character and null */ - temp = realloc(widget->u.text.text, widget->u.text.idx + 2); - if (temp != NULL) { - widget->u.text.text = temp; - widget->u.text.text[widget->u.text.idx] = fbtk_keycode_to_ucs4(value, modifier); - widget->u.text.text[widget->u.text.idx + 1] = '\0'; - widget->u.text.idx++; + temp = realloc(widget->u.text.text, widget->u.text.len + 2); + if (temp == NULL) { + break; } + widget->u.text.text = temp; + memmove(widget->u.text.text + widget->u.text.idx + 1, + widget->u.text.text + widget->u.text.idx, + widget->u.text.len - widget->u.text.idx); + widget->u.text.text[widget->u.text.idx] = + fbtk_keycode_to_ucs4(value, modifier); + widget->u.text.idx++; + widget->u.text.len++; + widget->u.text.text[widget->u.text.len] = '\0'; + break; } @@ -333,7 +352,8 @@ fbtk_set_text(fbtk_widget_t *widget, const char *text) free(widget->u.text.text); } widget->u.text.text = strdup(text); - widget->u.text.idx = strlen(text); + widget->u.text.len = strlen(text); + widget->u.text.idx = widget->u.text.len; fbtk_request_redraw(widget); } diff --git a/framebuffer/fbtk/widget.h b/framebuffer/fbtk/widget.h index e31fa117d..3521cc358 100644 --- a/framebuffer/fbtk/widget.h +++ b/framebuffer/fbtk/widget.h @@ -183,6 +183,8 @@ struct fbtk_widget_s { fbtk_enter_t enter; void *pw; int idx; + int len; + int width; } text; /* application driven widget */ -- cgit v1.2.3