Plumb default_widget_handler and default_user_data for widgets read from JSON/File
This commit is contained in:
@ -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_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
|
#endif // __MONGOOSE_TOUCH_H
|
||||||
|
@ -12,13 +12,17 @@ struct screen_t {
|
|||||||
|
|
||||||
// Private
|
// Private
|
||||||
SLIST_HEAD(widget_entries, widget_list_t) widget_entries;
|
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(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_file(char *fn, widget_event_fn handler, void *user_data);
|
||||||
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 screen_destroy(struct screen_t **s);
|
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);
|
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);
|
struct widget_t *screen_widget_add_from_file(struct screen_t *s, char *fn);
|
||||||
|
|
||||||
|
@ -50,11 +50,12 @@ void tft_demo(void)
|
|||||||
mgos_ili9341_jpg_image(CENTER, CENTER, 1, "mongoose-os.jpg", NULL, 0);
|
mgos_ili9341_jpg_image(CENTER, CENTER, 1, "mongoose-os.jpg", NULL, 0);
|
||||||
// mgos_ili9341_jpg_image(200, 150, 2, "flower.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) {
|
if (!screen) {
|
||||||
LOG(LL_ERROR, ("Could not load screen"));
|
LOG(LL_ERROR, ("Could not load screen"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
w = widget_create("name", 0, 0, 198, 20);
|
w = widget_create("name", 0, 0, 198, 20);
|
||||||
widget_set_handler(w, widget_name_ev, NULL);
|
widget_set_handler(w, widget_name_ev, NULL);
|
||||||
screen_widget_add(screen, w);
|
screen_widget_add(screen, w);
|
||||||
|
19
src/screen.c
19
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;
|
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;
|
char *json;
|
||||||
struct screen_t *screen = NULL;
|
struct screen_t *screen = NULL;
|
||||||
|
|
||||||
@ -27,12 +27,12 @@ struct screen_t *screen_create_from_file(char *fn) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
screen = screen_create_from_json(json);
|
screen = screen_create_from_json(json, handler, user_data);
|
||||||
free (json);
|
free (json);
|
||||||
return screen;
|
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;
|
void *h = NULL;
|
||||||
// struct json_token key;
|
// struct json_token key;
|
||||||
struct json_token val;
|
struct json_token val;
|
||||||
@ -47,6 +47,9 @@ struct screen_t *screen_create_from_json(char *json) {
|
|||||||
screen=NULL; goto exit;
|
screen=NULL; goto exit;
|
||||||
}
|
}
|
||||||
screen = screen_create(screen_name, screen_x, screen_y, screen_w, screen_h);
|
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
|
// Traverse Object
|
||||||
@ -61,6 +64,7 @@ struct screen_t *screen_create_from_json(char *json) {
|
|||||||
// printf("[%d]: [%.*s]\n", idx, val.len, val.ptr);
|
// printf("[%d]: [%.*s]\n", idx, val.len, val.ptr);
|
||||||
if (val.len>0 && val.ptr) {
|
if (val.len>0 && val.ptr) {
|
||||||
widget = widget_create_from_json(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)) {
|
if (!screen_widget_add(screen, widget)) {
|
||||||
LOG(LL_ERROR, ("Could not add widget to screen"));
|
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);
|
w = widget_create_from_file(fn);
|
||||||
if (!w)
|
if (!w)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
widget_set_handler(w, s->default_widget_handler, s->default_user_data);
|
||||||
screen_widget_add(s, w);
|
screen_widget_add(s, w);
|
||||||
return 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;
|
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;
|
||||||
|
}
|
||||||
|
22
src/widget_default.c
Normal file
22
src/widget_default.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,25 @@
|
|||||||
|
|
||||||
extern int _mgos_timers;
|
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) {
|
static void test_screen_widget_add_and_remove(struct screen_t *s, const char *fn) {
|
||||||
struct widget_t *w1;
|
struct widget_t *w1;
|
||||||
@ -84,12 +103,12 @@ int test_screen() {
|
|||||||
uint16_t num_widgets;
|
uint16_t num_widgets;
|
||||||
|
|
||||||
LOG(LL_INFO, ("screen_create_from_file(data/TestScreen-invalid.json)"));
|
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");
|
ASSERT(!s, "created screen from invalid date");
|
||||||
|
|
||||||
num_widgets = screen_get_num_widgets(s);
|
num_widgets = screen_get_num_widgets(s);
|
||||||
LOG(LL_INFO, ("screen_create_from_file(data/TestScreen.json)"));
|
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");
|
ASSERT(s, "Could not create screen");
|
||||||
|
|
||||||
num_widgets = screen_get_num_widgets(s);
|
num_widgets = screen_get_num_widgets(s);
|
||||||
|
@ -3,6 +3,26 @@
|
|||||||
|
|
||||||
extern int _mgos_timers;
|
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) {
|
static int test_widget_create_from_file(void) {
|
||||||
struct widget_t *w;
|
struct widget_t *w;
|
||||||
int ret;
|
int ret;
|
||||||
@ -24,6 +44,10 @@ static int test_widget_create_from_file(void) {
|
|||||||
widget_set_timer(w, 1000);
|
widget_set_timer(w, 1000);
|
||||||
ASSERT(_mgos_timers==1, "timer not found");
|
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()"));
|
LOG(LL_INFO, ("widget_delete_timer()"));
|
||||||
widget_delete_timer(w);
|
widget_delete_timer(w);
|
||||||
ASSERT(_mgos_timers==0, "timers found");
|
ASSERT(_mgos_timers==0, "timers found");
|
||||||
|
Reference in New Issue
Block a user