#include "../../lv_examples.h" #if LV_USE_OBSERVER && LV_USE_SLIDER && LV_USE_LABEL && LV_USE_ROLLER && LV_USE_DROPDOWN && LV_FONT_MONTSERRAT_30 && LV_BUILD_EXAMPLES static void cont_observer_cb(lv_observer_t * observer, lv_subject_t * subject); static void btn_create(lv_obj_t * parent, const char * text); static void btn_click_event_cb(lv_event_t * e); static void btn_observer_cb(lv_observer_t * observer, lv_subject_t * subject); static void indicator_observer_cb(lv_observer_t * observer, lv_subject_t * subject); static lv_subject_t current_tab_subject; static lv_subject_t slider_subject[4]; static lv_subject_t dropdown_subject[3]; static lv_subject_t roller_subject[2]; void lv_example_observer_4(void) { lv_subject_init_int(¤t_tab_subject, 0); lv_subject_init_int(&slider_subject[0], 0); lv_subject_init_int(&slider_subject[1], 0); lv_subject_init_int(&slider_subject[2], 0); lv_subject_init_int(&slider_subject[3], 0); lv_subject_init_int(&dropdown_subject[0], 0); lv_subject_init_int(&dropdown_subject[1], 0); lv_subject_init_int(&dropdown_subject[2], 0); lv_subject_init_int(&roller_subject[0], 0); lv_subject_init_int(&roller_subject[1], 0); lv_obj_t * main_cont = lv_obj_create(lv_screen_active()); lv_obj_remove_style_all(main_cont); lv_obj_set_size(main_cont, lv_pct(100), lv_pct(100)); lv_obj_set_style_pad_all(main_cont, 0, 0); lv_obj_set_flex_flow(main_cont, LV_FLEX_FLOW_COLUMN); lv_obj_t * cont = lv_obj_create(main_cont); lv_obj_remove_style_all(cont); lv_obj_set_flex_grow(cont, 1); lv_obj_set_style_pad_all(cont, 8, 0); lv_obj_set_width(cont, lv_pct(100)); lv_subject_add_observer_obj(¤t_tab_subject, cont_observer_cb, cont, NULL); lv_obj_set_scroll_dir(cont, LV_DIR_VER); lv_obj_t * footer = lv_obj_create(main_cont); lv_obj_remove_style_all(footer); lv_obj_set_style_pad_column(footer, 8, 0); lv_obj_set_style_pad_all(footer, 8, 0); lv_obj_set_flex_flow(footer, LV_FLEX_FLOW_ROW); lv_obj_set_size(footer, lv_pct(100), 60); lv_obj_align(footer, LV_ALIGN_BOTTOM_MID, 0, 0); btn_create(footer, "First"); btn_create(footer, "Second"); btn_create(footer, "Third"); lv_obj_t * indicator = lv_obj_create(footer); lv_obj_remove_style(indicator, NULL, 0); lv_obj_set_style_bg_opa(indicator, LV_OPA_40, 0); lv_subject_add_observer_obj(¤t_tab_subject, indicator_observer_cb, indicator, NULL); lv_obj_set_height(indicator, 10); lv_obj_align(indicator, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_add_flag(indicator, LV_OBJ_FLAG_IGNORE_LAYOUT); /*Be sure the indicator has the correct size*/ lv_obj_update_layout(indicator); lv_subject_notify(¤t_tab_subject); } static int32_t anim_get_x_cb(lv_anim_t * a) { return lv_obj_get_x_aligned(a->var); } static void anim_set_x_cb(void * obj, int32_t v) { lv_obj_set_x(obj, v); } static void cont_observer_cb(lv_observer_t * observer, lv_subject_t * subject) { int32_t prev_v = lv_subject_get_previous_int(subject); int32_t cur_v = lv_subject_get_int(subject); lv_obj_t * cont = lv_observer_get_target(observer); /*Animate out the previous content*/ lv_anim_t a; lv_anim_init(&a); lv_anim_set_duration(&a, 300); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, anim_set_x_cb); lv_anim_set_get_value_cb(&a, anim_get_x_cb); lv_anim_set_completed_cb(&a, lv_obj_delete_anim_completed_cb); uint32_t i; uint32_t delay = 0; uint32_t child_cnt_prev = lv_obj_get_child_count(cont); for(i = 0; i < child_cnt_prev; i++) { lv_obj_t * child = lv_obj_get_child(cont, i); lv_anim_set_var(&a, child); if(prev_v < cur_v) { lv_anim_set_values(&a, 0, -20); } else { lv_anim_set_values(&a, 0, 20); } lv_anim_set_delay(&a, delay); lv_anim_start(&a); lv_obj_fade_out(child, 200, delay); delay += 50; } /*Create the widgets according to the current value*/ if(cur_v == 0) { for(i = 0; i < 4; i++) { lv_obj_t * slider = lv_slider_create(cont); lv_slider_bind_value(slider, &slider_subject[i]); lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 10 + i * 30); } } if(cur_v == 1) { for(i = 0; i < 3; i++) { lv_obj_t * dropdown = lv_dropdown_create(cont); lv_dropdown_bind_value(dropdown, &dropdown_subject[i]); lv_obj_align(dropdown, LV_ALIGN_TOP_MID, 0, i * 50); } } if(cur_v == 2) { for(i = 0; i < 2; i++) { lv_obj_t * roller = lv_roller_create(cont); lv_roller_bind_value(roller, &roller_subject[i]); lv_obj_align(roller, LV_ALIGN_CENTER, - 80 + i * 160, 0); } } /*Animate in the new widgets*/ lv_anim_set_completed_cb(&a, NULL); for(i = child_cnt_prev; i < lv_obj_get_child_count(cont); i++) { lv_obj_t * child = lv_obj_get_child(cont, i); lv_anim_set_var(&a, child); if(prev_v < cur_v) { lv_anim_set_values(&a, 20, 0); } else { lv_anim_set_values(&a, -20, -0); } lv_anim_set_delay(&a, delay); lv_anim_start(&a); lv_obj_fade_in(child, 200, delay); delay += 50; } } static void btn_create(lv_obj_t * parent, const char * text) { lv_obj_t * btn = lv_button_create(parent); lv_obj_set_flex_grow(btn, 1); lv_obj_set_height(btn, lv_pct(100)); lv_obj_set_style_radius(btn, 0, 0); lv_subject_add_observer_obj(¤t_tab_subject, btn_observer_cb, btn, NULL); lv_obj_add_event_cb(btn, btn_click_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_t * label = lv_label_create(btn); lv_label_set_text(label, text); lv_obj_center(label); } static void btn_click_event_cb(lv_event_t * e) { lv_obj_t * btn = lv_event_get_target(e); uint32_t idx = lv_obj_get_index(btn); lv_subject_set_int(¤t_tab_subject, idx); } static void btn_observer_cb(lv_observer_t * observer, lv_subject_t * subject) { int32_t prev_v = lv_subject_get_previous_int(subject); int32_t cur_v = lv_subject_get_int(subject); lv_obj_t * btn = lv_observer_get_target(observer); int32_t idx = (int32_t)lv_obj_get_index(btn); if(idx == prev_v) lv_obj_remove_state(btn, LV_STATE_CHECKED); if(idx == cur_v) lv_obj_add_state(btn, LV_STATE_CHECKED); } static void indicator_observer_cb(lv_observer_t * observer, lv_subject_t * subject) { int32_t cur_v = lv_subject_get_int(subject); lv_obj_t * indicator = lv_observer_get_target(observer); lv_obj_t * footer = lv_obj_get_parent(indicator); lv_obj_t * btn_act = lv_obj_get_child(footer, cur_v); lv_obj_set_width(indicator, lv_obj_get_width(btn_act)); lv_anim_t a; lv_anim_init(&a); lv_anim_set_exec_cb(&a, anim_set_x_cb); lv_anim_set_duration(&a, 300); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_var(&a, indicator); lv_anim_set_values(&a, lv_obj_get_x(indicator), lv_obj_get_x(btn_act)); lv_anim_start(&a); } #endif