void *focused_control_id; /* uses the memory location of various locking
controls as an id */
char *textbuf;
- struct ui_dropdown_value{
- i32 index, value;
- }
- *ptr_dropdown;
+ i32 *ptr_enum;
};
u32 focused_control_hit;
enum ui_control_type{
k_ui_control_none,
k_ui_control_textbox,
- k_ui_control_dropdown,
+ k_ui_control_enum,
k_ui_control_modal
}
focused_control_type;
- union{
- struct ui_textbuf{
- int cursor_user, cursor_pos;
- u32 len;
- u32 flags;
-
- struct ui_textbox_callbacks{
- void (*enter)( char *, u32 ),
- (*up)( char *, u32 ),
- (*down)( char *, u32 ),
- (*change)( char *, u32 );
+ union{ /* controls that can be focused */
+ struct ui_textbuf{
+ int cursor_user, cursor_pos;
+ u32 len;
+ u32 flags;
+
+ struct ui_textbox_callbacks{
+ void (*enter)( char *, u32 ),
+ (*up)( char *, u32 ),
+ (*down)( char *, u32 ),
+ (*change)( char *, u32 );
+ }
+ callbacks;
}
- callbacks;
- }
- textbox;
+ textbox;
- struct ui_dropdown{
- struct ui_dropdown_opt{
- const char *alias;
- i32 value;
+ struct ui_enum{
+ struct ui_enum_opt{
+ i32 value;
+ const char *alias;
+ }
+ *options;
+ u32 option_count;
+ ui_rect rect;
}
- *options;
- u32 option_count;
- ui_rect rect;
- }
- dropdown;
+ _enum;
};
+
struct ui_modal{
const char *message;
u32 options;
vg_ui.focused_control_type = k_ui_control_none;
}
-static int ui_colourbutton( ui_rect rect, enum ui_scheme_colour colour )
-{
+enum ui_button_state {
+ k_ui_button_none = 0,
+ k_ui_button_click = 1,
+ k_ui_button_holding_inside = 2,
+ k_ui_button_holding_outside = 3,
+ k_ui_button_hover = 4
+};
+
+static enum ui_button_state ui_colourbutton( ui_rect rect,
+ enum ui_scheme_colour colour ){
int clickup= ui_click_up(UI_MOUSE_LEFT),
click = ui_clicking(UI_MOUSE_LEFT) | clickup,
target = ui_inside_rect( rect, vg_ui.mouse_click ) && click,
vg_ui.click_fade_opacity = 1.0f;
ui_defocus_all();
- return 1;
+ return k_ui_button_click;
}
else{
ui_fill( rect, col_highlight );
- return 0;
+ return k_ui_button_holding_inside;
}
}
else{
ui_fill( rect, col_base );
ui_outline( rect, 1, col_highlight );
- return 0;
+ return k_ui_button_holding_outside;
}
}
else{
ui_fill( rect, col_base );
- return 0;
+ return k_ui_button_none;
}
}
else{
if( hover ){
ui_fill( rect, col_hover );
- return 0;
+ return k_ui_button_hover;
}
else{
ui_fill( rect, col_base );
- return 0;
+ return k_ui_button_none;
}
}
}
-static int ui_colourbutton_text( ui_rect rect, const char *string, ui_px scale,
- enum ui_scheme_colour colour )
-{
- int result = ui_colourbutton( rect, colour );
+static enum ui_button_state ui_colourbutton_text(
+ ui_rect rect, const char *string, ui_px scale,
+ enum ui_scheme_colour colour ){
+ enum ui_button_state state = ui_colourbutton( rect, colour );
ui_rect t = { 0,0, ui_text_line_width( string )*scale, 14*scale };
ui_rect_center( rect, t );
- ui_text( t, string, scale, k_ui_align_left, ui_colourcont(colour) );
- return result;
+
+ u32 text_colour = ui_colourcont(colour);
+ if( state == k_ui_button_holding_inside )
+ text_colour = colour;
+
+ ui_text( t, string, scale, k_ui_align_left, text_colour );
+ return state;
}
-static int ui_button_text( ui_rect rect, const char *string, ui_px scale )
-{
+static enum ui_button_state ui_button_text( ui_rect rect,
+ const char *string, ui_px scale ){
return ui_colourbutton_text( rect, string, scale, k_ui_bg+4 );
}
ui_fill( rect, colour );
}
- if( vg_ui.focused_control_type == k_ui_control_dropdown ){
+ if( vg_ui.focused_control_type == k_ui_control_enum ){
ui_enum_post();
}
else if( vg_ui.focused_control_type == k_ui_control_modal ){
ui_rect_center( row1, btn );
vg_ui.focused_control_type = k_ui_control_none; /* HACK */
- if( !ui_button_text( btn, "OK", 1 ) )
+ if( ui_button_text( btn, "OK", 1 ) != 1 )
vg_ui.focused_control_hit = 1;
vg_ui.focused_control_type = k_ui_control_modal; /* HACK */
vg_ui.wants_mouse = 1;
* -----------------------------------------------------------------------------
*/
-static int ui_checkbox( ui_rect rect, const char *str_label, int *data )
-{
+static int ui_checkbox( ui_rect rect, const char *str_label, int *data ){
ui_rect label, box;
ui_split( rect, k_ui_axis_v, -rect[3], 0, label, box );
ui_text( label, str_label, 1, k_ui_align_middle_left, 0 );
- int changed = ui_colourbutton( box, k_ui_bg );
+ int changed = ui_colourbutton( box, k_ui_bg )==1;
if( changed )
*data = (*data) ^ 0x1;
* postrender step.
*/
static void ui_enum( ui_rect rect, const char *str_label,
- struct ui_dropdown_opt *options, u32 len,
- struct ui_dropdown_value *value )
+ struct ui_enum_opt *options, u32 len, i32 *value )
{
ui_rect label, box;
ui_split( rect, k_ui_axis_v, ui_text_line_width( str_label ) + 8,
0, label, box );
ui_text( label, str_label, 1, k_ui_align_middle_left, 0 );
- if( ui_button_text( box, options[ value->index ].alias, 1 ) ){
- vg_ui.focused_control_type = k_ui_control_dropdown;
- vg_ui.ptr_dropdown = value;
- vg_ui.dropdown.option_count = len;
- vg_ui.dropdown.options = options;
- rect_copy( box, vg_ui.dropdown.rect );
+ const char *display = "OUT OF RANGE";
+ for( u32 i=0; i<len; i ++ ){
+ if( *value == options[i].value ){
+ display = options[i].alias;
+ break;
+ }
+ }
+
+ if( ui_button_text( box, display, 1 ) == 1 ){
+ vg_ui.focused_control_type = k_ui_control_enum;
+ vg_ui.ptr_enum = value;
+ vg_ui._enum.option_count = len;
+ vg_ui._enum.options = options;
+ rect_copy( box, vg_ui._enum.rect );
}
}
-static void ui_enum_post(void)
-{
+static void ui_enum_post(void){
ui_rect drawer;
- rect_copy( vg_ui.dropdown.rect, drawer );
- drawer[3] *= vg_ui.dropdown.option_count;
+ rect_copy( vg_ui._enum.rect, drawer );
+ drawer[3] *= vg_ui._enum.option_count;
int close = 0;
int clickany= ui_click_up(UI_MOUSE_LEFT|UI_MOUSE_RIGHT|UI_MOUSE_MIDDLE),
/* HACK */
vg_ui.focused_control_type = k_ui_control_none;
- struct ui_dropdown_value *value = vg_ui.ptr_dropdown;
+ i32 *value = vg_ui.ptr_enum;
- for( u32 i=0; i<vg_ui.dropdown.option_count; i++ ){
+ for( u32 i=0; i<vg_ui._enum.option_count; i++ ){
ui_rect button;
- ui_split( drawer, k_ui_axis_h, vg_ui.dropdown.rect[3], 0, button,drawer );
+ ui_split( drawer, k_ui_axis_h, vg_ui._enum.rect[3], 0, button,drawer );
enum ui_scheme_colour colour = k_ui_bg+3;
- if( i == value->index ) colour = k_ui_orange;
+ if( vg_ui._enum.options[i].value == *value )
+ colour = k_ui_orange;
- if( ui_colourbutton_text( button, vg_ui.dropdown.options[i].alias, 1,
- colour ) ){
- value->index = i;
- value->value = vg_ui.dropdown.options[i].value;
+ if( ui_colourbutton_text( button, vg_ui._enum.options[i].alias, 1,
+ colour ) == 1 ){
+ *value = vg_ui._enum.options[i].value;
close = 1;
}
}
/* HACK */
- vg_ui.focused_control_type = k_ui_control_dropdown;
+ vg_ui.focused_control_type = k_ui_control_enum;
if( !close )
vg_ui.focused_control_hit = 1;
if( flags & k_vgi_window_closeable ){
ui_rect quit_button;
ui_split( bar, k_ui_axis_v, bar[2]-bar[3], 2, bar, quit_button );
- if( ui_button_text( quit_button, "X", 1 ) ){
+ if( ui_button_text( quit_button, "X", 1 ) == 1 ){
return 0;
}
}