summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/screen/form.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/screen/form.c')
-rw-r--r--fw/fe310/eos/eve/screen/form.c70
1 files changed, 24 insertions, 46 deletions
diff --git a/fw/fe310/eos/eve/screen/form.c b/fw/fe310/eos/eve/screen/form.c
index 3e5b97c..de03bfd 100644
--- a/fw/fe310/eos/eve/screen/form.c
+++ b/fw/fe310/eos/eve/screen/form.c
@@ -12,7 +12,8 @@
#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) {
+static void widgets_destroy(EVEWidget *widgets, uint16_t widget_size) {
+ EVEWidget *widget = widgets;
int i;
for (i=0; i<widget_size; i++) {
@@ -20,65 +21,60 @@ static void widgets_destroy(EVEWidget *widget, uint16_t widget_size) {
eve_widget_destroy(widget);
widget = eve_widget_next(widget);
}
+ eve_free(widgets);
}
-EVEPage *eve_form_create(EVEWindow *window, EVEViewStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
+int eve_form_create(EVEPage *page, EVEWindow *window, EVEVStack *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;
+ int i, rv;
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; i<spec_size; i++) {
w_size += eve_widget_size(spec[i].widget.type);
}
widgets = eve_malloc(w_size);
if (widgets == NULL) {
- eve_free(page);
- return NULL;
+ return EVE_ERR_NOMEM;
}
+ eve_form_init(page, window, stack, NULL, 0, uievt, destructor);
+
widget = widgets;
for (i=0; i<spec_size; i++) {
- r = eve_widget_create(widget, &spec[i].widget, page);
- if (r) {
+ rv = eve_widget_create(widget, &spec[i].widget, page);
+ if (rv) {
widgets_destroy(widgets, i);
- eve_free(widgets);
- eve_free(page);
- return NULL;
+ return rv;
}
if (spec[i].label.title) {
+ rv = EVE_OK;
label = eve_malloc(sizeof(EVELabel));
- if (label == NULL) {
+ if (label) rv = eve_label_create(label, &spec[i].label, page);
+ if ((label == NULL) || rv) {
+ if (label) eve_free(label);
eve_widget_destroy(widget);
widgets_destroy(widgets, i);
- eve_free(widgets);
- eve_free(page);
- return NULL;
+ return label ? rv : EVE_ERR_NOMEM;
}
- eve_label_create(label, &spec[i].label, page);
eve_widget_set_label(widget, label);
}
- if (widget->g.w == 0) widget->g.w = window->g.w - (widget->label ? widget->label->g.w : 0);
+ if ((widget->g.w == 0) && widget->label) widget->g.w = window->g.w - widget->label->g.w;
+ if (widget->g.w == 0) widget->g.w = window->g.w;
widget = eve_widget_next(widget);
}
eve_form_set_widget(page, widgets, spec_size);
- return page;
+ return EVE_OK;
}
-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_init(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
+ eve_page_init(page, window, stack, widget, widget_size, 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_update_g(page, NULL);
}
void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size) {
@@ -88,42 +84,24 @@ void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size)
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) {
+void 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;
+ return;
}
break;
}
}
- return 0;
}
void eve_form_update_g(EVEPage *page, EVEWidget *_widget) {