Subversion Repositories Kolibri OS

Rev

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