#include #include #include "eve.h" #include "eve_kbd.h" #include "eve_font.h" #include "window.h" #include "page.h" #include "form.h" #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) static void widgets_destroy(EVEWidget *widget, uint16_t widget_size) { int i; for (i=0; ilabel) eve_free(widget->label); eve_widget_destroy(widget); widget = eve_widget_next(widget); } } EVEPage *eve_form_create(EVEWindow *window, EVEViewStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) { EVEWidget *widgets; EVEWidget *widget; EVELabel *label; EVEPage *page; int w_size = 0; int i, r; if (uievt == NULL) uievt = eve_form_uievt; if (destructor == NULL) destructor = eve_form_destroy; page = eve_malloc(sizeof(EVEPage)); if (page == NULL) { return NULL; } eve_form_init(page, window, stack, NULL, 0, uievt, destructor); for (i=0; ig.w == 0) widget->g.w = window->g.w - (widget->label ? widget->label->g.w : 0); widget = eve_widget_next(widget); } eve_form_set_widget(page, widgets, spec_size); return page; } void eve_form_init(EVEPage *page, EVEWindow *window, EVEViewStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) { eve_page_init(page, window, stack, NULL, 0, EVE_PAGE_OPT_SCROLL_Y | EVE_PAGE_OPT_SCROLL_BACK | EVE_PAGE_OPT_TRACK_EXT_Y, eve_page_draw, eve_page_touch, uievt, destructor); if (widget) eve_form_set_widget(page, widget, widget_size); } void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size) { eve_page_set_widget(page, widget, widget_size); eve_form_update_g(page, NULL); } void eve_form_destroy(EVEPage *page) { widgets_destroy(page->widget, page->widget_size); eve_free(page->widget); eve_free(page); } int eve_form_uievt(EVEPage *page, uint16_t evt, void *param) { switch (evt) { case EVE_UIEVT_WIDGET_UPDATE_G: eve_form_update_g(page, (EVEWidget *)param); break; case EVE_UIEVT_WIDGET_FOCUS_IN: break; case EVE_UIEVT_WIDGET_FOCUS_OUT: break; case EVE_UIEVT_GEST_SCROLL_START: break; case EVE_UIEVT_GEST_SCROLL_STOP: break; case EVE_UIEVT_GEST_TRACK_START: break; case EVE_UIEVT_GEST_TRACK_STOP: { EVEUIEvtTouch *touch_p = (EVEUIEvtTouch *)param; if (touch_p->touch->eevt & EVE_TOUCH_EETYPE_TRACK_RIGHT) { eve_page_close(page); return 1; } break; } } return 0; } void eve_form_update_g(EVEPage *page, EVEWidget *_widget) { EVEWidget *widget = page->widget; EVEWidget *lastw = NULL; int i; uint16_t w = 0; uint16_t h = 0; uint16_t l_h = 0; for (i=0; iwidget_size; i++) { if (widget->flags & EVE_WIDGET_FLAG_HIDDEN) goto update_g_nextw; if (widget->label) { h += l_h; w = widget->label->g.w; l_h = widget->label->g.h; widget->label->g.x = 0; widget->label->g.y = h; } if (w + widget->g.w > page->v.window->g.w) { h += l_h; w = 0; l_h = 0; } widget->g.x = w; widget->g.y = h; w += widget->g.w; l_h = MAX(l_h, widget->g.h); lastw = widget; update_g_nextw: widget = eve_widget_next(widget); } page->g.w = page->v.window->g.w; page->g.h = h + l_h; if (lastw && eve_page_oob(page, NULL, NULL)) { eve_page_show_rect(page, &lastw->g); } }