diff --git a/radio/src/gui/colorlcd/listbox.cpp b/radio/src/gui/colorlcd/listbox.cpp index 8fc1c506d..7f7c54ac6 100644 --- a/radio/src/gui/colorlcd/listbox.cpp +++ b/radio/src/gui/colorlcd/listbox.cpp @@ -115,6 +115,19 @@ int ListBase::getSelected() const return -1; } +void ListBase::setActiveItem(int item) +{ + if (item != activeItem) { + activeItem = item; + invalidate(); + } +} + +int ListBase::getActiveItem() const +{ + return activeItem; +} + void ListBase::onPress(uint16_t row, uint16_t col) { if (row == LV_TABLE_CELL_NONE) return; @@ -148,3 +161,21 @@ void ListBase::onCancel() TableField::onCancel(); } } + +void ListBase::onDrawEnd(uint16_t row, uint16_t col, lv_obj_draw_part_dsc_t* dsc) +{ + if (row != activeItem) return; + + lv_area_t coords; + lv_coord_t area_h = lv_area_get_height(dsc->draw_area); + + lv_coord_t cell_right = lv_obj_get_style_pad_right(lvobj, LV_PART_ITEMS); + lv_coord_t font_h = getFontHeight(FONT(STD)); + + coords.x1 = dsc->draw_area->x2 - cell_right - font_h; + coords.x2 = coords.x1 + font_h; + coords.y1 = dsc->draw_area->y1 + (area_h - font_h) / 2; + coords.y2 = coords.y1 + font_h - 1; + + lv_draw_label(dsc->draw_ctx, dsc->label_dsc, &coords, LV_SYMBOL_OK, nullptr); +} diff --git a/radio/src/gui/colorlcd/listbox.h b/radio/src/gui/colorlcd/listbox.h index c53698705..5bc981749 100644 --- a/radio/src/gui/colorlcd/listbox.h +++ b/radio/src/gui/colorlcd/listbox.h @@ -51,6 +51,9 @@ class ListBase : public TableField virtual void setSelected(int selected); int getSelected() const; + virtual void setActiveItem(int item); + int getActiveItem() const; + void setLongPressHandler(std::function handler) { longPressHandler = std::move(handler); @@ -67,12 +70,15 @@ class ListBase : public TableField protected: static void event_cb(lv_event_t* e); + int activeItem = -1; void onPress(uint16_t row, uint16_t col) override; void onLongPressed(); void onClicked() override; void onCancel() override; + + void onDrawEnd(uint16_t row, uint16_t col, lv_obj_draw_part_dsc_t* dsc) override; }; class ListBox : public ListBase diff --git a/radio/src/gui/colorlcd/radio_theme.cpp b/radio/src/gui/colorlcd/radio_theme.cpp index af50e2182..d5fa864d5 100644 --- a/radio/src/gui/colorlcd/radio_theme.cpp +++ b/radio/src/gui/colorlcd/radio_theme.cpp @@ -431,10 +431,12 @@ void ThemeSetupPage::displayThemeMenu(Window *window, ThemePersistance *tp) // you cant activate the active theme if (listBox->getSelected() != tp->getThemeIndex()) { menu->addLine(STR_ACTIVATE, [=]() { - tp->applyTheme(listBox->getSelected()); - tp->setDefaultTheme(listBox->getSelected()); + auto idx = listBox->getSelected(); + tp->applyTheme(idx); + tp->setDefaultTheme(idx); nameText->setTextFlags(COLOR_THEME_PRIMARY1); authorText->setTextFlags(COLOR_THEME_PRIMARY1); + listBox->setActiveItem(idx); }); } @@ -508,6 +510,7 @@ void ThemeSetupPage::setupListbox(FormWindow *window, rect_t r, ThemePersistance listBox = new ListBox(window, r, tp->getNames()); listBox->setAutoEdit(true); listBox->setSelected(currentTheme); + listBox->setActiveItem(tp->getThemeIndex()); listBox->setTitle(STR_THEME + std::string("s")); // TODO: fix this! listBox->setLongPressHandler([=] () { displayThemeMenu(window, tp); }); listBox->setPressHandler([=] () {