Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Caret upwards and downwards move in overlay_edit_text #8342

Merged
merged 3 commits into from Jul 2, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
61 changes: 60 additions & 1 deletion rpcs3/Emu/RSX/Overlays/overlay_edit_text.cpp
Expand Up @@ -5,6 +5,30 @@ namespace rsx
{
namespace overlays
{
static size_t get_line_start(const std::u32string& text, size_t pos)
{
if (pos == 0)
{
return 0;
}
const size_t line_start = text.rfind('\n', pos - 1);
if (line_start == std::string::npos)
{
return 0;
}
return line_start + 1;
}

static size_t get_line_end(const std::u32string& text, size_t pos)
{
const size_t line_end = text.find('\n', pos);
if (line_end == std::string::npos)
{
return text.length();
}
return line_end;
}

void edit_text::move_caret(direction dir)
{
switch (dir)
Expand All @@ -28,10 +52,45 @@ namespace rsx
break;
}
case up:
{
const size_t current_line_start = get_line_start(text, caret_position);
if (current_line_start == 0)
{
// This is the first line, so caret moves to the very beginning
caret_position = 0;
refresh();
break;
}
const size_t caret_pos_in_line = caret_position - current_line_start;
const size_t prev_line_end = current_line_start - 1;
const size_t prev_line_start = get_line_start(text, prev_line_end);
// TODO : Save caret position to some kind of buffer, so after switching back and forward, caret would be on initial position
caret_position = std::min(prev_line_end, prev_line_start + caret_pos_in_line);

refresh();
break;
}
case down:
// TODO
{
const size_t current_line_end = get_line_end(text, caret_position);
if (current_line_end == text.length())
{
// This is the last line, so caret moves to the very end
caret_position = current_line_end;
refresh();
break;
}
const size_t current_line_start = get_line_start(text, caret_position);
const size_t caret_pos_in_line = caret_position - current_line_start;
const size_t next_line_start = current_line_end + 1;
const size_t next_line_end = get_line_end(text, next_line_start);
// TODO : Save caret position to some kind of buffer, so after switching back and forward, caret would be on initial position
caret_position = std::min(next_line_end, next_line_start + caret_pos_in_line);

refresh();
break;
}
}
}

void edit_text::insert_text(const std::u32string& str)
Expand Down