From 86aa553093084f9c2f04a5fb3d744b56b656ea3a Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Sat, 11 Jul 2020 03:58:45 +0200 Subject: screen/window/kbd window implemented; str widget tested --- code/fe310/eos/eve/screen/Makefile | 2 +- code/fe310/eos/eve/screen/form.c | 51 ++++++++-------- code/fe310/eos/eve/screen/form.h | 2 +- code/fe310/eos/eve/screen/page.c | 70 +++++++++++++++------- code/fe310/eos/eve/screen/page.h | 3 +- code/fe310/eos/eve/screen/screen.c | 119 +++++++++++++++++++------------------ code/fe310/eos/eve/screen/screen.h | 11 ++-- code/fe310/eos/eve/screen/window.c | 69 ++++++++++++++++++++- code/fe310/eos/eve/screen/window.h | 14 +++++ 9 files changed, 222 insertions(+), 119 deletions(-) (limited to 'code/fe310/eos/eve/screen') diff --git a/code/fe310/eos/eve/screen/Makefile b/code/fe310/eos/eve/screen/Makefile index 372cf9e..f6115df 100644 --- a/code/fe310/eos/eve/screen/Makefile +++ b/code/fe310/eos/eve/screen/Makefile @@ -2,7 +2,7 @@ include ../../../common.mk CFLAGS += -I. -I.. -I../.. -obj = font.o screen.o window.o page.o form.o +obj = font.o screen.o window.o kbdwin.o page.o form.o %.o: %.c %.h diff --git a/code/fe310/eos/eve/screen/form.c b/code/fe310/eos/eve/screen/form.c index f84b0d7..927f889 100644 --- a/code/fe310/eos/eve/screen/form.c +++ b/code/fe310/eos/eve/screen/form.c @@ -13,11 +13,9 @@ #include "widget/label.h" #include "widget/widget.h" -#define CH_EOF 0x1a - -int eve_form_init(EVEForm *form, EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close, EVEWindow *window) { +int eve_form_init(EVEForm *form, EVEWindow *window, EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close) { memset(form, 0, sizeof(EVEForm)); - eve_page_init(&form->p, eve_form_touch, eve_form_draw, open, close, eve_form_handle_evt, eve_form_update_g, window); + eve_page_init(&form->p, window, eve_form_touch, eve_form_draw, open, close, eve_form_handle_evt, eve_form_update_g); form->widget = widget; form->widget_size = widget_size; eve_form_update_g(&form->p, NULL); @@ -26,36 +24,29 @@ int eve_form_init(EVEForm *form, EVEWidget *widget, uint16_t widget_size, eve_pa int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx) { EVEForm *form = (EVEForm *)v; EVEWidget *widget = form->widget; - EVEWidget *widget_f = eve_page_get_focus(&form->p); - int i, ret = 0; + int i, r, ret = 0; EVERect focus = {0,0,0,0}; + if (touch_idx == 0) { + EVETouch *t; + uint16_t evt; + + t = eve_touch_evt(tag0, touch_idx, form->p.v.window->tag, 1, &evt); + if (t && evt) { + eve_form_handle_evt(&form->p, NULL, t, evt, tag0, touch_idx); + if ((evt & EVE_TOUCH_ETYPE_POINT_UP) && (t->eevt == 0)) eve_page_set_focus(&form->p, NULL, NULL); + ret = 1; + } + } for (i=0; iwidget_size; i++) { if (eve_page_rect_visible(&form->p, &widget->g)) { - int a; - - a = widget->touch(widget, &form->p, tag0, touch_idx, &focus); - ret = ret || a; - if (focus.w && focus.h && (widget_f != widget)) { - EVEKbd *kbd = eve_screen_get_kbd(form->p.window->screen); - - if (kbd) { - if (widget_f && widget_f->putc) { - eve_screen_hide_kbd(form->p.window->screen); - widget_f->putc(widget_f, CH_EOF); - } - eve_kbd_set_handler(kbd, widget->putc, &form->p); - if (widget->putc) { - eve_screen_show_kbd(form->p.window->screen); - } - } - widget_f = widget; - } + int r = widget->touch(widget, &form->p, tag0, touch_idx, &focus); + ret = ret || r; + if (focus.w && focus.h) eve_page_set_focus(&form->p, widget, &focus); } widget = eve_widget_next(widget); } - if (focus.w && focus.h) eve_page_set_focus(&form->p, widget_f, &focus); return ret; } @@ -65,7 +56,10 @@ uint8_t eve_form_draw(EVEView *v, uint8_t tag0) { int i; uint8_t tagN = tag0; + eve_cmd_dl(SAVE_CONTEXT()); eve_cmd_dl(VERTEX_FORMAT(0)); + eve_cmd_dl(VERTEX_TRANSLATE_X(eve_page_scr_x(&form->p, 0) * 16)); + eve_cmd_dl(VERTEX_TRANSLATE_Y(eve_page_scr_y(&form->p, 0) * 16)); for (i=0; iwidget_size; i++) { if (widget->label && eve_page_rect_visible(&form->p, &widget->label->g)) { @@ -77,9 +71,12 @@ uint8_t eve_form_draw(EVEView *v, uint8_t tag0) { widget = eve_widget_next(widget); } + eve_cmd_dl(RESTORE_CONTEXT()); + for (i=tag0; iwindow->tag != EVE_TAG_NOTAG) eve_touch_set_opt(v->window->tag, eve_touch_get_opt(v->window->tag) | EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT); return tagN; } @@ -103,7 +100,7 @@ void eve_form_update_g(EVEPage *page, EVEWidget *_widget) { for (i=0; iwidget_size; i++) { if (widget->label) { widget->label->g.y = h; - if (widget->label->g.w + widget->g.w > form->p.window->screen->w) h += widget->label->g.h; + if (widget->label->g.w + widget->g.w > form->p.v.window->g.w) h += widget->label->g.h; } widget->g.y = h; h += widget->g.h; diff --git a/code/fe310/eos/eve/screen/form.h b/code/fe310/eos/eve/screen/form.h index 006ef2e..7742b8c 100644 --- a/code/fe310/eos/eve/screen/form.h +++ b/code/fe310/eos/eve/screen/form.h @@ -8,7 +8,7 @@ typedef struct EVEForm { uint16_t widget_size; } EVEForm; -int eve_form_init(EVEForm *form, struct EVEWidget *widget, uint16_t widget_size, eve_page_open_t open, eve_page_close_t close, EVEWindow *window); +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_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); diff --git a/code/fe310/eos/eve/screen/page.c b/code/fe310/eos/eve/screen/page.c index b1b3985..7631c95 100644 --- a/code/fe310/eos/eve/screen/page.c +++ b/code/fe310/eos/eve/screen/page.c @@ -12,54 +12,78 @@ #include "widget/label.h" #include "widget/widget.h" -void eve_page_init(EVEPage *page, 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, EVEWindow *window) { +#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) { 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->widget_f = NULL; - page->window = window; + window->view = (EVEView *)page; } int16_t eve_page_x(EVEPage *page, int16_t x) { - return x + page->win_x - page->window->g.x; + return x + page->win_x - page->v.window->g.x; } int16_t eve_page_y(EVEPage *page, int16_t y) { - return y + page->win_y - page->window->g.y; + return y + page->win_y - page->v.window->g.y; } int16_t eve_page_scr_x(EVEPage *page, int16_t x) { - return x - page->win_x + page->window->g.x; + return x - page->win_x + page->v.window->g.x; } int16_t eve_page_scr_y(EVEPage *page, int16_t y) { - return y - page->win_y + page->window->g.y; + return y - page->win_y + page->v.window->g.y; } void eve_page_set_focus(EVEPage *page, EVEWidget *widget, EVERect *f) { - EVERect g; + if (page->widget_f != widget) { + EVEKbd *kbd = eve_screen_get_kbd(page->v.window->screen); - eve_window_visible_g(page->window, &g); - g.x -= page->window->g.x; - g.y -= page->window->g.y; + if (kbd) { + EVEWidget *widget_f = page->widget_f; - if (f->x < page->win_x + g.x) { - page->win_x = f->x - g.x; - } - if (f->y < page->win_y + g.y) { - page->win_y = f->y - g.y; - } - if ((f->x + f->w) > (page->win_x + g.x + g.w)) { - page->win_x = (f->x + f->w) - (g.x + g.w); + if (widget_f && widget_f->putc) { + eve_screen_hide_kbd(page->v.window->screen); + widget_f->putc(page, CH_EOF); + } + if (widget && widget->putc) { + eve_kbd_set_handler(kbd, widget->putc, page); + eve_screen_show_kbd(page->v.window->screen); + } else { + eve_kbd_set_handler(kbd, NULL, NULL); + } + } + page->widget_f = widget; } - if ((f->y + f->h) > (page->win_y + g.y + g.h)) { - page->win_y = (f->y + f->h) - (g.y + g.h); + + if (f) { + EVERect g; + + eve_window_visible_g(page->v.window, &g); + g.x -= page->v.window->g.x; + g.y -= page->v.window->g.y; + + if (f->x < page->win_x + g.x) { + page->win_x = f->x - g.x; + } + if (f->y < page->win_y + g.y) { + page->win_y = f->y - g.y; + } + if ((f->x + f->w) > (page->win_x + g.x + g.w)) { + page->win_x = (f->x + f->w) - (g.x + g.w); + } + if ((f->y + f->h) > (page->win_y + g.y + g.h)) { + page->win_y = (f->y + f->h) - (g.y + g.h); + } } - page->widget_f = widget; } EVEWidget *eve_page_get_focus(EVEPage *page) { @@ -67,8 +91,8 @@ EVEWidget *eve_page_get_focus(EVEPage *page) { } int eve_page_rect_visible(EVEPage *page, EVERect *g) { - uint16_t w = page->window->g.w; - uint16_t h = page->window->g.h; + uint16_t w = page->v.window->g.w; + uint16_t h = page->v.window->g.h; if (((g->x + g->w) >= page->win_x) && ((g->y + g->h) >= page->win_y) && (g->x <= (page->win_x + w)) && (g->y <= (page->win_y + h))) return 1; return 0; diff --git a/code/fe310/eos/eve/screen/page.h b/code/fe310/eos/eve/screen/page.h index 8f2fba9..eebedfd 100644 --- a/code/fe310/eos/eve/screen/page.h +++ b/code/fe310/eos/eve/screen/page.h @@ -17,10 +17,9 @@ typedef struct EVEPage { eve_page_evt_handler_t handle_evt; eve_page_g_updater_t update_g; struct EVEWidget *widget_f; - EVEWindow *window; } EVEPage; -void eve_page_init(EVEPage *page, 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, EVEWindow *window); +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); 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/code/fe310/eos/eve/screen/screen.c b/code/fe310/eos/eve/screen/screen.c index 68b6fb8..f103b48 100644 --- a/code/fe310/eos/eve/screen/screen.c +++ b/code/fe310/eos/eve/screen/screen.c @@ -6,11 +6,14 @@ #include "screen.h" #include "window.h" +#include "kbdwin.h" int eve_screen_init(EVEScreen *screen, uint16_t w, uint16_t h) { memset(screen, 0, sizeof(EVEScreen)); screen->w = w; screen->h = h; + screen->mem_next = EVE_RAM_G; + eve_touch_set_handler(eve_screen_handle_touch, screen); } void eve_screen_set_kbd(EVEScreen *screen, EVEKbd *kbd) { @@ -22,74 +25,57 @@ EVEKbd *eve_screen_get_kbd(EVEScreen *screen) { } void eve_screen_show_kbd(EVEScreen *screen) { - if (screen->kbd && screen->kbd_win) screen->kbd_win->g.y = screen->h - screen->kbd->g.h; -} - -void eve_screen_hide_kbd(EVEScreen *screen) { - if (screen->kbd && screen->kbd_win) screen->kbd_win->g.y = screen->h; -} - -int eve_screen_win_insert(EVEScreen *screen, EVEWindow *window, int idx) { - if (idx) { - int i; - EVEWindow *h = screen->win_head; + EVEWindow *win = screen->win_tail; + EVEKbd *kbd = eve_screen_get_kbd(screen); - for (i=1; inext; - if (h == NULL) return EVE_ERR; - } - window->next = h->next; - h->next = window; - } else { - window->next = screen->win_head; - screen->win_head = window; - } - if (window->next == NULL) screen->win_tail = window; - return EVE_OK; + if (win) win->g.y = screen->h - kbd->g.h; } -int eve_screen_win_remove(EVEScreen *screen, EVEWindow *window) { - EVEWindow *h = screen->win_head; - if (h == NULL) return EVE_ERR; - if (h == window) { - screen->win_head = window->next; - if (screen->win_head == NULL) screen->win_tail = NULL; - } else { - while (h->next && (h->next != window)) h = h->next; - if (h->next == NULL) return EVE_ERR; - - h->next = window->next; - if (h->next == NULL) screen->win_tail = h; - } -} +void eve_screen_hide_kbd(EVEScreen *screen) { + EVEWindow *win = screen->win_tail; -void eve_screen_win_append(EVEScreen *screen, EVEWindow *window) { - screen->win_tail->next = window; - screen->win_tail = window; + if (win) win->g.y = screen->h; } -void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx) { - EVEWindow *w; - int a; +void eve_screen_draw(EVEScreen *screen) { + EVEWindow *win; uint8_t tagN = 0x80; - eve_touch_clear_opt(); - - w = screen->win_head; - while(w) { - if (eve_window_visible(w)) a = w->view->touch(w->view, tag0, touch_idx); - w = w->next; - } - eve_cmd_burst_start(); eve_cmd_dl(CMD_DLSTART); - eve_cmd_dl(CLEAR_COLOR_RGB(0,0,0)); - eve_cmd_dl(CLEAR(1,1,1)); - w = screen->win_head; - while(w) { - if (eve_window_visible(w)) tagN = w->view->draw(w->view, tagN); - w = w->next; + win = screen->win_head; + while (win) { + if (eve_window_visible(win)) { + int16_t x = win->g.x; + int16_t y = win->g.y; + uint16_t w = win->g.w; + uint16_t h = win->g.h; + + if (x < 0) { + w += x; + x = 0; + } + if (y < 0) { + h += y; + y = 0; + } + if (x + w > screen->w) w = screen->w - x; + if (y + h > screen->h) h = screen->h - y; + win->tag = tagN; + + if (tagN != EVE_TAG_NOTAG) { + eve_cmd_dl(CLEAR_TAG(tagN)); + tagN++; + } + eve_cmd_dl(CLEAR_COLOR_RGBC(win->color_bg)); + eve_cmd_dl(SCISSOR_XY(x, y)); + eve_cmd_dl(SCISSOR_SIZE(w, h)); + eve_cmd_dl(CLEAR(1,1,1)); + eve_cmd_dl(COLOR_RGBC(win->color_fg)); + tagN = win->view->draw(win->view, tagN); + } + win = win->next; } eve_cmd_dl(DISPLAY()); @@ -97,3 +83,22 @@ void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx) { eve_cmd_burst_end(); eve_cmd_exec(1); } + +void eve_screen_handle_touch(void *s, uint8_t tag0, int touch_idx) { + EVEScreen *screen = s; + EVEWindow *win; + + eve_touch_clear_opt(); + + if (touch_idx >= 0) { + win = screen->win_tail; + while (win) { + if (eve_window_visible(win)) { + int a = win->view->touch(win->view, tag0, touch_idx); + } + win = win->prev; + } + } + + eve_screen_draw(screen); +} diff --git a/code/fe310/eos/eve/screen/screen.h b/code/fe310/eos/eve/screen/screen.h index d6bc5e8..a9745ad 100644 --- a/code/fe310/eos/eve/screen/screen.h +++ b/code/fe310/eos/eve/screen/screen.h @@ -5,20 +5,17 @@ struct EVEWindow; typedef struct EVEScreen { uint16_t w; uint16_t h; + uint32_t mem_next; struct EVEWindow *win_head; struct EVEWindow *win_tail; EVEKbd *kbd; - struct EVEWindow *kbd_win; } EVEScreen; int eve_screen_init(EVEScreen *screen, uint16_t w, uint16_t h); -void eve_screen_set_kbd(EVEScreen *screen, EVEKbd *kbd) ; +void eve_screen_set_kbd(EVEScreen *screen, EVEKbd *kbd); EVEKbd *eve_screen_get_kbd(EVEScreen *screen); void eve_screen_show_kbd(EVEScreen *screen); void eve_screen_hide_kbd(EVEScreen *screen); -int eve_screen_win_insert(EVEScreen *screen, struct EVEWindow *window, int idx); -int eve_screen_win_remove(EVEScreen *screen, struct EVEWindow *window); -void eve_screen_win_append(EVEScreen *screen, struct EVEWindow *window); - -void eve_screen_handle_touch(EVEScreen *screen, uint8_t tag0, int touch_idx); +void eve_screen_draw(EVEScreen *screen); +void eve_screen_handle_touch(void *s, uint8_t tag0, int touch_idx); diff --git a/code/fe310/eos/eve/screen/window.c b/code/fe310/eos/eve/screen/window.c index 5c329a9..e49897f 100644 --- a/code/fe310/eos/eve/screen/window.c +++ b/code/fe310/eos/eve/screen/window.c @@ -13,8 +13,20 @@ void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *sc memset(window, 0, sizeof(EVEWindow)); if (g) window->g = *g; - window->view = view; + if (view) { + window->view = view; + window->view->window = window; + } window->screen = screen; + window->color_fg = 0xffffff; +} + +void eve_window_set_color_bg(EVEWindow *window, uint8_t r, uint8_t g, uint8_t b) { + window->color_bg = (r << 16) | (g << 8) | b; +} + +void eve_window_set_color_fg(EVEWindow *window, uint8_t r, uint8_t g, uint8_t b) { + window->color_fg = (r << 16) | (g << 8) | b; } int eve_window_visible(EVEWindow *window) { @@ -47,3 +59,58 @@ void eve_window_visible_g(EVEWindow *window, EVERect *g) { w = w->next; } } + +void eve_window_append(EVEWindow *window) { + EVEScreen *screen = window->screen; + + window->prev = screen->win_tail; + if (screen->win_tail) { + screen->win_tail->next = window; + } else { + screen->win_head = window; + } + screen->win_tail = window; +} + +void eve_window_insert_above(EVEWindow *window, EVEWindow *win_prev) { + EVEScreen *screen = window->screen; + + window->prev = win_prev; + window->next = win_prev->next; + + if (window->next) { + window->next->prev = window; + } else { + screen->win_tail = window; + } + win_prev->next = window; +} + +void eve_window_insert_below(EVEWindow *window, EVEWindow *win_next) { + EVEScreen *screen = window->screen; + + window->prev = win_next->prev; + window->next = win_next; + + win_next->prev = window; + if (window->prev) { + window->prev->next = window; + } else { + screen->win_head = window; + } +} + +void eve_window_remove(EVEWindow *window) { + EVEScreen *screen = window->screen; + + if (window->prev) { + window->prev->next = window->next; + } else { + screen->win_head = window->next; + } + if (window->next) { + window->next->prev = window->prev; + } else { + screen->win_tail = window->prev; + } +} diff --git a/code/fe310/eos/eve/screen/window.h b/code/fe310/eos/eve/screen/window.h index 78aabde..7f14f18 100644 --- a/code/fe310/eos/eve/screen/window.h +++ b/code/fe310/eos/eve/screen/window.h @@ -1,6 +1,7 @@ #include struct EVEView; +struct EVEWindow; typedef int (*eve_view_touch_t) (struct EVEView *, uint8_t, int); typedef uint8_t (*eve_view_draw_t) (struct EVEView *, uint8_t); @@ -8,6 +9,7 @@ typedef uint8_t (*eve_view_draw_t) (struct EVEView *, uint8_t); typedef struct EVEView { eve_view_touch_t touch; eve_view_draw_t draw; + struct EVEWindow *window; } EVEView; typedef struct EVEWindow { @@ -15,8 +17,20 @@ typedef struct EVEWindow { EVEView *view; EVEScreen *screen; struct EVEWindow *next; + struct EVEWindow *prev; + uint32_t color_bg; + uint32_t color_fg; + uint8_t tag; } EVEWindow; void eve_window_init(EVEWindow *window, EVERect *g, EVEView *view, EVEScreen *screen); +void eve_window_set_color_bg(EVEWindow *window, uint8_t r, uint8_t g, uint8_t b); +void eve_window_set_color_fg(EVEWindow *window, uint8_t r, uint8_t g, uint8_t b); + int eve_window_visible(EVEWindow *window); void eve_window_visible_g(EVEWindow *window, EVERect *g); + +void eve_window_append(EVEWindow *window); +void eve_window_insert_above(EVEWindow *window, EVEWindow *win_prev); +void eve_window_insert_below(EVEWindow *window, EVEWindow *win_next); +void eve_window_remove(EVEWindow *window); -- cgit v1.2.3