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