diff --git a/src/activities/reader/EpubReaderMenuActivity.cpp b/src/activities/reader/EpubReaderMenuActivity.cpp index c1bf98b2..3d054bfc 100644 --- a/src/activities/reader/EpubReaderMenuActivity.cpp +++ b/src/activities/reader/EpubReaderMenuActivity.cpp @@ -158,60 +158,39 @@ void EpubReaderMenuActivity::render(RenderLock&&) { // Menu Items const int startY = 75 + contentRect.y; - constexpr int lineHeight = 30; + const int listHeight = contentRect.height - (startY - contentRect.y); - for (size_t i = 0; i < menuItems.size(); ++i) { - const int displayY = startY + (i * lineHeight); - const bool isSelected = (static_cast(i) == selectedIndex); - - if (isSelected) { - // Highlight only the content area so we don't paint over hint gutters. - renderer.fillRect(contentRect.x, displayY, contentRect.width - 1, lineHeight, true); - } - - renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, displayY, I18N.get(menuItems[i].labelId), !isSelected); - - if (menuItems[i].action == MenuAction::ROTATE_SCREEN) { - // Render current orientation value on the right edge of the content area. - const char* value = I18N.get(orientationLabels[pendingOrientation]); - const auto width = renderer.getTextWidth(UI_10_FONT_ID, value); - renderer.drawText(UI_10_FONT_ID, contentRect.x + contentRect.width - 20 - width, displayY, value, !isSelected); - } - - if (menuItems[i].action == MenuAction::AUTO_PAGE_TURN) { - // Render current page turn value on the right edge of the content area. - const auto value = pageTurnLabels[selectedPageTurnOption]; - const auto width = renderer.getTextWidth(UI_10_FONT_ID, value); - renderer.drawText(UI_10_FONT_ID, contentRect.x + contentRect.width - 20 - width, displayY, value, !isSelected); - } - - if (menuItems[i].action == MenuAction::EMBEDDED_STYLE) { - const char* value = tr(STR_DEFAULT_VALUE); - if (pendingEmbeddedStyleOverride == 1) { - value = tr(STR_STATE_ON); - } else if (pendingEmbeddedStyleOverride == 0) { - value = tr(STR_STATE_OFF); - } - const auto width = renderer.getTextWidth(UI_10_FONT_ID, value); - renderer.drawText(UI_10_FONT_ID, contentRect.x + contentRect.width - 20 - width, displayY, value, !isSelected); - } - - if (menuItems[i].action == MenuAction::IMAGE_RENDERING) { - const char* value = tr(STR_DEFAULT_VALUE); - if (pendingImageRenderingOverride >= 0 && pendingImageRenderingOverride < imageRenderingLabels.size()) { - value = I18N.get(imageRenderingLabels[pendingImageRenderingOverride]); - } - const auto width = renderer.getTextWidth(UI_10_FONT_ID, value); - renderer.drawText(UI_10_FONT_ID, contentRect.x + contentRect.width - 20 - width, displayY, value, !isSelected); - } - - if (menuItems[i].action == MenuAction::TEXT_DARKNESS) { - const uint8_t idx = (pendingTextDarkness < textDarknessLabels.size()) ? pendingTextDarkness : 0; - const char* value = I18N.get(textDarknessLabels[idx]); - const auto width = renderer.getTextWidth(UI_10_FONT_ID, value); - renderer.drawText(UI_10_FONT_ID, contentRect.x + contentRect.width - 20 - width, displayY, value, !isSelected); - } - } + GUI.drawList( + renderer, Rect{contentRect.x, startY, contentRect.width, listHeight}, static_cast(menuItems.size()), + selectedIndex, [this](int index) { return I18N.get(menuItems[index].labelId); }, nullptr, nullptr, + [this](int index) { + const auto& item = menuItems[index]; + switch (item.action) { + case MenuAction::ROTATE_SCREEN: + return std::string(I18N.get(orientationLabels[pendingOrientation])); + case MenuAction::AUTO_PAGE_TURN: + return std::string(pageTurnLabels[selectedPageTurnOption]); + case MenuAction::EMBEDDED_STYLE: + if (pendingEmbeddedStyleOverride == 1) { + return std::string(tr(STR_STATE_ON)); + } else if (pendingEmbeddedStyleOverride == 0) { + return std::string(tr(STR_STATE_OFF)); + } + return std::string(tr(STR_DEFAULT_VALUE)); + case MenuAction::IMAGE_RENDERING: + if (pendingImageRenderingOverride >= 0 && pendingImageRenderingOverride < imageRenderingLabels.size()) { + return std::string(I18N.get(imageRenderingLabels[pendingImageRenderingOverride])); + } + return std::string(tr(STR_DEFAULT_VALUE)); + case MenuAction::TEXT_DARKNESS: { + const uint8_t idx = (pendingTextDarkness < textDarknessLabels.size()) ? pendingTextDarkness : 0; + return std::string(I18N.get(textDarknessLabels[idx])); + } + default: + return std::string(); + } + }, + true); // Footer / Hints const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_SELECT), tr(STR_DIR_UP), tr(STR_DIR_DOWN)); diff --git a/src/components/themes/BaseTheme.cpp b/src/components/themes/BaseTheme.cpp index c982982b..d183a20d 100644 --- a/src/components/themes/BaseTheme.cpp +++ b/src/components/themes/BaseTheme.cpp @@ -273,7 +273,7 @@ void BaseTheme::drawList(const GfxRenderer& renderer, Rect rect, int itemCount, // Draw selection int contentWidth = rect.width - 5; if (selectedIndex >= 0) { - renderer.fillRect(0, rect.y + selectedIndex % pageItems * rowHeight - 2, rect.width, rowHeight); + renderer.fillRect(rect.x, rect.y + selectedIndex % pageItems * rowHeight - 2, rect.width, rowHeight); } // Draw all items const auto pageStartIndex = selectedIndex / pageItems * pageItems;