1 /* This is a demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "guix_widget_types_resources.h"
6 #include "guix_widget_types_specifications.h"
7 
8 extern SCROLL_WHEEL_SCREEN_CONTROL_BLOCK Scroll_Wheel_Screen;
9 
10 VOID animation_speed_set();
11 VOID day_count_update();
12 extern UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length);
13 
14 /******************************************************************************************/
15 /* Override default event processing of "Scroll_Wheel_Screen" to handle signals from my   */
16 /* child widgets.                                                                         */
17 /******************************************************************************************/
scroll_wheel_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)18 UINT scroll_wheel_screen_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
19 {
20     switch (event_ptr->gx_event_type)
21     {
22     case GX_EVENT_SHOW:
23         gx_window_event_process(window, event_ptr);
24         animation_speed_set();
25         break;
26     case GX_SIGNAL(ID_SCROLL_WHEEL_MONTH, GX_EVENT_LIST_SELECT):
27     case GX_SIGNAL(ID_SCROLL_WHEEL_YEAR, GX_EVENT_LIST_SELECT):
28         day_count_update();
29         break;
30 
31     default:
32         return gx_window_event_process(window, event_ptr);
33     }
34 
35     return 0;
36 }
37 
38 /******************************************************************************************/
39 /* Row value format callback of day wheel.                                                */
40 /******************************************************************************************/
day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL * wheel,INT row,GX_STRING * string)41 UINT day_wheel_value_format(GX_NUMERIC_SCROLL_WHEEL *wheel, INT row, GX_STRING *string)
42 {
43     sprintf(wheel->gx_numeric_scroll_wheel_string_buffer, "%02d", row + 1);
44 
45     string->gx_string_ptr = wheel->gx_numeric_scroll_wheel_string_buffer;
46     string->gx_string_length = string_length_get(string->gx_string_ptr, GX_NUMERIC_SCROLL_WHEEL_STRING_BUFFER_SIZE - 1);
47 
48     return GX_SUCCESS;
49 }
50 
51 /******************************************************************************************/
52 /* Set scroll wheel animation speed.                                                      */
53 /******************************************************************************************/
animation_speed_set()54 VOID animation_speed_set()
55 {
56     GX_NUMERIC_SCROLL_WHEEL *day_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_day;
57     GX_NUMERIC_SCROLL_WHEEL *year_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_year;
58     GX_STRING_SCROLL_WHEEL *month_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_month;
59 
60     gx_scroll_wheel_speed_set(day_wheel, GX_FIXED_VAL_MAKE(1), 200, 10, 2);
61     gx_scroll_wheel_speed_set(month_wheel, 512, 200, 10, 2);
62     gx_scroll_wheel_speed_set(year_wheel, GX_FIXED_VAL_MAKE(2), 200, 10, 2);
63 }
64 
65 /******************************************************************************************/
66 /* Update day range.                                                                      */
67 /******************************************************************************************/
day_count_update()68 VOID day_count_update()
69 {
70     int year;
71     int month;
72     int day_count;
73     int new_day_count;
74 
75     GX_NUMERIC_SCROLL_WHEEL *day_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_day;
76     GX_NUMERIC_SCROLL_WHEEL *year_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_year;
77     GX_STRING_SCROLL_WHEEL *month_wheel = &Scroll_Wheel_Screen.Scroll_Wheel_Screen_scroll_wheel_month;
78 
79     year = year_wheel->gx_numeric_scroll_wheel_start_val;
80     year += year_wheel->gx_scroll_wheel_selected_row;
81 
82     month = month_wheel->gx_scroll_wheel_selected_row + 1;
83     day_count = GX_ABS(day_wheel->gx_numeric_scroll_wheel_end_val - day_wheel->gx_numeric_scroll_wheel_start_val) + 1;
84 
85     switch (month)
86     {
87     case 1:
88     case 3:
89     case 5:
90     case 7:
91     case 8:
92     case 10:
93     case 12:
94         new_day_count = 31;
95         break;
96 
97     case 2:
98         if ((!(year % 400)) ||
99             (!(year % 4) && (year % 400)))
100         {
101             new_day_count = 29;
102         }
103         else
104         {
105             new_day_count = 28;
106         }
107         break;
108 
109     default:
110         new_day_count = 30;
111         break;
112     }
113 
114     if (new_day_count != day_count)
115     {
116         gx_numeric_scroll_wheel_range_set(day_wheel, 1, new_day_count);
117     }
118 }
119