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_5_4_2_resources.h"
6 #include "all_widgets_5_4_2_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 extern GX_WINDOW    *pScrollWheelScreen;
13 extern int           scroll_wheel_selected;
14 extern TX_SEMAPHORE *selected_semaphore;
15 
16 VOID day_count_update();
17 VOID animation_speed_set();
18 
19 /* Define day wheel callback function. */
day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL * wheel,INT row)20 GX_CONST GX_CHAR *day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL *wheel, INT row)
21 {
22     sprintf_s(wheel->gx_numeric_scroll_wheel_string_buffer, GX_NUMERIC_SCROLL_WHEEL_STRING_BUFFER_SIZE, "%02d", row + 1);
23     return wheel->gx_numeric_scroll_wheel_string_buffer;
24 }
25 
string_to_int(const char * string)26 int string_to_int(const char *string)
27 {
28     int value = 0;
29 
30     while (string[0])
31     {
32         value = value * 10 + string[0] - '0';
33         string++;
34     }
35 
36     return value;
37 }
38 
select_day()39 VOID select_day()
40 {
41     int selected_day;
42     GX_SINGLE_LINE_TEXT_INPUT *input;
43     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
44 
45     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
46 
47     gx_widget_find(pScrollWheelScreen, ID_DAY_INPUT, GX_SEARCH_DEPTH_INFINITE, &input);
48 
49     if (input && day_wheel)
50     {
51         selected_day = string_to_int(input->gx_single_line_text_input_buffer);
52         gx_scroll_wheel_selected_set(day_wheel, selected_day - 1);
53     }
54 }
55 
56 /* Override default event processing of scroll wheel screen. */
scroll_wheel_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)57 UINT scroll_wheel_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
58 {
59 
60     switch (event_ptr->gx_event_type)
61     {
62     case GX_EVENT_SHOW:
63         pScrollWheelScreen = window;
64         gx_window_event_process(window, event_ptr);
65         animation_speed_set();
66         break;
67 
68     case GX_SIGNAL(ID_DAY_WHEEL, GX_EVENT_LIST_SELECT):
69         if(selected_semaphore)
70         {
71             tx_semaphore_put(selected_semaphore);
72         }
73         break;
74 
75     case GX_SIGNAL(ID_MONTH_WHEEL, GX_EVENT_LIST_SELECT):
76         if(selected_semaphore)
77         {
78             tx_semaphore_put(selected_semaphore);
79         }
80         break;
81 
82     case GX_SIGNAL(ID_YEAR_WHEEL, GX_EVENT_LIST_SELECT):
83         day_count_update();
84         break;
85 
86     case GX_SIGNAL(ID_DAY_SELECT, GX_EVENT_CLICKED):
87         select_day();
88         break;
89 
90     default:
91         return gx_window_event_process(window, event_ptr);
92     }
93 
94     return 0;
95 }
96 
animation_speed_set()97 VOID animation_speed_set()
98 {
99     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
100     GX_NUMERIC_SCROLL_WHEEL *year_wheel;
101     GX_STRING_SCROLL_WHEEL *month_wheel;
102 
103     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
104     gx_widget_find(pScrollWheelScreen, ID_YEAR_WHEEL, GX_SEARCH_DEPTH_INFINITE, &year_wheel);
105     gx_widget_find(pScrollWheelScreen, ID_MONTH_WHEEL, GX_SEARCH_DEPTH_INFINITE, &month_wheel);
106 
107     gx_scroll_wheel_speed_set(day_wheel, GX_FIXED_VAL_MAKE(1), 100, 10, 2);
108     gx_scroll_wheel_speed_set(month_wheel, (GX_FIXED_VAL_MAKE(1) / 2), 100, 10, 2);
109     gx_scroll_wheel_speed_set(year_wheel, GX_FIXED_VAL_MAKE(2), 100, 10, 2);
110 }
111 
day_count_update()112 VOID day_count_update()
113 {
114     int year;
115     int month;
116     int day_count;
117     int new_day_count;
118 
119     GX_NUMERIC_SCROLL_WHEEL *day_wheel;
120     GX_NUMERIC_SCROLL_WHEEL *year_wheel;
121     GX_STRING_SCROLL_WHEEL *month_wheel;
122 
123     gx_widget_find(pScrollWheelScreen, ID_DAY_WHEEL, GX_SEARCH_DEPTH_INFINITE, &day_wheel);
124     gx_widget_find(pScrollWheelScreen, ID_YEAR_WHEEL, GX_SEARCH_DEPTH_INFINITE, &year_wheel);
125     gx_widget_find(pScrollWheelScreen, ID_MONTH_WHEEL, GX_SEARCH_DEPTH_INFINITE, &month_wheel);
126 
127     year = year_wheel->gx_numeric_scroll_wheel_start_val;
128     year += year_wheel->gx_scroll_wheel_selected_row;
129 
130     month = month_wheel->gx_scroll_wheel_selected_row + 1;
131     day_count = GX_ABS(day_wheel->gx_numeric_scroll_wheel_end_val - day_wheel->gx_numeric_scroll_wheel_start_val) + 1;
132 
133     switch (month)
134     {
135     case 1:
136     case 3:
137     case 5:
138     case 7:
139     case 8:
140     case 10:
141     case 12:
142         new_day_count = 31;
143         break;
144 
145     case 2:
146         if ((!(year % 400)) ||
147             (!(year % 4) && (year % 400)))
148         {
149             new_day_count = 29;
150         }
151         else
152         {
153             new_day_count = 28;
154         }
155         break;
156 
157     default:
158         new_day_count = 30;
159         break;
160     }
161 
162     if (new_day_count != day_count)
163     {
164         gx_numeric_scroll_wheel_range_set(day_wheel, 1, new_day_count);
165     }
166 }
167