1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "all_widgets_32argb_resources.h"
6 #include "all_widgets_32argb_specifications.h"
7 
8 #define ID_SCROLL_WHEEL_DAY   0xf0
9 #define ID_SCROLL_WHEEL_MONTH 0xf1
10 #define ID_SCROLL_WHEEL_YEAR  0xf2
11 
12 VOID select_day();
13 VOID day_count_update();
14 
15 /* Override default event processing of scroll wheel screen. */
scroll_wheel_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)16 UINT scroll_wheel_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
17 {
18     switch (event_ptr->gx_event_type)
19     {
20     case GX_SIGNAL(ID_YEAR_WHEEL, GX_EVENT_LIST_SELECT):
21         day_count_update();
22         break;
23 
24     case GX_SIGNAL(ID_DAY_SELECT, GX_EVENT_CLICKED):
25         select_day();
26         break;
27 
28     default:
29         return gx_window_event_process(window, event_ptr);
30     }
31 
32     return 0;
33 }
34 
string_to_int(const char * string)35 int string_to_int(const char* string)
36 {
37     int value = 0;
38 
39     while (string[0])
40     {
41         value = value * 10 + string[0] - '0';
42         string++;
43     }
44 
45     return value;
46 }
47 
select_day()48 VOID select_day()
49 {
50     int selected_day;
51     GX_SINGLE_LINE_TEXT_INPUT* input = &scroll_wheel_screen.scroll_wheel_screen_text_input;
52     GX_NUMERIC_SCROLL_WHEEL* day_wheel = &scroll_wheel_screen.scroll_wheel_screen_day_wheel;
53 
54     selected_day = string_to_int(input->gx_single_line_text_input_buffer);
55     gx_scroll_wheel_selected_set(day_wheel, selected_day - 1);
56 }
57 
day_count_update()58 VOID day_count_update()
59 {
60     int year;
61     int month;
62     int day_count;
63     int new_day_count;
64 
65     GX_NUMERIC_SCROLL_WHEEL *day_wheel = &scroll_wheel_screen.scroll_wheel_screen_day_wheel;
66     GX_NUMERIC_SCROLL_WHEEL *year_wheel = &scroll_wheel_screen.scroll_wheel_screen_year_wheel;
67     GX_STRING_SCROLL_WHEEL *month_wheel = &scroll_wheel_screen.scroll_wheel_screen_month_wheel;
68 
69     year = year_wheel->gx_numeric_scroll_wheel_start_val;
70     year += year_wheel->gx_scroll_wheel_selected_row;
71 
72     month = month_wheel->gx_scroll_wheel_selected_row + 1;
73     day_count = GX_ABS(day_wheel->gx_numeric_scroll_wheel_end_val - day_wheel->gx_numeric_scroll_wheel_start_val) + 1;
74 
75     switch (month)
76     {
77     case 1:
78     case 3:
79     case 5:
80     case 7:
81     case 8:
82     case 10:
83     case 12:
84         new_day_count = 31;
85         break;
86 
87     case 2:
88         if ((!(year % 400)) ||
89             (!(year % 4) && (year % 400)))
90         {
91             new_day_count = 29;
92         }
93         else
94         {
95             new_day_count = 28;
96         }
97         break;
98 
99     default:
100         new_day_count = 30;
101         break;
102     }
103 
104     if (new_day_count != day_count)
105     {
106         gx_numeric_scroll_wheel_range_set(day_wheel, 1, new_day_count);
107     }
108 }
109