2016-08-12 18:27:24 +02:00
/*
2016-08-15 21:52:50 +02:00
KolibriGUI demobox
- Scrollbar
- Progressbar
- StaticText
- StaticNum
2016-08-12 18:27:24 +02:00
Free for all
Initially written by Siemargl , 2016
ToDo
*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "kos32sys.h"
2016-08-15 21:52:50 +02:00
# include "kolibri_gui.h"
2016-08-12 18:27:24 +02:00
// 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
2016-09-08 20:54:17 +02:00
kolibri_window * main_window = kolibri_new_window ( 50 , 40 , 400 , 400 , " Scrollbar and progressbar showcase " ) ;
statictext * txt = kolibri_new_statictext_def ( X_Y ( 10 , 20 ) , " StaticText default 6x9. Use Arrows or PgUp/PgDn " ) ;
statictext * txt2 = kolibri_new_statictext ( X_Y ( 10 , 30 ) , " 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 , 30 ) , 3 , value ) ;
2016-09-20 02:42:12 +02:00
scrollbar * sbh = kolibri_new_scrollbar ( X_Y ( 30 , 300 ) , X_Y ( 350 , 15 ) , 15 , 100 , 10 , value , kolibri_color_table . color_work_area , kolibri_color_table . color_work_button , 0 ) ;
2016-09-08 20:54:17 +02:00
scrollbar * sbv = kolibri_new_scrollbar ( X_Y ( 370 , 15 ) , X_Y ( 40 , 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 , 70 , 200 , 20 ) ;
2016-08-12 18:27:24 +02:00
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 :
2016-09-19 13:17:21 +02:00
sbh - > all_redraw = sbv - > all_redraw = 1 ; // resetted by sbar
2016-08-12 18:27:24 +02:00
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 ;
}
2016-10-20 19:13:23 +02:00
kolibri_handle_event_key ( main_window , keypress ) ;
2016-08-12 18:27:24 +02:00
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
2016-09-19 13:17:21 +02:00
kolibri_handle_event_mouse ( main_window ) ;
// we can optimize a lot, if sb->delta2 == 1 then call sb->mouse() and redraw only if sb->redraw with flag all_redraw = 0 (only runner). Then reset redraw. OMG (
2016-08-12 18:27:24 +02:00
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 ) ;
}
*/