diff options
Diffstat (limited to 'fw/fe310/eos/eve/widget/textw.c')
-rw-r--r-- | fw/fe310/eos/eve/widget/textw.c | 90 |
1 files changed, 51 insertions, 39 deletions
diff --git a/fw/fe310/eos/eve/widget/textw.c b/fw/fe310/eos/eve/widget/textw.c index 7998e75..0a6a700 100644 --- a/fw/fe310/eos/eve/widget/textw.c +++ b/fw/fe310/eos/eve/widget/textw.c @@ -12,7 +12,7 @@ #include "widget.h" -#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS +#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS #define CH_BS 0x08 #define CH_DEL 0x7f @@ -30,20 +30,17 @@ #define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0)) -void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) { +int eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) { EVEWidget *_widget = &widget->w; size_t text_len; int rv; + rv = eve_font_verify(font, text, text_size, NULL, &text_len); + if (rv) return rv; + memset(widget, 0, sizeof(EVETextWidget)); eve_widget_init(_widget, EVE_WIDGET_TYPE_TEXT, g, page, eve_textw_draw, eve_textw_touch, eve_textw_putc); - rv = utf8_verify(text, text_size, &text_len); - if (rv) text[text_len] = '\0'; - - rv = eve_font_verify(font, text, NULL, &text_len); - if (rv) text[text_len] = '\0'; - widget->font = font; widget->text = text; widget->text_size = text_size; @@ -52,17 +49,16 @@ void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *f widget->line_size = line_size; memset(widget->line, 0xff, line_size * sizeof(uint16_t)); eve_textw_text_update(widget, 0, 0); + + return EVE_OK; } int eve_textw_update(EVETextWidget *widget) { size_t text_len; int rv; - rv = utf8_verify(widget->text, widget->text_size, &text_len); - if (rv) widget->text[text_len] = '\0'; - - rv = eve_font_verify(widget->font, widget->text, NULL, &text_len); - if (rv) widget->text[text_len] = '\0'; + rv = eve_font_verify(widget->font, widget->text, widget->text_size, NULL, &text_len); + if (rv) return rv; widget->text_len = text_len; memset(widget->line, 0xff, widget->line_size * sizeof(uint16_t)); @@ -77,6 +73,7 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) { EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window); utf8_t *text; uint16_t *line; + int rv; text = eve_malloc(tspec->text_size); if (text == NULL) { @@ -89,9 +86,12 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) { return EVE_ERR_NOMEM; } - eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size); - - return EVE_OK; + rv = eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size); + if (rv) { + eve_free(line); + eve_free(text); + } + return rv; } void eve_textw_destroy(EVEWidget *_widget) { @@ -214,7 +214,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) { for (i=line0; i<lineN; i++) { if (_widget->tagN != EVE_NOTAG) { eve_cmd_dl(TAG(_widget->tagN)); - eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT); + eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT); _widget->tagN++; } if (!s && c1 && (c1->line == i)) { @@ -257,7 +257,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) { if (lineNvisible) { if (_widget->tagN != EVE_NOTAG) { eve_cmd_dl(TAG(_widget->tagN)); - eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT); + eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT); _widget->tagN++; } draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0); @@ -276,7 +276,27 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { EVEPage *page = _widget->page; EVETextCursor *t_cursor = NULL; short dx, dl; - 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_IN: { + if (widget->cursor1.on) show_rect(widget, &widget->cursor1); + break; + } + + case EVE_UIEVT_WIDGET_FOCUS_OUT: { + if (widget->cursor1.on) eve_textw_cursor_clear(widget, &widget->cursor1); + if (widget->cursor2.on) eve_textw_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) { @@ -294,7 +314,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { if (widget->track.cursor) { if (evt & EVE_TOUCH_ETYPE_TRACK) eve_textw_cursor_set(widget, widget->track.cursor, touch->tag + widget->track.dl, eve_page_x(page, touch->x) + widget->track.dx); - ret = 1; + rv = 1; } else { if (evt & EVE_TOUCH_ETYPE_LPRESS) { if (widget->cursor2.on) { @@ -308,13 +328,12 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { } else { // select } - ret = 1; + rv = 1; } - if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT | EVE_TOUCH_EETYPE_LPRESS))) { + if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_LPRESS))) { eve_textw_cursor_set(widget, &widget->cursor1, touch->tag_up, eve_page_x(page, touch->x0)); if (widget->cursor2.on) eve_textw_cursor_clear(widget, &widget->cursor2); - show_rect(widget, &widget->cursor1); - ret = 1; + rv = 1; } } @@ -324,7 +343,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) { widget->track.dl = 0; } - return ret; + return rv; } void eve_textw_putc(void *w, int c) { @@ -334,16 +353,10 @@ void eve_textw_putc(void *w, int c) { EVETextCursor *cursor2 = &widget->cursor2; utf8_t *text; utf8_t *clipb = NULL; - int i, r; + int i, line; int ins_c = 0, del_c = 0; int ch_w = 0; - if (c == EVE_PAGE_KBDCH_CLOSE) { - if (cursor1->on) eve_textw_cursor_clear(widget, cursor1); - if (cursor2->on) eve_textw_cursor_clear(widget, cursor2); - return; - } - if (!cursor1->on) return; if (!cursor2->on && ((c == CH_BS) || (c == CH_DEL))) { @@ -401,9 +414,8 @@ void eve_textw_putc(void *w, int c) { clipb = eve_clipb_get(); if (clipb) { - rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len); - if (!rv) ch_w = eve_font_str_w(widget->font, clipb); - if (rv || (ch_w < 0)) { + rv = eve_font_verify(widget->font, clipb, EVE_CLIPB_SIZE_BUF, &ch_w, &clipb_len); + if (rv) { clipb = NULL; clipb_len = 0; ch_w = 0; @@ -437,9 +449,9 @@ void eve_textw_putc(void *w, int c) { widget->line[i] += ins_c - del_c; } - r = cursor1->line; - if (cursor1->line) r = eve_textw_text_update(widget, cursor1->line - 1, 1); - if (r == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1); + line = cursor1->line; + if (cursor1->line) line = eve_textw_text_update(widget, cursor1->line - 1, 1); + if (line == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1); if (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) { while (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) cursor1->line--; @@ -449,7 +461,7 @@ void eve_textw_putc(void *w, int c) { while ((cursor1->line != widget->line_len - 1) && (cursor1->ch > LINE_END(widget, cursor1->line))) cursor1->line++; eve_textw_cursor_update(widget, cursor1); show_rect(widget, cursor1); - } else if ((cursor1->line) && (r != cursor1->line)) { + } else if ((cursor1->line) && (line != cursor1->line)) { eve_textw_cursor_update(widget, cursor1); } else { cursor1->x += ch_w; |