/** * @file lv_example_fragment_2.c * @brief Navigation stack using obj fragment */ #include "../../lv_examples.h" #if LV_USE_FRAGMENT && LV_USE_WIN && LV_BUILD_EXAMPLES static void sample_fragment_ctor(lv_fragment_t * self, void * args); static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent); static void sample_push_click(lv_event_t * e); static void sample_pop_click(lv_event_t * e); static void sample_fragment_inc_click(lv_event_t * e); typedef struct sample_fragment_t { lv_fragment_t base; lv_obj_t * label; int depth; int counter; } sample_fragment_t; static const lv_fragment_class_t sample_cls = { .constructor_cb = sample_fragment_ctor, .create_obj_cb = sample_fragment_create_obj, .instance_size = sizeof(sample_fragment_t) }; static lv_obj_t * container = NULL; void lv_example_fragment_2(void) { lv_obj_t * root = lv_obj_create(lv_scr_act()); lv_obj_set_size(root, LV_PCT(100), LV_PCT(100)); lv_obj_set_layout(root, LV_LAYOUT_GRID); static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; static const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; lv_obj_set_grid_dsc_array(root, col_dsc, row_dsc); container = lv_obj_create(root); lv_obj_remove_style_all(container); lv_obj_set_grid_cell(container, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_STRETCH, 0, 1); lv_obj_t * push_btn = lv_btn_create(root); lv_obj_t * push_label = lv_label_create(push_btn); lv_label_set_text(push_label, "Push"); lv_obj_t * pop_btn = lv_btn_create(root); lv_obj_t * pop_label = lv_label_create(pop_btn); lv_label_set_text(pop_label, "Pop"); lv_obj_set_grid_cell(push_btn, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 1, 1); lv_obj_set_grid_cell(pop_btn, LV_GRID_ALIGN_END, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1); lv_fragment_manager_t * manager = lv_fragment_manager_create(NULL); int depth = 0; lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &depth); lv_fragment_manager_push(manager, fragment, &container); lv_obj_add_event_cb(push_btn, sample_push_click, LV_EVENT_CLICKED, manager); lv_obj_add_event_cb(pop_btn, sample_pop_click, LV_EVENT_CLICKED, manager); } static void sample_fragment_ctor(lv_fragment_t * self, void * args) { LV_UNUSED(args); ((sample_fragment_t *) self)->depth = *((int *) args); ((sample_fragment_t *) self)->counter = 0; } static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent) { sample_fragment_t * fragment = (sample_fragment_t *) self; lv_obj_t * content = lv_obj_create(parent); lv_obj_remove_style_all(content); lv_obj_set_style_bg_opa(content, LV_OPA_50, 0); lv_obj_set_style_bg_color(content, lv_palette_main(LV_PALETTE_YELLOW), 0); lv_obj_set_size(content, LV_PCT(100), LV_PCT(100)); lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN); lv_obj_t * depth = lv_label_create(content); lv_label_set_text_fmt(depth, "Depth: %d", fragment->depth); lv_obj_t * label = lv_label_create(content); fragment->label = label; lv_label_set_text_fmt(label, "The button has been pressed %d times", fragment->counter); lv_obj_t * inc_btn = lv_btn_create(content); lv_obj_t * inc_label = lv_label_create(inc_btn); lv_label_set_text(inc_label, "+1"); lv_obj_add_event_cb(inc_btn, sample_fragment_inc_click, LV_EVENT_CLICKED, fragment); return content; } static void sample_push_click(lv_event_t * e) { lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e); size_t stack_size = lv_fragment_manager_get_stack_size(manager); lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &stack_size); lv_fragment_manager_push(manager, fragment, &container); } static void sample_pop_click(lv_event_t * e) { lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e); lv_fragment_manager_pop(manager); } static void sample_fragment_inc_click(lv_event_t * e) { sample_fragment_t * fragment = (sample_fragment_t *) lv_event_get_user_data(e); fragment->counter++; lv_label_set_text_fmt(fragment->label, "The button has been pressed %d times", fragment->counter); } #endif