-
Notifications
You must be signed in to change notification settings - Fork 1
/
ui.c
151 lines (118 loc) · 7.47 KB
/
ui.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdio.h>
#include <time.h>
#include "ui.h"
#include "styles.h"
LV_IMG_DECLARE(tft_background_art)
void cb_calendar_event_handler(lv_obj_t *obj, lv_event_t event);
void cb_update_calendar_day_task(lv_task_t *task);
void update_calendar_day(Ui ui);
Ui *ui_init(void) {
static Ui ui;
static bool ui_initialized = false;
if (ui_initialized) {
LV_LOG_WARN("ui_init: already inited");
return &ui;
}
styles_init();
ui.display = lv_disp_get_default();
lv_disp_set_bg_image(ui.display, &tft_background_art);
ui.screen = lv_scr_act();
lv_obj_add_style(ui.screen, LV_OBJMASK_PART_MAIN, &style_background_transparent_full);
ui.page.main = lv_page_create(ui.screen, NULL);
lv_obj_set_size(ui.page.main, LV_HOR_RES, LV_VER_RES);
lv_obj_set_click(ui.page.main, false);
lv_obj_add_style(ui.page.main, LV_PAGE_PART_BG, &style_border_none);
lv_obj_add_style(ui.page.main, LV_PAGE_PART_BG, &style_padding_none);
lv_obj_add_style(ui.page.main, LV_PAGE_PART_BG, &style_background_transparent_full);
ui.page.left.main = lv_obj_create(ui.page.main, NULL);
lv_obj_set_size(ui.page.left.main, (LV_HOR_RES * 1 / 3), LV_VER_RES);
lv_obj_set_click(ui.page.left.main, false);
lv_obj_add_style(ui.page.left.main, LV_OBJ_PART_MAIN, &style_border_none);
lv_obj_add_style(ui.page.left.main, LV_OBJ_PART_MAIN, &style_background_transparent_full);
ui.page.left.top.main = lv_page_create(ui.page.left.main, NULL);
lv_obj_set_click(ui.page.left.top.main, false);
lv_obj_set_size(ui.page.left.top.main, lv_obj_get_width(ui.page.left.main), lv_obj_get_width(ui.page.left.main) * 2 / 3);
lv_obj_add_style(ui.page.left.top.main, LV_STATE_DEFAULT, &style_border_none);
lv_obj_add_style(ui.page.left.top.main, LV_PAGE_PART_BG, &style_background_transparent_full);
lv_obj_add_style(ui.page.left.top.main, LV_PAGE_PART_BG, &style_padding_default);
ui.page.left.bottom.main = lv_page_create(ui.page.left.main, NULL);
lv_obj_set_click(ui.page.left.bottom.main, false);
lv_obj_set_pos(ui.page.left.bottom.main, 0, lv_obj_get_height(ui.page.left.top.main));
lv_obj_set_size(ui.page.left.bottom.main, lv_obj_get_width(ui.page.left.main), lv_obj_get_height(ui.page.left.main) - lv_obj_get_height(ui.page.left.top.main));
lv_obj_set_style_local_pad_top(ui.page.left.bottom.main, LV_PAGE_PART_BG, LV_STATE_DEFAULT, 0);
lv_obj_add_style(ui.page.left.bottom.main, LV_STATE_DEFAULT, &style_border_none);
lv_obj_add_style(ui.page.left.bottom.main, LV_PAGE_PART_BG, &style_background_transparent_full);
lv_obj_add_style(ui.page.left.bottom.main, LV_PAGE_PART_BG, &style_padding_default);
ui.page.left.top.container = lv_obj_create(ui.page.left.top.main, NULL);
lv_obj_set_click(ui.page.left.top.container, false);
lv_obj_set_size(ui.page.left.top.container, lv_page_get_width_fit(ui.page.left.top.main), lv_page_get_height_fit(ui.page.left.top.main));
lv_obj_add_style(ui.page.left.top.container, LV_CALENDAR_PART_BG, &style_background_color_black);
lv_obj_add_style(ui.page.left.top.container, LV_PAGE_PART_BG, &style_background_overlay_color_black);
ui.page.left.bottom.itinerary = lv_obj_create(ui.page.left.bottom.main, NULL);
lv_obj_set_click(ui.page.left.bottom.itinerary, false);
lv_obj_set_size(ui.page.left.bottom.itinerary, lv_page_get_width_fit(ui.page.left.bottom.main), lv_page_get_height_fit(ui.page.left.bottom.main));
lv_obj_add_style(ui.page.left.bottom.itinerary, LV_CALENDAR_PART_BG, &style_background_color_black);
lv_obj_add_style(ui.page.left.bottom.itinerary, LV_PAGE_PART_BG, &style_background_overlay_color_black);
ui.page.left.top.label_day = lv_label_create(ui.page.left.top.container, NULL);
lv_label_set_text(ui.page.left.top.label_day, "");
lv_obj_add_style(ui.page.left.top.label_day, LV_LABEL_PART_MAIN, &style_font_black_large);
ui.page.left.top.label_month = lv_label_create(ui.page.left.top.container, NULL);
lv_label_set_text(ui.page.left.top.label_month, "");
lv_obj_add_style(ui.page.left.top.label_month, LV_LABEL_PART_MAIN, &style_font_black_medium);
ui.page.left.top.label_year = lv_label_create(ui.page.left.top.container, NULL);
lv_label_set_text(ui.page.left.top.label_year, "");
lv_obj_add_style(ui.page.left.top.label_year, LV_LABEL_PART_MAIN, &style_font_black_medium);
ui.page.right.main = lv_obj_create(ui.page.main, NULL);
lv_obj_set_click(ui.page.right.main, false);
lv_obj_set_size(ui.page.right.main, (LV_HOR_RES * 2 / 3), LV_VER_RES);
lv_obj_set_pos(ui.page.right.main, lv_obj_get_width(ui.page.left.main), 0);
lv_obj_add_style(ui.page.right.main, LV_PAGE_PART_BG, &style_padding_default);
lv_obj_add_style(ui.page.right.main, LV_OBJ_PART_MAIN, &style_border_none);
lv_obj_add_style(ui.page.right.main, LV_OBJ_PART_MAIN, &style_background_transparent_full);
ui.page.right.calendar = lv_calendar_create(ui.page.right.main, NULL);
lv_obj_set_click(ui.page.right.calendar, false);
lv_obj_set_size(ui.page.right.calendar, lv_obj_get_width_fit(ui.page.right.main), lv_obj_get_height_fit(ui.page.right.main));
lv_obj_align(ui.page.right.calendar, ui.page.right.main, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_style(ui.page.right.calendar, LV_CALENDAR_PART_BG, &style_background_color_black);
lv_obj_add_style(ui.page.right.calendar, LV_CALENDAR_PART_BG, &style_background_overlay_color_black);
lv_obj_set_style_local_text_font(ui.page.right.calendar, LV_CALENDAR_PART_HEADER, LV_STATE_DEFAULT, &roboto_black_24);
lv_obj_set_style_local_text_font(ui.page.right.calendar, LV_CALENDAR_PART_DAY_NAMES, LV_STATE_DEFAULT, &roboto_black_16);
lv_obj_set_style_local_text_font(ui.page.right.calendar, LV_CALENDAR_PART_BG, LV_STATE_DEFAULT, &roboto_regular_12);
update_calendar_day(ui);
lv_task_create(cb_update_calendar_day_task, 750, LV_TASK_PRIO_HIGH, &ui);
lv_obj_set_event_cb(ui.page.right.calendar, cb_calendar_event_handler);
ui_initialized = true;
LV_LOG_INFO("ui_init ready");
return &ui;
}
void cb_calendar_event_handler(lv_obj_t *obj, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
lv_calendar_date_t *date = lv_calendar_get_pressed_date(obj);
if (date) {
printf("Clicked date: %02d.%02d.%d\n", date->day, date->month, date->year);
}
}
}
void cb_update_calendar_day_task(lv_task_t *task) {
// https://docs.lvgl.io/latest/en/html/overview/task.html#create-a-task
update_calendar_day(*(Ui *) task->user_data);
}
void update_calendar_day(Ui ui) {
time_t t = time(NULL);
struct tm tm = *localtime(&t);
char bufMonth[4], bufYear[5];
lv_calendar_date_t today;
strftime(bufMonth, sizeof(bufMonth), "%b", &tm);
strftime(bufYear, sizeof(bufYear), "%EY", &tm);
today.year = tm.tm_year + 1900;
today.day = tm.tm_mday;
today.month = tm.tm_mon + 1;
lv_calendar_set_today_date(ui.page.right.calendar, &today);
lv_calendar_set_showed_date(ui.page.right.calendar, &today);
lv_label_set_text_fmt(ui.page.left.top.label_month, "%s", bufMonth);
lv_label_set_text_fmt(ui.page.left.top.label_day, "%02d", tm.tm_mday);
lv_label_set_text_fmt(ui.page.left.top.label_year, "%s", bufYear);
lv_obj_align(ui.page.left.top.label_month, ui.page.left.top.container, LV_ALIGN_IN_TOP_MID, 0, DEFAULT_BORDER);
lv_obj_align(ui.page.left.top.label_day, ui.page.left.top.container, LV_ALIGN_CENTER, 0, DEFAULT_BORDER);
lv_obj_align(ui.page.left.top.label_year, ui.page.left.top.container, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
}