overlays: fix osk placeholder

This commit is contained in:
Megamouse 2021-04-12 15:14:13 +02:00
parent fc9b3c13e6
commit 088d22675b
4 changed files with 68 additions and 39 deletions

View File

@ -468,7 +468,7 @@ namespace rsx
is_compiled = false;
}
void set_text(const std::u32string& text)
virtual void set_unicode_text(const std::u32string& text)
{
this->text = text;
is_compiled = false;
@ -476,7 +476,7 @@ namespace rsx
void set_text(localized_string_id id)
{
set_text(get_localized_u32string(id));
set_unicode_text(get_localized_u32string(id));
}
virtual void set_font(const char* font_name, u16 font_size)
@ -1101,10 +1101,18 @@ namespace rsx
u16 caret_position = 0;
u16 vertical_scroll_offset = 0;
bool m_reset_caret_pulse = 0;
bool m_reset_caret_pulse = false;
std::u32string value;
std::u32string placeholder;
using label::label;
void set_text(const std::string& text) override;
void set_unicode_text(const std::u32string& text) override;
void set_placeholder(const std::u32string& placeholder_text);
void move_caret(direction dir);
void insert_text(const std::u32string& str);
void erase();

View File

@ -46,7 +46,7 @@ namespace rsx
}
case direction::right:
{
if (caret_position < text.length())
if (caret_position < value.length())
{
caret_position++;
refresh();
@ -55,7 +55,7 @@ namespace rsx
}
case direction::up:
{
const usz current_line_start = get_line_start(text, caret_position);
const usz current_line_start = get_line_start(value, caret_position);
if (current_line_start == 0)
{
// This is the first line, so caret moves to the very beginning
@ -65,7 +65,7 @@ namespace rsx
}
const usz caret_pos_in_line = caret_position - current_line_start;
const usz prev_line_end = current_line_start - 1;
const usz prev_line_start = get_line_start(text, prev_line_end);
const usz prev_line_start = get_line_start(value, 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);
@ -74,18 +74,18 @@ namespace rsx
}
case direction::down:
{
const usz current_line_end = get_line_end(text, caret_position);
if (current_line_end == text.length())
const usz current_line_end = get_line_end(value, caret_position);
if (current_line_end == value.length())
{
// This is the last line, so caret moves to the very end
caret_position = current_line_end;
refresh();
break;
}
const usz current_line_start = get_line_start(text, caret_position);
const usz current_line_start = get_line_start(value, caret_position);
const usz caret_pos_in_line = caret_position - current_line_start;
const usz next_line_start = current_line_end + 1;
const usz next_line_end = get_line_end(text, next_line_start);
const usz next_line_end = get_line_end(value, 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);
@ -95,26 +95,51 @@ namespace rsx
}
}
void edit_text::set_text(const std::string& text)
{
set_unicode_text(utf8_to_u32string(text));
}
void edit_text::set_unicode_text(const std::u32string& text)
{
value = text;
if (value.empty())
{
overlay_element::set_unicode_text(placeholder);
}
else
{
overlay_element::set_unicode_text(value);
}
}
void edit_text::set_placeholder(const std::u32string& placeholder_text)
{
placeholder = placeholder_text;
}
void edit_text::insert_text(const std::u32string& str)
{
if (caret_position == 0)
{
// Start
text = str + text;
value = str + text;
}
else if (caret_position == text.length())
{
// End
text += str;
value += str;
}
else
{
// Middle
text.insert(caret_position, str);
value.insert(caret_position, str);
}
caret_position += ::narrow<u16>(str.length());
m_reset_caret_pulse = true;
set_unicode_text(value);
refresh();
}
@ -127,19 +152,20 @@ namespace rsx
if (caret_position == 1)
{
text = text.length() > 1 ? text.substr(1) : U"";
value = value.length() > 1 ? value.substr(1) : U"";
}
else if (caret_position == text.length())
{
text = text.substr(0, caret_position - 1);
value = value.substr(0, caret_position - 1);
}
else
{
text = text.substr(0, caret_position - 1) + text.substr(caret_position);
value = value.substr(0, caret_position - 1) + value.substr(caret_position);
}
caret_position--;
m_reset_caret_pulse = true;
set_unicode_text(value);
refresh();
}

