Skip to content

Commit c3ba3fd

Browse files
samuelclayClang Robotjohnboiles
authored
Page numbers in Kindle popup (#1147)
Co-authored-by: Clang Robot <[email protected]> Co-authored-by: John Boiles <[email protected]> Co-authored-by: John Boiles <[email protected]>
1 parent 2365172 commit c3ba3fd

File tree

4 files changed

+57
-19
lines changed

4 files changed

+57
-19
lines changed

src/UI/KindleReadableScreen.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ KindleReadableScreen::KindleReadableScreen(DisplaySystem &display,
237237
popupMenuScreen_ = std::make_shared<NewReadablePopupMenuScreen>(
238238
display, prefs_, fileSystem_, popupMenuReadable_, lightingController_, renderer_,
239239
telemetry_, localStore_, stream);
240-
popupMenuScreen_->setShowPageIndicators(false);
240+
popupMenuScreen_->setShowPageIndicators(true);
241241

242242
popupMenuScreen_->addTab("Popup", popupNavigationFactory, 8);
243243
popupMenuScreen_->addTab("Style", popupStyleFactory, 8);
@@ -870,6 +870,19 @@ void KindleReadableScreen::showPopupMenu() {
870870
}
871871

872872
if (popupMenuScreen_) {
873+
// For Kindle content, suppress fallback page calculation when we don't have real pages
874+
popupMenuScreen_->setSuppressFallbackPageNumbers(true);
875+
876+
// Only set page numbers if we have valid ones from the server
877+
// Note: -1 means the server hasn't provided page numbers (only locations)
878+
if (kindleBook_->progressCurrentPage > 0 && kindleBook_->progressTotalPages > 0) {
879+
popupMenuScreen_->setExplicitPageNumbers(kindleBook_->progressCurrentPage,
880+
kindleBook_->progressTotalPages);
881+
} else {
882+
// Clear any previous page info when we don't have valid server page numbers
883+
popupMenuScreen_->setExplicitPageNumbers(-1, -1);
884+
}
885+
873886
popupMenuScreen_->setUpPopupMenu();
874887
popupMenuScreen_->regenerateCurrentTab();
875888
}

src/UI/NewReadablePopupMenuScreen.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,18 @@ void NewReadablePopupMenuScreen::setUpPopupMenu() {
6464
chapterHref.c_str());
6565
}
6666
} else {
67-
size_t lengthOfFile = renderer_.size();
68-
placeStringForBottom = StringFormat("%d of %d", SOL_PAGE_NUMBER(renderer_.getTxtOffset()),
69-
SOL_PAGE_NUMBER(lengthOfFile));
67+
// Use explicit page numbers if provided
68+
if (hasExplicitPageNumbers()) {
69+
placeStringForBottom =
70+
StringFormat("%d of %d", explicitCurrentPage_, explicitTotalPages_);
71+
} else if (!suppressFallbackPageNumbers_) {
72+
// Calculate page numbers from offset if not suppressed
73+
size_t lengthOfFile = renderer_.size();
74+
placeStringForBottom =
75+
StringFormat("%d of %d", SOL_PAGE_NUMBER(renderer_.getTxtOffset()),
76+
SOL_PAGE_NUMBER(lengthOfFile));
77+
}
78+
// If fallback is suppressed and no explicit pages, don't show anything
7079
}
7180

