xref: /OK3568_Linux_fs/app/lvgl_demo/rk_demo/setting/language_and_date_ui.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <time.h>
5 #include <unistd.h>
6 
7 #include <lvgl/lvgl.h>
8 
9 #include "main.h"
10 #include "ui_resource.h"
11 
12 static lv_obj_t * bg;
13 
14 static lv_obj_t * area_language;
15 static lv_obj_t * area_date;
16 static lv_obj_t * area_time;
17 
18 static lv_obj_t * label_date;
19 static lv_obj_t * label_time;
20 static lv_obj_t * mask;
21 static lv_obj_t * calendar;
22 static lv_obj_t * time_roller[3];
23 static lv_obj_t * btn_confirm;
24 
confirm_cb(lv_event_t * e)25 static void confirm_cb(lv_event_t * e)
26 {
27     int hour, min, sec;
28     char buf[10];
29 
30     lv_roller_get_selected_str(time_roller[0], buf, sizeof(buf));
31     hour = atoi(buf);
32     lv_roller_get_selected_str(time_roller[1], buf, sizeof(buf));
33     min = atoi(buf);
34     lv_roller_get_selected_str(time_roller[2], buf, sizeof(buf));
35     sec = atoi(buf);
36 
37     lv_label_set_text_fmt(label_time, "%02d:%02d",
38                           hour, min);
39     // TODO set system time
40     lv_obj_del(mask);
41 }
42 
calendar_cb(lv_event_t * e)43 static void calendar_cb(lv_event_t * e)
44 {
45     lv_calendar_date_t date;
46 
47     if(lv_calendar_get_pressed_date(calendar, &date)) {
48         lv_label_set_text_fmt(label_date, "%04d-%02d-%02d",
49                               date.year, date.month, date.day);
50         lv_obj_del(mask);
51     }
52 }
53 
show_calendar(lv_event_t * e)54 static void show_calendar(lv_event_t * e)
55 {
56     mask = lv_obj_create(lv_layer_top());
57     lv_obj_remove_style_all(mask);
58     lv_obj_set_size(mask, lv_pct(100), lv_pct(100));
59     lv_obj_set_style_bg_color(mask, lv_color_black(), LV_PART_MAIN);
60     lv_obj_set_style_bg_opa(mask, 150, LV_PART_MAIN);
61 
62     calendar = lv_calendar_create(mask);
63     lv_obj_set_size(calendar, lv_pct(80), lv_pct(60));
64     lv_obj_add_event_cb(calendar, calendar_cb, LV_EVENT_VALUE_CHANGED, NULL);
65     lv_obj_center(calendar);
66 
67     // TODO real date
68     lv_calendar_set_today_date(calendar, 2023, 7, 12);
69     lv_calendar_set_showed_date(calendar, 2023, 7);
70     lv_calendar_header_arrow_create(calendar);
71 }
72 
roller_drawed(lv_event_t * e)73 static void roller_drawed(lv_event_t * e)
74 {
75     lv_obj_align_to(btn_confirm, time_roller[1], LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
76 }
77 
show_time_setting(lv_event_t * e)78 static void show_time_setting(lv_event_t * e)
79 {
80     const char *opts[2] = {
81         "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n"
82         "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n"
83         "20\n21\n22\n23",
84         "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n"
85         "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n"
86         "20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n"
87         "30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n"
88         "40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n"
89         "50\n51\n52\n53\n55\n55\n56\n57\n58\n59\n"
90     };
91     lv_obj_t * obj;
92 
93     mask = lv_obj_create(lv_layer_top());
94     lv_obj_remove_style_all(mask);
95     lv_obj_set_size(mask, lv_pct(100), lv_pct(100));
96     lv_obj_set_style_bg_color(mask, lv_color_black(), LV_PART_MAIN);
97     lv_obj_set_style_bg_opa(mask, 150, LV_PART_MAIN);
98 
99     time_roller[1] = lv_roller_create(mask);
100     lv_roller_set_options(time_roller[1], opts[1], LV_ROLLER_MODE_INFINITE);
101     lv_roller_set_visible_row_count(time_roller[1], 3);
102     lv_obj_align(time_roller[1], LV_ALIGN_CENTER, 0, 0);
103     time_roller[0] = lv_roller_create(mask);
104     lv_roller_set_options(time_roller[0], opts[0], LV_ROLLER_MODE_INFINITE);
105     lv_roller_set_visible_row_count(time_roller[0], 3);
106     lv_obj_align_to(time_roller[0], time_roller[1], LV_ALIGN_OUT_LEFT_MID, -10, 0);
107     time_roller[2] = lv_roller_create(mask);
108     lv_roller_set_options(time_roller[2], opts[1], LV_ROLLER_MODE_INFINITE);
109     lv_roller_set_visible_row_count(time_roller[2], 3);
110     lv_obj_align_to(time_roller[2], time_roller[1], LV_ALIGN_OUT_RIGHT_MID, 10, 0);
111 
112     lv_obj_add_event_cb(time_roller[1], roller_drawed, LV_EVENT_DRAW_POST_END, NULL);
113 
114     // TODO real time
115     lv_roller_set_selected(time_roller[0], 15, LV_ANIM_OFF);
116     lv_roller_set_selected(time_roller[1], 25, LV_ANIM_OFF);
117     lv_roller_set_selected(time_roller[2], 30, LV_ANIM_OFF);
118 
119     btn_confirm = lv_btn_create(mask);
120     lv_obj_align_to(btn_confirm, time_roller[1], LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
121     lv_obj_add_event_cb(btn_confirm, confirm_cb, LV_EVENT_CLICKED, NULL);
122     obj = lv_label_create(btn_confirm);
123     lv_obj_center(obj);
124     lv_label_set_text(obj, "确认");
125     lv_obj_add_style(obj, &style_txt_s, LV_PART_MAIN);
126 }
127 
menu_language_init(lv_obj_t * parent)128 lv_obj_t * menu_language_init(lv_obj_t * parent)
129 {
130     lv_obj_t * obj;
131 
132     bg = lv_obj_create(parent);
133     lv_obj_set_size(bg, lv_pct(100), LV_SIZE_CONTENT);
134     lv_obj_set_flex_flow(bg, LV_FLEX_FLOW_COLUMN);
135     lv_obj_center(bg);
136 
137     area_language = lv_obj_create(bg);
138     lv_obj_remove_style_all(area_language);
139     lv_obj_set_size(area_language, lv_pct(100), LV_SIZE_CONTENT);
140     obj = lv_label_create(area_language);
141     lv_label_set_text(obj, "语言");
142     lv_obj_add_style(obj, &style_txt_m, LV_PART_MAIN);
143     obj = lv_dropdown_create(area_language);
144     lv_obj_add_style(obj, &style_txt_s, LV_PART_MAIN);
145     lv_dropdown_set_options(obj, "中文\nEnglish");
146     lv_obj_align(obj, LV_ALIGN_RIGHT_MID, 0, 0);
147 
148     area_date = lv_obj_create(bg);
149     lv_obj_remove_style_all(area_date);
150     lv_obj_set_size(area_date, lv_pct(100), LV_SIZE_CONTENT);
151     obj = lv_label_create(area_date);
152     lv_label_set_text(obj, "日期");
153     lv_obj_add_style(obj, &style_txt_m, LV_PART_MAIN);
154     label_date = lv_label_create(area_date);
155     // TODO real date
156     lv_label_set_text(label_date, "2023-07-12");
157     lv_obj_add_flag(label_date, LV_OBJ_FLAG_CLICKABLE);
158     lv_obj_add_style(label_date, &style_txt_m, LV_PART_MAIN);
159     lv_obj_align(label_date, LV_ALIGN_RIGHT_MID, 0, 0);
160     lv_obj_add_event_cb(label_date, show_calendar, LV_EVENT_CLICKED, NULL);
161 
162     area_time = lv_obj_create(bg);
163     lv_obj_remove_style_all(area_time);
164     lv_obj_set_size(area_time, lv_pct(100), LV_SIZE_CONTENT);
165     obj = lv_label_create(area_time);
166     lv_label_set_text(obj, "时间");
167     lv_obj_add_style(obj, &style_txt_m, LV_PART_MAIN);
168     label_time = lv_label_create(area_time);
169     // TODO real time
170     lv_label_set_text(label_time, "15:25");
171     lv_obj_add_flag(label_time, LV_OBJ_FLAG_CLICKABLE);
172     lv_obj_add_style(label_time, &style_txt_m, LV_PART_MAIN);
173     lv_obj_align(label_time, LV_ALIGN_RIGHT_MID, 0, 0);
174     lv_obj_add_event_cb(label_time, show_time_setting, LV_EVENT_CLICKED, NULL);
175 
176     return bg;
177 }
178 
menu_language_deinit(void)179 void menu_language_deinit(void)
180 {
181     lv_obj_del(bg);
182     bg = NULL;
183 }
184 
185