summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/widget/strw.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/widget/strw.c')
-rw-r--r--fw/fe310/eos/eve/widget/strw.c104
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) {