overlays/osk: fix selection after changing panels

We now try to keep the current x and y selected after panel changes.
Also change some copy to ref
This commit is contained in:
Megamouse 2020-03-15 14:17:33 +01:00
parent c63f77e3b0
commit fd8cda0f2b
2 changed files with 56 additions and 40 deletions

View file

@ -76,7 +76,7 @@ namespace rsx
{ {
ASSERT(m_panel_index < m_panels.size()); ASSERT(m_panel_index < m_panels.size());
const auto panel = m_panels[m_panel_index]; const auto& panel = m_panels[m_panel_index];
num_rows = panel.num_rows; num_rows = panel.num_rows;
num_columns = panel.num_columns; num_columns = panel.num_columns;
@ -92,6 +92,8 @@ namespace rsx
const position2u grid_origin = { m_frame.x, m_frame.y + 30u + m_preview.h }; const position2u grid_origin = { m_frame.x, m_frame.y + 30u + m_preview.h };
const u32 old_index = (selected_y * num_columns) + selected_x;
u32 index = 0; u32 index = 0;
for (const auto& props : panel.layout) for (const auto& props : panel.layout)
@ -189,13 +191,16 @@ namespace rsx
verify(HERE), num_shift_layers_by_charset[layer]; verify(HERE), num_shift_layers_by_charset[layer];
} }
// TODO: Should just scan for the first enabled cell // Reset to first shift layer in the first charset, because the panel changed and we don't know if the layers are similar between panels.
selected_x = selected_y = selected_z = 0;
m_grid[0].selected = true;
m_selected_charset = 0; m_selected_charset = 0;
selected_z = 0;
// Enable/Disable the control buttons based on the current layout.
update_controls(); update_controls();
// Roughly keep x and y selection in grid if possible. Jumping to (0,0) would be annoying. Needs to be done after updating the control buttons.
update_selection_by_index(old_index);
m_update = true; m_update = true;
} }
@ -318,38 +323,44 @@ namespace rsx
m_update = true; m_update = true;
} }
void osk_dialog::on_button_pressed(pad_button button_press) std::pair<u32, u32> osk_dialog::get_cell_geometry(u32 index)
{ {
const auto index_limit = (num_columns * num_rows) - 1; const auto index_limit = (num_columns * num_rows) - 1;
u32 start_index = index;
u32 count = 0;
auto get_cell_geometry = [&](u32 index) while (start_index > index_limit && start_index >= num_columns)
{ {
u32 start_index = index, count = 0; // Try one row above
start_index -= num_columns;
}
// Find first cell // Find first cell
while (!(m_grid[start_index].flags & border_flags::left) && start_index) while (!(m_grid[start_index].flags & border_flags::left) && start_index)
{
--start_index;
}
// Find last cell
while (true)
{
const auto current_index = (start_index + count);
verify(HERE), current_index <= index_limit;
if (m_grid[current_index].flags & border_flags::right)
{ {
start_index--; ++count;
break;
} }
// Find last cell ++count;
while (true) }
{
const auto current_index = (start_index + count);
verify(HERE), current_index <= index_limit;
if (m_grid[current_index].flags & border_flags::right) return std::make_pair(start_index, count);
{ }
count++;
break;
}
count++;
}
return std::make_pair(start_index, count);
};
void osk_dialog::update_selection_by_index(u32 index)
{
auto select_cell = [&](u32 index, bool state) auto select_cell = [&](u32 index, bool state)
{ {
const auto info = get_cell_geometry(index); const auto info = get_cell_geometry(index);
@ -361,17 +372,19 @@ namespace rsx
} }
}; };
auto decode_index = [&](u32 index) // 1. Deselect current
{ const auto current_index = (selected_y * num_columns) + selected_x;
// 1. Deselect current select_cell(current_index, false);
auto current_index = (selected_y * num_columns) + selected_x;
select_cell(current_index, false);
// 2. Select new // 2. Select new
selected_y = index / num_columns; selected_y = index / num_columns;
selected_x = index % num_columns; selected_x = index % num_columns;
select_cell(index, true); select_cell(index, true);
}; }
void osk_dialog::on_button_pressed(pad_button button_press)
{
const auto index_limit = (num_columns * num_rows) - 1;
auto on_accept = [&]() auto on_accept = [&]()
{ {
@ -430,7 +443,7 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled) if (m_grid[get_cell_geometry(current_index).first].enabled)
{ {
decode_index(current_index); update_selection_by_index(current_index);
m_update = true; m_update = true;
break; break;
} }
@ -450,7 +463,7 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled) if (m_grid[get_cell_geometry(current_index).first].enabled)
{ {
decode_index(current_index); update_selection_by_index(current_index);
m_update = true; m_update = true;
break; break;
} }
@ -475,7 +488,7 @@ namespace rsx
if (m_grid[get_cell_geometry(current_index).first].enabled) if (m_grid[get_cell_geometry(current_index).first].enabled)
{ {
decode_index(current_index); update_selection_by_index(current_index);
m_update = true; m_update = true;
break; break;
} }
@ -490,7 +503,7 @@ namespace rsx
current_index -= num_columns; current_index -= num_columns;
if (m_grid[get_cell_geometry(current_index).first].enabled) if (m_grid[get_cell_geometry(current_index).first].enabled)
{ {
decode_index(current_index); update_selection_by_index(current_index);
m_update = true; m_update = true;
break; break;
} }

View file

@ -89,6 +89,7 @@ namespace rsx
void update() override; void update() override;
void update_controls(); void update_controls();
void update_selection_by_index(u32 index);
void on_button_pressed(pad_button button_press) override; void on_button_pressed(pad_button button_press) override;
void on_text_changed(); void on_text_changed();
@ -102,6 +103,8 @@ namespace rsx
std::u32string get_placeholder(); std::u32string get_placeholder();
std::pair<u32, u32> get_cell_geometry(u32 index);
compiled_resource get_compiled() override; compiled_resource get_compiled() override;
}; };
} }