1 /* This is a small demo of the high-performance GUIX graphics framework. */
2
3 #include <stdio.h>
4 #include "gx_api.h"
5
6 #include "generic_scroll_wheel_resources.h"
7 #include "generic_scroll_wheel_specifications.h"
8
9 #define MEMORY_SIZE (DISPLAY_1_X_RESOLUTION * DISPLAY_1_Y_RESOLUTION)
10 #define SCROLL_WHEEL_VISIBLE_ROWS 6
11 #define SCROLL_WHEEL_ICON_WIDTH 38
12 #define SCROLL_WHEEL_ICON_HEIGHT 38
13
14 /* Define the ThreadX demo thread control block and stack. */
15
16 TX_THREAD demo_thread;
17 UCHAR demo_thread_stack[4096];
18 GX_WINDOW_ROOT *root;
19 TX_BYTE_POOL memory_pool;
20 GX_UBYTE memory_buffer[MEMORY_SIZE];
21
22 /* Define vertical list row item structure. */
23 typedef struct {
24 GX_NUMERIC_PROMPT prompt;
25 GX_ICON icon;
26 }SCROLL_WHEEL_ROW;
27
28 SCROLL_WHEEL_ROW scroll_wheel_nowrap_rows[SCROLL_WHEEL_VISIBLE_ROWS + 1];
29 SCROLL_WHEEL_ROW scroll_wheel_wrap_rows[SCROLL_WHEEL_VISIBLE_ROWS + 1];
30
31 /* Define prototypes. */
32 VOID demo_thread_entry(ULONG thread_input);
33 extern UINT win32_graphics_driver_setup_565rgb(GX_DISPLAY *display);
34 void widget_scroll_wheel_init();
35 void string_to_int(char* str, int len, int* value);
36
main(int argc,char ** argv)37 int main(int argc, char ** argv)
38 {
39 tx_kernel_enter();
40 return(0);
41 }
42
43
memory_allocate(ULONG size)44 VOID* memory_allocate(ULONG size)
45 {
46 VOID* memptr;
47
48 if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
49 {
50 return memptr;
51 }
52
53 return NULL;
54 }
55
memory_free(VOID * mem)56 VOID memory_free(VOID* mem)
57 {
58 tx_byte_release(mem);
59 }
60
tx_application_define(void * first_unused_memory)61 VOID tx_application_define(void *first_unused_memory)
62 {
63 /* Create the main demo thread. */
64 tx_thread_create(&demo_thread, "GUIX Demo Thread", demo_thread_entry,
65 0, demo_thread_stack, sizeof(demo_thread_stack),
66 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
67 }
68
demo_thread_entry(ULONG thread_input)69 VOID demo_thread_entry(ULONG thread_input)
70 {
71 /* create byte pool for rotate to use */
72 tx_byte_pool_create(&memory_pool, "memory poll", memory_buffer, MEMORY_SIZE);
73
74 /* Initialize GUIX. */
75 gx_system_initialize();
76
77 gx_system_memory_allocator_set(memory_allocate, memory_free);
78
79 gx_studio_display_configure(DISPLAY_1, win32_graphics_driver_setup_565rgb,
80 LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
81
82 /* create the button screen */
83 gx_studio_named_widget_create("main_screen", (GX_WIDGET*)root, GX_NULL);
84
85 widget_scroll_wheel_init();
86
87 /* Show the root window to make it and patients screen visible. */
88 gx_widget_show(root);
89
90 /* let GUIX run */
91 gx_system_start();
92 }
93
main_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)94 UINT main_screen_event_process(GX_WINDOW* window, GX_EVENT* event_ptr)
95 {
96 GX_CHAR* input_string;
97 UINT string_size;
98 UINT value;
99
100 switch (event_ptr->gx_event_type)
101 {
102 case GX_SIGNAL(ID_SET_TOTAL_ROWS, GX_EVENT_CLICKED):
103 gx_single_line_text_input_buffer_get(&main_screen.main_screen_text_input_total_row, &input_string, &string_size, GX_NULL);
104 string_to_int(input_string, string_size, &value);
105
106 gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel, value);
107 gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel_nowrap, value);
108 gx_generic_scroll_wheel_total_rows_set(&main_screen.main_screen_scroll_wheel_wrap, value);
109 break;
110
111 case GX_SIGNAL(ID_SET_SELECTED_ROW, GX_EVENT_CLICKED):
112 gx_single_line_text_input_buffer_get(&main_screen.main_screen_text_input_selected_row, &input_string, &string_size, GX_NULL);
113 string_to_int(input_string, string_size, &value);
114
115 gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel, value);
116 gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel_nowrap, value);
117 gx_scroll_wheel_selected_set((GX_SCROLL_WHEEL *)&main_screen.main_screen_scroll_wheel_wrap, value);
118 break;
119
120 default:
121 return gx_window_event_process(window, event_ptr);
122 }
123
124 return 0;
125 }
126
custom_prompt_draw(GX_NUMERIC_PROMPT * prompt)127 void custom_prompt_draw(GX_NUMERIC_PROMPT* prompt)
128 {
129
130 /* draw widget background. */
131 gx_widget_background_draw((GX_WIDGET*)prompt);
132
133 if (prompt->gx_widget_style & GX_STYLE_DRAW_SELECTED)
134 {
135 prompt->gx_prompt_font_id = GX_FONT_ID_SELECTED;
136 }
137 else
138 {
139 prompt->gx_prompt_font_id = GX_FONT_ID_NORMAL;
140 }
141
142 /* draw the text. */
143 gx_prompt_text_draw((GX_PROMPT *)prompt);
144
145 /* Draw children widgets of prompt widget. */
146 gx_widget_children_draw((GX_WIDGET*)prompt);
147 }
148
widget_scroll_callback(GX_GENERIC_SCROLL_WHEEL * wheel,GX_WIDGET * widget,INT index)149 void widget_scroll_callback(GX_GENERIC_SCROLL_WHEEL* wheel, GX_WIDGET* widget, INT index)
150 {
151 GX_BOOL created;
152 GX_RECTANGLE size;
153 SCROLL_WHEEL_ROW* row = (SCROLL_WHEEL_ROW*)widget;
154 int width;
155
156 gx_widget_created_test(widget, &created);
157
158 if (!created)
159 {
160 gx_window_client_width_get((GX_WINDOW *)wheel, &width);
161
162 gx_utility_rectangle_define(&size, 0, 0, width - 1, wheel->gx_scroll_wheel_row_height - 1);
163 gx_numeric_prompt_create((GX_NUMERIC_PROMPT*)&row->prompt, "", wheel, 0, GX_STYLE_ENABLED | GX_STYLE_TRANSPARENT, 0, &size);
164
165 size.gx_rectangle_top = (size.gx_rectangle_top + size.gx_rectangle_bottom - SCROLL_WHEEL_ICON_HEIGHT) >> 1;
166 size.gx_rectangle_left = size.gx_rectangle_right - SCROLL_WHEEL_ICON_WIDTH - 1;
167
168 gx_icon_create(&row->icon, "", &row->prompt, GX_PIXELMAP_ID_I_PATIENTLIST_LG, GX_STYLE_TRANSPARENT, 0, size.gx_rectangle_left, size.gx_rectangle_top);
169
170 gx_widget_draw_set(widget, custom_prompt_draw);
171 gx_prompt_font_set((GX_PROMPT*)&row->prompt, GX_FONT_ID_NORMAL);
172 gx_prompt_text_color_set((GX_PROMPT*)&row->prompt, GX_COLOR_ID_TEXT, GX_COLOR_ID_SELECTED, GX_COLOR_ID_DISABLED_TEXT);
173 }
174
175 gx_numeric_prompt_value_set((GX_NUMERIC_PROMPT*)&row->prompt, index);
176 }
177
widget_scroll_wheel_init()178 void widget_scroll_wheel_init()
179 {
180 INT index = 0;
181 GX_GENERIC_SCROLL_WHEEL *nowrap_wheel = &main_screen.main_screen_scroll_wheel_nowrap;
182 GX_GENERIC_SCROLL_WHEEL *wrap_wheel = &main_screen.main_screen_scroll_wheel_wrap;
183
184 while (index <= SCROLL_WHEEL_VISIBLE_ROWS)
185 {
186 widget_scroll_callback(nowrap_wheel, &scroll_wheel_nowrap_rows[index], index);
187 widget_scroll_callback(wrap_wheel, &scroll_wheel_wrap_rows[index], index);
188
189 index++;
190 }
191
192 gx_scroll_wheel_speed_set(nowrap_wheel,
193 GX_FIXED_VAL_MAKE(1), /* The rate of start speed to flick speed. */
194 GX_FIXED_VAL_MAKE(1) / 5, /* The rate of end speed to flick speed. */
195 10, /* Max steps fro scrolling. */
196 2); /* Delay time of each step. */
197
198 gx_scroll_wheel_speed_set(wrap_wheel, GX_FIXED_VAL_MAKE(1), GX_FIXED_VAL_MAKE(1) / 2, 10, 2);
199 }
200
201 /******************************************************************************************/
202 /* Convert string to integer value. */
203 /******************************************************************************************/
string_to_int(char * str,int len,int * value)204 void string_to_int(char* str, int len, int* value)
205 {
206 int index;
207
208 *value = 0;
209
210 for (index = 0; index < len; index++)
211 {
212 *value = *value * 10;
213 *value += str[index] - '0';
214 }
215 }
216