struct
{
i32 cursor_user, cursor_pos;
+ u32 flags;
c8 *text_buffer;
u32 text_buffer_length;
enum ui_text_encoding text_buffer_encoding;
+ enum textbox_action action;
}
textbox;
}
else if( action == k_ui_action_enter )
{
- _ui_textbox_input_string( (const c8[]){ '\n', 0 } );
- //_ui.active_control_type = k_ui_control_none;
+ if( _ui.controls.textbox.flags & UI_MULTILINE )
+ _ui_textbox_input_string( (const c8[]){ '\n', 0 } );
+ else
+ _ui.controls.textbox.action = k_textbox_enter;
}
else if( action == k_ui_action_home )
_ui_textbox_set_cursor_user( 0, super );
}
else if( action == k_ui_action_up )
{
- i16 user_co[2] = {-1, -1};
- i32 result_index = -1;
- struct ui_string_decoder decoder, decoder1;
- ui_string_decode_init( &decoder, _ui.controls.textbox.text_buffer, _ui.controls.textbox.text_buffer_encoding );
- decoder1 = decoder;
- bool loop; do
- {
- loop = ui_string_decode( &decoder );
- if( decoder.character_index == _ui.controls.textbox.cursor_user )
- {
- user_co[0] = decoder.grid_co[0];
- user_co[1] = decoder.grid_co[1];
- loop = 0;
- }
- } while( loop );
- bool loop1; do
- {
- loop1 = ui_string_decode( &decoder1 );
- if( decoder1.grid_co[1] == user_co[1]-1 )
- if( decoder1.grid_co[0] <= user_co[0] )
- result_index = decoder1.character_index;
- } while( loop1 );
-
- if( result_index != -1 )
- _ui_textbox_set_cursor_user( result_index, super );
+ if( _ui.controls.textbox.flags & UI_MULTILINE )
+ {
+ i16 user_co[2] = {-1, -1};
+ i32 result_index = -1;
+ struct ui_string_decoder decoder, decoder1;
+ ui_string_decode_init( &decoder, _ui.controls.textbox.text_buffer, _ui.controls.textbox.text_buffer_encoding );
+ decoder1 = decoder;
+ bool loop; do
+ {
+ loop = ui_string_decode( &decoder );
+ if( decoder.character_index == _ui.controls.textbox.cursor_user )
+ {
+ user_co[0] = decoder.grid_co[0];
+ user_co[1] = decoder.grid_co[1];
+ loop = 0;
+ }
+ } while( loop );
+ bool loop1; do
+ {
+ loop1 = ui_string_decode( &decoder1 );
+ if( decoder1.grid_co[1] == user_co[1]-1 )
+ if( decoder1.grid_co[0] <= user_co[0] )
+ result_index = decoder1.character_index;
+ } while( loop1 );
+
+ if( result_index != -1 )
+ _ui_textbox_set_cursor_user( result_index, super );
+ }
+ else
+ _ui.controls.textbox.action = k_textbox_input_up;
}
else if( action == k_ui_action_down )
{
- i16 user_co[2] = { -1, -1 };
- i32 result_index = -1;
- struct ui_string_decoder decoder;
- ui_string_decode_init( &decoder, _ui.controls.textbox.text_buffer, _ui.controls.textbox.text_buffer_encoding );
- bool loop; do
- {
- loop = ui_string_decode( &decoder );
- if( decoder.character_index == _ui.controls.textbox.cursor_user )
- {
- user_co[0] = decoder.grid_co[0];
- user_co[1] = decoder.grid_co[1];
- }
- if( decoder.grid_co[1] == user_co[1]+1 )
- if( decoder.grid_co[0] <= user_co[0] )
- result_index = decoder.character_index;
- } while( loop );
+ if( _ui.controls.textbox.flags & UI_MULTILINE )
+ {
+ i16 user_co[2] = { -1, -1 };
+ i32 result_index = -1;
+ struct ui_string_decoder decoder;
+ ui_string_decode_init( &decoder, _ui.controls.textbox.text_buffer, _ui.controls.textbox.text_buffer_encoding );
+ bool loop; do
+ {
+ loop = ui_string_decode( &decoder );
+ if( decoder.character_index == _ui.controls.textbox.cursor_user )
+ {
+ user_co[0] = decoder.grid_co[0];
+ user_co[1] = decoder.grid_co[1];
+ }
+ if( decoder.grid_co[1] == user_co[1]+1 )
+ if( decoder.grid_co[0] <= user_co[0] )
+ result_index = decoder.character_index;
+ } while( loop );
- if( result_index != -1 )
- _ui_textbox_set_cursor_user( result_index, super );
+ if( result_index != -1 )
+ _ui_textbox_set_cursor_user( result_index, super );
+ }
+ else
+ _ui.controls.textbox.action = k_textbox_input_up;
}
else if( action == k_ui_action_indent )
{
i16 kerning[3];
_font_get_kerning( kerning );
- if( (_ui_button( rect ) == k_button_click) || (flags & UI_AUTOFOCUS) )
+ bool init = 0;
+ if( _ui_button( rect ) == k_button_click )
+ init = 1;
+
+ if( flags & UI_AUTOFOCUS )
+ {
+ if( _ui.active_control_type != k_ui_control_textbox )
+ init = 1;
+ else if( _ui.controls.textbox.text_buffer != text_buffer )
+ init = 1;
+
+ if( init )
+ {
+ _ui.controls.textbox.cursor_pos = 0;
+ _ui.controls.textbox.cursor_user = 0;
+ }
+ }
+
+ if( init )
{
_ui.active_control_type = k_ui_control_textbox;
_ui.controls.textbox.text_buffer = text_buffer;
_ui.controls.textbox.text_buffer_length = text_buffer_length;
_ui.controls.textbox.text_buffer_encoding = _ui.text_encoding;
+ _ui.controls.textbox.flags = flags;
+ _ui.controls.textbox.action = k_textbox_no_action;
}
union colour text_colour = (union colour){{255,255,255,255}};
}
}
_ui_text( rect, text_buffer, k_ui_align_x_left, text_colour );
- return k_textbox_no_action;
+
+ enum textbox_action return_action = _ui.controls.textbox.action;
+ _ui.controls.textbox.action = k_textbox_no_action;
+ if( (return_action == k_textbox_enter) && !(flags & UI_MULTILINE ) )
+ _ui.active_control_type = k_ui_control_none;
+ return return_action;
}
enum dropdown_action _ui_dropdown( i16 rect[4], struct ui_dropdown_option *options, u32 option_count, i32 *value )