acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
lv_demo_widgets.c (70787B)
1 /** 2 * @file lv_demo_widgets.c 3 * 4 */ 5 6 /********************* 7 * INCLUDES 8 *********************/ 9 #include "lv_demo_widgets.h" 10 11 #if LV_USE_DEMO_WIDGETS 12 13 #if LV_MEM_CUSTOM == 0 && LV_MEM_SIZE < (38ul * 1024ul) 14 #error Insufficient memory for lv_demo_widgets. Please set LV_MEM_SIZE to at least 38KB (38ul * 1024ul). 48KB is recommended. 15 #endif 16 17 /********************* 18 * DEFINES 19 *********************/ 20 21 /********************** 22 * TYPEDEFS 23 **********************/ 24 typedef enum { 25 DISP_SMALL, 26 DISP_MEDIUM, 27 DISP_LARGE, 28 } disp_size_t; 29 30 /********************** 31 * STATIC PROTOTYPES 32 **********************/ 33 static void profile_create(lv_obj_t * parent); 34 static void analytics_create(lv_obj_t * parent); 35 static void shop_create(lv_obj_t * parent); 36 static void color_changer_create(lv_obj_t * parent); 37 38 static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2, 39 const char * text3); 40 static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category, 41 const char * price); 42 43 static void color_changer_event_cb(lv_event_t * e); 44 static void color_event_cb(lv_event_t * e); 45 static void ta_event_cb(lv_event_t * e); 46 static void birthday_event_cb(lv_event_t * e); 47 static void calendar_event_cb(lv_event_t * e); 48 static void slider_event_cb(lv_event_t * e); 49 static void chart_event_cb(lv_event_t * e); 50 static void shop_chart_event_cb(lv_event_t * e); 51 static void meter1_indic1_anim_cb(void * var, int32_t v); 52 static void meter1_indic2_anim_cb(void * var, int32_t v); 53 static void meter1_indic3_anim_cb(void * var, int32_t v); 54 static void meter2_timer_cb(lv_timer_t * timer); 55 static void meter3_anim_cb(void * var, int32_t v); 56 57 /********************** 58 * STATIC VARIABLES 59 **********************/ 60 static disp_size_t disp_size; 61 62 static lv_obj_t * tv; 63 static lv_obj_t * calendar; 64 static lv_style_t style_text_muted; 65 static lv_style_t style_title; 66 static lv_style_t style_icon; 67 static lv_style_t style_bullet; 68 69 static lv_obj_t * meter1; 70 static lv_obj_t * meter2; 71 static lv_obj_t * meter3; 72 73 static lv_obj_t * chart1; 74 static lv_obj_t * chart2; 75 static lv_obj_t * chart3; 76 77 static lv_chart_series_t * ser1; 78 static lv_chart_series_t * ser2; 79 static lv_chart_series_t * ser3; 80 static lv_chart_series_t * ser4; 81 82 static const lv_font_t * font_large; 83 static const lv_font_t * font_normal; 84 85 static uint32_t session_desktop = 1000; 86 static uint32_t session_tablet = 1000; 87 static uint32_t session_mobile = 1000; 88 89 /********************** 90 * MACROS 91 **********************/ 92 93 /********************** 94 * GLOBAL FUNCTIONS 95 **********************/ 96 97 void lv_demo_widgets(void) 98 { 99 if(LV_HOR_RES <= 320) disp_size = DISP_SMALL; 100 else if(LV_HOR_RES < 720) disp_size = DISP_MEDIUM; 101 else disp_size = DISP_LARGE; 102 103 font_large = LV_FONT_DEFAULT; 104 font_normal = LV_FONT_DEFAULT; 105 106 lv_coord_t tab_h; 107 if(disp_size == DISP_LARGE) { 108 tab_h = 70; 109 #if LV_FONT_MONTSERRAT_24 110 font_large = &lv_font_montserrat_24; 111 #else 112 LV_LOG_WARN("LV_FONT_MONTSERRAT_24 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 113 #endif 114 #if LV_FONT_MONTSERRAT_16 115 font_normal = &lv_font_montserrat_16; 116 #else 117 LV_LOG_WARN("LV_FONT_MONTSERRAT_16 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 118 #endif 119 } 120 else if(disp_size == DISP_MEDIUM) { 121 tab_h = 45; 122 #if LV_FONT_MONTSERRAT_20 123 font_large = &lv_font_montserrat_20; 124 #else 125 LV_LOG_WARN("LV_FONT_MONTSERRAT_20 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 126 #endif 127 #if LV_FONT_MONTSERRAT_14 128 font_normal = &lv_font_montserrat_14; 129 #else 130 LV_LOG_WARN("LV_FONT_MONTSERRAT_14 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 131 #endif 132 } 133 else { /* disp_size == DISP_SMALL */ 134 tab_h = 45; 135 #if LV_FONT_MONTSERRAT_18 136 font_large = &lv_font_montserrat_18; 137 #else 138 LV_LOG_WARN("LV_FONT_MONTSERRAT_18 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 139 #endif 140 #if LV_FONT_MONTSERRAT_12 141 font_normal = &lv_font_montserrat_12; 142 #else 143 LV_LOG_WARN("LV_FONT_MONTSERRAT_12 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead."); 144 #endif 145 } 146 147 #if LV_USE_THEME_DEFAULT 148 lv_theme_default_init(NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK, 149 font_normal); 150 #endif 151 152 lv_style_init(&style_text_muted); 153 lv_style_set_text_opa(&style_text_muted, LV_OPA_50); 154 155 lv_style_init(&style_title); 156 lv_style_set_text_font(&style_title, font_large); 157 158 lv_style_init(&style_icon); 159 lv_style_set_text_color(&style_icon, lv_theme_get_color_primary(NULL)); 160 lv_style_set_text_font(&style_icon, font_large); 161 162 lv_style_init(&style_bullet); 163 lv_style_set_border_width(&style_bullet, 0); 164 lv_style_set_radius(&style_bullet, LV_RADIUS_CIRCLE); 165 166 tv = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, tab_h); 167 168 lv_obj_set_style_text_font(lv_scr_act(), font_normal, 0); 169 170 if(disp_size == DISP_LARGE) { 171 lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tv); 172 lv_obj_set_style_pad_left(tab_btns, LV_HOR_RES / 2, 0); 173 lv_obj_t * logo = lv_img_create(tab_btns); 174 LV_IMG_DECLARE(img_lvgl_logo); 175 lv_img_set_src(logo, &img_lvgl_logo); 176 lv_obj_align(logo, LV_ALIGN_LEFT_MID, -LV_HOR_RES / 2 + 25, 0); 177 178 lv_obj_t * label = lv_label_create(tab_btns); 179 lv_obj_add_style(label, &style_title, 0); 180 lv_label_set_text(label, "LVGL v8"); 181 lv_obj_align_to(label, logo, LV_ALIGN_OUT_RIGHT_TOP, 10, 0); 182 183 label = lv_label_create(tab_btns); 184 lv_label_set_text(label, "Widgets demo"); 185 lv_obj_add_style(label, &style_text_muted, 0); 186 lv_obj_align_to(label, logo, LV_ALIGN_OUT_RIGHT_BOTTOM, 10, 0); 187 } 188 189 lv_obj_t * t1 = lv_tabview_add_tab(tv, "Profile"); 190 lv_obj_t * t2 = lv_tabview_add_tab(tv, "Analytics"); 191 lv_obj_t * t3 = lv_tabview_add_tab(tv, "Shop"); 192 profile_create(t1); 193 analytics_create(t2); 194 shop_create(t3); 195 196 color_changer_create(tv); 197 } 198 199 /********************** 200 * STATIC FUNCTIONS 201 **********************/ 202 203 static void profile_create(lv_obj_t * parent) 204 { 205 lv_obj_t * panel1 = lv_obj_create(parent); 206 lv_obj_set_height(panel1, LV_SIZE_CONTENT); 207 208 LV_IMG_DECLARE(img_demo_widgets_avatar); 209 lv_obj_t * avatar = lv_img_create(panel1); 210 lv_img_set_src(avatar, &img_demo_widgets_avatar); 211 212 lv_obj_t * name = lv_label_create(panel1); 213 lv_label_set_text(name, "Elena Smith"); 214 lv_obj_add_style(name, &style_title, 0); 215 216 lv_obj_t * dsc = lv_label_create(panel1); 217 lv_obj_add_style(dsc, &style_text_muted, 0); 218 lv_label_set_text(dsc, "This is a short description of me. Take a look at my profile!"); 219 lv_label_set_long_mode(dsc, LV_LABEL_LONG_WRAP); 220 221 lv_obj_t * email_icn = lv_label_create(panel1); 222 lv_obj_add_style(email_icn, &style_icon, 0); 223 lv_label_set_text(email_icn, LV_SYMBOL_ENVELOPE); 224 225 lv_obj_t * email_label = lv_label_create(panel1); 226 lv_label_set_text(email_label, "elena@smith.com"); 227 228 lv_obj_t * call_icn = lv_label_create(panel1); 229 lv_obj_add_style(call_icn, &style_icon, 0); 230 lv_label_set_text(call_icn, LV_SYMBOL_CALL); 231 232 lv_obj_t * call_label = lv_label_create(panel1); 233 lv_label_set_text(call_label, "+79 246 123 4567"); 234 235 lv_obj_t * log_out_btn = lv_btn_create(panel1); 236 lv_obj_set_height(log_out_btn, LV_SIZE_CONTENT); 237 238 lv_obj_t * label = lv_label_create(log_out_btn); 239 lv_label_set_text(label, "Log out"); 240 lv_obj_center(label); 241 242 lv_obj_t * invite_btn = lv_btn_create(panel1); 243 lv_obj_add_state(invite_btn, LV_STATE_DISABLED); 244 lv_obj_set_height(invite_btn, LV_SIZE_CONTENT); 245 246 label = lv_label_create(invite_btn); 247 lv_label_set_text(label, "Invite"); 248 lv_obj_center(label); 249 250 /*Create a keyboard*/ 251 lv_obj_t * kb = lv_keyboard_create(lv_scr_act()); 252 lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); 253 254 /*Create the second panel*/ 255 lv_obj_t * panel2 = lv_obj_create(parent); 256 lv_obj_set_height(panel2, LV_SIZE_CONTENT); 257 258 lv_obj_t * panel2_title = lv_label_create(panel2); 259 lv_label_set_text(panel2_title, "Your profile"); 260 lv_obj_add_style(panel2_title, &style_title, 0); 261 262 lv_obj_t * user_name_label = lv_label_create(panel2); 263 lv_label_set_text(user_name_label, "User name"); 264 lv_obj_add_style(user_name_label, &style_text_muted, 0); 265 266 lv_obj_t * user_name = lv_textarea_create(panel2); 267 lv_textarea_set_one_line(user_name, true); 268 lv_textarea_set_placeholder_text(user_name, "Your name"); 269 lv_obj_add_event_cb(user_name, ta_event_cb, LV_EVENT_ALL, kb); 270 271 lv_obj_t * password_label = lv_label_create(panel2); 272 lv_label_set_text(password_label, "Password"); 273 lv_obj_add_style(password_label, &style_text_muted, 0); 274 275 lv_obj_t * password = lv_textarea_create(panel2); 276 lv_textarea_set_one_line(password, true); 277 lv_textarea_set_password_mode(password, true); 278 lv_textarea_set_placeholder_text(password, "Min. 8 chars."); 279 lv_obj_add_event_cb(password, ta_event_cb, LV_EVENT_ALL, kb); 280 281 lv_obj_t * gender_label = lv_label_create(panel2); 282 lv_label_set_text(gender_label, "Gender"); 283 lv_obj_add_style(gender_label, &style_text_muted, 0); 284 285 lv_obj_t * gender = lv_dropdown_create(panel2); 286 lv_dropdown_set_options_static(gender, "Male\nFemale\nOther"); 287 288 lv_obj_t * birthday_label = lv_label_create(panel2); 289 lv_label_set_text(birthday_label, "Birthday"); 290 lv_obj_add_style(birthday_label, &style_text_muted, 0); 291 292 lv_obj_t * birthdate = lv_textarea_create(panel2); 293 lv_textarea_set_one_line(birthdate, true); 294 lv_obj_add_event_cb(birthdate, birthday_event_cb, LV_EVENT_ALL, NULL); 295 296 /*Create the third panel*/ 297 lv_obj_t * panel3 = lv_obj_create(parent); 298 lv_obj_t * panel3_title = lv_label_create(panel3); 299 lv_label_set_text(panel3_title, "Your skills"); 300 lv_obj_add_style(panel3_title, &style_title, 0); 301 302 lv_obj_t * experience_label = lv_label_create(panel3); 303 lv_label_set_text(experience_label, "Experience"); 304 lv_obj_add_style(experience_label, &style_text_muted, 0); 305 306 lv_obj_t * slider1 = lv_slider_create(panel3); 307 lv_obj_set_width(slider1, LV_PCT(95)); 308 lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_ALL, NULL); 309 lv_obj_refresh_ext_draw_size(slider1); 310 311 lv_obj_t * team_player_label = lv_label_create(panel3); 312 lv_label_set_text(team_player_label, "Team player"); 313 lv_obj_add_style(team_player_label, &style_text_muted, 0); 314 315 lv_obj_t * sw1 = lv_switch_create(panel3); 316 317 lv_obj_t * hard_working_label = lv_label_create(panel3); 318 lv_label_set_text(hard_working_label, "Hard-working"); 319 lv_obj_add_style(hard_working_label, &style_text_muted, 0); 320 321 lv_obj_t * sw2 = lv_switch_create(panel3); 322 323 if(disp_size == DISP_LARGE) { 324 static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 325 static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; 326 327 /*Create the top panel*/ 328 static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, 5, LV_GRID_CONTENT, LV_GRID_FR(2), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 329 static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, 10, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; 330 331 static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 332 static lv_coord_t grid_2_row_dsc[] = { 333 LV_GRID_CONTENT, /*Title*/ 334 5, /*Separator*/ 335 LV_GRID_CONTENT, /*Box title*/ 336 30, /*Boxes*/ 337 5, /*Separator*/ 338 LV_GRID_CONTENT, /*Box title*/ 339 30, /*Boxes*/ 340 LV_GRID_TEMPLATE_LAST 341 }; 342 343 344 lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); 345 346 lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 347 348 lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc); 349 lv_obj_set_grid_cell(avatar, LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 5); 350 lv_obj_set_grid_cell(name, LV_GRID_ALIGN_START, 2, 2, LV_GRID_ALIGN_CENTER, 0, 1); 351 lv_obj_set_grid_cell(dsc, LV_GRID_ALIGN_STRETCH, 2, 4, LV_GRID_ALIGN_START, 1, 1); 352 lv_obj_set_grid_cell(email_icn, LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 3, 1); 353 lv_obj_set_grid_cell(email_label, LV_GRID_ALIGN_START, 3, 1, LV_GRID_ALIGN_CENTER, 3, 1); 354 lv_obj_set_grid_cell(call_icn, LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 4, 1); 355 lv_obj_set_grid_cell(call_label, LV_GRID_ALIGN_START, 3, 1, LV_GRID_ALIGN_CENTER, 4, 1); 356 lv_obj_set_grid_cell(log_out_btn, LV_GRID_ALIGN_STRETCH, 4, 1, LV_GRID_ALIGN_CENTER, 3, 2); 357 lv_obj_set_grid_cell(invite_btn, LV_GRID_ALIGN_STRETCH, 5, 1, LV_GRID_ALIGN_CENTER, 3, 2); 358 359 lv_obj_set_grid_cell(panel2, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 1, 1); 360 lv_obj_set_grid_dsc_array(panel2, grid_2_col_dsc, grid_2_row_dsc); 361 lv_obj_set_grid_cell(panel2_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 362 lv_obj_set_grid_cell(user_name, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_CENTER, 3, 1); 363 lv_obj_set_grid_cell(user_name_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 364 lv_obj_set_grid_cell(password, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 3, 1); 365 lv_obj_set_grid_cell(password_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 2, 1); 366 lv_obj_set_grid_cell(birthdate, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_CENTER, 6, 1); 367 lv_obj_set_grid_cell(birthday_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 5, 1); 368 lv_obj_set_grid_cell(gender, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_CENTER, 6, 1); 369 lv_obj_set_grid_cell(gender_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1); 370 371 372 lv_obj_set_grid_cell(panel3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1); 373 lv_obj_set_grid_dsc_array(panel3, grid_2_col_dsc, grid_2_row_dsc); 374 lv_obj_set_grid_cell(panel3_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 375 lv_obj_set_grid_cell(slider1, LV_GRID_ALIGN_CENTER, 0, 2, LV_GRID_ALIGN_CENTER, 3, 1); 376 lv_obj_set_grid_cell(experience_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 377 lv_obj_set_grid_cell(sw2, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 6, 1); 378 lv_obj_set_grid_cell(hard_working_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1); 379 lv_obj_set_grid_cell(sw1, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 6, 1); 380 lv_obj_set_grid_cell(team_player_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 5, 1); 381 } 382 else if(disp_size == DISP_MEDIUM) { 383 static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 384 static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; 385 386 387 /*Create the top panel*/ 388 static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, 1, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 389 static lv_coord_t grid_1_row_dsc[] = { 390 LV_GRID_CONTENT, /*Name*/ 391 LV_GRID_CONTENT, /*Description*/ 392 LV_GRID_CONTENT, /*Email*/ 393 -20, 394 LV_GRID_CONTENT, /*Phone*/ 395 LV_GRID_CONTENT, /*Buttons*/ 396 LV_GRID_TEMPLATE_LAST 397 }; 398 399 static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 400 static lv_coord_t grid_2_row_dsc[] = { 401 LV_GRID_CONTENT, /*Title*/ 402 5, /*Separator*/ 403 LV_GRID_CONTENT, /*Box title*/ 404 40, /*Box*/ 405 LV_GRID_CONTENT, /*Box title*/ 406 40, /*Box*/ 407 LV_GRID_CONTENT, /*Box title*/ 408 40, /*Box*/ 409 LV_GRID_CONTENT, /*Box title*/ 410 40, /*Box*/ 411 LV_GRID_TEMPLATE_LAST 412 }; 413 414 415 lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); 416 lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 417 418 lv_obj_set_width(log_out_btn, 120); 419 lv_obj_set_width(invite_btn, 120); 420 421 lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc); 422 lv_obj_set_grid_cell(avatar, LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_START, 0, 4); 423 lv_obj_set_grid_cell(name, LV_GRID_ALIGN_START, 2, 2, LV_GRID_ALIGN_CENTER, 0, 1); 424 lv_obj_set_grid_cell(dsc, LV_GRID_ALIGN_STRETCH, 2, 2, LV_GRID_ALIGN_START, 1, 1); 425 lv_obj_set_grid_cell(email_label, LV_GRID_ALIGN_START, 3, 1, LV_GRID_ALIGN_CENTER, 2, 1); 426 lv_obj_set_grid_cell(email_icn, LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 2, 1); 427 lv_obj_set_grid_cell(call_icn, LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 4, 1); 428 lv_obj_set_grid_cell(call_label, LV_GRID_ALIGN_START, 3, 1, LV_GRID_ALIGN_CENTER, 4, 1); 429 lv_obj_set_grid_cell(log_out_btn, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 5, 1); 430 lv_obj_set_grid_cell(invite_btn, LV_GRID_ALIGN_END, 3, 1, LV_GRID_ALIGN_CENTER, 5, 1); 431 432 lv_obj_set_grid_cell(panel2, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 1, 1); 433 lv_obj_set_grid_dsc_array(panel2, grid_2_col_dsc, grid_2_row_dsc); 434 lv_obj_set_grid_cell(panel2_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 435 lv_obj_set_grid_cell(user_name_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 2, 1); 436 lv_obj_set_grid_cell(user_name, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 3, 1); 437 lv_obj_set_grid_cell(password_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 4, 1); 438 lv_obj_set_grid_cell(password, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 5, 1); 439 lv_obj_set_grid_cell(birthday_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 6, 1); 440 lv_obj_set_grid_cell(birthdate, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 7, 1); 441 lv_obj_set_grid_cell(gender_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 8, 1); 442 lv_obj_set_grid_cell(gender, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 9, 1); 443 444 lv_obj_set_grid_cell(panel3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1); 445 lv_obj_set_grid_dsc_array(panel3, grid_2_col_dsc, grid_2_row_dsc); 446 lv_obj_set_grid_cell(panel3_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 447 lv_obj_set_grid_cell(slider1, LV_GRID_ALIGN_CENTER, 0, 2, LV_GRID_ALIGN_CENTER, 3, 1); 448 lv_obj_set_grid_cell(experience_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 449 lv_obj_set_grid_cell(hard_working_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 4, 1); 450 lv_obj_set_grid_cell(sw2, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1); 451 lv_obj_set_grid_cell(team_player_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 6, 1); 452 lv_obj_set_grid_cell(sw1, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 7, 1); 453 } 454 else if(disp_size == DISP_SMALL) { 455 static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 456 static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; 457 lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); 458 459 460 /*Create the top panel*/ 461 static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 462 static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, /*Avatar*/ 463 LV_GRID_CONTENT, /*Name*/ 464 LV_GRID_CONTENT, /*Description*/ 465 LV_GRID_CONTENT, /*Email*/ 466 LV_GRID_CONTENT, /*Phone number*/ 467 LV_GRID_CONTENT, /*Button1*/ 468 LV_GRID_CONTENT, /*Button2*/ 469 LV_GRID_TEMPLATE_LAST 470 }; 471 472 lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc); 473 474 475 static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 476 static lv_coord_t grid_2_row_dsc[] = { 477 LV_GRID_CONTENT, /*Title*/ 478 5, /*Separator*/ 479 LV_GRID_CONTENT, /*Box title*/ 480 40, /*Box*/ 481 LV_GRID_CONTENT, /*Box title*/ 482 40, /*Box*/ 483 LV_GRID_CONTENT, /*Box title*/ 484 40, /*Box*/ 485 LV_GRID_CONTENT, /*Box title*/ 486 40, LV_GRID_TEMPLATE_LAST /*Box*/ 487 }; 488 489 lv_obj_set_grid_dsc_array(panel2, grid_2_col_dsc, grid_2_row_dsc); 490 lv_obj_set_grid_dsc_array(panel3, grid_2_col_dsc, grid_2_row_dsc); 491 492 lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); 493 494 lv_obj_set_style_text_align(dsc, LV_TEXT_ALIGN_CENTER, 0); 495 496 lv_obj_set_grid_cell(avatar, LV_GRID_ALIGN_CENTER, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 497 lv_obj_set_grid_cell(name, LV_GRID_ALIGN_CENTER, 0, 2, LV_GRID_ALIGN_CENTER, 1, 1); 498 lv_obj_set_grid_cell(dsc, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 2, 1); 499 lv_obj_set_grid_cell(email_icn, LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 3, 1); 500 lv_obj_set_grid_cell(email_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 3, 1); 501 lv_obj_set_grid_cell(call_icn, LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 4, 1); 502 lv_obj_set_grid_cell(call_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 4, 1); 503 lv_obj_set_grid_cell(log_out_btn, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 5, 1); 504 lv_obj_set_grid_cell(invite_btn, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 6, 1); 505 506 lv_obj_set_grid_cell(panel2, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 1, 1); 507 lv_obj_set_grid_cell(panel2_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 508 lv_obj_set_grid_cell(user_name_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 2, 1); 509 lv_obj_set_grid_cell(user_name, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 3, 1); 510 lv_obj_set_grid_cell(password_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 4, 1); 511 lv_obj_set_grid_cell(password, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 5, 1); 512 lv_obj_set_grid_cell(birthday_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 6, 1); 513 lv_obj_set_grid_cell(birthdate, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 7, 1); 514 lv_obj_set_grid_cell(gender_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 8, 1); 515 lv_obj_set_grid_cell(gender, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_START, 9, 1); 516 517 lv_obj_set_height(panel3, LV_SIZE_CONTENT); 518 lv_obj_set_grid_cell(panel3, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_START, 2, 1); 519 lv_obj_set_grid_cell(panel3_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); 520 lv_obj_set_grid_cell(experience_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 521 lv_obj_set_grid_cell(slider1, LV_GRID_ALIGN_CENTER, 0, 2, LV_GRID_ALIGN_CENTER, 3, 1); 522 lv_obj_set_grid_cell(hard_working_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 4, 1); 523 lv_obj_set_grid_cell(sw1, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1); 524 lv_obj_set_grid_cell(team_player_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 4, 1); 525 lv_obj_set_grid_cell(sw2, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_START, 5, 1); 526 } 527 } 528 529 530 static void analytics_create(lv_obj_t * parent) 531 { 532 lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW_WRAP); 533 534 static lv_coord_t grid_chart_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), 10, LV_GRID_TEMPLATE_LAST}; 535 static lv_coord_t grid_chart_col_dsc[] = {20, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 536 537 lv_obj_t * chart1_cont = lv_obj_create(parent); 538 lv_obj_set_flex_grow(chart1_cont, 1); 539 lv_obj_set_grid_dsc_array(chart1_cont, grid_chart_col_dsc, grid_chart_row_dsc); 540 541 lv_obj_set_height(chart1_cont, LV_PCT(100)); 542 lv_obj_set_style_max_height(chart1_cont, 300, 0); 543 544 lv_obj_t * title = lv_label_create(chart1_cont); 545 lv_label_set_text(title, "Unique visitors"); 546 lv_obj_add_style(title, &style_title, 0); 547 lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 0, 1); 548 549 chart1 = lv_chart_create(chart1_cont); 550 lv_group_add_obj(lv_group_get_default(), chart1); 551 lv_obj_add_flag(chart1, LV_OBJ_FLAG_SCROLL_ON_FOCUS); 552 lv_obj_set_grid_cell(chart1, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1); 553 lv_chart_set_axis_tick(chart1, LV_CHART_AXIS_PRIMARY_Y, 0, 0, 5, 1, true, 80); 554 lv_chart_set_axis_tick(chart1, LV_CHART_AXIS_PRIMARY_X, 0, 0, 12, 1, true, 50); 555 lv_chart_set_div_line_count(chart1, 0, 12); 556 lv_chart_set_point_count(chart1, 12); 557 lv_obj_add_event_cb(chart1, chart_event_cb, LV_EVENT_ALL, NULL); 558 if(disp_size == DISP_SMALL) lv_chart_set_zoom_x(chart1, 256 * 3); 559 else if(disp_size == DISP_MEDIUM) lv_chart_set_zoom_x(chart1, 256 * 2); 560 561 lv_obj_set_style_border_side(chart1, LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_BOTTOM, 0); 562 lv_obj_set_style_radius(chart1, 0, 0); 563 564 ser1 = lv_chart_add_series(chart1, lv_theme_get_color_primary(chart1), LV_CHART_AXIS_PRIMARY_Y); 565 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 566 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 567 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 568 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 569 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 570 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 571 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 572 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 573 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 574 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 575 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 576 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 577 lv_chart_set_next_value(chart1, ser1, lv_rand(10, 80)); 578 579 lv_obj_t * chart2_cont = lv_obj_create(parent); 580 lv_obj_add_flag(chart2_cont, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 581 lv_obj_set_flex_grow(chart2_cont, 1); 582 583 lv_obj_set_height(chart2_cont, LV_PCT(100)); 584 lv_obj_set_style_max_height(chart2_cont, 300, 0); 585 586 lv_obj_set_grid_dsc_array(chart2_cont, grid_chart_col_dsc, grid_chart_row_dsc); 587 588 title = lv_label_create(chart2_cont); 589 lv_label_set_text(title, "Monthly revenue"); 590 lv_obj_add_style(title, &style_title, 0); 591 lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 0, 1); 592 593 chart2 = lv_chart_create(chart2_cont); 594 lv_group_add_obj(lv_group_get_default(), chart2); 595 lv_obj_add_flag(chart2, LV_OBJ_FLAG_SCROLL_ON_FOCUS); 596 597 lv_obj_set_grid_cell(chart2, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1); 598 lv_chart_set_axis_tick(chart2, LV_CHART_AXIS_PRIMARY_Y, 0, 0, 5, 1, true, 80); 599 lv_chart_set_axis_tick(chart2, LV_CHART_AXIS_PRIMARY_X, 0, 0, 12, 1, true, 50); 600 lv_obj_set_size(chart2, LV_PCT(100), LV_PCT(100)); 601 lv_chart_set_type(chart2, LV_CHART_TYPE_BAR); 602 lv_chart_set_div_line_count(chart2, 6, 0); 603 lv_chart_set_point_count(chart2, 12); 604 lv_obj_add_event_cb(chart2, chart_event_cb, LV_EVENT_ALL, NULL); 605 lv_chart_set_zoom_x(chart2, 256 * 2); 606 lv_obj_set_style_border_side(chart2, LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_BOTTOM, 0); 607 lv_obj_set_style_radius(chart2, 0, 0); 608 609 if(disp_size == DISP_SMALL) { 610 lv_obj_set_style_pad_gap(chart2, 0, LV_PART_ITEMS); 611 lv_obj_set_style_pad_gap(chart2, 2, LV_PART_MAIN); 612 } 613 else if(disp_size == DISP_LARGE) { 614 lv_obj_set_style_pad_gap(chart2, 16, 0); 615 } 616 617 ser2 = lv_chart_add_series(chart2, lv_palette_lighten(LV_PALETTE_GREY, 1), LV_CHART_AXIS_PRIMARY_Y); 618 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 619 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 620 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 621 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 622 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 623 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 624 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 625 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 626 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 627 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 628 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 629 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 630 lv_chart_set_next_value(chart2, ser2, lv_rand(10, 80)); 631 632 ser3 = lv_chart_add_series(chart2, lv_theme_get_color_primary(chart1), LV_CHART_AXIS_PRIMARY_Y); 633 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 634 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 635 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 636 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 637 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 638 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 639 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 640 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 641 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 642 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 643 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 644 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 645 lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); 646 647 lv_meter_scale_t * scale; 648 lv_meter_indicator_t * indic; 649 meter1 = create_meter_box(parent, "Monthly Target", "Revenue: 63%", "Sales: 44%", "Costs: 58%"); 650 lv_obj_add_flag(lv_obj_get_parent(meter1), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 651 scale = lv_meter_add_scale(meter1); 652 lv_meter_set_scale_range(meter1, scale, 0, 100, 270, 90); 653 lv_meter_set_scale_ticks(meter1, scale, 0, 0, 0, lv_color_black()); 654 655 lv_anim_t a; 656 lv_anim_init(&a); 657 lv_anim_set_values(&a, 20, 100); 658 lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); 659 660 indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_BLUE), 0); 661 lv_anim_set_exec_cb(&a, meter1_indic1_anim_cb); 662 lv_anim_set_var(&a, indic); 663 lv_anim_set_time(&a, 4100); 664 lv_anim_set_playback_time(&a, 2700); 665 lv_anim_start(&a); 666 667 indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_RED), -20); 668 lv_anim_set_exec_cb(&a, meter1_indic2_anim_cb); 669 lv_anim_set_var(&a, indic); 670 lv_anim_set_time(&a, 2600); 671 lv_anim_set_playback_time(&a, 3200); 672 a.user_data = indic; 673 lv_anim_start(&a); 674 675 indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_GREEN), -40); 676 lv_anim_set_exec_cb(&a, meter1_indic3_anim_cb); 677 lv_anim_set_var(&a, indic); 678 lv_anim_set_time(&a, 2800); 679 lv_anim_set_playback_time(&a, 1800); 680 lv_anim_start(&a); 681 682 meter2 = create_meter_box(parent, "Sessions", "Desktop: ", "Tablet: ", "Mobile: "); 683 if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter2), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 684 scale = lv_meter_add_scale(meter2); 685 lv_meter_set_scale_range(meter2, scale, 0, 100, 360, 90); 686 lv_meter_set_scale_ticks(meter2, scale, 0, 0, 0, lv_color_black()); 687 688 static lv_meter_indicator_t * meter2_indic[3]; 689 meter2_indic[0] = lv_meter_add_arc(meter2, scale, 20, lv_palette_main(LV_PALETTE_RED), -10); 690 lv_meter_set_indicator_start_value(meter2, meter2_indic[0], 0); 691 lv_meter_set_indicator_end_value(meter2, meter2_indic[0], 39); 692 693 meter2_indic[1] = lv_meter_add_arc(meter2, scale, 30, lv_palette_main(LV_PALETTE_BLUE), 0); 694 lv_meter_set_indicator_start_value(meter2, meter2_indic[1], 40); 695 lv_meter_set_indicator_end_value(meter2, meter2_indic[1], 69); 696 697 meter2_indic[2] = lv_meter_add_arc(meter2, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -20); 698 lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70); 699 lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99); 700 701 lv_timer_create(meter2_timer_cb, 100, meter2_indic); 702 703 meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed"); 704 if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter3), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 705 706 /*Add a special circle to the needle's pivot*/ 707 lv_obj_set_style_pad_hor(meter3, 10, 0); 708 lv_obj_set_style_size(meter3, 10, LV_PART_INDICATOR); 709 lv_obj_set_style_radius(meter3, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); 710 lv_obj_set_style_bg_opa(meter3, LV_OPA_COVER, LV_PART_INDICATOR); 711 lv_obj_set_style_bg_color(meter3, lv_palette_darken(LV_PALETTE_GREY, 4), LV_PART_INDICATOR); 712 lv_obj_set_style_outline_color(meter3, lv_color_white(), LV_PART_INDICATOR); 713 lv_obj_set_style_outline_width(meter3, 3, LV_PART_INDICATOR); 714 lv_obj_set_style_text_color(meter3, lv_palette_darken(LV_PALETTE_GREY, 1), LV_PART_TICKS); 715 716 scale = lv_meter_add_scale(meter3); 717 lv_meter_set_scale_range(meter3, scale, 10, 60, 220, 360 - 220); 718 lv_meter_set_scale_ticks(meter3, scale, 21, 3, 17, lv_color_white()); 719 lv_meter_set_scale_major_ticks(meter3, scale, 4, 4, 22, lv_color_white(), 15); 720 721 indic = lv_meter_add_arc(meter3, scale, 10, lv_palette_main(LV_PALETTE_RED), 0); 722 lv_meter_set_indicator_start_value(meter3, indic, 0); 723 lv_meter_set_indicator_end_value(meter3, indic, 20); 724 725 indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_RED, 3), lv_palette_darken(LV_PALETTE_RED, 726 3), true, 0); 727 lv_meter_set_indicator_start_value(meter3, indic, 0); 728 lv_meter_set_indicator_end_value(meter3, indic, 20); 729 730 indic = lv_meter_add_arc(meter3, scale, 12, lv_palette_main(LV_PALETTE_BLUE), 0); 731 lv_meter_set_indicator_start_value(meter3, indic, 20); 732 lv_meter_set_indicator_end_value(meter3, indic, 40); 733 734 indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_BLUE, 3), 735 lv_palette_darken(LV_PALETTE_BLUE, 3), true, 0); 736 lv_meter_set_indicator_start_value(meter3, indic, 20); 737 lv_meter_set_indicator_end_value(meter3, indic, 40); 738 739 indic = lv_meter_add_arc(meter3, scale, 10, lv_palette_main(LV_PALETTE_GREEN), 0); 740 lv_meter_set_indicator_start_value(meter3, indic, 40); 741 lv_meter_set_indicator_end_value(meter3, indic, 60); 742 743 indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_GREEN, 3), 744 lv_palette_darken(LV_PALETTE_GREEN, 3), true, 0); 745 lv_meter_set_indicator_start_value(meter3, indic, 40); 746 lv_meter_set_indicator_end_value(meter3, indic, 60); 747 748 indic = lv_meter_add_needle_line(meter3, scale, 4, lv_palette_darken(LV_PALETTE_GREY, 4), -25); 749 750 lv_obj_t * mbps_label = lv_label_create(meter3); 751 lv_label_set_text(mbps_label, "-"); 752 lv_obj_add_style(mbps_label, &style_title, 0); 753 754 lv_obj_t * mbps_unit_label = lv_label_create(meter3); 755 lv_label_set_text(mbps_unit_label, "Mbps"); 756 757 lv_anim_init(&a); 758 lv_anim_set_values(&a, 10, 60); 759 lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); 760 lv_anim_set_exec_cb(&a, meter3_anim_cb); 761 lv_anim_set_var(&a, indic); 762 lv_anim_set_time(&a, 4100); 763 lv_anim_set_playback_time(&a, 800); 764 lv_anim_start(&a); 765 766 lv_obj_update_layout(parent); 767 if(disp_size == DISP_MEDIUM) { 768 lv_obj_set_size(meter1, 200, 200); 769 lv_obj_set_size(meter2, 200, 200); 770 lv_obj_set_size(meter3, 200, 200); 771 } 772 else { 773 lv_coord_t meter_w = lv_obj_get_width(meter1); 774 lv_obj_set_height(meter1, meter_w); 775 lv_obj_set_height(meter2, meter_w); 776 lv_obj_set_height(meter3, meter_w); 777 } 778 779 lv_obj_align(mbps_label, LV_ALIGN_TOP_MID, 10, lv_pct(55)); 780 lv_obj_align_to(mbps_unit_label, mbps_label, LV_ALIGN_OUT_RIGHT_BOTTOM, 10, 0); 781 } 782 783 void shop_create(lv_obj_t * parent) 784 { 785 lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW_WRAP); 786 787 lv_obj_t * panel1 = lv_obj_create(parent); 788 lv_obj_set_size(panel1, lv_pct(100), LV_SIZE_CONTENT); 789 lv_obj_set_style_pad_bottom(panel1, 30, 0); 790 791 lv_obj_t * title = lv_label_create(panel1); 792 lv_label_set_text(title, "Monthly Summary"); 793 lv_obj_add_style(title, &style_title, 0); 794 795 lv_obj_t * date = lv_label_create(panel1); 796 lv_label_set_text(date, "8-15 July, 2021"); 797 lv_obj_add_style(date, &style_text_muted, 0); 798 799 lv_obj_t * amount = lv_label_create(panel1); 800 lv_label_set_text(amount, "$27,123.25"); 801 lv_obj_add_style(amount, &style_title, 0); 802 803 lv_obj_t * hint = lv_label_create(panel1); 804 lv_label_set_text(hint, LV_SYMBOL_UP" 17% growth this week"); 805 lv_obj_set_style_text_color(hint, lv_palette_main(LV_PALETTE_GREEN), 0); 806 807 chart3 = lv_chart_create(panel1); 808 lv_chart_set_axis_tick(chart3, LV_CHART_AXIS_PRIMARY_Y, 0, 0, 6, 1, true, 80); 809 lv_chart_set_axis_tick(chart3, LV_CHART_AXIS_PRIMARY_X, 0, 0, 7, 1, true, 50); 810 lv_chart_set_type(chart3, LV_CHART_TYPE_BAR); 811 lv_chart_set_div_line_count(chart3, 6, 0); 812 lv_chart_set_point_count(chart3, 7); 813 lv_obj_add_event_cb(chart3, shop_chart_event_cb, LV_EVENT_ALL, NULL); 814 815 ser4 = lv_chart_add_series(chart3, lv_theme_get_color_primary(chart3), LV_CHART_AXIS_PRIMARY_Y); 816 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 817 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 818 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 819 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 820 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 821 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 822 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 823 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 824 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 825 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 826 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 827 lv_chart_set_next_value(chart3, ser4, lv_rand(60, 90)); 828 829 if(disp_size == DISP_LARGE) { 830 static lv_coord_t grid1_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 831 static lv_coord_t grid1_row_dsc[] = { 832 LV_GRID_CONTENT, /*Title*/ 833 LV_GRID_CONTENT, /*Sub title*/ 834 20, /*Spacer*/ 835 LV_GRID_CONTENT, /*Amount*/ 836 LV_GRID_CONTENT, /*Hint*/ 837 LV_GRID_TEMPLATE_LAST 838 }; 839 840 lv_obj_set_size(chart3, lv_pct(100), lv_pct(100)); 841 lv_obj_set_style_pad_column(chart3, LV_DPX(30), 0); 842 843 844 lv_obj_set_grid_dsc_array(panel1, grid1_col_dsc, grid1_row_dsc); 845 lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 1); 846 lv_obj_set_grid_cell(date, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 1); 847 lv_obj_set_grid_cell(amount, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 3, 1); 848 lv_obj_set_grid_cell(hint, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 4, 1); 849 lv_obj_set_grid_cell(chart3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 0, 5); 850 } 851 else if(disp_size == DISP_MEDIUM) { 852 static lv_coord_t grid1_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 853 static lv_coord_t grid1_row_dsc[] = { 854 LV_GRID_CONTENT, /*Title + Date*/ 855 LV_GRID_CONTENT, /*Amount + Hint*/ 856 200, /*Chart*/ 857 LV_GRID_TEMPLATE_LAST 858 }; 859 860 lv_obj_update_layout(panel1); 861 lv_obj_set_width(chart3, lv_obj_get_content_width(panel1) - 20); 862 lv_obj_set_style_pad_column(chart3, LV_DPX(30), 0); 863 864 lv_obj_set_grid_dsc_array(panel1, grid1_col_dsc, grid1_row_dsc); 865 lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); 866 lv_obj_set_grid_cell(date, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); 867 lv_obj_set_grid_cell(amount, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 1, 1); 868 lv_obj_set_grid_cell(hint, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1); 869 lv_obj_set_grid_cell(chart3, LV_GRID_ALIGN_END, 0, 2, LV_GRID_ALIGN_STRETCH, 2, 1); 870 } 871 else if(disp_size == DISP_SMALL) { 872 static lv_coord_t grid1_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 873 static lv_coord_t grid1_row_dsc[] = { 874 LV_GRID_CONTENT, /*Title*/ 875 LV_GRID_CONTENT, /*Date*/ 876 LV_GRID_CONTENT, /*Amount*/ 877 LV_GRID_CONTENT, /*Hint*/ 878 LV_GRID_CONTENT, /*Chart*/ 879 LV_GRID_TEMPLATE_LAST 880 }; 881 882 lv_obj_set_width(chart3, LV_PCT(95)); 883 lv_obj_set_height(chart3, LV_VER_RES - 70); 884 lv_obj_set_style_max_height(chart3, 300, 0); 885 lv_chart_set_zoom_x(chart3, 512); 886 887 lv_obj_set_grid_dsc_array(panel1, grid1_col_dsc, grid1_row_dsc); 888 lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 1); 889 lv_obj_set_grid_cell(date, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 1); 890 lv_obj_set_grid_cell(amount, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 891 lv_obj_set_grid_cell(hint, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 3, 1); 892 lv_obj_set_grid_cell(chart3, LV_GRID_ALIGN_END, 0, 1, LV_GRID_ALIGN_START, 4, 1); 893 } 894 895 lv_obj_t * list = lv_obj_create(parent); 896 if(disp_size == DISP_SMALL) { 897 lv_obj_add_flag(list, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 898 lv_obj_set_height(list, LV_PCT(100)); 899 } 900 else { 901 lv_obj_set_height(list, LV_PCT(100)); 902 lv_obj_set_style_max_height(list, 300, 0); 903 } 904 905 lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN); 906 lv_obj_set_flex_grow(list, 1); 907 lv_obj_add_flag(list, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 908 909 title = lv_label_create(list); 910 lv_label_set_text(title, "Top products"); 911 lv_obj_add_style(title, &style_title, 0); 912 913 LV_IMG_DECLARE(img_clothes); 914 create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$722"); 915 create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$411"); 916 create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$917"); 917 create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$64"); 918 create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$805"); 919 920 lv_obj_t * notifications = lv_obj_create(parent); 921 if(disp_size == DISP_SMALL) { 922 lv_obj_add_flag(notifications, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); 923 lv_obj_set_height(notifications, LV_PCT(100)); 924 } 925 else { 926 lv_obj_set_height(notifications, LV_PCT(100)); 927 lv_obj_set_style_max_height(notifications, 300, 0); 928 } 929 930 lv_obj_set_flex_flow(notifications, LV_FLEX_FLOW_COLUMN); 931 lv_obj_set_flex_grow(notifications, 1); 932 933 title = lv_label_create(notifications); 934 lv_label_set_text(title, "Notification"); 935 lv_obj_add_style(title, &style_title, 0); 936 937 lv_obj_t * cb; 938 cb = lv_checkbox_create(notifications); 939 lv_checkbox_set_text(cb, "Item purchased"); 940 941 cb = lv_checkbox_create(notifications); 942 lv_checkbox_set_text(cb, "New connection"); 943 944 cb = lv_checkbox_create(notifications); 945 lv_checkbox_set_text(cb, "New subscriber"); 946 lv_obj_add_state(cb, LV_STATE_CHECKED); 947 948 cb = lv_checkbox_create(notifications); 949 lv_checkbox_set_text(cb, "New message"); 950 lv_obj_add_state(cb, LV_STATE_DISABLED); 951 952 cb = lv_checkbox_create(notifications); 953 lv_checkbox_set_text(cb, "Milestone reached"); 954 lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED); 955 956 cb = lv_checkbox_create(notifications); 957 lv_checkbox_set_text(cb, "Out of stock"); 958 959 960 } 961 962 static void color_changer_create(lv_obj_t * parent) 963 { 964 static lv_palette_t palette[] = { 965 LV_PALETTE_BLUE, LV_PALETTE_GREEN, LV_PALETTE_BLUE_GREY, LV_PALETTE_ORANGE, 966 LV_PALETTE_RED, LV_PALETTE_PURPLE, LV_PALETTE_TEAL, _LV_PALETTE_LAST 967 }; 968 969 lv_obj_t * color_cont = lv_obj_create(parent); 970 lv_obj_remove_style_all(color_cont); 971 lv_obj_set_flex_flow(color_cont, LV_FLEX_FLOW_ROW); 972 lv_obj_set_flex_align(color_cont, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); 973 lv_obj_add_flag(color_cont, LV_OBJ_FLAG_FLOATING); 974 975 lv_obj_set_style_bg_color(color_cont, lv_color_white(), 0); 976 lv_obj_set_style_pad_right(color_cont, disp_size == DISP_SMALL ? LV_DPX(47) : LV_DPX(55), 0); 977 lv_obj_set_style_bg_opa(color_cont, LV_OPA_COVER, 0); 978 lv_obj_set_style_radius(color_cont, LV_RADIUS_CIRCLE, 0); 979 980 if(disp_size == DISP_SMALL) lv_obj_set_size(color_cont, LV_DPX(52), LV_DPX(52)); 981 else lv_obj_set_size(color_cont, LV_DPX(60), LV_DPX(60)); 982 983 lv_obj_align(color_cont, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10)); 984 985 uint32_t i; 986 for(i = 0; palette[i] != _LV_PALETTE_LAST; i++) { 987 lv_obj_t * c = lv_btn_create(color_cont); 988 lv_obj_set_style_bg_color(c, lv_palette_main(palette[i]), 0); 989 lv_obj_set_style_radius(c, LV_RADIUS_CIRCLE, 0); 990 lv_obj_set_style_opa(c, LV_OPA_TRANSP, 0); 991 lv_obj_set_size(c, 20, 20); 992 lv_obj_add_event_cb(c, color_event_cb, LV_EVENT_ALL, &palette[i]); 993 lv_obj_clear_flag(c, LV_OBJ_FLAG_SCROLL_ON_FOCUS); 994 } 995 996 lv_obj_t * btn = lv_btn_create(parent); 997 lv_obj_add_flag(btn, LV_OBJ_FLAG_FLOATING | LV_OBJ_FLAG_CLICKABLE); 998 lv_obj_set_style_bg_color(btn, lv_color_white(), LV_STATE_CHECKED); 999 lv_obj_set_style_pad_all(btn, 10, 0); 1000 lv_obj_set_style_radius(btn, LV_RADIUS_CIRCLE, 0); 1001 lv_obj_add_event_cb(btn, color_changer_event_cb, LV_EVENT_ALL, color_cont); 1002 lv_obj_set_style_shadow_width(btn, 0, 0); 1003 lv_obj_set_style_bg_img_src(btn, LV_SYMBOL_TINT, 0); 1004 1005 if(disp_size == DISP_SMALL) { 1006 lv_obj_set_size(btn, LV_DPX(42), LV_DPX(42)); 1007 lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15)); 1008 } 1009 else { 1010 lv_obj_set_size(btn, LV_DPX(50), LV_DPX(50)); 1011 lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15)); 1012 } 1013 } 1014 1015 static void color_changer_anim_cb(void * var, int32_t v) 1016 { 1017 lv_obj_t * obj = var; 1018 lv_coord_t max_w = lv_obj_get_width(lv_obj_get_parent(obj)) - LV_DPX(20); 1019 lv_coord_t w; 1020 1021 if(disp_size == DISP_SMALL) { 1022 w = lv_map(v, 0, 256, LV_DPX(52), max_w); 1023 lv_obj_set_width(obj, w); 1024 lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10)); 1025 } 1026 else { 1027 w = lv_map(v, 0, 256, LV_DPX(60), max_w); 1028 lv_obj_set_width(obj, w); 1029 lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10)); 1030 } 1031 1032 if(v > LV_OPA_COVER) v = LV_OPA_COVER; 1033 1034 uint32_t i; 1035 for(i = 0; i < lv_obj_get_child_cnt(obj); i++) { 1036 lv_obj_set_style_opa(lv_obj_get_child(obj, i), v, 0); 1037 } 1038 1039 } 1040 1041 static void color_changer_event_cb(lv_event_t * e) 1042 { 1043 if(lv_event_get_code(e) == LV_EVENT_CLICKED) { 1044 lv_obj_t * color_cont = lv_event_get_user_data(e); 1045 if(lv_obj_get_width(color_cont) < LV_HOR_RES / 2) { 1046 lv_anim_t a; 1047 lv_anim_init(&a); 1048 lv_anim_set_var(&a, color_cont); 1049 lv_anim_set_exec_cb(&a, color_changer_anim_cb); 1050 lv_anim_set_values(&a, 0, 256); 1051 lv_anim_set_time(&a, 200); 1052 lv_anim_start(&a); 1053 } 1054 else { 1055 lv_anim_t a; 1056 lv_anim_init(&a); 1057 lv_anim_set_var(&a, color_cont); 1058 lv_anim_set_exec_cb(&a, color_changer_anim_cb); 1059 lv_anim_set_values(&a, 256, 0); 1060 lv_anim_set_time(&a, 200); 1061 lv_anim_start(&a); 1062 } 1063 } 1064 } 1065 static void color_event_cb(lv_event_t * e) 1066 { 1067 lv_event_code_t code = lv_event_get_code(e); 1068 lv_obj_t * obj = lv_event_get_target(e); 1069 1070 if(code == LV_EVENT_FOCUSED) { 1071 lv_obj_t * color_cont = lv_obj_get_parent(obj); 1072 if(lv_obj_get_width(color_cont) < LV_HOR_RES / 2) { 1073 lv_anim_t a; 1074 lv_anim_init(&a); 1075 lv_anim_set_var(&a, color_cont); 1076 lv_anim_set_exec_cb(&a, color_changer_anim_cb); 1077 lv_anim_set_values(&a, 0, 256); 1078 lv_anim_set_time(&a, 200); 1079 lv_anim_start(&a); 1080 } 1081 } 1082 else if(code == LV_EVENT_CLICKED) { 1083 lv_palette_t * palette_primary = lv_event_get_user_data(e); 1084 lv_palette_t palette_secondary = (*palette_primary) + 3; /*Use another palette as secondary*/ 1085 if(palette_secondary >= _LV_PALETTE_LAST) palette_secondary = 0; 1086 1087 lv_theme_default_init(NULL, lv_palette_main(*palette_primary), lv_palette_main(palette_secondary), 1088 LV_THEME_DEFAULT_DARK, font_normal); 1089 1090 lv_color_t color = lv_palette_main(*palette_primary); 1091 lv_style_set_text_color(&style_icon, color); 1092 lv_chart_set_series_color(chart1, ser1, color); 1093 lv_chart_set_series_color(chart2, ser3, color); 1094 } 1095 } 1096 1097 static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2, 1098 const char * text3) 1099 { 1100 lv_obj_t * cont = lv_obj_create(parent); 1101 lv_obj_set_height(cont, LV_SIZE_CONTENT); 1102 lv_obj_set_flex_grow(cont, 1); 1103 1104 lv_obj_t * title_label = lv_label_create(cont); 1105 lv_label_set_text(title_label, title); 1106 lv_obj_add_style(title_label, &style_title, 0); 1107 1108 lv_obj_t * meter = lv_meter_create(cont); 1109 lv_obj_remove_style(meter, NULL, LV_PART_MAIN); 1110 lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR); 1111 lv_obj_set_width(meter, LV_PCT(100)); 1112 1113 lv_obj_t * bullet1 = lv_obj_create(cont); 1114 lv_obj_set_size(bullet1, 13, 13); 1115 lv_obj_remove_style(bullet1, NULL, LV_PART_SCROLLBAR); 1116 lv_obj_add_style(bullet1, &style_bullet, 0); 1117 lv_obj_set_style_bg_color(bullet1, lv_palette_main(LV_PALETTE_RED), 0); 1118 lv_obj_t * label1 = lv_label_create(cont); 1119 lv_label_set_text(label1, text1); 1120 1121 lv_obj_t * bullet2 = lv_obj_create(cont); 1122 lv_obj_set_size(bullet2, 13, 13); 1123 lv_obj_remove_style(bullet2, NULL, LV_PART_SCROLLBAR); 1124 lv_obj_add_style(bullet2, &style_bullet, 0); 1125 lv_obj_set_style_bg_color(bullet2, lv_palette_main(LV_PALETTE_BLUE), 0); 1126 lv_obj_t * label2 = lv_label_create(cont); 1127 lv_label_set_text(label2, text2); 1128 1129 lv_obj_t * bullet3 = lv_obj_create(cont); 1130 lv_obj_set_size(bullet3, 13, 13); 1131 lv_obj_remove_style(bullet3, NULL, LV_PART_SCROLLBAR); 1132 lv_obj_add_style(bullet3, &style_bullet, 0); 1133 lv_obj_set_style_bg_color(bullet3, lv_palette_main(LV_PALETTE_GREEN), 0); 1134 lv_obj_t * label3 = lv_label_create(cont); 1135 lv_label_set_text(label3, text3); 1136 1137 if(disp_size == DISP_MEDIUM) { 1138 static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_FR(8), LV_GRID_TEMPLATE_LAST}; 1139 static lv_coord_t grid_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 1140 1141 lv_obj_set_grid_dsc_array(cont, grid_col_dsc, grid_row_dsc); 1142 lv_obj_set_grid_cell(title_label, LV_GRID_ALIGN_START, 0, 4, LV_GRID_ALIGN_START, 0, 1); 1143 lv_obj_set_grid_cell(meter, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 3); 1144 lv_obj_set_grid_cell(bullet1, LV_GRID_ALIGN_START, 2, 1, LV_GRID_ALIGN_CENTER, 2, 1); 1145 lv_obj_set_grid_cell(bullet2, LV_GRID_ALIGN_START, 2, 1, LV_GRID_ALIGN_CENTER, 3, 1); 1146 lv_obj_set_grid_cell(bullet3, LV_GRID_ALIGN_START, 2, 1, LV_GRID_ALIGN_CENTER, 4, 1); 1147 lv_obj_set_grid_cell(label1, LV_GRID_ALIGN_STRETCH, 3, 1, LV_GRID_ALIGN_CENTER, 2, 1); 1148 lv_obj_set_grid_cell(label2, LV_GRID_ALIGN_STRETCH, 3, 1, LV_GRID_ALIGN_CENTER, 3, 1); 1149 lv_obj_set_grid_cell(label3, LV_GRID_ALIGN_STRETCH, 3, 1, LV_GRID_ALIGN_CENTER, 4, 1); 1150 } 1151 else { 1152 static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 1153 static lv_coord_t grid_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; 1154 lv_obj_set_grid_dsc_array(cont, grid_col_dsc, grid_row_dsc); 1155 lv_obj_set_grid_cell(title_label, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 0, 1); 1156 lv_obj_set_grid_cell(meter, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_START, 1, 1); 1157 lv_obj_set_grid_cell(bullet1, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 2, 1); 1158 lv_obj_set_grid_cell(bullet2, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 3, 1); 1159 lv_obj_set_grid_cell(bullet3, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 4, 1); 1160 lv_obj_set_grid_cell(label1, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 2, 1); 1161 lv_obj_set_grid_cell(label2, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 3, 1); 1162 lv_obj_set_grid_cell(label3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 4, 1); 1163 } 1164 1165 1166 return meter; 1167 1168 } 1169 1170 static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category, 1171 const char * price) 1172 { 1173 static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, 5, LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 1174 static lv_coord_t grid_row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; 1175 1176 lv_obj_t * cont = lv_obj_create(parent); 1177 lv_obj_remove_style_all(cont); 1178 lv_obj_set_size(cont, LV_PCT(100), LV_SIZE_CONTENT); 1179 lv_obj_set_grid_dsc_array(cont, grid_col_dsc, grid_row_dsc); 1180 1181 lv_obj_t * img = lv_img_create(cont); 1182 lv_img_set_src(img, img_src); 1183 lv_obj_set_grid_cell(img, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 2); 1184 1185 lv_obj_t * label; 1186 label = lv_label_create(cont); 1187 lv_label_set_text(label, name); 1188 lv_obj_set_grid_cell(label, LV_GRID_ALIGN_START, 2, 1, LV_GRID_ALIGN_END, 0, 1); 1189 1190 label = lv_label_create(cont); 1191 lv_label_set_text(label, category); 1192 lv_obj_add_style(label, &style_text_muted, 0); 1193 lv_obj_set_grid_cell(label, LV_GRID_ALIGN_START, 2, 1, LV_GRID_ALIGN_START, 1, 1); 1194 1195 label = lv_label_create(cont); 1196 lv_label_set_text(label, price); 1197 lv_obj_set_grid_cell(label, LV_GRID_ALIGN_END, 3, 1, LV_GRID_ALIGN_END, 0, 1); 1198 1199 return cont; 1200 } 1201 1202 static void ta_event_cb(lv_event_t * e) 1203 { 1204 lv_event_code_t code = lv_event_get_code(e); 1205 lv_obj_t * ta = lv_event_get_target(e); 1206 lv_obj_t * kb = lv_event_get_user_data(e); 1207 if(code == LV_EVENT_FOCUSED) { 1208 if(lv_indev_get_type(lv_indev_get_act()) != LV_INDEV_TYPE_KEYPAD) { 1209 lv_keyboard_set_textarea(kb, ta); 1210 lv_obj_set_style_max_height(kb, LV_HOR_RES * 2 / 3, 0); 1211 lv_obj_update_layout(tv); /*Be sure the sizes are recalculated*/ 1212 lv_obj_set_height(tv, LV_VER_RES - lv_obj_get_height(kb)); 1213 lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); 1214 lv_obj_scroll_to_view_recursive(ta, LV_ANIM_OFF); 1215 } 1216 } 1217 else if(code == LV_EVENT_DEFOCUSED) { 1218 lv_keyboard_set_textarea(kb, NULL); 1219 lv_obj_set_height(tv, LV_VER_RES); 1220 lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); 1221 lv_indev_reset(NULL, ta); 1222 1223 } 1224 else if(code == LV_EVENT_READY || code == LV_EVENT_CANCEL) { 1225 lv_obj_set_height(tv, LV_VER_RES); 1226 lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); 1227 lv_obj_clear_state(ta, LV_STATE_FOCUSED); 1228 lv_indev_reset(NULL, ta); /*To forget the last clicked object to make it focusable again*/ 1229 } 1230 } 1231 1232 static void birthday_event_cb(lv_event_t * e) 1233 { 1234 lv_event_code_t code = lv_event_get_code(e); 1235 lv_obj_t * ta = lv_event_get_target(e); 1236 1237 if(code == LV_EVENT_FOCUSED) { 1238 if(lv_indev_get_type(lv_indev_get_act()) == LV_INDEV_TYPE_POINTER) { 1239 if(calendar == NULL) { 1240 lv_obj_add_flag(lv_layer_top(), LV_OBJ_FLAG_CLICKABLE); 1241 calendar = lv_calendar_create(lv_layer_top()); 1242 lv_obj_set_style_bg_opa(lv_layer_top(), LV_OPA_50, 0); 1243 lv_obj_set_style_bg_color(lv_layer_top(), lv_palette_main(LV_PALETTE_GREY), 0); 1244 if(disp_size == DISP_SMALL) lv_obj_set_size(calendar, 180, 200); 1245 else if(disp_size == DISP_MEDIUM) lv_obj_set_size(calendar, 200, 220); 1246 else lv_obj_set_size(calendar, 300, 330); 1247 lv_calendar_set_showed_date(calendar, 1990, 01); 1248 lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 30); 1249 lv_obj_add_event_cb(calendar, calendar_event_cb, LV_EVENT_ALL, ta); 1250 1251 lv_calendar_header_dropdown_create(calendar); 1252 } 1253 } 1254 } 1255 } 1256 1257 static void calendar_event_cb(lv_event_t * e) 1258 { 1259 lv_event_code_t code = lv_event_get_code(e); 1260 lv_obj_t * ta = lv_event_get_user_data(e); 1261 lv_obj_t * obj = lv_event_get_current_target(e); 1262 if(code == LV_EVENT_VALUE_CHANGED) { 1263 lv_calendar_date_t d; 1264 lv_calendar_get_pressed_date(obj, &d); 1265 char buf[32]; 1266 lv_snprintf(buf, sizeof(buf), "%02d.%02d.%d", d.day, d.month, d.year); 1267 lv_textarea_set_text(ta, buf); 1268 1269 lv_obj_del(calendar); 1270 calendar = NULL; 1271 lv_obj_clear_flag(lv_layer_top(), LV_OBJ_FLAG_CLICKABLE); 1272 lv_obj_set_style_bg_opa(lv_layer_top(), LV_OPA_TRANSP, 0); 1273 } 1274 } 1275 1276 static void slider_event_cb(lv_event_t * e) 1277 { 1278 lv_event_code_t code = lv_event_get_code(e); 1279 lv_obj_t * obj = lv_event_get_target(e); 1280 1281 if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { 1282 lv_coord_t * s = lv_event_get_param(e); 1283 *s = LV_MAX(*s, 60); 1284 } 1285 else if(code == LV_EVENT_DRAW_PART_END) { 1286 lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); 1287 if(dsc->part == LV_PART_KNOB && lv_obj_has_state(obj, LV_STATE_PRESSED)) { 1288 char buf[8]; 1289 lv_snprintf(buf, sizeof(buf), "%"LV_PRId32, lv_slider_get_value(obj)); 1290 1291 lv_point_t text_size; 1292 lv_txt_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); 1293 1294 lv_area_t txt_area; 1295 txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - text_size.x / 2; 1296 txt_area.x2 = txt_area.x1 + text_size.x; 1297 txt_area.y2 = dsc->draw_area->y1 - 10; 1298 txt_area.y1 = txt_area.y2 - text_size.y; 1299 1300 lv_area_t bg_area; 1301 bg_area.x1 = txt_area.x1 - LV_DPX(8); 1302 bg_area.x2 = txt_area.x2 + LV_DPX(8); 1303 bg_area.y1 = txt_area.y1 - LV_DPX(8); 1304 bg_area.y2 = txt_area.y2 + LV_DPX(8); 1305 1306 lv_draw_rect_dsc_t rect_dsc; 1307 lv_draw_rect_dsc_init(&rect_dsc); 1308 rect_dsc.bg_color = lv_palette_darken(LV_PALETTE_GREY, 3); 1309 rect_dsc.radius = LV_DPX(5); 1310 lv_draw_rect(dsc->draw_ctx, &rect_dsc, &bg_area); 1311 1312 lv_draw_label_dsc_t label_dsc; 1313 lv_draw_label_dsc_init(&label_dsc); 1314 label_dsc.color = lv_color_white(); 1315 label_dsc.font = font_normal; 1316 lv_draw_label(dsc->draw_ctx, &label_dsc, &txt_area, buf, NULL); 1317 } 1318 } 1319 } 1320 1321 static void chart_event_cb(lv_event_t * e) 1322 { 1323 lv_event_code_t code = lv_event_get_code(e); 1324 lv_obj_t * obj = lv_event_get_target(e); 1325 1326 if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { 1327 lv_obj_invalidate(obj); /*To make the value boxes visible*/ 1328 } 1329 else if(code == LV_EVENT_DRAW_PART_BEGIN) { 1330 lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); 1331 /*Set the markers' text*/ 1332 if(dsc->part == LV_PART_TICKS && dsc->id == LV_CHART_AXIS_PRIMARY_X) { 1333 if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) { 1334 const char * month[] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"}; 1335 lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]); 1336 } 1337 else { 1338 const char * month[] = {"Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"}; 1339 lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]); 1340 } 1341 } 1342 1343 /*Add the faded area before the lines are drawn */ 1344 else if(dsc->part == LV_PART_ITEMS) { 1345 #if LV_DRAW_COMPLEX 1346 /*Add a line mask that keeps the area below the line*/ 1347 if(dsc->p1 && dsc->p2) { 1348 lv_draw_mask_line_param_t line_mask_param; 1349 lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y, 1350 LV_DRAW_MASK_LINE_SIDE_BOTTOM); 1351 int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL); 1352 1353 /*Add a fade effect: transparent bottom covering top*/ 1354 lv_coord_t h = lv_obj_get_height(obj); 1355 lv_draw_mask_fade_param_t fade_mask_param; 1356 lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP, 1357 obj->coords.y2); 1358 int16_t fade_mask_id = lv_draw_mask_add(&fade_mask_param, NULL); 1359 1360 /*Draw a rectangle that will be affected by the mask*/ 1361 lv_draw_rect_dsc_t draw_rect_dsc; 1362 lv_draw_rect_dsc_init(&draw_rect_dsc); 1363 draw_rect_dsc.bg_opa = LV_OPA_50; 1364 draw_rect_dsc.bg_color = dsc->line_dsc->color; 1365 1366 lv_area_t obj_clip_area; 1367 _lv_area_intersect(&obj_clip_area, dsc->draw_ctx->clip_area, &obj->coords); 1368 const lv_area_t * clip_area_ori = dsc->draw_ctx->clip_area; 1369 dsc->draw_ctx->clip_area = &obj_clip_area; 1370 lv_area_t a; 1371 a.x1 = dsc->p1->x; 1372 a.x2 = dsc->p2->x - 1; 1373 a.y1 = LV_MIN(dsc->p1->y, dsc->p2->y); 1374 a.y2 = obj->coords.y2; 1375 lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); 1376 dsc->draw_ctx->clip_area = clip_area_ori; 1377 /*Remove the masks*/ 1378 lv_draw_mask_remove_id(line_mask_id); 1379 lv_draw_mask_remove_id(fade_mask_id); 1380 } 1381 #endif 1382 1383 1384 const lv_chart_series_t * ser = dsc->sub_part_ptr; 1385 1386 if(lv_chart_get_pressed_point(obj) == dsc->id) { 1387 if(lv_chart_get_type(obj) == LV_CHART_TYPE_LINE) { 1388 dsc->rect_dsc->outline_color = lv_color_white(); 1389 dsc->rect_dsc->outline_width = 2; 1390 } 1391 else { 1392 dsc->rect_dsc->shadow_color = ser->color; 1393 dsc->rect_dsc->shadow_width = 15; 1394 dsc->rect_dsc->shadow_spread = 0; 1395 } 1396 1397 char buf[8]; 1398 lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, dsc->value); 1399 1400 lv_point_t text_size; 1401 lv_txt_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); 1402 1403 lv_area_t txt_area; 1404 if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) { 1405 txt_area.y2 = dsc->draw_area->y1 - LV_DPX(15); 1406 txt_area.y1 = txt_area.y2 - text_size.y; 1407 if(ser == lv_chart_get_series_next(obj, NULL)) { 1408 txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2; 1409 txt_area.x2 = txt_area.x1 + text_size.x; 1410 } 1411 else { 1412 txt_area.x2 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2; 1413 txt_area.x1 = txt_area.x2 - text_size.x; 1414 } 1415 } 1416 else { 1417 txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - text_size.x / 2; 1418 txt_area.x2 = txt_area.x1 + text_size.x; 1419 txt_area.y2 = dsc->draw_area->y1 - LV_DPX(15); 1420 txt_area.y1 = txt_area.y2 - text_size.y; 1421 } 1422 1423 lv_area_t bg_area; 1424 bg_area.x1 = txt_area.x1 - LV_DPX(8); 1425 bg_area.x2 = txt_area.x2 + LV_DPX(8); 1426 bg_area.y1 = txt_area.y1 - LV_DPX(8); 1427 bg_area.y2 = txt_area.y2 + LV_DPX(8); 1428 1429 lv_draw_rect_dsc_t rect_dsc; 1430 lv_draw_rect_dsc_init(&rect_dsc); 1431 rect_dsc.bg_color = ser->color; 1432 rect_dsc.radius = LV_DPX(5); 1433 lv_draw_rect(dsc->draw_ctx, &rect_dsc, &bg_area); 1434 1435 lv_draw_label_dsc_t label_dsc; 1436 lv_draw_label_dsc_init(&label_dsc); 1437 label_dsc.color = lv_color_white(); 1438 label_dsc.font = font_normal; 1439 lv_draw_label(dsc->draw_ctx, &label_dsc, &txt_area, buf, NULL); 1440 } 1441 else { 1442 dsc->rect_dsc->outline_width = 0; 1443 dsc->rect_dsc->shadow_width = 0; 1444 } 1445 } 1446 } 1447 } 1448 1449 1450 static void shop_chart_event_cb(lv_event_t * e) 1451 { 1452 lv_event_code_t code = lv_event_get_code(e); 1453 if(code == LV_EVENT_DRAW_PART_BEGIN) { 1454 lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); 1455 /*Set the markers' text*/ 1456 if(dsc->part == LV_PART_TICKS && dsc->id == LV_CHART_AXIS_PRIMARY_X) { 1457 const char * month[] = {"Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"}; 1458 lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]); 1459 } 1460 if(dsc->part == LV_PART_ITEMS) { 1461 dsc->rect_dsc->bg_opa = LV_OPA_TRANSP; /*We will draw it later*/ 1462 } 1463 } 1464 if(code == LV_EVENT_DRAW_PART_END) { 1465 lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); 1466 /*Add the faded area before the lines are drawn */ 1467 if(dsc->part == LV_PART_ITEMS) { 1468 static const uint32_t devices[10] = {32, 43, 21, 56, 29, 36, 19, 25, 62, 35}; 1469 static const uint32_t clothes[10] = {12, 19, 23, 31, 27, 32, 32, 11, 21, 32}; 1470 static const uint32_t services[10] = {56, 38, 56, 13, 44, 32, 49, 64, 17, 33}; 1471 1472 lv_draw_rect_dsc_t draw_rect_dsc; 1473 lv_draw_rect_dsc_init(&draw_rect_dsc); 1474 1475 lv_coord_t h = lv_area_get_height(dsc->draw_area); 1476 1477 lv_area_t a; 1478 a.x1 = dsc->draw_area->x1; 1479 a.x2 = dsc->draw_area->x2; 1480 1481 a.y1 = dsc->draw_area->y1; 1482 a.y2 = a.y1 + 4 + (devices[dsc->id] * h) / 100; /*+4 to overlap the radius*/ 1483 draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_RED); 1484 draw_rect_dsc.radius = 4; 1485 lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); 1486 1487 a.y1 = a.y2 - 4; /*-4 to overlap the radius*/ 1488 a.y2 = a.y1 + (clothes[dsc->id] * h) / 100; 1489 draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_BLUE); 1490 draw_rect_dsc.radius = 0; 1491 lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); 1492 1493 a.y1 = a.y2; 1494 a.y2 = a.y1 + (services[dsc->id] * h) / 100; 1495 draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_GREEN); 1496 lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); 1497 } 1498 } 1499 } 1500 1501 1502 static void meter1_indic1_anim_cb(void * var, int32_t v) 1503 { 1504 lv_meter_set_indicator_end_value(meter1, var, v); 1505 1506 lv_obj_t * card = lv_obj_get_parent(meter1); 1507 lv_obj_t * label = lv_obj_get_child(card, -5); 1508 lv_label_set_text_fmt(label, "Revenue: %"LV_PRId32" %%", v); 1509 } 1510 1511 static void meter1_indic2_anim_cb(void * var, int32_t v) 1512 { 1513 lv_meter_set_indicator_end_value(meter1, var, v); 1514 1515 lv_obj_t * card = lv_obj_get_parent(meter1); 1516 lv_obj_t * label = lv_obj_get_child(card, -3); 1517 lv_label_set_text_fmt(label, "Sales: %"LV_PRId32" %%", v); 1518 1519 } 1520 1521 static void meter1_indic3_anim_cb(void * var, int32_t v) 1522 { 1523 lv_meter_set_indicator_end_value(meter1, var, v); 1524 1525 lv_obj_t * card = lv_obj_get_parent(meter1); 1526 lv_obj_t * label = lv_obj_get_child(card, -1); 1527 lv_label_set_text_fmt(label, "Costs: %"LV_PRId32" %%", v); 1528 } 1529 1530 static void meter2_timer_cb(lv_timer_t * timer) 1531 { 1532 lv_meter_indicator_t ** indics = timer->user_data; 1533 1534 static bool down1 = false; 1535 static bool down2 = false; 1536 static bool down3 = false; 1537 1538 1539 if(down1) { 1540 session_desktop -= 137; 1541 if(session_desktop < 1400) down1 = false; 1542 } 1543 else { 1544 session_desktop += 116; 1545 if(session_desktop > 4500) down1 = true; 1546 } 1547 1548 if(down2) { 1549 session_tablet -= 3; 1550 if(session_tablet < 1400) down2 = false; 1551 } 1552 else { 1553 session_tablet += 9; 1554 if(session_tablet > 4500) down2 = true; 1555 } 1556 1557 if(down3) { 1558 session_mobile -= 57; 1559 if(session_mobile < 1400) down3 = false; 1560 } 1561 else { 1562 session_mobile += 76; 1563 if(session_mobile > 4500) down3 = true; 1564 } 1565 1566 uint32_t all = session_desktop + session_tablet + session_mobile; 1567 uint32_t pct1 = (session_desktop * 97) / all; 1568 uint32_t pct2 = (session_tablet * 97) / all; 1569 1570 lv_meter_set_indicator_start_value(meter2, indics[0], 0); 1571 lv_meter_set_indicator_end_value(meter2, indics[0], pct1); 1572 1573 lv_meter_set_indicator_start_value(meter2, indics[1], pct1 + 1); 1574 lv_meter_set_indicator_end_value(meter2, indics[1], pct1 + 1 + pct2); 1575 1576 lv_meter_set_indicator_start_value(meter2, indics[2], pct1 + 1 + pct2 + 1); 1577 lv_meter_set_indicator_end_value(meter2, indics[2], 99); 1578 1579 lv_obj_t * card = lv_obj_get_parent(meter2); 1580 lv_obj_t * label; 1581 1582 label = lv_obj_get_child(card, -5); 1583 lv_label_set_text_fmt(label, "Desktop: %"LV_PRIu32, session_desktop); 1584 1585 label = lv_obj_get_child(card, -3); 1586 lv_label_set_text_fmt(label, "Tablet: %"LV_PRIu32, session_tablet); 1587 1588 label = lv_obj_get_child(card, -1); 1589 lv_label_set_text_fmt(label, "Mobile: %"LV_PRIu32, session_mobile); 1590 } 1591 1592 static void meter3_anim_cb(void * var, int32_t v) 1593 { 1594 lv_meter_set_indicator_value(meter3, var, v); 1595 1596 lv_obj_t * label = lv_obj_get_child(meter3, 0); 1597 lv_label_set_text_fmt(label, "%"LV_PRId32, v); 1598 } 1599 1600 #endif