diff options
Diffstat (limited to 'fw/fe310/eos/eve/widget/strw.c')
-rw-r--r-- | fw/fe310/eos/eve/widget/strw.c | 104 |
1 files changed, 57 insertions, 47 deletions
diff --git a/fw/fe310/eos/eve/widget/strw.c b/fw/fe310/eos/eve/widget/strw.c index 6a2692b..847de49 100644 --- a/fw/fe310/eos/eve/widget/strw.c +++ b/fw/fe310/eos/eve/widget/strw.c @@ -12,7 +12,7 @@ #include "widget.h" -#define STRW_TOUCH_OPT EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_X | EVE_TOUCH_OPT_TRACK_EXT_X | EVE_TOUCH_OPT_LPRESS +#define STRW_TOUCH_OPT EVE_TOUCH_OPT_TRACK_X | EVE_TOUCH_OPT_TRACK_EXT_X | EVE_TOUCH_OPT_LPRESS #define STRW_TMODE_NONE 0 #define STRW_TMODE_CRSR 1 @@ -27,37 +27,33 @@ #define CHAR_VALID_INPUT(c) ((c >= 0x20) && (c < 0x7f)) -void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size) { +int eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size) { EVEWidget *_widget = &widget->w; size_t str_len; int str_w, rv; + rv = eve_font_verify(font, str, str_size, &str_w, &str_len); + if (rv) return rv; + memset(widget, 0, sizeof(EVEStrWidget)); eve_widget_init(_widget, EVE_WIDGET_TYPE_STR, g, page, eve_strw_draw, eve_strw_touch, eve_strw_putc); - rv = utf8_verify(str, str_size, &str_len); - if (rv) str[str_len] = '\0'; - - rv = eve_font_verify(font, str, &str_w, &str_len); - if (rv) str[str_len] = '\0'; - widget->font = font; widget->str = str; widget->str_size = str_size; widget->str_len = str_len; widget->str_g.w = str_w; if (_widget->g.h == 0) _widget->g.h = eve_font_h(widget->font); + + return EVE_OK; } int eve_strw_update(EVEStrWidget *widget) { size_t str_len; int str_w, rv; - rv = utf8_verify(widget->str, widget->str_size, &str_len); - if (rv) widget->str[str_len] = '\0'; - - rv = eve_font_verify(widget->font, widget->str, &str_w, &str_len); - if (rv) widget->str[str_len] = '\0'; + rv = eve_font_verify(widget->font, widget->str, widget->str_size, &str_w, &str_len); + if (rv) return rv; widget->str_len = str_len; widget->str_g.w = str_w; @@ -71,14 +67,15 @@ int eve_strw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) { EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window); utf8_t *str; uint16_t *line; + int rv; str = eve_malloc(tspec->str_size); if (str == NULL) return EVE_ERR_NOMEM; str[0] = '\0'; - eve_strw_init(widget, &spec->g, page, font, str, tspec->str_size); - - return EVE_OK; + rv = eve_strw_init(widget, &spec->g, page, font, str, tspec->str_size); + if (rv) eve_free(str); + return rv; } void eve_strw_destroy(EVEWidget *_widget) { @@ -87,15 +84,20 @@ void eve_strw_destroy(EVEWidget *_widget) { eve_free(widget->str); } -static void show_rect(EVEStrWidget *widget) { +static void show_text(EVEStrWidget *widget, EVEStrCursor *cursor, int del_w) { EVEWidget *_widget = &widget->w; - EVERect focus; + int w0 = widget->font->w; + int w1 = _widget->g.w - widget->font->w; - focus.x = _widget->g.x; - focus.y = _widget->g.y; - focus.w = _widget->g.w; - focus.h = 2 * widget->font->h; - eve_page_show_rect(_widget->page, &focus); + if (del_w && (widget->str_g.w - widget->str_g.x < w1)) { + widget->str_g.x = (widget->str_g.x > del_w ? widget->str_g.x - del_w : 0); + } + if (cursor->x - widget->str_g.x < w0) { + widget->str_g.x = (cursor->x > w0 ? cursor->x - w0 : 0); + } + if (cursor->x - widget->str_g.x > w1) { + widget->str_g.x = cursor->x - w1; + } } static EVEStrCursor *cursor_prox(EVEStrWidget *widget, EVEStrCursor *cursor, EVETouch *touch, short *dx) { @@ -156,7 +158,7 @@ uint8_t eve_strw_draw(EVEWidget *_widget, uint8_t tag0) { _widget->tag0 = tag0; if (tag0 != EVE_NOTAG) { eve_cmd_dl(TAG(tag0)); - eve_touch_set_opt(tag0, STRW_TOUCH_OPT); + eve_tag_set_opt(tag0, STRW_TOUCH_OPT); tag0++; } _widget->tagN = tag0; @@ -228,7 +230,22 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { EVEPage *page = _widget->page; EVEStrCursor *t_cursor = NULL; short dx; - int ret = 0; + int rv = 0; + + /* widget received non-touch event */ + if (evt & EVE_TOUCH_ETYPE_EXT) { + evt &= ~EVE_TOUCH_ETYPE_EXT; + switch (evt) { + case EVE_UIEVT_WIDGET_FOCUS_OUT: { + if (widget->cursor1.on) eve_strw_cursor_clear(widget, &widget->cursor1); + if (widget->cursor2.on) eve_strw_cursor_clear(widget, &widget->cursor2); + break; + } + } + + /* always return 0 for non-touch events */ + return 0; + } if (evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TRACK_START)) { if (widget->cursor2.on) { @@ -266,10 +283,11 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { case STRW_TMODE_CRSR: eve_strw_cursor_set(widget, widget->track.cursor, eve_page_x(page, touch->x) + widget->track.dx); + show_text(widget, widget->track.cursor, 0); break; } } - ret = 1; + rv = 1; } else { if (evt & EVE_TOUCH_ETYPE_LPRESS) { if (widget->cursor2.on) { @@ -283,13 +301,12 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { } else { // select } - ret = 1; + rv = 1; } - if ((evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT | EVE_TOUCH_EETYPE_LPRESS))) { + if ((evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_LPRESS))) { eve_strw_cursor_set(widget, &widget->cursor1, eve_page_x(page, touch->x0)); if (widget->cursor2.on) eve_strw_cursor_clear(widget, &widget->cursor2); - show_rect(widget); - ret = 1; + rv = 1; } } @@ -299,7 +316,7 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { widget->track.dx = 0; } - return ret; + return rv; } void eve_strw_putc(void *w, int c) { @@ -309,19 +326,18 @@ void eve_strw_putc(void *w, int c) { EVEStrCursor *cursor2 = &widget->cursor2; utf8_t *str; utf8_t *clipb = NULL; - int w0 = widget->font->w; - int w1 = _widget->g.w - widget->font->w; int ins_c = 0, del_c = 0; int ins_w = 0, del_w = 0; - if (c == EVE_PAGE_KBDCH_CLOSE) { - if (cursor1->on) eve_strw_cursor_clear(widget, cursor1); - if (cursor2->on) eve_strw_cursor_clear(widget, cursor2); + if (!cursor1->on) return; + + if (c == '\n') { + EVEPage *page = _widget->page; + + eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_UPDATE, _widget); return; } - if (!cursor1->on) return; - if (!cursor2->on && ((c == CH_BS) || (c == CH_DEL))) { ucp_t uc; @@ -349,10 +365,6 @@ void eve_strw_putc(void *w, int c) { } break; } - if (widget->str_g.w - widget->str_g.x < w1) { - widget->str_g.x -= del_w; - if (widget->str_g.x < 0) widget->str_g.x = 0; - } } else { EVEStrCursor *c1 = cursor1; EVEStrCursor *c2 = cursor1; @@ -387,9 +399,8 @@ void eve_strw_putc(void *w, int c) { clipb = eve_clipb_get(); if (clipb) { - rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len); - if (!rv) ins_w = eve_font_str_w(widget->font, clipb); - if (rv || (ins_w < 0)) { + rv = eve_font_verify(widget->font, clipb, EVE_CLIPB_SIZE_BUF, &ins_w, &clipb_len); + if (rv) { clipb = NULL; clipb_len = 0; ins_w = 0; @@ -419,8 +430,7 @@ void eve_strw_putc(void *w, int c) { if (cursor2->on) eve_strw_cursor_clear(widget, cursor2); } - if (cursor1->x - widget->str_g.x < w0) widget->str_g.x = cursor1->x > w0 ? cursor1->x - w0 : 0; - if (cursor1->x - widget->str_g.x > w1) widget->str_g.x = cursor1->x - w1; + show_text(widget, cursor1, del_w); } void eve_strw_cursor_set(EVEStrWidget *widget, EVEStrCursor *cursor, int16_t x) { |