7281
if (showPageIndicators_) {

src/UI/NewReadablePopupMenuScreen.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ class NewReadablePopupMenuScreen : public CarouselMenuScreen {
4747

4848
void setShowPageIndicators(bool show) { showPageIndicators_ = show; }
4949

50+
// Set explicit page numbers (e.g., from server) instead of calculating from offset
51+
void setExplicitPageNumbers(int currentPage, int totalPages) {
52+
explicitCurrentPage_ = currentPage;
53+
explicitTotalPages_ = totalPages;
54+
}
55+
56+
// When true, don't show calculated page numbers as fallback
57+
void setSuppressFallbackPageNumbers(bool suppress) { suppressFallbackPageNumbers_ = suppress; }
58+
5059
protected:
5160
DisplaySystem &display_;
5261
PreferencesStore &prefs_;
@@ -69,4 +78,13 @@ class NewReadablePopupMenuScreen : public CarouselMenuScreen {
6978

7079
ChapterIdx currentChapterIdx_ = -1;
7180
bool showPageIndicators_ = true;
81+
82+
// Generic page number overrides (not Kindle-specific)
83+
int explicitCurrentPage_ = -1;
84+
int explicitTotalPages_ = -1;
85+
bool suppressFallbackPageNumbers_ = false;
86+
87+
auto hasExplicitPageNumbers() const -> bool {
88+
return explicitCurrentPage_ > 0 && explicitTotalPages_ > 0;
89+
}
7290
};

test/CatchTests/KindleTests.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
#include "Misc/Dispatch.hpp"
2121
#include "Misc/Platform.hpp"
2222
#include "Misc/Telemetry.hpp"
23-
#include "Models/Json.hpp"
2423
#include "Models/KindleBook.hpp"
25-
#include "Models/KindleChaptersResponse.hpp"
2624
#include "Models/KindlePageFlipper.hpp"
2725
#include "Sensors/LightingController.hpp"
2826
#include "Storage/LocalStore.hpp"
@@ -706,31 +704,31 @@ TEST_CASE("Kindle table of contents highlights current chapter", "[.][no-kindle]
706704

707705
const std::string midChapter =
708706
R"({"success":true,"progress":{"current_page":35,"total_pages":1000},"chapters":[{"title":"Intro","uuid":"c1","page":1},{"title":"Middle","uuid":"c2","page":20},{"title":"Later","uuid":"c3","page":40}]})";
709-
auto midChapterResponse = std::make_shared<KindleChaptersResponse>();
710-
JsonDocument doc;
711-
deserializeJson(doc, midChapter);
712-
midChapterResponse->fromJson(doc.as<JsonObject>());
713-
tocScreen.handleTableOfContentsResponse(midChapterResponse);
707+
auto midResp = std::make_shared<KindleChaptersResponse>();
708+
SpiRamJsonDocument doc1(2048);
709+
deserializeJson(doc1, midChapter);
710+
midResp->fromJson(doc1.as<JsonObject>());
711+
tocScreen.handleTableOfContentsResponse(midResp);
714712
REQUIRE(tocScreen.menuView_.getSelectedIndex() == 1);
715713
REQUIRE(book->progressPercent == 4);
716714

717715
const std::string earlyChapter =
718716
R"({"success":true,"progress":{"current_page":0,"total_pages":1000},"chapters":[{"title":"Intro","uuid":"c1","page":5},{"title":"Next","uuid":"c2","page":15}]})";
719-
auto earlyChapterResponse = std::make_shared<KindleChaptersResponse>();
720-
JsonDocument doc2;
717+
auto earlyResp = std::make_shared<KindleChaptersResponse>();
718+
SpiRamJsonDocument doc2(2048);
721719
deserializeJson(doc2, earlyChapter);
722-
earlyChapterResponse->fromJson(doc2.as<JsonObject>());
723-
tocScreen.handleTableOfContentsResponse(earlyChapterResponse);
720+
earlyResp->fromJson(doc2.as<JsonObject>());
721+
tocScreen.handleTableOfContentsResponse(earlyResp);
724722
REQUIRE(tocScreen.menuView_.getSelectedIndex() == 0);
725723
REQUIRE(book->progressPercent == 0);
726724

727725
const std::string lateChapter =
728726
R"({"success":true,"progress":{"current_page":200,"total_pages":1000},"chapters":[{"title":"Intro","uuid":"c1","page":5},{"title":"Next","uuid":"c2","page":115},{"title":"Last","uuid":"c3","page":190}]})";
729-
auto lateChapterResponse = std::make_shared<KindleChaptersResponse>();
730-
JsonDocument doc3;
727+
auto lateResp = std::make_shared<KindleChaptersResponse>();
728+
SpiRamJsonDocument doc3(2048);
731729
deserializeJson(doc3, lateChapter);
732-
lateChapterResponse->fromJson(doc3.as<JsonObject>());
733-
tocScreen.handleTableOfContentsResponse(lateChapterResponse);
730+
lateResp->fromJson(doc3.as<JsonObject>());
731+
tocScreen.handleTableOfContentsResponse(lateResp);
734732
REQUIRE(tocScreen.menuView_.getSelectedIndex() == 2);
735733
REQUIRE(book->progressPercent == 20);
736734
}

0 commit comments

Comments
 (0)