1 /**
2  * @file lv_demo_smartwatch_settings.c
3  * Settings screen layout & functions. Contains basic settings for smartwatch.
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_demo_smartwatch.h"
10 #if LV_USE_DEMO_SMARTWATCH
11 
12 #include "lv_demo_smartwatch_private.h"
13 #include "lv_demo_smartwatch_settings.h"
14 
15 /*********************
16  *      DEFINES
17  *********************/
18 
19 /**********************
20  *      TYPEDEFS
21  **********************/
22 
23 typedef enum {
24     ST_SLIDER,
25     ST_SWITCH,
26     ST_DROPDOWN,
27     ST_LABEL,
28     ST_MAX
29 } settings_type_t;
30 
31 /**********************
32  *  STATIC PROTOTYPES
33  **********************/
34 static void create_screen_settings(void);
35 static void settings_action_event_cb(lv_event_t * e);
36 static void settings_screen_event_cb(lv_event_t * e);
37 
38 /**********************
39  *  STATIC VARIABLES
40  **********************/
41 static lv_obj_t * settings_screen;
42 static lv_obj_t * settings_list;
43 
44 static lv_obj_t * brightness_slider;
45 static lv_obj_t * circular_switch;
46 static lv_obj_t * timeout_dropdown;
47 static lv_obj_t * rotation_dropdown;
48 static lv_obj_t * alerts_switch;
49 static lv_obj_t * about_label;
50 static lv_obj_t * scroll_mode;
51 static lv_obj_t * hint_switch;
52 static bool manual_trigger;
53 
54 static lv_smartwatch_settings_change_cb_t settings_change_cb;
55 
56 /**********************
57  *      MACROS
58  **********************/
59 
60 /**********************
61  *   GLOBAL FUNCTIONS
62  **********************/
63 
lv_demo_smartwatch_settings_create(void)64 void lv_demo_smartwatch_settings_create(void)
65 {
66     create_screen_settings();
67 }
68 
lv_demo_smartwatch_settings_load(lv_screen_load_anim_t anim_type,uint32_t time,uint32_t delay)69 void lv_demo_smartwatch_settings_load(lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay)
70 {
71     lv_screen_load_anim(settings_screen, anim_type, time, delay, false);
72 }
73 
lv_demo_smartwatch_settings_add_slider(uint16_t id,const char * name,const lv_img_dsc_t * img,int32_t value,int32_t min,int32_t max)74 lv_obj_t * lv_demo_smartwatch_settings_add_slider(uint16_t id, const char * name, const lv_img_dsc_t * img,
75                                                   int32_t value,
76                                                   int32_t min, int32_t max)
77 {
78     lv_obj_t * panel = lv_obj_create(settings_list);
79     lv_obj_set_width(panel, lv_pct(85));
80     lv_obj_set_height(panel, 64);
81     lv_obj_set_align(panel, LV_ALIGN_CENTER);
82     lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE);
83     lv_obj_set_style_radius(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
84     lv_obj_set_style_bg_color(panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
85     lv_obj_set_style_bg_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
86     lv_obj_set_style_border_color(panel, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
87     lv_obj_set_style_border_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
88     lv_obj_set_style_border_width(panel, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
89     lv_obj_set_style_border_side(panel, LV_BORDER_SIDE_BOTTOM, LV_PART_MAIN | LV_STATE_DEFAULT);
90     lv_obj_set_style_pad_left(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
91     lv_obj_set_style_pad_right(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
92     lv_obj_set_style_pad_top(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
93     lv_obj_set_style_pad_bottom(panel, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
94 
95     lv_obj_t * slider = lv_slider_create(panel);
96     lv_slider_set_range(slider, min, max);
97     lv_slider_set_value(slider, value, LV_ANIM_OFF);
98     if(lv_slider_get_mode(slider) == LV_SLIDER_MODE_RANGE)
99         lv_slider_set_left_value(slider, 0, LV_ANIM_OFF);
100     lv_obj_set_width(slider, 123);
101     lv_obj_set_height(slider, 10);
102     lv_obj_set_x(slider, 65);
103     lv_obj_set_y(slider, 12);
104     lv_obj_set_align(slider, LV_ALIGN_LEFT_MID);
105     lv_obj_remove_flag(slider, LV_OBJ_FLAG_GESTURE_BUBBLE);
106 
107     lv_obj_t * icon = lv_image_create(panel);
108     lv_image_set_src(icon, img);
109     lv_obj_set_width(icon, LV_SIZE_CONTENT);
110     lv_obj_set_height(icon, LV_SIZE_CONTENT);
111     lv_obj_set_align(icon, LV_ALIGN_LEFT_MID);
112     lv_obj_add_flag(icon, LV_OBJ_FLAG_ADV_HITTEST);
113     lv_obj_remove_flag(icon, LV_OBJ_FLAG_SCROLLABLE);
114     lv_image_set_scale(icon, 150);
115 
116     lv_obj_t * label = lv_label_create(panel);
117     lv_obj_set_width(label, LV_SIZE_CONTENT);
118     lv_obj_set_height(label, LV_SIZE_CONTENT);
119     lv_obj_set_x(label, 60);
120     lv_obj_set_y(label, 3);
121     lv_label_set_text(label, name);
122 
123     lv_obj_add_event_cb(slider, settings_action_event_cb, LV_EVENT_VALUE_CHANGED,
124                         (void *)(intptr_t)((ST_SLIDER << 16) | id));
125 
126     return slider;
127 }
128 
lv_demo_smartwatch_settings_add_toggle(uint16_t id,const char * name,const lv_img_dsc_t * img,bool state)129 lv_obj_t * lv_demo_smartwatch_settings_add_toggle(uint16_t id, const char * name, const lv_img_dsc_t * img, bool state)
130 {
131     lv_obj_t * panel = lv_obj_create(settings_list);
132     lv_obj_set_width(panel, lv_pct(85));
133     lv_obj_set_height(panel, 64);
134     lv_obj_set_align(panel, LV_ALIGN_CENTER);
135     lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE);
136     lv_obj_set_style_radius(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
137     lv_obj_set_style_bg_color(panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
138     lv_obj_set_style_bg_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
139     lv_obj_set_style_border_color(panel, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
140     lv_obj_set_style_border_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
141     lv_obj_set_style_border_width(panel, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
142     lv_obj_set_style_border_side(panel, LV_BORDER_SIDE_BOTTOM, LV_PART_MAIN | LV_STATE_DEFAULT);
143     lv_obj_set_style_pad_left(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
144     lv_obj_set_style_pad_right(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
145     lv_obj_set_style_pad_top(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
146     lv_obj_set_style_pad_bottom(panel, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
147 
148     lv_obj_t * icon = lv_image_create(panel);
149     lv_image_set_src(icon, img);
150     lv_obj_set_width(icon, LV_SIZE_CONTENT);
151     lv_obj_set_height(icon, LV_SIZE_CONTENT);
152     lv_obj_set_align(icon, LV_ALIGN_LEFT_MID);
153     lv_obj_add_flag(icon, LV_OBJ_FLAG_ADV_HITTEST);
154     lv_obj_remove_flag(icon, LV_OBJ_FLAG_SCROLLABLE);
155     lv_image_set_scale(icon, 150);
156 
157     lv_obj_t * toggle = lv_switch_create(panel);
158     lv_obj_set_width(toggle, 50);
159     lv_obj_set_height(toggle, 25);
160     lv_obj_set_x(toggle, 65);
161     lv_obj_set_y(toggle, 12);
162     lv_obj_set_align(toggle, LV_ALIGN_LEFT_MID);
163 
164     if(state) {
165         lv_obj_add_state(toggle, LV_STATE_CHECKED);
166     }
167     else {
168         lv_obj_remove_state(toggle, LV_STATE_CHECKED);
169     }
170 
171     lv_obj_t * label = lv_label_create(panel);
172     lv_obj_set_width(label, LV_SIZE_CONTENT);
173     lv_obj_set_height(label, LV_SIZE_CONTENT);
174     lv_obj_set_x(label, 60);
175     lv_obj_set_y(label, 3);
176     lv_label_set_text(label, name);
177 
178     lv_obj_add_event_cb(toggle, settings_action_event_cb, LV_EVENT_VALUE_CHANGED,
179                         (void *)(intptr_t)((ST_SWITCH << 16) | id));
180 
181     return toggle;
182 }
183 
lv_demo_smartwatch_settings_add_dropdown(uint16_t id,const char * name,const lv_img_dsc_t * img,const char * options)184 lv_obj_t * lv_demo_smartwatch_settings_add_dropdown(uint16_t id, const char * name, const lv_img_dsc_t * img,
185                                                     const char * options)
186 {
187     lv_obj_t * panel = lv_obj_create(settings_list);
188     lv_obj_set_width(panel, lv_pct(85));
189     lv_obj_set_height(panel, 64);
190     lv_obj_set_x(panel, 37);
191     lv_obj_set_y(panel, 7);
192     lv_obj_set_align(panel, LV_ALIGN_CENTER);
193     lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE);
194     lv_obj_set_style_radius(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
195     lv_obj_set_style_bg_color(panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
196     lv_obj_set_style_bg_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
197     lv_obj_set_style_border_color(panel, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
198     lv_obj_set_style_border_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
199     lv_obj_set_style_border_width(panel, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
200     lv_obj_set_style_border_side(panel, LV_BORDER_SIDE_BOTTOM, LV_PART_MAIN | LV_STATE_DEFAULT);
201     lv_obj_set_style_pad_left(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
202     lv_obj_set_style_pad_right(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
203     lv_obj_set_style_pad_top(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
204     lv_obj_set_style_pad_bottom(panel, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
205 
206     lv_obj_t * dropdown = lv_dropdown_create(panel);
207     lv_dropdown_set_options(dropdown, options);
208     lv_obj_set_width(dropdown, 120);
209     lv_obj_set_height(dropdown, LV_SIZE_CONTENT);
210     lv_obj_set_x(dropdown, 65);
211     lv_obj_set_y(dropdown, 12);
212     lv_obj_set_align(dropdown, LV_ALIGN_LEFT_MID);
213     lv_obj_add_flag(dropdown, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
214     lv_obj_set_style_bg_color(dropdown, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
215     lv_obj_set_style_bg_opa(dropdown, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
216     lv_obj_set_style_border_color(dropdown, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
217     lv_obj_set_style_border_opa(dropdown, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
218     lv_obj_set_style_border_width(dropdown, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
219 
220     lv_obj_set_style_bg_color(lv_dropdown_get_list(dropdown), lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
221     lv_obj_set_style_bg_opa(lv_dropdown_get_list(dropdown), 255, LV_PART_MAIN | LV_STATE_DEFAULT);
222 
223     lv_obj_t * icon = lv_image_create(panel);
224     lv_image_set_src(icon, img);
225     lv_obj_set_width(icon, LV_SIZE_CONTENT);
226     lv_obj_set_height(icon, LV_SIZE_CONTENT);
227     lv_obj_set_align(icon, LV_ALIGN_LEFT_MID);
228     lv_obj_add_flag(icon, LV_OBJ_FLAG_ADV_HITTEST);
229     lv_obj_remove_flag(icon, LV_OBJ_FLAG_SCROLLABLE);
230     lv_image_set_scale(icon, 150);
231 
232     lv_obj_t * label = lv_label_create(panel);
233     lv_obj_set_width(label, LV_SIZE_CONTENT);
234     lv_obj_set_height(label, LV_SIZE_CONTENT);
235     lv_obj_set_x(label, 60);
236     lv_obj_set_y(label, 3);
237     lv_label_set_text(label, name);
238 
239     lv_obj_add_event_cb(dropdown, settings_action_event_cb, LV_EVENT_VALUE_CHANGED,
240                         (void *)(intptr_t)((ST_DROPDOWN << 16) | id));
241 
242     return dropdown;
243 }
244 
lv_demo_smartwatch_settings_add_label(uint16_t id,const char * name,const lv_img_dsc_t * img)245 lv_obj_t * lv_demo_smartwatch_settings_add_label(uint16_t id, const char * name, const lv_img_dsc_t * img)
246 {
247     lv_obj_t * panel = lv_obj_create(settings_list);
248     lv_obj_set_width(panel, lv_pct(85));
249     lv_obj_set_height(panel, LV_SIZE_CONTENT);
250     lv_obj_set_align(panel, LV_ALIGN_CENTER);
251     lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE);
252     lv_obj_set_style_radius(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
253     lv_obj_set_style_bg_color(panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
254     lv_obj_set_style_bg_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
255     lv_obj_set_style_border_color(panel, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
256     lv_obj_set_style_border_opa(panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
257     lv_obj_set_style_border_width(panel, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
258     lv_obj_set_style_border_side(panel, LV_BORDER_SIDE_BOTTOM, LV_PART_MAIN | LV_STATE_DEFAULT);
259     lv_obj_set_style_pad_left(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
260     lv_obj_set_style_pad_right(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
261     lv_obj_set_style_pad_top(panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
262     lv_obj_set_style_pad_bottom(panel, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
263 
264     lv_obj_t * icon = lv_image_create(panel);
265     lv_image_set_src(icon, img);
266     lv_obj_set_width(icon, LV_SIZE_CONTENT);
267     lv_obj_set_height(icon, LV_SIZE_CONTENT);
268     lv_obj_set_x(icon, -5);
269     lv_obj_set_y(icon, 2);
270     lv_obj_add_flag(icon, LV_OBJ_FLAG_ADV_HITTEST);
271     lv_obj_remove_flag(icon, LV_OBJ_FLAG_SCROLLABLE);
272     lv_image_set_scale(icon, 150);
273 
274     lv_obj_t * label = lv_label_create(panel);
275     lv_obj_set_width(label, 130);
276     lv_obj_set_height(label, LV_SIZE_CONTENT);
277     lv_obj_set_x(label, 60);
278     lv_obj_set_y(label, 7);
279     lv_label_set_text(label, name);
280 
281     lv_obj_add_event_cb(panel, settings_action_event_cb, LV_EVENT_CLICKED, (void *)(intptr_t)((ST_LABEL << 16) | id));
282 
283     return label;
284 }
285 
lv_demo_smartwatch_set_settings_actions_cb(lv_smartwatch_settings_change_cb_t cb)286 void lv_demo_smartwatch_set_settings_actions_cb(lv_smartwatch_settings_change_cb_t cb)
287 {
288     settings_change_cb = cb;
289 }
290 
lv_demo_smartwatch_set_default_brightness(uint8_t brightness)291 void lv_demo_smartwatch_set_default_brightness(uint8_t brightness)
292 {
293     lv_slider_set_value(brightness_slider, brightness, LV_ANIM_OFF);
294     lv_demo_smartwatch_update_brightness_slider(brightness);
295     manual_trigger = true;
296     lv_obj_send_event(brightness_slider, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_SLIDER << 16) | 0x0001));
297 }
298 
lv_demo_smartwatch_set_default_timeout(uint8_t timeout)299 void lv_demo_smartwatch_set_default_timeout(uint8_t timeout)
300 {
301     lv_dropdown_set_selected(timeout_dropdown, timeout, LV_ANIM_OFF);
302     manual_trigger = true;
303     lv_obj_send_event(timeout_dropdown, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_DROPDOWN << 16) | 0x0003));
304 }
305 
lv_demo_smartwatch_set_default_rotation(uint8_t rotation)306 void lv_demo_smartwatch_set_default_rotation(uint8_t rotation)
307 {
308     lv_dropdown_set_selected(rotation_dropdown, rotation, LV_ANIM_OFF);
309     manual_trigger = true;
310     lv_obj_send_event(rotation_dropdown, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_DROPDOWN << 16) | 0x0004));
311 }
312 
lv_demo_smartwatch_set_default_circular_scroll(bool enabled)313 void lv_demo_smartwatch_set_default_circular_scroll(bool enabled)
314 {
315     if(enabled) {
316         lv_obj_add_state(circular_switch, LV_STATE_CHECKED);
317     }
318     else {
319         lv_obj_remove_state(circular_switch, LV_STATE_CHECKED);
320     }
321     manual_trigger = true;
322     lv_obj_send_event(circular_switch, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_SWITCH << 16) | 0x0002));
323 }
324 
lv_demo_smartwatch_set_default_alert_state(bool enabled)325 void lv_demo_smartwatch_set_default_alert_state(bool enabled)
326 {
327     if(enabled) {
328         lv_obj_add_state(alerts_switch, LV_STATE_CHECKED);
329     }
330     else {
331         lv_obj_remove_state(alerts_switch, LV_STATE_CHECKED);
332     }
333     manual_trigger = true;
334     lv_obj_send_event(alerts_switch, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_SWITCH << 16) | 0x0005));
335 }
336 
lv_demo_smartwatch_set_default_hints_state(bool enabled)337 void lv_demo_smartwatch_set_default_hints_state(bool enabled)
338 {
339     if(enabled) {
340         lv_obj_add_state(hint_switch, LV_STATE_CHECKED);
341     }
342     else {
343         lv_obj_remove_state(hint_switch, LV_STATE_CHECKED);
344     }
345     manual_trigger = true;
346     lv_obj_send_event(hint_switch, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_SWITCH << 16) | 0x0009));
347 }
348 
lv_demo_smartwatch_set_default_scrollbar_mode(lv_scrollbar_mode_t mode)349 void lv_demo_smartwatch_set_default_scrollbar_mode(lv_scrollbar_mode_t mode)
350 {
351     lv_dropdown_set_selected(scroll_mode, mode, LV_ANIM_OFF);
352     manual_trigger = true;
353     lv_obj_send_event(scroll_mode, LV_EVENT_VALUE_CHANGED, (void *)(intptr_t)((ST_DROPDOWN << 16) | 0x0008));
354 }
355 
lv_demo_smartwatch_set_default_about_info(const char * info)356 void lv_demo_smartwatch_set_default_about_info(const char * info)
357 {
358     lv_label_set_text(about_label, info);
359 }
360 
361 /**********************
362  *   STATIC FUNCTIONS
363  **********************/
364 
settings_action_event_cb(lv_event_t * e)365 static void settings_action_event_cb(lv_event_t * e)
366 {
367 
368     lv_obj_t * active_screen = lv_screen_active();
369 
370     LV_LOG_WARN("Settings actions event triggered, settings screen %s, Manually triggered %s",
371                 active_screen == settings_screen ? "active" : "inactive", manual_trigger ? "yes" : "no");
372 
373     if(active_screen != settings_screen && !manual_trigger) {
374         /* event was triggered but the current screen is no longer active */
375         /* event was not manually triggerd */
376         LV_LOG_WARN("Settings actions event triggered but the current screen is no longer active");
377         return;
378     }
379 
380     uint32_t data = (uint32_t)(intptr_t)lv_event_get_user_data(e);
381     uint16_t id = (uint16_t)data;
382     uint16_t type = (uint16_t)(data >> 16);
383     uint64_t value;
384     lv_obj_t * target = lv_event_get_target(e);
385 
386     /* extract value based on the type */
387     switch(type) {
388         case ST_SLIDER:
389             value = lv_slider_get_value(target);
390             break;
391         case ST_DROPDOWN:
392             value = lv_dropdown_get_selected(target);
393             break;
394         case ST_SWITCH:
395             value = lv_obj_has_state(target, LV_STATE_CHECKED) ? 1 : 0;
396             break;
397         case ST_LABEL:
398             break;
399 
400         default:
401             break;
402     }
403 
404     /* send actions to user callback function if set */
405     if(settings_change_cb != NULL) {
406         settings_change_cb(id, value);
407     }
408 
409     /* handle actions for the inbuilt settings */
410     switch(id) {
411         case 0x0001:
412             if(!manual_trigger) {
413                 /* Update the brightness slider in the control screen */
414                 lv_demo_smartwatch_update_brightness_slider(value);
415             }
416             break;
417         case 0x0002:
418             lv_demo_smartwatch_set_circular_scroll(value);
419             lv_obj_scroll_by(settings_list, 0, value ? 1 : -1, LV_ANIM_OFF);
420             break;
421         case 0x0007:
422             lv_demo_smartwatch_easter_egg_load(LV_SCR_LOAD_ANIM_FADE_ON, 500, 0);
423             break;
424         case 0x0008:
425             lv_demo_smartwatch_set_scrollbar_mode(value);
426             lv_obj_set_scrollbar_mode(settings_list, lv_demo_smartwatch_get_scrollbar_mode());
427             break;
428         case 0x0009:
429             lv_demo_smartwatch_set_scroll_hint(value);
430             break;
431 
432         default:
433             break;
434     }
435 
436     manual_trigger = false;
437 }
438 
settings_screen_event_cb(lv_event_t * e)439 static void settings_screen_event_cb(lv_event_t * e)
440 {
441     lv_event_code_t event_code = lv_event_get_code(e);
442 
443     if(event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_active()) == LV_DIR_RIGHT) {
444         lv_demo_smartwatch_list_load(LV_SCR_LOAD_ANIM_MOVE_RIGHT, 500, 0);
445     }
446 
447     if(event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_active()) == LV_DIR_LEFT) {
448         lv_demo_smartwatch_show_scroll_hint(LV_DIR_LEFT);
449     }
450 
451     if(event_code == LV_EVENT_SCREEN_LOAD_START) {
452         lv_obj_scroll_by(settings_list, 0, 1, LV_ANIM_OFF);
453         lv_obj_scroll_by(settings_list, 0, -1, LV_ANIM_OFF);
454 
455         lv_obj_set_scrollbar_mode(settings_list, lv_demo_smartwatch_get_scrollbar_mode());
456     }
457 
458     if(event_code == LV_EVENT_SCREEN_LOADED) {
459         lv_demo_smartwatch_show_scroll_hint(LV_DIR_LEFT);
460     }
461 }
462 
create_screen_settings(void)463 static void create_screen_settings(void)
464 {
465 
466     settings_screen = lv_obj_create(NULL);
467     lv_obj_remove_flag(settings_screen, LV_OBJ_FLAG_SCROLLABLE);
468     lv_obj_set_style_radius(settings_screen, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
469     lv_obj_set_style_bg_color(settings_screen, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
470     lv_obj_set_style_bg_opa(settings_screen, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
471 
472     settings_list = lv_obj_create(settings_screen);
473     lv_obj_set_width(settings_list, lv_pct(100));
474     lv_obj_set_height(settings_list, lv_pct(100));
475     lv_obj_set_align(settings_list, LV_ALIGN_TOP_MID);
476     lv_obj_set_flex_flow(settings_list, LV_FLEX_FLOW_COLUMN);
477     lv_obj_set_flex_align(settings_list, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
478     lv_obj_set_scrollbar_mode(settings_list, LV_SCROLLBAR_MODE_OFF);
479     lv_obj_set_scroll_dir(settings_list, LV_DIR_VER);
480     lv_obj_set_style_radius(settings_list, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
481     lv_obj_set_style_bg_color(settings_list, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
482     lv_obj_set_style_bg_opa(settings_list, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
483     lv_obj_set_style_border_width(settings_list, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
484     lv_obj_set_style_pad_left(settings_list, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
485     lv_obj_set_style_pad_right(settings_list, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
486     lv_obj_set_style_pad_top(settings_list, 50, LV_PART_MAIN | LV_STATE_DEFAULT);
487     lv_obj_set_style_pad_bottom(settings_list, 70, LV_PART_MAIN | LV_STATE_DEFAULT);
488 
489     brightness_slider = lv_demo_smartwatch_settings_add_slider(0x0001, "Screen Brightness", &img_brightness_icon, 50, 1,
490                                                                255);
491     circular_switch = lv_demo_smartwatch_settings_add_toggle(0x0002, "Circular Scroll", &img_scrolling_icon, true);
492     scroll_mode = lv_demo_smartwatch_settings_add_dropdown(0x0008, "Scrollbar Mode", &img_scrolling_icon,
493                                                            "OFF\nON\nACTIVE\nAUTO");
494     timeout_dropdown = lv_demo_smartwatch_settings_add_dropdown(0x0003, "Screen Timeout", &img_timeout_icon,
495                                                                 "5 Seconds\n10 Seconds\n20 Seconds\n30 Seconds\nAlways On");
496     rotation_dropdown = lv_demo_smartwatch_settings_add_dropdown(0x0004, "Screen Rotation", &img_screen_rotate_icon,
497                                                                  "Default\n90\n180\n270");
498     hint_switch = lv_demo_smartwatch_settings_add_toggle(0x0009, "Show Hints", &img_info_icon, false);
499     alerts_switch = lv_demo_smartwatch_settings_add_toggle(0x0005, "Show Alerts", &img_alert_icon, false);
500     about_label = lv_demo_smartwatch_settings_add_label(0x0006, "LVGL Demo\nSmart Watch UI\n11:22:33:44:55:66",
501                                                         &img_info_icon);
502     lv_demo_smartwatch_settings_add_label(0x0007, "Made with love\nin Kenya\nusing LVGL", &img_kenya_icon);
503 
504     lv_obj_add_event_cb(settings_list, lv_demo_smartwatch_scroll_event, LV_EVENT_ALL, NULL);
505     lv_obj_add_event_cb(settings_screen, settings_screen_event_cb, LV_EVENT_ALL, NULL);
506 }
507 
508 #endif /*LV_USE_DEMO_SMARTWATCH*/
509