diff options
Diffstat (limited to 'src/gui/checkbox.cpp')
| -rw-r--r-- | src/gui/checkbox.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/gui/checkbox.cpp b/src/gui/checkbox.cpp new file mode 100644 index 0000000..02cadc6 --- /dev/null +++ b/src/gui/checkbox.cpp @@ -0,0 +1,78 @@ +#include "base.h" + +const I32 CHECKBOX_SIZE = 14; + +void gui_checkbox_draw_fn( void* ptr ) { + GUI_CHECKBOX* check = (GUI_CHECKBOX*)ptr; + + I32 x = gui_relx( check ); + I32 y = gui_rely( check ); + + I32 half = CHECKBOX_SIZE / 2; + + CLR col = gui_is_fg_window( check )? ui_clr.border : ui_clr.border_inactive; + gui_draw_frect( x, y+2, CHECKBOX_SIZE, CHECKBOX_SIZE, col ); + gui_draw_frect( x+1, y+3, CHECKBOX_SIZE-2, CHECKBOX_SIZE-2, ui_clr.bg_sec ); + + if( *check->pval ) + gui_draw_str( x + half, y, ALIGN_C, FNT_JPN12, ui_clr.txt, "x" ); + + gui_draw_str( x + CHECKBOX_SIZE + 2, y, ALIGN_L, FNT_JPN12, ui_clr.txt, check->name ); +} + +void gui_checkbox_input_fn( void* ptr ) { + GUI_CHECKBOX* check = (GUI_CHECKBOX*)ptr; + + I32 x = gui_relx( check ); + I32 y = gui_rely( check ); + + U8 m1 = gui_mbutton_down( 0 ); + I32 mx, my; + gui_cursor_pos( &mx, &my ); + + gui_draw_get_str_bounds( &check->w, 0, FNT_JPN12, check->name ); + check->w += CHECKBOX_SIZE + 2; + + U8 inbounds = mx >= x && mx <= x + check->w && my >= y && my <= y + check->h; + + if( !m1 ) { + // checkbox could be destroyed by callback + U8 was_held = check->held; + check->held = 0; + if( inbounds && was_held ) { + *check->pval = !*check->pval; + if( check->cb ) + check->cb( check ); + } + + return; + } + + if( inbounds ) + check->held = 1; +} + +GUI_CHECKBOX* gui_checkbox( I32 x, I32 y, const char* title, U8* pval ) { + if( !gui_check_target() ) return 0; + + GUI_CHECKBOX* check = new GUI_CHECKBOX; + check->x = x; + check->y = y; + check->cb = 0; + check->ybound = check->h = 16; + check->draw_fn = gui_checkbox_draw_fn; + check->input_fn = gui_checkbox_input_fn; + + check->pval = pval; + + check->parent = _gui.cur_view; + strcpy( check->name, title ); + + gui_draw_get_str_bounds( &check->w, 0, FNT_JPN12, check->name ); + check->w += CHECKBOX_SIZE + 2; + check->xbound = check->w; + check->ybound = check->h; + + gui_get_view()->children.push( check ); + return check; +} |
