1 /**
2  * @file lv_demo_music_list.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_demo_music_list.h"
10 #if LV_USE_DEMO_MUSIC
11 
12 #include "lv_demo_music_main.h"
13 
14 /*********************
15  *      DEFINES
16  *********************/
17 
18 /**********************
19  *      TYPEDEFS
20  **********************/
21 
22 /**********************
23  *  STATIC PROTOTYPES
24  **********************/
25 static lv_obj_t * add_list_button(lv_obj_t * parent, uint32_t track_id);
26 static void btn_click_event_cb(lv_event_t * e);
27 static void list_delete_event_cb(lv_event_t * e);
28 
29 /**********************
30  *  STATIC VARIABLES
31  **********************/
32 static lv_obj_t * list;
33 static const lv_font_t * font_small;
34 static const lv_font_t * font_medium;
35 static lv_style_t style_scrollbar;
36 static lv_style_t style_btn;
37 static lv_style_t style_button_pr;
38 static lv_style_t style_button_chk;
39 static lv_style_t style_button_dis;
40 static lv_style_t style_title;
41 static lv_style_t style_artist;
42 static lv_style_t style_time;
43 LV_IMAGE_DECLARE(img_lv_demo_music_btn_list_play);
44 LV_IMAGE_DECLARE(img_lv_demo_music_btn_list_pause);
45 
46 /**********************
47  *      MACROS
48  **********************/
49 
50 /**********************
51  *   GLOBAL FUNCTIONS
52  **********************/
53 
lv_demo_music_list_create(lv_obj_t * parent)54 lv_obj_t * lv_demo_music_list_create(lv_obj_t * parent)
55 {
56     font_small = LV_FONT_DEFAULT;
57     font_medium = LV_FONT_DEFAULT;
58 
59 #if LV_DEMO_MUSIC_LARGE
60 #if LV_FONT_MONTSERRAT_16
61     font_small = &lv_font_montserrat_16;
62 #else
63     LV_LOG_WARN("LV_FONT_MONTSERRAT_16 is not enabled for the music demo. Using LV_FONT_DEFAULT instead.");
64 #endif
65 #if LV_FONT_MONTSERRAT_22
66     font_medium = &lv_font_montserrat_22;
67 #else
68     LV_LOG_WARN("LV_FONT_MONTSERRAT_22 is not enabled for the music demo. Using LV_FONT_DEFAULT instead.");
69 #endif
70 #else
71 #if LV_FONT_MONTSERRAT_12
72     font_small = &lv_font_montserrat_12;
73 #else
74     LV_LOG_WARN("LV_FONT_MONTSERRAT_12 is not enabled for the music demo. Using LV_FONT_DEFAULT instead.");
75 #endif
76 #if LV_FONT_MONTSERRAT_16
77     font_medium = &lv_font_montserrat_16;
78 #else
79     LV_LOG_WARN("LV_FONT_MONTSERRAT_16 is not enabled for the music demo. Using LV_FONT_DEFAULT instead.");
80 #endif
81 #endif
82 
83     lv_style_init(&style_scrollbar);
84     lv_style_set_width(&style_scrollbar,  4);
85     lv_style_set_bg_opa(&style_scrollbar, LV_OPA_COVER);
86     lv_style_set_bg_color(&style_scrollbar, lv_color_hex3(0xeee));
87     lv_style_set_radius(&style_scrollbar, LV_RADIUS_CIRCLE);
88     lv_style_set_pad_right(&style_scrollbar, 4);
89 
90     static const int32_t grid_cols[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
91 #if LV_DEMO_MUSIC_LARGE
92     static const int32_t grid_rows[] = {35,  30, LV_GRID_TEMPLATE_LAST};
93 #else
94     static const int32_t grid_rows[] = {22,  17, LV_GRID_TEMPLATE_LAST};
95 #endif
96     lv_style_init(&style_btn);
97     lv_style_set_bg_opa(&style_btn, LV_OPA_TRANSP);
98     lv_style_set_grid_column_dsc_array(&style_btn, grid_cols);
99     lv_style_set_grid_row_dsc_array(&style_btn, grid_rows);
100     lv_style_set_grid_row_align(&style_btn, LV_GRID_ALIGN_CENTER);
101     lv_style_set_layout(&style_btn, LV_LAYOUT_GRID);
102 #if LV_DEMO_MUSIC_LARGE
103     lv_style_set_pad_right(&style_btn, 30);
104 #else
105     lv_style_set_pad_right(&style_btn, 20);
106 #endif
107     lv_style_init(&style_button_pr);
108     lv_style_set_bg_opa(&style_button_pr, LV_OPA_COVER);
109     lv_style_set_bg_color(&style_button_pr,  lv_color_hex(0x4c4965));
110 
111     lv_style_init(&style_button_chk);
112     lv_style_set_bg_opa(&style_button_chk, LV_OPA_COVER);
113     lv_style_set_bg_color(&style_button_chk, lv_color_hex(0x4c4965));
114 
115     lv_style_init(&style_button_dis);
116     lv_style_set_text_opa(&style_button_dis, LV_OPA_40);
117     lv_style_set_image_opa(&style_button_dis, LV_OPA_40);
118 
119     lv_style_init(&style_title);
120     lv_style_set_text_font(&style_title, font_medium);
121     lv_style_set_text_color(&style_title, lv_color_hex(0xffffff));
122 
123     lv_style_init(&style_artist);
124     lv_style_set_text_font(&style_artist, font_small);
125     lv_style_set_text_color(&style_artist, lv_color_hex(0xb1b0be));
126 
127     lv_style_init(&style_time);
128     lv_style_set_text_font(&style_time, font_medium);
129     lv_style_set_text_color(&style_time, lv_color_hex(0xffffff));
130 
131     /*Create an empty transparent container*/
132     list = lv_obj_create(parent);
133     lv_obj_add_event_cb(list, list_delete_event_cb, LV_EVENT_DELETE, NULL);
134     lv_obj_remove_style_all(list);
135     lv_obj_set_size(list, LV_HOR_RES, LV_VER_RES - LV_DEMO_MUSIC_HANDLE_SIZE);
136     lv_obj_set_y(list, LV_DEMO_MUSIC_HANDLE_SIZE);
137     lv_obj_add_style(list, &style_scrollbar, LV_PART_SCROLLBAR);
138     lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN);
139 
140     uint32_t track_id;
141     for(track_id = 0; lv_demo_music_get_title(track_id); track_id++) {
142         add_list_button(list,  track_id);
143     }
144 
145 #if LV_DEMO_MUSIC_ROUND
146     lv_obj_set_scroll_snap_y(list, LV_SCROLL_SNAP_CENTER);
147 #endif
148 
149     lv_demo_music_list_button_check(0, true);
150 
151     return list;
152 }
153 
lv_demo_music_list_button_check(uint32_t track_id,bool state)154 void lv_demo_music_list_button_check(uint32_t track_id, bool state)
155 {
156     lv_obj_t * btn = lv_obj_get_child(list, track_id);
157     lv_obj_t * icon = lv_obj_get_child(btn, 0);
158 
159     if(state) {
160         lv_obj_add_state(btn, LV_STATE_CHECKED);
161         lv_image_set_src(icon, &img_lv_demo_music_btn_list_pause);
162         lv_obj_scroll_to_view(btn, LV_ANIM_ON);
163     }
164     else {
165         lv_obj_remove_state(btn, LV_STATE_CHECKED);
166         lv_image_set_src(icon, &img_lv_demo_music_btn_list_play);
167     }
168 }
169 
170 /**********************
171  *   STATIC FUNCTIONS
172  **********************/
173 
add_list_button(lv_obj_t * parent,uint32_t track_id)174 static lv_obj_t * add_list_button(lv_obj_t * parent, uint32_t track_id)
175 {
176     uint32_t t = lv_demo_music_get_track_length(track_id);
177     char time[32];
178     lv_snprintf(time, sizeof(time), "%"LV_PRIu32":%02"LV_PRIu32, t / 60, t % 60);
179     const char * title = lv_demo_music_get_title(track_id);
180     const char * artist = lv_demo_music_get_artist(track_id);
181 
182     lv_obj_t * btn = lv_obj_create(parent);
183     lv_obj_remove_style_all(btn);
184 #if LV_DEMO_MUSIC_LARGE
185     lv_obj_set_size(btn, lv_pct(100), 110);
186 #else
187     lv_obj_set_size(btn, lv_pct(100), 60);
188 #endif
189 
190     lv_obj_add_style(btn, &style_btn, 0);
191     lv_obj_add_style(btn, &style_button_pr, LV_STATE_PRESSED);
192     lv_obj_add_style(btn, &style_button_chk, LV_STATE_CHECKED);
193     lv_obj_add_style(btn, &style_button_dis, LV_STATE_DISABLED);
194     lv_obj_add_event_cb(btn, btn_click_event_cb, LV_EVENT_CLICKED, NULL);
195 
196     if(track_id >= 3) {
197         lv_obj_add_state(btn, LV_STATE_DISABLED);
198     }
199 
200     lv_obj_t * icon = lv_image_create(btn);
201     lv_image_set_src(icon, &img_lv_demo_music_btn_list_play);
202     lv_obj_set_grid_cell(icon, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 0, 2);
203 
204     lv_obj_t * title_label = lv_label_create(btn);
205     lv_label_set_text(title_label, title);
206     lv_obj_set_grid_cell(title_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1);
207     lv_obj_add_style(title_label, &style_title, 0);
208 
209     lv_obj_t * artist_label = lv_label_create(btn);
210     lv_label_set_text(artist_label, artist);
211     lv_obj_add_style(artist_label, &style_artist, 0);
212     lv_obj_set_grid_cell(artist_label, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1);
213 
214     lv_obj_t * time_label = lv_label_create(btn);
215     lv_label_set_text(time_label, time);
216     lv_obj_add_style(time_label, &style_time, 0);
217     lv_obj_set_grid_cell(time_label, LV_GRID_ALIGN_END, 2, 1, LV_GRID_ALIGN_CENTER, 0, 2);
218 
219     LV_IMAGE_DECLARE(img_lv_demo_music_list_border);
220     lv_obj_t * border = lv_image_create(btn);
221     lv_image_set_src(border, &img_lv_demo_music_list_border);
222     lv_image_set_inner_align(border, LV_IMAGE_ALIGN_TILE);
223     lv_obj_set_width(border, lv_pct(120));
224     lv_obj_align(border, LV_ALIGN_BOTTOM_MID, 0, 0);
225     lv_obj_add_flag(border, LV_OBJ_FLAG_IGNORE_LAYOUT);
226 
227     return btn;
228 }
229 
btn_click_event_cb(lv_event_t * e)230 static void btn_click_event_cb(lv_event_t * e)
231 {
232     lv_obj_t * btn = lv_event_get_target(e);
233 
234     uint32_t idx = lv_obj_get_index(btn);
235 
236     lv_demo_music_play(idx);
237 }
238 
list_delete_event_cb(lv_event_t * e)239 static void list_delete_event_cb(lv_event_t * e)
240 {
241     lv_event_code_t code = lv_event_get_code(e);
242 
243     if(code == LV_EVENT_DELETE) {
244         lv_style_reset(&style_scrollbar);
245         lv_style_reset(&style_btn);
246         lv_style_reset(&style_button_pr);
247         lv_style_reset(&style_button_chk);
248         lv_style_reset(&style_button_dis);
249         lv_style_reset(&style_title);
250         lv_style_reset(&style_artist);
251         lv_style_reset(&style_time);
252     }
253 }
254 #endif /*LV_USE_DEMO_MUSIC*/
255