[ui, textbox] Scroll text inside text box to always show edit cursor.
This commit is contained in:
parent
592f4cdecd
commit
1af132352a
|
@ -922,7 +922,7 @@ static void mp_process_mouse_button(NSEvent* nsEvent, mp_window_data* window, mp
|
||||||
mp_event event = {};
|
mp_event event = {};
|
||||||
event.window = mp_window_handle_from_ptr(window);
|
event.window = mp_window_handle_from_ptr(window);
|
||||||
event.type = MP_EVENT_KEYBOARD_KEY;
|
event.type = MP_EVENT_KEYBOARD_KEY;
|
||||||
event.key.action = MP_KEY_PRESS;
|
event.key.action = action;
|
||||||
event.key.code = mp_convert_osx_key([nsEvent keyCode]);
|
event.key.code = mp_convert_osx_key([nsEvent keyCode]);
|
||||||
event.key.mods = mp_convert_osx_mods([nsEvent modifierFlags]);
|
event.key.mods = mp_convert_osx_mods([nsEvent modifierFlags]);
|
||||||
|
|
||||||
|
@ -930,7 +930,7 @@ static void mp_process_mouse_button(NSEvent* nsEvent, mp_window_data* window, mp
|
||||||
event.key.labelLen = label.len;
|
event.key.labelLen = label.len;
|
||||||
memcpy(event.key.label, label.ptr, label.len);
|
memcpy(event.key.label, label.ptr, label.len);
|
||||||
|
|
||||||
mp_update_key_state(&__mpApp.inputState.keyboard.keys[event.key.code], MP_KEY_PRESS);
|
mp_update_key_state(&__mpApp.inputState.keyboard.keys[event.key.code], action);
|
||||||
|
|
||||||
mp_queue_event(&event);
|
mp_queue_event(&event);
|
||||||
|
|
||||||
|
|
27
src/ui.c
27
src/ui.c
|
@ -2214,7 +2214,8 @@ ui_text_box_result ui_text_box(const char* name, mem_arena* arena, str8 text)
|
||||||
{
|
{
|
||||||
const ui_edit_command* command = &(UI_EDIT_COMMANDS[i]);
|
const ui_edit_command* command = &(UI_EDIT_COMMANDS[i]);
|
||||||
|
|
||||||
if(mp_key_pressed(command->key) && mods == command->mods)
|
if( (mp_key_pressed(command->key) || mp_key_repeated(command->key))
|
||||||
|
&& mods == command->mods)
|
||||||
{
|
{
|
||||||
codepoints = ui_edit_perform_operation(ui, command->operation, command->move, command->direction, codepoints);
|
codepoints = ui_edit_perform_operation(ui, command->operation, command->move, command->direction, codepoints);
|
||||||
break;
|
break;
|
||||||
|
@ -2235,7 +2236,29 @@ ui_text_box_result ui_text_box(const char* name, mem_arena* arena, str8 text)
|
||||||
result.text = utf8_push_from_codepoints(arena, codepoints);
|
result.text = utf8_push_from_codepoints(arena, codepoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO slide contents
|
//NOTE slide contents
|
||||||
|
{
|
||||||
|
if(ui->editCursor < ui->editFirstDisplayedChar)
|
||||||
|
{
|
||||||
|
ui->editFirstDisplayedChar = ui->editCursor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f32 textMargin = 5.; //TODO: pull this out and make it configurable
|
||||||
|
i32 firstDisplayedChar = ui->editFirstDisplayedChar;
|
||||||
|
str32 firstToCursor = str32_slice(codepoints, firstDisplayedChar, ui->editCursor);
|
||||||
|
mp_rect firstToCursorBox = mg_text_bounding_box_utf32(style->font, style->fontSize, firstToCursor);
|
||||||
|
|
||||||
|
while(firstToCursorBox.w > (frame->rect.w - 2*textMargin))
|
||||||
|
{
|
||||||
|
firstDisplayedChar++;
|
||||||
|
firstToCursor = str32_slice(codepoints, firstDisplayedChar, ui->editCursor);
|
||||||
|
firstToCursorBox = mg_text_bounding_box_utf32(style->font, style->fontSize, firstToCursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->editFirstDisplayedChar = firstDisplayedChar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//NOTE: set renderer
|
//NOTE: set renderer
|
||||||
str32* renderCodepoints = mem_arena_alloc_type(&ui->frameArena, str32);
|
str32* renderCodepoints = mem_arena_alloc_type(&ui->frameArena, str32);
|
||||||
|
|
Loading…
Reference in New Issue