diff options
author | Uros Majstorovic <majstor@majstor.org> | 2020-08-23 22:37:16 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2020-08-23 22:37:16 +0200 |
commit | 1e5eb7cb910e6f23c69c2c986b6373e9f9abb980 (patch) | |
tree | 5e8ed0ad6b2fcba747c626c1c51afebbf76b3b9d /fw/fe310/eos/eve | |
parent | 57c1824affca858023c65c84e188ea7dc6c0a5f2 (diff) |
dynamic memory alloc for gui added; page navigation added
Diffstat (limited to 'fw/fe310/eos/eve')
27 files changed, 442 insertions, 82 deletions
diff --git a/fw/fe310/eos/eve/Makefile b/fw/fe310/eos/eve/Makefile index d700b30..68d406a 100644 --- a/fw/fe310/eos/eve/Makefile +++ b/fw/fe310/eos/eve/Makefile @@ -14,4 +14,4 @@ obj = eve.o eve_touch.o eve_track.o eve_kbd.o eve_text.o eve_platform.o all: $(obj) clean: - rm -f *.o
\ No newline at end of file + rm -f *.o diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c index 1db5744..1152699 100644 --- a/fw/fe310/eos/eve/eve.c +++ b/fw/fe310/eos/eve/eve.c @@ -395,6 +395,7 @@ static int _init(void) { } int eve_init(int pwr_on) { + pwr_on = 1; // override this for now if (pwr_on) { int rv = _init(); if (rv) return rv; diff --git a/fw/fe310/eos/eve/eve.h b/fw/fe310/eos/eve/eve.h index eb59959..c482d83 100644 --- a/fw/fe310/eos/eve/eve.h +++ b/fw/fe310/eos/eve/eve.h @@ -7,6 +7,7 @@ #define EVE_OK 0 #define EVE_ERR -1 +#define EVE_ERR_NOMEM -100 #define EVE_PSTATE_ACTIVE 0 #define EVE_PSTATE_STANDBY 1 diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h index 41ec6b4..514c4ee 100644 --- a/fw/fe310/eos/eve/eve_platform.h +++ b/fw/fe310/eos/eve/eve_platform.h @@ -1,7 +1,7 @@ #include <stdint.h> -#include "../spi.h" -#include "../timer.h" +#include "spi.h" +#include "timer.h" #define EVE_ETYPE_INTR 1 #define EVE_PIN_INTR 0 @@ -19,6 +19,9 @@ #define eve_spi_xchg24 eos_spi_xchg24 #define eve_spi_xchg32 eos_spi_xchg32 +#define eve_malloc malloc +#define eve_free free + void eve_time_sleep(uint32_t ms); void eve_timer_set(uint32_t ms); void eve_timer_clear(void); diff --git a/fw/fe310/eos/eve/screen/Makefile b/fw/fe310/eos/eve/screen/Makefile index b6cb393..b1650bd 100644 --- a/fw/fe310/eos/eve/screen/Makefile +++ b/fw/fe310/eos/eve/screen/Makefile @@ -2,7 +2,7 @@ include ../../../common.mk CFLAGS += -I.. -I../.. -obj = font.o screen.o window.o kbdwin.o page.o form.o +obj = screen.o window.o kbdwin.o page.o form.o %.o: %.c %.h @@ -14,4 +14,4 @@ obj = font.o screen.o window.o kbdwin.o page.o form.o all: $(obj) clean: - rm -f *.o
\ No newline at end of file + rm -f *.o diff --git a/fw/fe310/eos/eve/screen/form.c b/fw/fe310/eos/eve/screen/form.c index f7d37ee..52cfdc6 100644 --- a/fw/fe310/eos/eve/screen/form.c +++ b/fw/fe310/eos/eve/screen/form.c @@ -8,15 +8,18 @@ #include "screen.h" #include "window.h" #include "page.h" -#include "font.h" #include "form.h" +#include "widget/font.h" #include "widget/label.h" #include "widget/widget.h" -int eve_form_init(EVEForm *form, EVEWindow *window, EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close) { +#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) +#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) + +int eve_form_init(EVEForm *form, EVEWindow *window, EVEPageStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_destructor_t destructor) { memset(form, 0, sizeof(EVEForm)); - eve_page_init(&form->p, window, eve_form_touch, eve_form_draw, open, close, eve_form_handle_evt, eve_form_update_g); + eve_page_init(&form->p, window, stack, eve_form_touch, eve_form_draw, eve_form_handle_evt, eve_form_update_g, destructor); form->widget = widget; form->widget_size = widget_size; eve_form_update_g(&form->p, NULL); @@ -80,7 +83,7 @@ uint8_t eve_form_draw(EVEView *v, uint8_t tag0) { return tagN; } -void eve_form_handle_evt(EVEPage *page, EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx) { +int eve_form_handle_evt(EVEPage *page, EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx) { /* if (evt & EVE_TOUCH_ETYPE_TRACK_Y) { // do scroll @@ -94,15 +97,28 @@ void eve_form_update_g(EVEPage *page, EVEWidget *_widget) { EVEForm *form = (EVEForm *)page; EVEWidget *widget = form->widget; int i; + uint16_t w = 0; uint16_t h = 0; + uint16_t _h = 0; for (i=0; i<form->widget_size; i++) { if (widget->label) { + h += _h; + w = widget->label->g.w; + _h = widget->label->g.h; + widget->label->g.x = 0; widget->label->g.y = h; - if (widget->label->g.w + widget->g.w > form->p.v.window->g.w) h += widget->label->g.h; } + if (w + widget->g.w >= form->p.v.window->g.w) { + h += _h; + w = 0; + _h = 0; + } + widget->g.x = w; widget->g.y = h; - h += widget->g.h; + + w += widget->g.w; + _h = MAX(_h, widget->g.h); widget = eve_widget_next(widget); } diff --git a/fw/fe310/eos/eve/screen/form.h b/fw/fe310/eos/eve/screen/form.h index 7742b8c..91a4f8a 100644 --- a/fw/fe310/eos/eve/screen/form.h +++ b/fw/fe310/eos/eve/screen/form.h @@ -8,8 +8,8 @@ typedef struct EVEForm { uint16_t widget_size; } EVEForm; -int eve_form_init(EVEForm *form, EVEWindow *window, struct EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close); +int eve_form_init(EVEForm *form, EVEWindow *window, EVEPageStack *stack, struct EVEWidget *widget, uint16_t widget_size, eve_page_destructor_t destructor); int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx); uint8_t eve_form_draw(EVEView *v, uint8_t tag0); -void eve_form_handle_evt(EVEPage *page, struct EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx); +int eve_form_handle_evt(EVEPage *page, struct EVEWidget *widget, EVETouch *touch, uint16_t evt, uint8_t tag0, int touch_idx); void eve_form_update_g(EVEPage *page, struct EVEWidget *widget); diff --git a/fw/fe310/eos/eve/screen/page.c b/fw/fe310/eos/eve/screen/page.c index f54056c..9579346 100644 --- a/fw/fe310/eos/eve/screen/page.c +++ b/fw/fe310/eos/eve/screen/page.c @@ -8,26 +8,60 @@ #include "screen.h" #include "window.h" #include "page.h" -#include "font.h" +#include "widget/font.h" #include "widget/label.h" #include "widget/widget.h" #define CH_EOF 0x1a -void eve_page_init(EVEPage *page, EVEWindow *window, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_open_t open, eve_page_close_t close, eve_page_evt_handler_t handle_evt, eve_page_g_updater_t update_g) { +void eve_page_init(EVEPage *page, EVEWindow *window, EVEPageStack *stack, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_evt_handler_t handle_evt, eve_page_g_updater_t update_g, eve_page_destructor_t destructor) { memset(page, 0, sizeof(EVEPage)); page->v.touch = touch; page->v.draw = draw; page->v.window = window; - page->open = open; - page->close = close; page->handle_evt = handle_evt; page->update_g = update_g; + page->destructor = destructor; + page->stack = stack; page->widget_f = NULL; window->view = (EVEView *)page; } +void eve_page_stack_init(EVEPageStack *stack) { + memset(stack, 0, sizeof(EVEPageStack)); +} + +void eve_page_create(EVEWindow *window, EVEPageStack *stack, eve_page_constructor_t constructor) { + if (stack->level < EVE_PAGE_SIZE_STACK - 1) { + stack->constructor[stack->level] = constructor; + stack->level++; + constructor(window, stack); + } +} + +void eve_page_open(EVEPage *parent, eve_page_constructor_t constructor) { + EVEWindow *window = parent->v.window; + EVEPageStack *stack = parent->stack; + + parent->destructor(parent); + eve_page_create(window, stack, constructor); +} + +void eve_page_close(EVEPage *page) { + EVEWindow *window = page->v.window; + EVEPageStack *stack = page->stack; + + if (stack->level > 1) { + eve_page_constructor_t constructor; + + stack->level--; + constructor = stack->constructor[stack->level - 1]; + page->destructor(page); + constructor(window, stack); + } +} + int16_t eve_page_x(EVEPage *page, int16_t x) { return x + page->win_x - page->v.window->g.x; } diff --git a/fw/fe310/eos/eve/screen/page.h b/fw/fe310/eos/eve/screen/page.h index eebedfd..227375c 100644 --- a/fw/fe310/eos/eve/screen/page.h +++ b/fw/fe310/eos/eve/screen/page.h @@ -1,25 +1,38 @@ #include <stdint.h> +#define EVE_PAGE_SIZE_STACK 16 + struct EVEPage; struct EVEWidget; +struct EVEPageStack; -typedef void (*eve_page_open_t) (struct EVEPage *, struct EVEPage *); -typedef void (*eve_page_close_t) (struct EVEPage *); -typedef void (*eve_page_evt_handler_t) (struct EVEPage *, struct EVEWidget *, EVETouch *, uint16_t, uint8_t, int); +typedef void (*eve_page_constructor_t) (EVEWindow *window, struct EVEPageStack *); +typedef void (*eve_page_destructor_t) (struct EVEPage *); +typedef int (*eve_page_evt_handler_t) (struct EVEPage *, struct EVEWidget *, EVETouch *, uint16_t, uint8_t, int); typedef void (*eve_page_g_updater_t) (struct EVEPage *, struct EVEWidget *); typedef struct EVEPage { EVEView v; int16_t win_x; int16_t win_y; - eve_page_open_t open; - eve_page_close_t close; eve_page_evt_handler_t handle_evt; eve_page_g_updater_t update_g; + eve_page_destructor_t destructor; + struct EVEPageStack *stack; struct EVEWidget *widget_f; } EVEPage; -void eve_page_init(EVEPage *page, EVEWindow *window, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_open_t open, eve_page_close_t close, eve_page_evt_handler_t handle_evt, eve_page_g_updater_t update_g); +typedef struct EVEPageStack { + eve_page_constructor_t constructor[EVE_PAGE_SIZE_STACK]; + uint8_t level; +} EVEPageStack; + +void eve_page_init(EVEPage *page, EVEWindow *window, EVEPageStack *stack, eve_view_touch_t touch, eve_view_draw_t draw, eve_page_evt_handler_t handle_evt, eve_page_g_updater_t update_g, eve_page_destructor_t destructor); +void eve_page_stack_init(EVEPageStack *stack); +void eve_page_create(EVEWindow *window, EVEPageStack *stack, eve_page_constructor_t constructor); +void eve_page_open(EVEPage *parent, eve_page_constructor_t constructor); +void eve_page_close(EVEPage *page); + int16_t eve_page_x(EVEPage *page, int16_t x); int16_t eve_page_y(EVEPage *page, int16_t y); int16_t eve_page_scr_x(EVEPage *page, int16_t x); diff --git a/fw/fe310/eos/eve/widget/Makefile b/fw/fe310/eos/eve/widget/Makefile index 160db72..720029e 100644 --- a/fw/fe310/eos/eve/widget/Makefile +++ b/fw/fe310/eos/eve/widget/Makefile @@ -2,7 +2,7 @@ include ../../../common.mk CFLAGS += -I.. -I../.. -obj = clipb.o label.o widget.o pagew.o strw.o textw.o +obj = clipb.o font.o label.o widget.o freew.o spacerw.o pagew.o strw.o textw.o %.o: %.c %.h @@ -14,4 +14,4 @@ obj = clipb.o label.o widget.o pagew.o strw.o textw.o all: $(obj) clean: - rm -f *.o
\ No newline at end of file + rm -f *.o diff --git a/fw/fe310/eos/eve/screen/font.c b/fw/fe310/eos/eve/widget/font.c index da02983..da02983 100644 --- a/fw/fe310/eos/eve/screen/font.c +++ b/fw/fe310/eos/eve/widget/font.c diff --git a/fw/fe310/eos/eve/screen/font.h b/fw/fe310/eos/eve/widget/font.h index aff038c..aff038c 100644 --- a/fw/fe310/eos/eve/screen/font.h +++ b/fw/fe310/eos/eve/widget/font.h diff --git a/fw/fe310/eos/eve/widget/freew.c b/fw/fe310/eos/eve/widget/freew.c new file mode 100644 index 0000000..55f91cb --- /dev/null +++ b/fw/fe310/eos/eve/widget/freew.c @@ -0,0 +1,61 @@ +#include <stdlib.h> +#include <string.h> + +#include "eve.h" +#include "eve_kbd.h" +#include "unicode.h" + +#include "screen/screen.h" +#include "screen/window.h" +#include "screen/page.h" + +#include "font.h" +#include "label.h" +#include "widget.h" +#include "freew.h" + +int eve_freew_create(EVEFreeWidget *widget, EVERect *g, EVEFreeSpec *spec) { + eve_freew_init(widget, g, spec->touch, spec->draw, spec->putc); + + return EVE_OK; +} + +void eve_freew_init(EVEFreeWidget *widget, EVERect *g, eve_freew_touch_t touch, eve_freew_draw_t draw, eve_kbd_input_handler_t putc) { + EVEWidget *_widget = &widget->w; + + memset(widget, 0, sizeof(EVEFreeWidget)); + eve_widget_init(_widget, EVE_WIDGET_TYPE_FREE, g, eve_freew_touch, eve_freew_draw, putc); + eve_freew_update(widget, touch, draw, NULL); +} + +void eve_freew_update(EVEFreeWidget *widget, eve_freew_touch_t touch, eve_freew_draw_t draw, eve_kbd_input_handler_t putc) { + if (touch) widget->_touch = touch; + if (draw) widget->_draw = draw; + if (putc) widget->w.putc = putc; +} + +int eve_freew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx) { + EVEFreeWidget *widget = (EVEFreeWidget *)_widget; + EVETouch *t; + uint16_t evt; + int ret = 0; + + if (touch_idx > 0) return 0; + + t = eve_touch_evt(tag0, touch_idx, widget->tag0, widget->tagN - widget->tag0, &evt); + if (t && evt) { + ret = widget->_touch(widget, page, t, evt, tag0, touch_idx); + if (!ret && page && page->handle_evt) ret = page->handle_evt(page, _widget, t, evt, tag0, touch_idx); + } + + return ret; +} + +uint8_t eve_freew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) { + EVEFreeWidget *widget = (EVEFreeWidget *)_widget; + + widget->tag0 = tag0; + widget->tagN = widget->_draw(widget, page, tag0); + + return widget->tagN; +} diff --git a/fw/fe310/eos/eve/widget/freew.h b/fw/fe310/eos/eve/widget/freew.h new file mode 100644 index 0000000..49f896f --- /dev/null +++ b/fw/fe310/eos/eve/widget/freew.h @@ -0,0 +1,27 @@ +#include <stdint.h> + +struct EVEFreeWidget; + +typedef int (*eve_freew_touch_t) (struct EVEFreeWidget *, EVEPage *, EVETouch *, uint16_t, uint8_t, int); +typedef uint8_t (*eve_freew_draw_t) (struct EVEFreeWidget *, EVEPage *, uint8_t); + +typedef struct EVEFreeWidget { + EVEWidget w; + eve_freew_touch_t _touch; + eve_freew_draw_t _draw; + uint8_t tag0; + uint8_t tagN; +} EVEFreeWidget; + +typedef struct EVEFreeSpec { + eve_freew_touch_t touch; + eve_freew_draw_t draw; + eve_kbd_input_handler_t putc; +} EVEFreeSpec; + +int eve_freew_create(EVEFreeWidget *widget, EVERect *g, EVEFreeSpec *spec); +void eve_freew_init(EVEFreeWidget *widget, EVERect *g, eve_freew_touch_t touch, eve_freew_draw_t draw, eve_kbd_input_handler_t putc); +void eve_freew_update(EVEFreeWidget *widget, eve_freew_touch_t touch, eve_freew_draw_t draw, eve_kbd_input_handler_t putc); + +int eve_freew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx); +uint8_t eve_freew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0);
\ No newline at end of file diff --git a/fw/fe310/eos/eve/widget/label.c b/fw/fe310/eos/eve/widget/label.c index ebea823..b4af37f 100644 --- a/fw/fe310/eos/eve/widget/label.c +++ b/fw/fe310/eos/eve/widget/label.c @@ -8,15 +8,15 @@ #include "screen/screen.h" #include "screen/window.h" #include "screen/page.h" -#include "screen/font.h" +#include "font.h" #include "label.h" void eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title) { memset(label, 0, sizeof(EVELabel)); if (g) label->g = *g; - label->title = title; label->font = font; + label->title = title; if (label->g.w == 0) label->g.w = eve_font_str_w(font, label->title); if (label->g.h == 0) label->g.h = eve_font_h(font); } diff --git a/fw/fe310/eos/eve/widget/label.h b/fw/fe310/eos/eve/widget/label.h index ec96844..659c057 100644 --- a/fw/fe310/eos/eve/widget/label.h +++ b/fw/fe310/eos/eve/widget/label.h @@ -2,8 +2,8 @@ typedef struct EVELabel { EVERect g; - char *title; EVEFont *font; + char *title; } EVELabel; void eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title); diff --git a/fw/fe310/eos/eve/widget/pagew.c b/fw/fe310/eos/eve/widget/pagew.c index c64c477..b3e71a6 100644 --- a/fw/fe310/eos/eve/widget/pagew.c +++ b/fw/fe310/eos/eve/widget/pagew.c @@ -8,20 +8,32 @@ #include "screen/screen.h" #include "screen/window.h" #include "screen/page.h" -#include "screen/font.h" +#include "font.h" #include "label.h" #include "widget.h" #include "pagew.h" -void eve_pagew_init(EVEPageWidget *widget, EVERect *g, char *title, EVEFont *font, EVEPage *page) { +int eve_pagew_create(EVEPageWidget *widget, EVERect *g, EVEPageSpec *spec) { + eve_pagew_init(widget, g, spec->font, spec->title, spec->constructor); + + return EVE_OK; +} + +void eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEFont *font, char *title, eve_page_constructor_t constructor) { EVEWidget *_widget = &widget->w; memset(widget, 0, sizeof(EVEPageWidget)); eve_widget_init(_widget, EVE_WIDGET_TYPE_PAGE, g, eve_pagew_touch, eve_pagew_draw, NULL); - widget->title = title; - widget->font = font; - widget->page = page; + eve_pagew_update(widget, font, title, constructor); +} + +void eve_pagew_update(EVEPageWidget *widget, EVEFont *font, char *title, eve_page_constructor_t constructor) { + EVEWidget *_widget = &widget->w; + + if (font) widget->font = font; + if (title) widget->title = title; + if (constructor) widget->constructor = constructor; if (_widget->g.w == 0) _widget->g.w = eve_font_str_w(font, widget->title); if (_widget->g.h == 0) _widget->g.h = eve_font_h(font); } @@ -37,12 +49,13 @@ int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i t = eve_touch_evt(tag0, touch_idx, widget->tag, 1, &evt); if (t && evt) { if (evt & EVE_TOUCH_ETYPE_TRACK_MASK) { - if (page && page->handle_evt) page->handle_evt(page, _widget, t, evt, tag0, touch_idx); + if (page->handle_evt) ret = page->handle_evt(page, _widget, t, evt, tag0, touch_idx); } else if (evt & EVE_TOUCH_ETYPE_TAG_UP) { - widget->page->open(widget->page, page); + eve_page_open(page, widget->constructor); + ret = 1; } - ret = 1; } + return ret; } diff --git a/fw/fe310/eos/eve/widget/pagew.h b/fw/fe310/eos/eve/widget/pagew.h index 1f9ae18..797f1c3 100644 --- a/fw/fe310/eos/eve/widget/pagew.h +++ b/fw/fe310/eos/eve/widget/pagew.h @@ -4,10 +4,19 @@ typedef struct EVEPageWidget { EVEWidget w; char *title; EVEFont *font; - EVEPage *page; + eve_page_constructor_t constructor; uint8_t tag; } EVEPageWidget; -void eve_pagew_init(EVEPageWidget *widget, EVERect *g, char *title, EVEFont *font, EVEPage *page); +typedef struct EVEPageSpec { + EVEFont *font; + char *title; + eve_page_constructor_t constructor; +} EVEPageSpec; + +int eve_pagew_create(EVEPageWidget *widget, EVERect *g, EVEPageSpec *spec); +void eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEFont *font, char *title, eve_page_constructor_t constructor); +void eve_pagew_update(EVEPageWidget *widget, EVEFont *font, char *title, eve_page_constructor_t constructor); + int eve_pagew_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx); uint8_t eve_pagew_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0); diff --git a/fw/fe310/eos/eve/widget/spacerw.c b/fw/fe310/eos/eve/widget/spacerw.c new file mode 100644 index 0000000..23aec14 --- /dev/null +++ b/fw/fe310/eos/eve/widget/spacerw.c @@ -0,0 +1,36 @@ +#include <stdlib.h> +#include <string.h> + +#include "eve.h" +#include "eve_kbd.h" +#include "unicode.h" + +#include "screen/screen.h" +#include "screen/window.h" +#include "screen/page.h" + +#include "font.h" +#include "label.h" +#include "widget.h" +#include "spacerw.h" + +int eve_spacerw_create(EVESpacerWidget *widget, EVERect *g, EVESpacerSpec *spec) { + eve_spacerw_init(widget, g); + + return EVE_OK; +} + +void eve_spacerw_init(EVESpacerWidget *widget, EVERect *g) { + EVEWidget *_widget = &widget->w; + + memset(widget, 0, sizeof(EVESpacerWidget)); + eve_widget_init(_widget, EVE_WIDGET_TYPE_SPACER, g, eve_spacerw_touch, eve_spacerw_draw, NULL); +} + +int eve_spacerw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx) { + return 0; +} + +uint8_t eve_spacerw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0) { + return tag0; +} diff --git a/fw/fe310/eos/eve/widget/spacerw.h b/fw/fe310/eos/eve/widget/spacerw.h new file mode 100644 index 0000000..cbde4e8 --- /dev/null +++ b/fw/fe310/eos/eve/widget/spacerw.h @@ -0,0 +1,14 @@ +#include <stdint.h> + +typedef struct EVESpacerWidget { + EVEWidget w; +} EVESpacerWidget; + +typedef struct EVESpacerSpec { +} EVESpacerSpec; + +int eve_spacerw_create(EVESpacerWidget *widget, EVERect *g, EVESpacerSpec *spec); +void eve_spacerw_init(EVESpacerWidget *widget, EVERect *g); + +int eve_spacerw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx); +uint8_t eve_spacerw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0); diff --git a/fw/fe310/eos/eve/widget/strw.c b/fw/fe310/eos/eve/widget/strw.c index 2a80a28..e973575 100644 --- a/fw/fe310/eos/eve/widget/strw.c +++ b/fw/fe310/eos/eve/widget/strw.c @@ -8,9 +8,9 @@ #include "screen/screen.h" #include "screen/window.h" #include "screen/page.h" -#include "screen/font.h" #include "clipb.h" +#include "font.h" #include "label.h" #include "widget.h" #include "strw.h" @@ -29,22 +29,47 @@ #define CHAR_VALID_INPUT(c) ((c >= 0x20) && (c < 0x7f)) +int eve_strw_create(EVEStrWidget *widget, EVERect *g, EVEStrSpec *spec) { + utf8_t *str; + uint16_t *line; + + str = eve_malloc(spec->str_size); + if (str == NULL) return EVE_ERR_NOMEM; + str[0] = '\0'; + + eve_strw_init(widget, g, spec->font, str, spec->str_size); + + return EVE_OK; +} + +void eve_strw_destroy(EVEStrWidget *widget) { + eve_free(widget->str); +} + void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEFont *font, utf8_t *str, uint16_t str_size) { - int rv, str_len; EVEWidget *_widget = &widget->w; memset(widget, 0, sizeof(EVEStrWidget)); eve_widget_init(_widget, EVE_WIDGET_TYPE_STR, g, eve_strw_touch, eve_strw_draw, eve_strw_putc); - widget->font = font; - widget->str = str; - widget->str_size = str_size; - rv = utf8_verify(str, str_size, &str_len); - if (rv != UTF_OK) { - if (str_len >= str_size) str_len = 0; - widget->str[str_len] = '\0'; + eve_strw_update(widget, font, str, str_size); +} + +void eve_strw_update(EVEStrWidget *widget, EVEFont *font, utf8_t *str, uint16_t str_size) { + int rv, str_len; + EVEWidget *_widget = &widget->w; + + if (font) widget->font = font; + if (str) { + widget->str = str; + widget->str_size = str_size; + rv = utf8_verify(str, str_size, &str_len); + if (rv != UTF_OK) { + if (str_len >= str_size) str_len = 0; + widget->str[str_len] = '\0'; + } + widget->str_len = str_len; + widget->str_g.w = eve_font_str_w(font, str); } - widget->str_len = str_len; - widget->str_g.w = eve_font_str_w(font, str); if (_widget->g.h == 0) _widget->g.h = eve_font_h(font); } diff --git a/fw/fe310/eos/eve/widget/strw.h b/fw/fe310/eos/eve/widget/strw.h index 72fc6aa..9456603 100644 --- a/fw/fe310/eos/eve/widget/strw.h +++ b/fw/fe310/eos/eve/widget/strw.h @@ -27,7 +27,16 @@ typedef struct EVEStrWidget { } track; } EVEStrWidget; +typedef struct EVEStrSpec { + EVEFont *font; + uint16_t str_size; +} EVEStrSpec; + +int eve_strw_create(EVEStrWidget *widget, EVERect *g, EVEStrSpec *spec); +void eve_strw_destroy(EVEStrWidget *widget); void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEFont *font, utf8_t *str, uint16_t str_size); +void eve_strw_update(EVEStrWidget *widget, EVEFont *font, utf8_t *str, uint16_t str_size); + int eve_strw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx); uint8_t eve_strw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0); void eve_strw_putc(void *_page, int c); diff --git a/fw/fe310/eos/eve/widget/textw.c b/fw/fe310/eos/eve/widget/textw.c index bf075cf..5835a57 100644 --- a/fw/fe310/eos/eve/widget/textw.c +++ b/fw/fe310/eos/eve/widget/textw.c @@ -8,9 +8,9 @@ #include "screen/screen.h" #include "screen/window.h" #include "screen/page.h" -#include "screen/font.h" #include "clipb.h" +#include "font.h" #include "label.h" #include "widget.h" #include "textw.h" @@ -35,25 +35,59 @@ #define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0)) +int eve_textw_create(EVETextWidget *widget, EVERect *g, EVETextSpec *spec) { + utf8_t *text; + uint16_t *line; + + text = eve_malloc(spec->text_size); + if (text == NULL) { + return EVE_ERR_NOMEM; + } + text[0] = '\0'; + line = eve_malloc(sizeof(uint16_t) * spec->line_size); + if (line == NULL) { + free(text); + return EVE_ERR_NOMEM; + } + + eve_textw_init(widget, g, spec->font, text, spec->text_size, line, spec->line_size); + + return EVE_OK; +} + +void eve_textw_destroy(EVETextWidget *widget) { + eve_free(widget->line); + eve_free(widget->text); +} + void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) { - int rv, text_len; EVEWidget *_widget = &widget->w; memset(widget, 0, sizeof(EVETextWidget)); eve_widget_init(_widget, EVE_WIDGET_TYPE_TEXT, g, eve_textw_touch, eve_textw_draw, eve_textw_putc); - widget->font = font; - widget->text = text; - widget->text_size = text_size; - rv = utf8_verify(text, text_size, &text_len); - if (rv != UTF_OK) { - if (text_len >= text_size) text_len = 0; - widget->text[text_len] = '\0'; + eve_textw_update(widget, font, text, text_size, line, line_size); +} + +void eve_textw_update(EVETextWidget *widget, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) { + int rv, text_len; + + if (font) widget->font = font; + if (text) { + widget->text = text; + widget->text_size = text_size; + rv = utf8_verify(text, text_size, &text_len); + if (rv != UTF_OK) { + if (text_len >= text_size) text_len = 0; + widget->text[text_len] = '\0'; + } + widget->text_len = text_len; + } + if (line) { + widget->line = line; + widget->line_size = line_size; } - widget->text_len = text_len; - widget->line = line; - widget->line_size = line_size; memset(widget->line, 0xff, line_size * sizeof(uint16_t)); - eve_textw_update(widget, NULL, 0); + eve_textw_text_update(widget, NULL, 0); } static void set_focus(EVETextWidget *widget, EVETextCursor *cursor, EVEPage *page) { @@ -87,7 +121,6 @@ int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i EVETextWidget *widget = (EVETextWidget *)_widget; EVETouch *t; uint16_t evt; - int ret = 0; if (touch_idx > 0) return 0; @@ -121,7 +154,9 @@ int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i break; case TEXTW_TMODE_CURSOR: - if (evt & EVE_TOUCH_ETYPE_TRACK) eve_textw_cursor_set(widget, widget->track.cursor, t->tag + widget->track.dl, eve_page_x(page, t->x) + widget->track.dx); + if (evt & EVE_TOUCH_ETYPE_TRACK) { + eve_textw_cursor_set(widget, widget->track.cursor, t->tag + widget->track.dl, eve_page_x(page, t->x) + widget->track.dx); + } break; default: @@ -153,10 +188,10 @@ int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_i widget->track.dl = 0; } - ret = 1; + return 1; } - return ret; + return 0; } static void _draw_line(EVETextWidget *widget, EVEWindow *window, uint16_t l, uint16_t ch, uint16_t len, uint16_t x1, uint16_t x2, char s) { @@ -387,8 +422,8 @@ void eve_textw_putc(void *_page, int c) { } r = cursor1->line; - if (cursor1->line) r = eve_textw_update(widget, page, cursor1->line - 1); - if ((cursor1->line == 0) || (r == cursor1->line - 1)) r = eve_textw_update(widget, page, cursor1->line); + if (cursor1->line) r = eve_textw_text_update(widget, page, cursor1->line - 1); + if ((cursor1->line == 0) || (r == cursor1->line - 1)) r = eve_textw_text_update(widget, page, cursor1->line); if (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) { cursor1->line--; @@ -403,7 +438,7 @@ void eve_textw_putc(void *_page, int c) { } } -uint16_t eve_textw_update(EVETextWidget *widget, EVEPage *page, uint16_t line) { +uint16_t eve_textw_text_update(EVETextWidget *widget, EVEPage *page, uint16_t line) { int i; utf32_t ch; uint8_t ch_w; diff --git a/fw/fe310/eos/eve/widget/textw.h b/fw/fe310/eos/eve/widget/textw.h index cd46ea3..36ab466 100644 --- a/fw/fe310/eos/eve/widget/textw.h +++ b/fw/fe310/eos/eve/widget/textw.h @@ -29,11 +29,21 @@ typedef struct EVETextWidget { } track; } EVETextWidget; +typedef struct EVETextSpec { + EVEFont *font; + uint16_t text_size; + uint16_t line_size; +} EVETextSpec; + +int eve_textw_create(EVETextWidget *widget, EVERect *g, EVETextSpec *spec); +void eve_textw_destroy(EVETextWidget *widget); void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size); +void eve_textw_update(EVETextWidget *widget, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size); + int eve_textw_touch(EVEWidget *_widget, EVEPage *page, uint8_t tag0, int touch_idx); uint8_t eve_textw_draw(EVEWidget *_widget, EVEPage *page, uint8_t tag0); void eve_textw_putc(void *_w, int c); -uint16_t eve_textw_update(EVETextWidget *widget, EVEPage *page, uint16_t line); +uint16_t eve_textw_text_update(EVETextWidget *widget, EVEPage *page, uint16_t line); void eve_textw_cursor_update(EVETextWidget *widget, EVETextCursor *cursor); void eve_textw_cursor_set(EVETextWidget *widget, EVETextCursor *cursor, uint8_t tag, int16_t x); void eve_textw_cursor_clear(EVETextWidget *widget, EVETextCursor *cursor); diff --git a/fw/fe310/eos/eve/widget/widget.c b/fw/fe310/eos/eve/widget/widget.c index ab121d8..7c1fcad 100644 --- a/fw/fe310/eos/eve/widget/widget.c +++ b/fw/fe310/eos/eve/widget/widget.c @@ -8,19 +8,34 @@ #include "screen/screen.h" #include "screen/window.h" #include "screen/page.h" -#include "screen/font.h" -#include "label.h" -#include "widget.h" -#include "pagew.h" -#include "strw.h" -#include "textw.h" +#include "widgets.h" -static const size_t _eve_wsize[] = { +static const size_t _widget_size[] = { 0, + sizeof(EVEFreeWidget), + sizeof(EVESpacerWidget), sizeof(EVEPageWidget), sizeof(EVEStrWidget), - sizeof(EVETextWidget) + sizeof(EVETextWidget), +}; + +static const eve_widget_create_t _widget_create[] = { + NULL, + (eve_widget_create_t)eve_freew_create, + (eve_widget_create_t)eve_spacerw_create, + (eve_widget_create_t)eve_pagew_create, + (eve_widget_create_t)eve_strw_create, + (eve_widget_create_t)eve_textw_create, +}; + +static const eve_widget_destroy_t _widget_destroy[] = { + NULL, + NULL, + NULL, + NULL, + (eve_widget_destroy_t)eve_strw_destroy, + (eve_widget_destroy_t)eve_textw_destroy, }; void eve_widget_init(EVEWidget *widget, uint8_t type, EVERect *g, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc) { @@ -31,11 +46,23 @@ void eve_widget_init(EVEWidget *widget, uint8_t type, EVERect *g, eve_widget_tou widget->type = type; } +size_t eve_widget_size(uint8_t type) { + return _widget_size[type]; +} + void eve_widget_set_label(EVEWidget *widget, EVELabel *label) { widget->label = label; } EVEWidget *eve_widget_next(EVEWidget *widget) { char *_w = (char *)widget; - return (EVEWidget *)(_w + _eve_wsize[widget->type]); + return (EVEWidget *)(_w + _widget_size[widget->type]); +} + +int eve_widget_create(EVEWidget *widget, uint8_t type, EVERect *g, EVEWidgetSpec *spec) { + return _widget_create[type](widget, g, spec); } + +void eve_widget_destroy(EVEWidget *widget) { + if (_widget_destroy[widget->type]) _widget_destroy[widget->type](widget); +}
\ No newline at end of file diff --git a/fw/fe310/eos/eve/widget/widget.h b/fw/fe310/eos/eve/widget/widget.h index 1aa2cd7..cff5c1d 100644 --- a/fw/fe310/eos/eve/widget/widget.h +++ b/fw/fe310/eos/eve/widget/widget.h @@ -1,8 +1,10 @@ #include <stdint.h> -#define EVE_WIDGET_TYPE_PAGE 1 -#define EVE_WIDGET_TYPE_STR 2 -#define EVE_WIDGET_TYPE_TEXT 3 +#define EVE_WIDGET_TYPE_FREE 1 +#define EVE_WIDGET_TYPE_SPACER 2 +#define EVE_WIDGET_TYPE_PAGE 3 +#define EVE_WIDGET_TYPE_STR 4 +#define EVE_WIDGET_TYPE_TEXT 5 struct EVEWidget; @@ -19,5 +21,6 @@ typedef struct EVEWidget { } EVEWidget; void eve_widget_init(EVEWidget *widget, uint8_t type, EVERect *g, eve_widget_touch_t touch, eve_widget_draw_t draw, eve_kbd_input_handler_t putc); +size_t eve_widget_size(uint8_t type); void eve_widget_set_label(EVEWidget *widget, EVELabel *label); EVEWidget *eve_widget_next(EVEWidget *widget); diff --git a/fw/fe310/eos/eve/widget/widgets.h b/fw/fe310/eos/eve/widget/widgets.h new file mode 100644 index 0000000..4206894 --- /dev/null +++ b/fw/fe310/eos/eve/widget/widgets.h @@ -0,0 +1,23 @@ +#include "font.h" +#include "label.h" +#include "widget.h" + +#include "freew.h" +#include "spacerw.h" +#include "pagew.h" +#include "strw.h" +#include "textw.h" + +typedef union EVEWidgetSpec { + EVEFreeSpec free; + EVESpacerSpec spacer; + EVEPageSpec page; + EVEStrSpec str; + EVETextSpec text; +} EVEWidgetSpec; + +typedef int (*eve_widget_create_t) (EVEWidget *, EVERect *g, EVEWidgetSpec *); +typedef void (*eve_widget_destroy_t) (EVEWidget *); + +int eve_widget_create(EVEWidget *widget, uint8_t type, EVERect *g, EVEWidgetSpec *spec); +void eve_widget_destroy(EVEWidget *widget); |