0,0 → 1,213 |
/* |
Scrollbar and Progressbar usage example KolibriOS GUI lib |
|
Free for all |
|
Initially written by Siemargl, 2016 |
|
|
ToDo |
*/ |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include "kolibri_gui.h" |
#include "kos32sys.h" |
|
// codes copied from \programs\cmm\lib\keyboard.h, but they're decimal |
//ASCII KEYS |
#define ASCII_KEY_BS 8 |
#define ASCII_KEY_TAB 9 |
#define ASCII_KEY_ENTER 13 |
#define ASCII_KEY_ESC 27 |
#define ASCII_KEY_DEL 182 |
#define ASCII_KEY_INS 185 |
#define ASCII_KEY_SPACE 32 |
|
#define ASCII_KEY_LEFT 176 |
#define ASCII_KEY_RIGHT 179 |
#define ASCII_KEY_DOWN 177 |
#define ASCII_KEY_UP 178 |
#define ASCII_KEY_HOME 180 |
#define ASCII_KEY_END 181 |
#define ASCII_KEY_PGDN 183 |
#define ASCII_KEY_PGUP 184 |
|
//SCAN CODE KEYS |
#define SCAN_CODE_BS 14 |
#define SCAN_CODE_TAB 15 |
#define SCAN_CODE_ENTER 28 |
#define SCAN_CODE_ESC 1 |
#define SCAN_CODE_DEL 83 |
#define SCAN_CODE_INS 82 |
#define SCAN_CODE_SPACE 57 |
|
#define SCAN_CODE_LEFT 75 |
#define SCAN_CODE_RIGHT 77 |
#define SCAN_CODE_DOWN 80 |
#define SCAN_CODE_UP 72 |
#define SCAN_CODE_HOME 71 |
#define SCAN_CODE_END 79 |
#define SCAN_CODE_PGDN 81 |
#define SCAN_CODE_PGUP 73 |
|
#define KEY_LSHIFT 00000000001b |
#define KEY_RSHIFT 00000000010b |
#define KEY_LCTRL 00000000100b |
#define KEY_RCTRL 00000001000b |
#define KEY_LALT 00000010000b |
#define KEY_RALT 00000100000b |
#define KEY_CAPSLOCK 00001000000b |
#define KEY_NUMLOCK 00010000000b |
#define KEY_SCROLLLOCK 00100000000b |
#define KEY_LWIN 01000000000b |
#define KEY_RWIN 10000000000b |
|
|
int main() |
{ |
/* Load all libraries, initialize global tables like system color table and |
operations table. kolibri_gui_init() will EXIT with mcall -1 if it fails |
to do it's job. This is all you need to call and all libraries and GUI |
elements can be used after a successful call to this function |
*/ |
kolibri_gui_init(); |
int gui_event = KOLIBRI_EVENT_REDRAW; |
uint32_t pressed_button = 0; |
// uint32_t mouse_button; |
// pos_t mouse_pos; |
oskey_t keypress; |
|
int value = 40; // showed value |
int valuechange = 0; |
|
// creating GUI using library functions |
kolibri_window *main_window = kolibri_new_window(50, 50, 400, 400, "Scrollbar and progressbar showcase"); |
statictext *txt = kolibri_new_statictext_def(X_Y(10,30), "StaticText default 6x9. Use Arrows or PgUp/PgDn"); |
statictext *txt2 = kolibri_new_statictext(X_Y(10,40), "StaticText 8x16 x2:", CP866, 1, kolibri_color_table.color_work_text, 0); |
staticnum *num = kolibri_new_staticnum_def(X_Y(10 + (strlen("StaticText 8x16 x2:") + 2) * 8 * 2, 40), 3, value); |
scrollbar *sbh = kolibri_new_scrollbar(X_Y(30, 300), X_Y(370, 15), 15, 100, 10, value, kolibri_color_table.color_work_area, kolibri_color_table.color_work_button, 0); |
scrollbar *sbv = kolibri_new_scrollbar(X_Y(370, 15), X_Y(50, 300), 15, 100, 10, value, kolibri_color_table.color_work_area, kolibri_color_table.color_work_button, 0); |
progressbar *pg = kolibri_new_progressbar(0, 100, value, 10, 80, 200, 20); |
|
kolibri_window_add_element(main_window, KOLIBRI_STATICTEXT, txt); |
kolibri_window_add_element(main_window, KOLIBRI_STATICTEXT, txt2); |
kolibri_window_add_element(main_window, KOLIBRI_STATICNUM, num); |
kolibri_window_add_element(main_window, KOLIBRI_SCROLL_BAR_H, sbh); |
kolibri_window_add_element(main_window, KOLIBRI_SCROLL_BAR_V, sbv); |
kolibri_window_add_element(main_window, KOLIBRI_PROGRESS_BAR, pg); |
|
do /* Start of main activity loop */ |
{ |
switch(gui_event) |
{ |
case KOLIBRI_EVENT_REDRAW: |
sbh->all_redraw = sbv->all_redraw = 1; // resetted |
kolibri_handle_event_redraw(main_window); |
valuechange = 0; |
break; |
case KOLIBRI_EVENT_NONE: |
break; |
case KOLIBRI_EVENT_KEY: |
keypress = get_key(); |
// add logic to find focused active widget |
// we have only one reaction |
switch (keypress.ctrl_key) |
{ |
case SCAN_CODE_UP: case SCAN_CODE_RIGHT: |
if(value < 100) |
{ |
value++; valuechange = 1; |
progressbar_progress(pg); // +1 and redraw self |
} |
break; |
case SCAN_CODE_PGUP: |
if(value < 100) |
{ |
value += 10; valuechange = 1; |
if (value > 100) value = 100; |
} |
break; |
case SCAN_CODE_DOWN: case SCAN_CODE_LEFT: |
if(value > 0) |
{ |
value--; valuechange = 1; |
} |
break; |
case SCAN_CODE_PGDN: |
if(value > 0) |
{ |
value -= 10; valuechange = 1; |
if (value < 0) value = 0; |
} |
break; |
} |
kolibri_handle_event_key(main_window); // ??????? |
break; |
case KOLIBRI_EVENT_BUTTON: |
pressed_button = get_os_button(); |
switch (pressed_button) |
{ |
case BTN_QUIT: |
return 0; |
break; |
} |
break; |
case KOLIBRI_EVENT_MOUSE: |
// mouse_pos = get_mouse_pos(POS_WINDOW); // window relative |
// mouse_button = get_mouse_eventstate(); |
// add logic to find widget under mouse |
kolibri_handle_event_mouse(main_window); |
if (sbh->position != value) // scrollbars was changed |
{ |
value = sbh->position; |
valuechange = 1; |
}else |
if (sbv->position != value) // scrollbars was changed |
{ |
value = sbv->position; |
valuechange = 1; |
} |
/* debug_board_printf("mouse ev (%d,%d)%x\n", mouse_pos.x, mouse_pos.y, mouse_button); |
if (mouse_button & (1<<24)) // double click |
{ |
} |
// ignore |
*/ |
break; |
} |
if(valuechange) |
{ |
debug_board_printf("value change (%d)\n", value); |
num->number = value; |
sbh->position = value; |
sbv->position = value; |
pg->value = value; |
gui_event = KOLIBRI_EVENT_REDRAW; |
continue; |
} |
|
gui_event = wait_for_event(10); // 100 = 1 sec |
} while(1) ; /* End of main activity loop */ |
|
return 0; |
} |
/* |
void __attribute__ ((noinline)) debug_board_write_str(const char* str){ |
while(*str) |
debug_board_write_byte(*str++); |
} |
|
void __attribute__ ((noinline)) debug_board_printf(const char *format,...) |
{ |
va_list ap; |
char log_board[300]; |
|
va_start (ap, format); |
tiny_vsnprintf(log_board, sizeof log_board, format, ap); |
va_end(ap); |
debug_board_write_str(log_board); |
|
} |
*/ |