1 /**
2 * @file lv_demo_high_res_app_about.c
3 *
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9
10 #include "lv_demo_high_res_private.h"
11 #if LV_USE_DEMO_HIGH_RES
12
13 #include "../../src/widgets/image/lv_image.h"
14 #include "../../src/widgets/label/lv_label.h"
15
16 /*********************
17 * DEFINES
18 *********************/
19
20 /**********************
21 * TYPEDEFS
22 **********************/
23
24 /**********************
25 * STATIC PROTOTYPES
26 **********************/
27
28 static void back_clicked_cb(lv_event_t * e);
29 static void slide_deck_scrolled_cb(lv_event_t * e);
30 static lv_obj_t * create_button(lv_obj_t * parent, const void * img_src, lv_demo_high_res_ctx_t * c);
31 static void left_clicked_cb(lv_event_t * e);
32 static void bg_cont_delete_cb(lv_event_t * e);
33 static bool advance_slides(lv_obj_t * slide_deck);
34 static void right_clicked_cb(lv_event_t * e);
35 static void play_pause_timer_cb(lv_timer_t * t);
36 static void play_pause_clicked_cb(lv_event_t * e);
37
38 /**********************
39 * STATIC VARIABLES
40 **********************/
41
42 /**********************
43 * MACROS
44 **********************/
45
46 /**********************
47 * GLOBAL FUNCTIONS
48 **********************/
49
lv_demo_high_res_app_about(lv_obj_t * base_obj)50 void lv_demo_high_res_app_about(lv_obj_t * base_obj)
51 {
52 lv_demo_high_res_ctx_t * c = lv_obj_get_user_data(base_obj);
53
54 /* background */
55
56 lv_obj_t * bg = base_obj;
57 lv_obj_remove_style_all(bg);
58 lv_obj_set_size(bg, LV_PCT(100), LV_PCT(100));
59
60 lv_obj_t * bg_img = lv_image_create(bg);
61 lv_subject_add_observer_obj(&c->th, lv_demo_high_res_theme_observer_image_src_cb, bg_img,
62 (void *)&c->imgs[IMG_LIGHT_BG_ABOUT]);
63
64 lv_obj_t * bg_cont = lv_obj_create(bg);
65 lv_obj_remove_style_all(bg_cont);
66 lv_obj_set_size(bg_cont, LV_PCT(100), LV_PCT(100));
67 lv_obj_set_style_pad_top(bg_cont, c->sz->gap[7], 0);
68 lv_obj_set_style_pad_bottom(bg_cont, c->sz->gap[10], 0);
69 lv_obj_set_style_pad_hor(bg_cont, c->sz->gap[10], 0);
70
71 /* top margin */
72
73 lv_obj_t * top_margin = lv_demo_high_res_top_margin_create(bg_cont, 0, true, c);
74
75 /* app info */
76
77 lv_obj_t * app_info = lv_demo_high_res_simple_container_create(bg_cont, true, c->sz->gap[4], LV_FLEX_ALIGN_START);
78 lv_obj_align_to(app_info, top_margin, LV_ALIGN_OUT_BOTTOM_LEFT, 0, c->sz->gap[7]);
79
80 lv_obj_t * back = lv_demo_high_res_simple_container_create(app_info, false, c->sz->gap[2], LV_FLEX_ALIGN_CENTER);
81 lv_obj_add_event_cb(back, back_clicked_cb, LV_EVENT_CLICKED, NULL);
82
83 lv_obj_t * back_icon = lv_image_create(back);
84 lv_image_set_src(back_icon, c->imgs[IMG_ARROW_LEFT]);
85 lv_obj_add_style(back_icon, &c->styles[STYLE_COLOR_BASE][STYLE_TYPE_A8_IMG], 0);
86 lv_obj_add_flag(back_icon, LV_OBJ_FLAG_EVENT_BUBBLE);
87
88 lv_obj_t * back_label = lv_label_create(back);
89 lv_label_set_text_static(back_label, "Back");
90 lv_obj_set_style_text_opa(back_label, LV_OPA_60, 0);
91 lv_obj_add_style(back_label, &c->styles[STYLE_COLOR_BASE][STYLE_TYPE_TEXT], 0);
92 lv_obj_add_style(back_label, &c->fonts[FONT_HEADING_MD], 0);
93
94 lv_obj_t * app_label = lv_label_create(app_info);
95 lv_label_set_text_static(app_label, "About");
96 lv_obj_add_style(app_label, &c->styles[STYLE_COLOR_BASE][STYLE_TYPE_TEXT], 0);
97 lv_obj_add_style(app_label, &c->fonts[FONT_HEADING_LG], 0);
98
99 /* slides */
100
101 if(lv_array_is_empty(&c->about_slides_array)) {
102 lv_obj_t * label = lv_label_create(bg_cont);
103 if(c->about_slides_dir_exists) {
104 lv_label_set_text_fmt(label, "Couldn't find images named Slide1.png, Slide2.png, etc. in the '%s' folder",
105 c->slides_path);
106 }
107 else {
108 lv_label_set_text_fmt(label, "Couldn't open the '%s' folder to load the images", c->slides_path);
109 }
110 lv_obj_center(label);
111 lv_obj_add_style(label, &c->styles[STYLE_COLOR_BASE][STYLE_TYPE_TEXT], 0);
112 return;
113 }
114
115 lv_obj_t * slides_cont = lv_obj_create(bg_cont);
116 lv_obj_remove_style_all(slides_cont);
117 lv_obj_set_size(slides_cont, LV_PCT(100), LV_SIZE_CONTENT);
118 lv_obj_set_flex_flow(slides_cont, LV_FLEX_FLOW_COLUMN);
119 lv_obj_set_flex_align(slides_cont, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
120 lv_obj_set_align(slides_cont, LV_ALIGN_BOTTOM_MID);
121 lv_obj_set_style_pad_row(slides_cont, c->sz->gap[3], 0);
122
123
124 lv_obj_t * slide_deck_cont = lv_obj_create(slides_cont);
125 lv_obj_remove_style_all(slide_deck_cont);
126 lv_obj_set_size(slide_deck_cont, LV_PCT(100), LV_SIZE_CONTENT);
127 lv_obj_t * slide_deck = lv_demo_high_res_simple_container_create(slide_deck_cont, false, c->sz->gap[2],
128 LV_FLEX_ALIGN_START);
129 lv_obj_set_style_pad_left(slide_deck, lv_display_get_horizontal_resolution(NULL) * 2 / 5, 0);
130
131 lv_obj_t * buttons = lv_demo_high_res_simple_container_create(slides_cont, false, c->sz->gap[2], LV_FLEX_ALIGN_START);
132 lv_obj_t * left = create_button(buttons, c->imgs[IMG_PAGER_LEFT], c);
133 lv_obj_set_width(left, c->sz->icon[3]);
134 lv_obj_add_state(left, LV_STATE_DISABLED);
135 lv_obj_t * play_pause = create_button(buttons, c->imgs[IMG_PAGER_PAUSE], c);
136 lv_obj_set_width(play_pause, c->sz->icon[4]);
137 lv_obj_set_user_data(play_pause, c);
138 lv_obj_t * right = create_button(buttons, c->imgs[IMG_PAGER_RIGHT], c);
139 lv_obj_set_width(right, c->sz->icon[3]);
140
141 lv_obj_add_event_cb(slide_deck_cont, slide_deck_scrolled_cb, LV_EVENT_SCROLL, buttons);
142 lv_obj_add_event_cb(left, left_clicked_cb, LV_EVENT_CLICKED, slide_deck);
143 lv_obj_add_event_cb(right, right_clicked_cb, LV_EVENT_CLICKED, slide_deck);
144
145 lv_timer_t * play_pause_timer = lv_timer_create(play_pause_timer_cb, 5000, slide_deck);
146 lv_obj_add_event_cb(play_pause, play_pause_clicked_cb, LV_EVENT_CLICKED, play_pause_timer);
147 lv_obj_add_event_cb(bg_cont, bg_cont_delete_cb, LV_EVENT_DELETE, play_pause_timer);
148
149 lv_obj_t * slide;
150
151 uint32_t about_slides_count = lv_array_size(&c->about_slides_array);
152 for(uint32_t i = 0; i < about_slides_count; i++) {
153 lv_image_dsc_t ** slide_src = lv_array_at(&c->about_slides_array, i);
154 slide = lv_image_create(slide_deck);
155 lv_image_set_src(slide, *slide_src);
156 }
157
158 slide = lv_obj_get_child(slide_deck, 0);
159 if(slide) {
160 lv_obj_scroll_to_view_recursive(slide, LV_ANIM_OFF);
161 }
162 }
163
164 /**********************
165 * STATIC FUNCTIONS
166 **********************/
167
back_clicked_cb(lv_event_t * e)168 static void back_clicked_cb(lv_event_t * e)
169 {
170 lv_obj_t * back = lv_event_get_target_obj(e);
171
172 lv_obj_t * base_obj = lv_obj_get_parent(lv_obj_get_parent(lv_obj_get_parent(back)));
173 lv_obj_clean(base_obj);
174 lv_demo_high_res_home(base_obj);
175 }
176
slide_deck_scrolled_cb(lv_event_t * e)177 static void slide_deck_scrolled_cb(lv_event_t * e)
178 {
179 lv_obj_t * slide_deck_cont = lv_event_get_target_obj(e);
180 lv_obj_t * slide_deck = lv_obj_get_child(slide_deck_cont, 0);
181 lv_obj_t * buttons = lv_event_get_user_data(e);
182 lv_obj_t * left_button = lv_obj_get_child(buttons, 0);
183 lv_obj_t * right_button = lv_obj_get_child(buttons, 2);
184
185 lv_obj_set_state(left_button, LV_STATE_DISABLED,
186 lv_obj_get_scroll_left(slide_deck_cont) - lv_obj_get_style_pad_left(slide_deck, 0) <= 0);
187 lv_obj_set_state(right_button, LV_STATE_DISABLED, lv_obj_get_scroll_right(slide_deck_cont) <= 0);
188 }
189
create_button(lv_obj_t * parent,const void * img_src,lv_demo_high_res_ctx_t * c)190 static lv_obj_t * create_button(lv_obj_t * parent, const void * img_src, lv_demo_high_res_ctx_t * c)
191 {
192 lv_obj_t * button = lv_obj_create(parent);
193 lv_obj_remove_style_all(button);
194 lv_obj_set_style_bg_opa(button, LV_OPA_COVER, 0);
195 lv_obj_set_size(button, c->sz->icon[4], c->sz->icon[1]);
196 lv_obj_set_style_radius(button, c->sz->gap[3], 0);
197 lv_obj_add_style(button, &c->styles[STYLE_COLOR_ACCENT][STYLE_TYPE_OBJ], 0);
198 lv_obj_set_style_opa(button, LV_OPA_20, LV_STATE_DISABLED);
199 lv_obj_t * img = lv_image_create(button);
200 lv_image_set_src(img, img_src);
201 lv_obj_set_style_image_recolor(img, lv_color_white(), 0);
202 lv_obj_set_style_image_recolor_opa(img, LV_OPA_COVER, 0);
203 lv_obj_center(img);
204 return button;
205 }
206
left_clicked_cb(lv_event_t * e)207 static void left_clicked_cb(lv_event_t * e)
208 {
209 lv_obj_t * slide_deck = lv_event_get_user_data(e);
210 lv_obj_t * slide_deck_cont = lv_obj_get_parent(slide_deck);
211 lv_area_t slide_deck_cont_area;
212 lv_obj_get_coords(slide_deck_cont, &slide_deck_cont_area);
213
214 int32_t slide_count = lv_obj_get_child_count(slide_deck);
215 for(int32_t i = slide_count - 1; i >= 0; i--) {
216 lv_obj_t * slide = lv_obj_get_child(slide_deck, i);
217 lv_area_t slide_area;
218 lv_obj_get_coords(slide, &slide_area);
219 if(slide_area.x1 < slide_deck_cont_area.x1 && slide_area.x2 < slide_deck_cont_area.x2) {
220 lv_obj_scroll_to_view_recursive(slide, LV_ANIM_ON);
221 break;
222 }
223 }
224 }
225
bg_cont_delete_cb(lv_event_t * e)226 static void bg_cont_delete_cb(lv_event_t * e)
227 {
228 lv_timer_t * play_pause_timer = lv_event_get_user_data(e);
229 lv_timer_delete(play_pause_timer);
230 }
231
advance_slides(lv_obj_t * slide_deck)232 static bool advance_slides(lv_obj_t * slide_deck)
233 {
234 lv_obj_t * slide_deck_cont = lv_obj_get_parent(slide_deck);
235 lv_area_t slide_deck_cont_area;
236 lv_obj_get_coords(slide_deck_cont, &slide_deck_cont_area);
237
238 int32_t slide_count = lv_obj_get_child_count(slide_deck);
239 for(int32_t i = 0; i < slide_count; i++) {
240 lv_obj_t * slide = lv_obj_get_child(slide_deck, i);
241 lv_area_t slide_area;
242 lv_obj_get_coords(slide, &slide_area);
243 if(slide_area.x1 > slide_deck_cont_area.x1 && slide_area.x2 > slide_deck_cont_area.x2) {
244 lv_obj_scroll_to_view_recursive(slide, LV_ANIM_ON);
245 return true;
246 }
247 }
248 return false;
249 }
250
right_clicked_cb(lv_event_t * e)251 static void right_clicked_cb(lv_event_t * e)
252 {
253 lv_obj_t * slide_deck = lv_event_get_user_data(e);
254 advance_slides(slide_deck);
255 }
256
play_pause_timer_cb(lv_timer_t * t)257 static void play_pause_timer_cb(lv_timer_t * t)
258 {
259 lv_obj_t * slide_deck = lv_timer_get_user_data(t);
260 bool scrolled = advance_slides(slide_deck);
261 if(!scrolled) {
262 lv_obj_t * first_slide = lv_obj_get_child(slide_deck, 0);
263 lv_obj_scroll_to_view_recursive(first_slide, LV_ANIM_ON);
264 }
265 }
266
play_pause_clicked_cb(lv_event_t * e)267 static void play_pause_clicked_cb(lv_event_t * e)
268 {
269 lv_obj_t * play_pause = lv_event_get_target_obj(e);
270 lv_timer_t * play_pause_timer = lv_event_get_user_data(e);
271 lv_demo_high_res_ctx_t * c = lv_obj_get_user_data(play_pause);
272 lv_obj_t * play_pause_img = lv_obj_get_child(play_pause, 0);
273
274 if(lv_image_get_src(play_pause_img) == c->imgs[IMG_PAGER_PAUSE]) {
275 lv_image_set_src(play_pause_img, c->imgs[IMG_PAGER_PLAY]);
276 lv_timer_pause(play_pause_timer);
277 }
278 else {
279 lv_image_set_src(play_pause_img, c->imgs[IMG_PAGER_PAUSE]);
280 lv_timer_reset(play_pause_timer);
281 lv_timer_resume(play_pause_timer);
282 }
283 }
284
285 #endif /*LV_USE_DEMO_HIGH_RES*/
286