mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-10 16:49:36 +00:00
add checks to prevent crashes when showing an empty menu (#3060)
* add checks to prevent crashes when showing an empty menu * Update firmware/application/ui/ui_btngrid.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -188,6 +188,13 @@ void BtnGridView::insert_item(const GridItem& new_item, size_t position, bool in
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BtnGridView::show_hide_arrows() {
|
void BtnGridView::show_hide_arrows() {
|
||||||
|
// if there are no menu items, disable both arrows and avoid size-1 underflow
|
||||||
|
if (menu_items.empty()) {
|
||||||
|
set_arrow_up_enabled(false);
|
||||||
|
set_arrow_down_enabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (highlighted_item == 0) {
|
if (highlighted_item == 0) {
|
||||||
set_arrow_up_enabled(false);
|
set_arrow_up_enabled(false);
|
||||||
} else {
|
} else {
|
||||||
@@ -251,6 +258,17 @@ void BtnGridView::show_arrows_enabled(bool enabled) {
|
|||||||
bool BtnGridView::set_highlighted(int32_t new_value, bool force_update) {
|
bool BtnGridView::set_highlighted(int32_t new_value, bool force_update) {
|
||||||
int32_t item_count = (int32_t)menu_items.size();
|
int32_t item_count = (int32_t)menu_items.size();
|
||||||
|
|
||||||
|
// nothing to highlight when the list is empty
|
||||||
|
if (item_count == 0) {
|
||||||
|
highlighted_item = 0;
|
||||||
|
offset = 0;
|
||||||
|
show_hide_arrows();
|
||||||
|
if (force_update) {
|
||||||
|
update_items();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_value < 0)
|
if (new_value < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -291,8 +309,11 @@ bool BtnGridView::set_highlighted(int32_t new_value, bool force_update) {
|
|||||||
update_items();
|
update_items();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (visible())
|
if (visible()) {
|
||||||
item_view(highlighted_item - offset)->focus();
|
size_t idx = highlighted_item - offset;
|
||||||
|
if (idx < menu_item_views.size())
|
||||||
|
item_view(idx)->focus();
|
||||||
|
}
|
||||||
|
|
||||||
show_hide_arrows();
|
show_hide_arrows();
|
||||||
|
|
||||||
@@ -304,7 +325,11 @@ uint32_t BtnGridView::highlighted_index() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BtnGridView::on_focus() {
|
void BtnGridView::on_focus() {
|
||||||
item_view(highlighted_item - offset)->focus();
|
if (!menu_items.empty()) {
|
||||||
|
size_t idx = highlighted_item - offset;
|
||||||
|
if (idx < menu_item_views.size())
|
||||||
|
item_view(idx)->focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BtnGridView::on_blur() {
|
void BtnGridView::on_blur() {
|
||||||
@@ -348,8 +373,10 @@ bool BtnGridView::on_key(const KeyEvent key) {
|
|||||||
return set_highlighted(highlighted_item - 1);
|
return set_highlighted(highlighted_item - 1);
|
||||||
|
|
||||||
case KeyEvent::Select:
|
case KeyEvent::Select:
|
||||||
if (menu_items[highlighted_item].on_select) {
|
if (!menu_items.empty() && highlighted_item < menu_items.size()) {
|
||||||
menu_items[highlighted_item].on_select();
|
if (menu_items[highlighted_item].on_select) {
|
||||||
|
menu_items[highlighted_item].on_select();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user