diff --git a/include/mongoose-touch.h b/include/mongoose-touch.h index 6a79852..2b6a626 100644 --- a/include/mongoose-touch.h +++ b/include/mongoose-touch.h @@ -16,4 +16,7 @@ void widget_topbar_ev(int ev, struct widget_t *w, void *ev_data); void widget_name_ev(int ev, struct widget_t *w, void *ev_data); +void widget_default_ev(int ev, struct widget_t *w, void *ev_data); + + #endif // __MONGOOSE_TOUCH_H diff --git a/include/screen.h b/include/screen.h index a15006d..5d5b362 100644 --- a/include/screen.h +++ b/include/screen.h @@ -12,13 +12,17 @@ struct screen_t { // Private SLIST_HEAD(widget_entries, widget_list_t) widget_entries; + widget_event_fn default_widget_handler; + void *default_user_data; }; struct screen_t *screen_create(char *name, uint16_t x, uint16_t y, uint16_t w, uint16_t h); -struct screen_t *screen_create_from_file(char *fn); -struct screen_t *screen_create_from_json(char *json); +struct screen_t *screen_create_from_file(char *fn, widget_event_fn handler, void *user_data); +struct screen_t *screen_create_from_json(char *json, widget_event_fn handler, void *user_data); void screen_destroy(struct screen_t **s); +void screen_widget_set_handler(struct screen_t *s, widget_event_fn handler, void *user_data); + bool screen_widget_add(struct screen_t *s, struct widget_t *w); struct widget_t *screen_widget_add_from_file(struct screen_t *s, char *fn); diff --git a/src/main.c b/src/main.c index 989721c..9dc382b 100644 --- a/src/main.c +++ b/src/main.c @@ -50,11 +50,12 @@ void tft_demo(void) mgos_ili9341_jpg_image(CENTER, CENTER, 1, "mongoose-os.jpg", NULL, 0); // mgos_ili9341_jpg_image(200, 150, 2, "flower.jpg", NULL, 0); - screen = screen_create_from_file("/screen_main.json"); + screen = screen_create_from_file("/screen_main.json", widget_default_ev, NULL); if (!screen) { LOG(LL_ERROR, ("Could not load screen")); return; } + w = widget_create("name", 0, 0, 198, 20); widget_set_handler(w, widget_name_ev, NULL); screen_widget_add(screen, w); diff --git a/src/screen.c b/src/screen.c index 526adba..77bf169 100644 --- a/src/screen.c +++ b/src/screen.c @@ -17,7 +17,7 @@ struct screen_t *screen_create(char *name, uint16_t x, uint16_t y, uint16_t w, u return screen; } -struct screen_t *screen_create_from_file(char *fn) { +struct screen_t *screen_create_from_file(char *fn, widget_event_fn handler, void *user_data) { char *json; struct screen_t *screen = NULL; @@ -27,12 +27,12 @@ struct screen_t *screen_create_from_file(char *fn) { return NULL; } - screen = screen_create_from_json(json); + screen = screen_create_from_json(json, handler, user_data); free (json); return screen; } -struct screen_t *screen_create_from_json(char *json) { +struct screen_t *screen_create_from_json(char *json, widget_event_fn handler, void *user_data) { void *h = NULL; // struct json_token key; struct json_token val; @@ -47,6 +47,9 @@ struct screen_t *screen_create_from_json(char *json) { screen=NULL; goto exit; } screen = screen_create(screen_name, screen_x, screen_y, screen_w, screen_h); + if (!screen) + return NULL; + screen_widget_set_handler(screen, handler, user_data); /* // Traverse Object @@ -61,6 +64,7 @@ struct screen_t *screen_create_from_json(char *json) { // printf("[%d]: [%.*s]\n", idx, val.len, val.ptr); if (val.len>0 && val.ptr) { widget = widget_create_from_json(val.ptr); + widget_set_handler(widget, screen->default_widget_handler, screen->default_user_data); if (!screen_widget_add(screen, widget)) { LOG(LL_ERROR, ("Could not add widget to screen")); } @@ -99,6 +103,7 @@ struct widget_t *screen_widget_add_from_file(struct screen_t *s, char *fn) { w = widget_create_from_file(fn); if (!w) return NULL; + widget_set_handler(w, s->default_widget_handler, s->default_user_data); screen_widget_add(s, w); return w; } @@ -145,3 +150,11 @@ struct widget_t *screen_widget_find_by_xy(struct screen_t *s, uint16_t x, uint16 } return NULL; } + +void screen_widget_set_handler(struct screen_t *s, widget_event_fn handler, void *user_data) { + if (!s) + return; + s->default_widget_handler=handler; + s->default_user_data=user_data; + return; +} diff --git a/src/widget_default.c b/src/widget_default.c new file mode 100644 index 0000000..a708d27 --- /dev/null +++ b/src/widget_default.c @@ -0,0 +1,22 @@ +#include "mgos.h" +#include "tft.h" +#include "mongoose-touch.h" + +void widget_default_ev(int ev, struct widget_t *w, void *ev_data) { + if (!w) + return; + + LOG(LL_INFO, ("Event %d received for widget '%s'", ev, w->name)); + + switch(ev) { + case EV_WIDGET_CREATE: + case EV_WIDGET_DRAW: + case EV_WIDGET_REDRAW: + case EV_WIDGET_TIMER: + case EV_WIDGET_TOUCH_UP: + case EV_WIDGET_TOUCH_DOWN: + case EV_WIDGET_DESTROY: + default: // EV_WIDGET_NONE + break; + } +} diff --git a/unittest/test_screen.c b/unittest/test_screen.c index ea760a8..488ba6b 100644 --- a/unittest/test_screen.c +++ b/unittest/test_screen.c @@ -4,6 +4,25 @@ extern int _mgos_timers; +static void test_screen_default_ev(int ev, struct widget_t *w, void *ev_data) { + if (!w) + return; + + LOG(LL_INFO, ("Event %d received for widget '%s'", ev, w->name)); + + switch(ev) { + case EV_WIDGET_CREATE: + case EV_WIDGET_DRAW: + case EV_WIDGET_REDRAW: + case EV_WIDGET_TIMER: + case EV_WIDGET_TOUCH_UP: + case EV_WIDGET_TOUCH_DOWN: + case EV_WIDGET_DESTROY: + default: // EV_WIDGET_NONE + break; + } + (void) ev_data; +} static void test_screen_widget_add_and_remove(struct screen_t *s, const char *fn) { struct widget_t *w1; @@ -84,12 +103,12 @@ int test_screen() { uint16_t num_widgets; LOG(LL_INFO, ("screen_create_from_file(data/TestScreen-invalid.json)")); - s = screen_create_from_file("data/TestScreen-invalid.json"); + s = screen_create_from_file("data/TestScreen-invalid.json", test_screen_default_ev, NULL); ASSERT(!s, "created screen from invalid date"); num_widgets = screen_get_num_widgets(s); LOG(LL_INFO, ("screen_create_from_file(data/TestScreen.json)")); - s = screen_create_from_file("data/TestScreen.json"); + s = screen_create_from_file("data/TestScreen.json", test_screen_default_ev, NULL); ASSERT(s, "Could not create screen"); num_widgets = screen_get_num_widgets(s); diff --git a/unittest/test_widget.c b/unittest/test_widget.c index c5dc4c2..c42c70c 100644 --- a/unittest/test_widget.c +++ b/unittest/test_widget.c @@ -3,6 +3,26 @@ extern int _mgos_timers; +static void test_widget_default_ev(int ev, struct widget_t *w, void *ev_data) { + if (!w) + return; + + LOG(LL_INFO, ("Event %d received for widget '%s'", ev, w->name)); + + switch(ev) { + case EV_WIDGET_CREATE: + case EV_WIDGET_DRAW: + case EV_WIDGET_REDRAW: + case EV_WIDGET_TIMER: + case EV_WIDGET_TOUCH_UP: + case EV_WIDGET_TOUCH_DOWN: + case EV_WIDGET_DESTROY: + default: // EV_WIDGET_NONE + break; + } + (void) ev_data; +} + static int test_widget_create_from_file(void) { struct widget_t *w; int ret; @@ -24,6 +44,10 @@ static int test_widget_create_from_file(void) { widget_set_timer(w, 1000); ASSERT(_mgos_timers==1, "timer not found"); + LOG(LL_INFO, ("widget_set_handler()")); + widget_set_handler(w, test_widget_default_ev, NULL); + + LOG(LL_INFO, ("widget_delete_timer()")); widget_delete_timer(w); ASSERT(_mgos_timers==0, "timers found");