Rev 6612 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6479 | siemargl | 1 | /* |
2 | KolibriGUI demobox |
||
3 | -OptionBox |
||
4 | -MenuBar |
||
5 | -Frame |
||
6 | |||
7 | Free for all |
||
8 | |||
9 | Initially written by Siemargl, 2016 |
||
10 | |||
11 | |||
12 | ToDo |
||
13 | */ |
||
14 | |||
15 | #include |
||
16 | #include |
||
17 | #include |
||
18 | #include "kos32sys.h" |
||
19 | #include "kolibri_gui.h" |
||
20 | |||
6489 | siemargl | 21 | #define SCAN_CODE_ALTM 50 |
22 | #define SCAN_CODE_ALTE 18 |
||
8581 | rgimad | 23 | |
24 | static inline uint32_t get_os_keyb_modifiers() |
||
6489 | siemargl | 25 | { |
26 | register uint32_t val; |
||
27 | __asm__ __volatile__( |
||
28 | "int $0x40" |
||
29 | :"=a"(val) |
||
30 | :"a"(66), "b"(3)); |
||
31 | return val; |
||
32 | }; |
||
6479 | siemargl | 33 | |
6489 | siemargl | 34 | #define KEY_LSHIFT 0x1 |
35 | #define KEY_RSHIFT 0x2 |
||
36 | #define KEY_LCTRL 0x4 |
||
37 | #define KEY_RCTRL 0x8 |
||
38 | #define KEY_LALT 0x10 |
||
39 | #define KEY_RALT 0x20 |
||
40 | #define KEY_CAPSLOCK 0x40 |
||
41 | #define KEY_NUMLOCK 0x80 |
||
42 | #define KEY_SCROLLLOCK 0x100 |
||
43 | #define KEY_LWIN 0x200 |
||
44 | #define KEY_RWIN 0x400 |
||
45 | |||
8581 | rgimad | 46 | static inline void set_os_keyb_mode(int mode) |
6489 | siemargl | 47 | // 0 - ASCII, 1 - SCAN |
48 | { |
||
49 | __asm__ __volatile__( |
||
50 | "int $0x40" |
||
51 | ::"a"(66), "b"(1), "c"(mode)); |
||
52 | }; |
||
53 | |||
8581 | rgimad | 54 | int main() |
55 | { |
||
56 | /* Load all libraries, initialize global tables like system color table and |
||
57 | operations table. kolibri_gui_init() will EXIT with mcall -1 if it fails |
||
58 | to do it's job. This is all you need to call and all libraries and GUI |
||
59 | elements can be used after a successful call to this function |
||
60 | */ |
||
61 | kolibri_gui_init(); |
||
6479 | siemargl | 62 | int gui_event = KOLIBRI_EVENT_REDRAW; |
63 | uint32_t pressed_button = 0; |
||
64 | // uint32_t mouse_button; |
||
65 | // pos_t mouse_pos; |
||
66 | oskey_t keypress; |
||
67 | |||
68 | |||
69 | // creating GUI using library functions |
||
8581 | rgimad | 70 | kolibri_window *main_window = kolibri_new_window(50, 40, 400, 160, "OptionBox and Menu demo"); |
6479 | siemargl | 71 | //check_box *checkbox = kolibri_new_check_box(20, 45, 12, 12, "Append BOARDMSG to entered message."); |
72 | |||
8581 | rgimad | 73 | option_box opts1[3]; |
74 | option_box *option1sel = opts1; // intially selected RED |
||
6479 | siemargl | 75 | |
6516 | siemargl | 76 | option_box *op1_1 = gui_optionbox(opts1, X_Y(20, 50), "G1 Item RED", &option1sel); |
77 | option_box *op1_2 = gui_optionbox(opts1+1, X_Y(20, 70), "G1 Item GREEN", &option1sel); |
||
78 | option_box *op1_3 = gui_optionbox(opts1+2, X_Y(20, 90), "G1 Item BLUE", &option1sel); |
||
6479 | siemargl | 79 | option_box* option_group1[] = {op1_1, op1_2, op1_3, NULL}; |
80 | |||
8581 | rgimad | 81 | option_box opts2[3]; |
6479 | siemargl | 82 | option_box *option2sel = opts2 + 1; // intially selected #2 |
6516 | siemargl | 83 | option_box *op2_1 = gui_optionbox(&opts2[0], X_Y(140, 50), "G2 Item 1st", &option2sel); |
84 | option_box *op2_2 = gui_optionbox(&opts2[1], X_Y(140, 70), "G2 Item 2nd", &option2sel); |
||
85 | option_box *op2_3 = gui_optionbox(&opts2[2], X_Y(140, 90), "G2 Item 3rd", &option2sel); |
||
6479 | siemargl | 86 | option_box* option_group2[] = {op2_1, op2_2, op2_3, NULL}; |
87 | |||
6516 | siemargl | 88 | frame *fr1 = kolibri_new_frame_def(X_Y(12, 110), X_Y(40, 70), "Option 1"); |
89 | frame *fr2 = kolibri_new_frame_def(X_Y(132, 100), X_Y(40, 70), "Option 2"); |
||
6479 | siemargl | 90 | |
8581 | rgimad | 91 | gui_add_optiongroup(main_window, option_group1); // new syntax |
92 | gui_add_optiongroup(main_window, option_group2); |
||
93 | gui_add_frame(main_window, fr1); |
||
94 | gui_add_frame(main_window, fr2); |
||
6479 | siemargl | 95 | |
96 | int option_index1 = 0; // index of selected option |
||
97 | int option_index2 = 0; |
||
98 | |||
6489 | siemargl | 99 | char *menu1stru[] = {"Menu1", "Set RED", "Set GREEN", "Set BLUE", NULL}; |
6516 | siemargl | 100 | menubar* menu1 = kolibri_new_menubar_def(X_Y(10, 40), X_Y(5, 15), 80, 100, menu1stru); |
8581 | rgimad | 101 | gui_add_menubar(main_window, menu1); |
6482 | siemargl | 102 | |
6489 | siemargl | 103 | char *menu2stru[] = {"mEnu2", "Set Option 1", "Set Option 2", "Set Option 3", NULL}; |
6516 | siemargl | 104 | menubar* menu2 = kolibri_new_menubar_def(X_Y(50, 40), X_Y(5, 15), 80, 100, menu2stru); |
6489 | siemargl | 105 | gui_add_menubar(main_window, menu2); |
6482 | siemargl | 106 | |
6489 | siemargl | 107 | char *menu3stru[] = {"Quit", NULL}; |
6516 | siemargl | 108 | menubar* menu3 = kolibri_new_menubar_def(X_Y(90, 40), X_Y(5, 15), 0, 0, menu3stru); |
8581 | rgimad | 109 | menu3->type = 1; // no subitems |
6489 | siemargl | 110 | gui_add_menubar(main_window, menu3); |
6482 | siemargl | 111 | |
112 | |||
113 | |||
6489 | siemargl | 114 | set_os_keyb_mode(1); // needed for keyboard use in menu |
115 | |||
116 | |||
8581 | rgimad | 117 | do /* Start of main activity loop */ |
6479 | siemargl | 118 | { |
119 | if(option_index1 != option1sel - opts1) |
||
120 | debug_board_printf("Option1 change to %d\n", option1sel - opts1); |
||
121 | if(option_index2 != option2sel - opts2) |
||
122 | debug_board_printf("Option2 change to %d\n", option2sel - opts2); |
||
123 | option_index1 = option1sel - opts1; |
||
124 | option_index2 = option2sel - opts2; |
||
125 | |||
126 | switch(gui_event) |
||
127 | { |
||
128 | case KOLIBRI_EVENT_REDRAW: |
||
129 | kolibri_handle_event_redraw(main_window); |
||
130 | break; |
||
131 | case KOLIBRI_EVENT_NONE: |
||
132 | break; |
||
133 | case KOLIBRI_EVENT_KEY: |
||
6489 | siemargl | 134 | keypress = get_key(); |
135 | debug_board_printf("Key pressed state(%d) code(%d) ctrl_key(%d) modifiers(%#x)\n", keypress.state, keypress.code, keypress.ctrl_key, get_os_keyb_modifiers()); |
||
6612 | siemargl | 136 | kolibri_handle_event_key(main_window, keypress); |
6489 | siemargl | 137 | |
138 | if(keypress.code == SCAN_CODE_ALTM && get_os_keyb_modifiers() & (KEY_LALT | KEY_RALT)) |
||
6559 | siemargl | 139 | (*menu_bar_activate)(menu1); // wont work, immediately redraw command closes menu ( . but Alt+F1 worked in opendial.asm:463 |
8581 | rgimad | 140 | |
6479 | siemargl | 141 | break; |
142 | case KOLIBRI_EVENT_BUTTON: |
||
8581 | rgimad | 143 | pressed_button = get_os_button(); |
144 | switch (pressed_button) |
||
145 | { |
||
146 | case BTN_QUIT: |
||
147 | return 0; |
||
148 | break; |
||
149 | } |
||
150 | break; |
||
6479 | siemargl | 151 | case KOLIBRI_EVENT_MOUSE: |
152 | // mouse_pos = get_mouse_pos(POS_WINDOW); // window relative |
||
153 | // mouse_button = get_mouse_eventstate(); |
||
6489 | siemargl | 154 | kolibri_handle_event_mouse(main_window); |
155 | if(menu1->click && menu1->cursor_out) |
||
156 | { |
||
157 | option1sel = opts1 + menu1->cursor_out - 1; // check bounds ? |
||
158 | (*option_box_draw)(option_group1); |
||
159 | } |
||
160 | if(menu2->click && menu2->cursor_out) |
||
161 | { |
||
162 | option2sel = opts2 + menu2->cursor_out - 1; // check bounds ? |
||
163 | (*option_box_draw)(option_group2); |
||
164 | } |
||
165 | if(menu3->click && menu3->cursor_out) |
||
166 | { |
||
167 | return 0; // quit |
||
168 | } |
||
8581 | rgimad | 169 | |
170 | break; |
||
6479 | siemargl | 171 | } |
172 | |||
173 | gui_event = get_os_event(); |
||
8581 | rgimad | 174 | } while(1) ; /* End of main activity loop */ |
6479 | siemargl | 175 | |
8581 | rgimad | 176 | return 0; |
177 | } |
||
178 |