#include #include #include "eve.h" #include "eve_kbd.h" #include "unicode.h" #include "screen.h" #include "window.h" #include "page.h" #include "form.h" #include "widget/font.h" #include "widget/label.h" #include "widget/widget.h" #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, 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); } int eve_form_touch(EVEView *v, uint8_t tag0, int touch_idx) { EVEForm *form = (EVEForm *)v; EVEWidget *widget = form->widget; int i, ret = 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 r = widget->touch(widget, &form->p, tag0, touch_idx); ret = ret || r; } widget = eve_widget_next(widget); } return ret; } uint8_t eve_form_draw(EVEView *v, uint8_t tag0) { EVEForm *form = (EVEForm *)v; EVEWidget *widget = form->widget; 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)) { eve_cmd_dl(TAG_MASK(0)); eve_label_draw(widget->label); eve_cmd_dl(TAG_MASK(1)); } if (eve_page_rect_visible(&form->p, &widget->g)) tagN = widget->draw(widget, &form->p, tagN); 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; } 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 } else { // go back / forward } */ } 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; iwidget_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 (w + widget->g.w >= form->p.v.window->g.w) { h += _h; w = 0; _h = 0; } widget->g.x = w; widget->g.y = h; w += widget->g.w; _h = MAX(_h, widget->g.h); widget = eve_widget_next(widget); } }