From 8dc82f28af007110b36905d39ec3fbe7c169fedf Mon Sep 17 00:00:00 2001 From: jpirnay Date: Sun, 8 Mar 2026 17:44:10 +0100 Subject: [PATCH] Use series in recents if present --- src/activities/home/RecentBooksActivity.cpp | 2 +- src/components/themes/BaseTheme.cpp | 6 +++++- src/components/themes/lyra/LyraTheme.cpp | 14 +++++++++++--- src/components/themes/lyra/LyraTheme.h | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/activities/home/RecentBooksActivity.cpp b/src/activities/home/RecentBooksActivity.cpp index 8f9c2e61..2b77fc7b 100644 --- a/src/activities/home/RecentBooksActivity.cpp +++ b/src/activities/home/RecentBooksActivity.cpp @@ -103,7 +103,7 @@ void RecentBooksActivity::render(RenderLock&&) { [this](int index) { return recentBooks[index].title; }, [this](int index) { const auto& book = recentBooks[index]; - if (!book.author.empty() && !book.series.empty()) return book.author + " \u2022 " + book.series; + if (!book.author.empty() && !book.series.empty()) return book.author + "\n" + book.series; if (!book.series.empty()) return book.series; return book.author; }, diff --git a/src/components/themes/BaseTheme.cpp b/src/components/themes/BaseTheme.cpp index 0346ce28..f94cba1f 100644 --- a/src/components/themes/BaseTheme.cpp +++ b/src/components/themes/BaseTheme.cpp @@ -235,8 +235,12 @@ void BaseTheme::drawList(const GfxRenderer& renderer, Rect rect, int itemCount, renderer.drawText(font, rect.x + BaseMetrics::values.contentSidePadding, itemY, item.c_str(), i != selectedIndex); if (rowSubtitle != nullptr) { - // Draw subtitle + // Draw subtitle; if the text is newline-separated (author\nseries), join with • for single-line display std::string subtitleText = rowSubtitle(i); + const auto nl = subtitleText.find('\n'); + if (nl != std::string::npos) { + subtitleText = subtitleText.substr(0, nl) + " \u2022 " + subtitleText.substr(nl + 1); + } auto subtitle = renderer.truncatedText(UI_10_FONT_ID, subtitleText.c_str(), textWidth); renderer.drawText(UI_10_FONT_ID, rect.x + BaseMetrics::values.contentSidePadding, itemY + 30, subtitle.c_str(), i != selectedIndex); diff --git a/src/components/themes/lyra/LyraTheme.cpp b/src/components/themes/lyra/LyraTheme.cpp index a8bbd837..ad97f6b1 100644 --- a/src/components/themes/lyra/LyraTheme.cpp +++ b/src/components/themes/lyra/LyraTheme.cpp @@ -318,10 +318,18 @@ void LyraTheme::drawList(const GfxRenderer& renderer, Rect rect, int itemCount, } if (rowSubtitle != nullptr) { - // Draw subtitle std::string subtitleText = rowSubtitle(i); - auto subtitle = renderer.truncatedText(SMALL_FONT_ID, subtitleText.c_str(), rowTextWidth); - renderer.drawText(SMALL_FONT_ID, textX, itemY + 30, subtitle.c_str(), true); + const auto nl = subtitleText.find('\n'); + if (nl != std::string::npos) { + // Two-line subtitle: first line (author) at +24, second line (series) at +40 + auto line1 = renderer.truncatedText(SMALL_FONT_ID, subtitleText.substr(0, nl).c_str(), rowTextWidth); + renderer.drawText(SMALL_FONT_ID, textX, itemY + 24, line1.c_str(), true); + auto line2 = renderer.truncatedText(SMALL_FONT_ID, subtitleText.substr(nl + 1).c_str(), rowTextWidth); + renderer.drawText(SMALL_FONT_ID, textX, itemY + 40, line2.c_str(), true); + } else { + auto subtitle = renderer.truncatedText(SMALL_FONT_ID, subtitleText.c_str(), rowTextWidth); + renderer.drawText(SMALL_FONT_ID, textX, itemY + 30, subtitle.c_str(), true); + } } // Draw value diff --git a/src/components/themes/lyra/LyraTheme.h b/src/components/themes/lyra/LyraTheme.h index 1e953a81..db162f18 100644 --- a/src/components/themes/lyra/LyraTheme.h +++ b/src/components/themes/lyra/LyraTheme.h @@ -14,7 +14,7 @@ constexpr ThemeMetrics values = {.batteryWidth = 16, .verticalSpacing = 16, .contentSidePadding = 20, .listRowHeight = 40, - .listWithSubtitleRowHeight = 60, + .listWithSubtitleRowHeight = 68, .menuRowHeight = 64, .menuSpacing = 8, .tabSpacing = 8,