View File

@ -250,26 +250,27 @@ namespace rsx
m_update = true;
}
void osk_dialog::initialize_layout(const std::u32string & title, const std::u32string & initial_text)
void osk_dialog::initialize_layout(const std::u32string& title, const std::u32string& initial_text)
{
m_background.set_size(1280, 720);
m_background.back_color.a = 0.8f;
m_frame.back_color = { 0.2f, 0.2f, 0.2f, 1.f };
m_title.set_text(title);
m_title.set_unicode_text(title);
m_title.back_color.a = 0.f;
if (initial_text.empty())
m_preview.set_placeholder(get_placeholder());
m_preview.set_unicode_text(initial_text);
if (m_preview.value.empty())
{
m_preview.set_text(get_placeholder());
m_preview.caret_position = 0;
m_preview.fore_color.a = 0.5f; // Muted contrast for hint text
}
else
{
m_preview.set_text(initial_text);
m_preview.caret_position = ::narrow<u16>(initial_text.length());
m_preview.caret_position = ::narrow<u16>(m_preview.value.length());
m_preview.fore_color.a = 1.f;
}
@ -343,14 +344,12 @@ namespace rsx
{
const auto current_index = (start_index + count);
ensure(current_index <= index_limit);
++count;
if (m_grid[current_index].flags & border_flags::right)
{
++count;
break;
}
++count;
}
return std::make_pair(start_index, count);
@ -559,7 +558,7 @@ namespace rsx
void osk_dialog::on_text_changed()
{
const auto ws = u32string_to_utf16(m_preview.text);
const auto ws = u32string_to_utf16(m_preview.value);
const auto length = (ws.length() + 1) * sizeof(char16_t);
memcpy(osk_text, ws.c_str(), length);
@ -568,6 +567,9 @@ namespace rsx
on_osk_input_entered();
}
// Muted contrast for placeholder text
m_preview.fore_color.a = m_preview.value.empty() ? 0.5f : 1.f;
m_update = true;
}
@ -579,20 +581,19 @@ namespace rsx
}
// Append to output text
if (m_preview.text == get_placeholder())
if (m_preview.value.empty())
{
m_preview.caret_position = ::narrow<u16>(str.length());
m_preview.set_text(str);
m_preview.fore_color.a = 1.f;
m_preview.set_unicode_text(str);
}
else
{
if (m_preview.text.length() == char_limit)
if (m_preview.value.length() == char_limit)
{
return;
}
const auto new_str = m_preview.text + str;
const auto new_str = m_preview.value + str;
if (new_str.length() <= char_limit)
{
m_preview.insert_text(str);
@ -641,12 +642,6 @@ namespace rsx
void osk_dialog::on_backspace(const std::u32string&)
{
m_preview.erase();
if (m_preview.text.empty())
{
m_preview.set_text(get_placeholder());
}
on_text_changed();
}
@ -752,7 +747,7 @@ namespace rsx
m_label.fore_color = c.enabled ? normal_fore_color : disabled_fore_color;
const auto _z = (selected_z < output_count) ? selected_z : output_count - 1u;
m_label.set_text(c.outputs[m_selected_charset][_z]);
m_label.set_unicode_text(c.outputs[m_selected_charset][_z]);
m_label.align_text(rsx::overlays::overlay_element::text_align::center);
render_label = true;
}

View File

@ -129,7 +129,7 @@ namespace rsx
default: break;
}
text_view.set_text(get_localized_u32string(string_id, trophy.name));
text_view.set_unicode_text(get_localized_u32string(string_id, trophy.name));
text_view.auto_resize();
// Resize background to cover the text