Compare commits

...

3 Commits

Author SHA1 Message Date
Baris Albayrak
10401991d3
Merge 616619d0d3 into 140fcb9db5 2026-01-27 20:13:33 +05:00
Baris Albayrak
616619d0d3 Fix: Preserve page number when rotating screen
Previously, rotating the screen would reset the reading position to the beginning of the chapter. This change ensures the current page number is stored and restored after the view re-renders.
2026-01-23 00:01:29 +11:00
Baris Albayrak
7d49feea18 Feat: Implement reading rotation via long-press confirm button 2026-01-22 23:17:41 +11:00
2 changed files with 54 additions and 1 deletions

View File

@ -17,6 +17,7 @@ namespace {
// pagesPerRefresh now comes from SETTINGS.getRefreshFrequency()
constexpr unsigned long skipChapterMs = 700;
constexpr unsigned long goHomeMs = 1000;
constexpr unsigned long rotateScreenMs = 1000;
constexpr int statusBarMargin = 19;
constexpr int progressBarMarginTop = 1;
@ -123,8 +124,14 @@ void EpubReaderActivity::loop() {
return;
}
// Long press CONFIRM (1s+) rotates the screen
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm) && mappedInput.getHeldTime() >= rotateScreenMs) {
rotateScreen();
return;
}
// Enter chapter selection activity
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm) && mappedInput.getHeldTime() < rotateScreenMs) {
// Don't start activity transition while rendering
xSemaphoreTake(renderingMutex, portMAX_DELAY);
const int currentPage = section ? section->currentPage : 0;
@ -553,3 +560,48 @@ void EpubReaderActivity::renderStatusBar(const int orientedMarginRight, const in
title.c_str());
}
}
void EpubReaderActivity::rotateScreen() {
// We don't want to change orientation mid-render, so grab the semaphore
xSemaphoreTake(renderingMutex, portMAX_DELAY);
// If a section is loaded, preserve the current page number
if (section) {
nextPageNumber = section->currentPage;
}
//
// Cycle to next orientation
//
uint8_t newOrientation = (SETTINGS.orientation + 1) % 4;
SETTINGS.orientation = newOrientation;
SETTINGS.saveToFile();
//
// Apply orientation to renderer
//
switch (SETTINGS.orientation) {
case CrossPointSettings::ORIENTATION::PORTRAIT:
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
break;
case CrossPointSettings::ORIENTATION::LANDSCAPE_CW:
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise);
break;
case CrossPointSettings::ORIENTATION::INVERTED:
renderer.setOrientation(GfxRenderer::Orientation::PortraitInverted);
break;
case CrossPointSettings::ORIENTATION::LANDSCAPE_CCW:
renderer.setOrientation(GfxRenderer::Orientation::LandscapeCounterClockwise);
break;
default:
break;
}
//
// Force a redraw
//
section.reset();
updateRequired = true;
xSemaphoreGive(renderingMutex);
}

View File

@ -27,6 +27,7 @@ class EpubReaderActivity final : public ActivityWithSubactivity {
void renderContents(std::unique_ptr<Page> page, int orientedMarginTop, int orientedMarginRight,
int orientedMarginBottom, int orientedMarginLeft);
void renderStatusBar(int orientedMarginRight, int orientedMarginBottom, int orientedMarginLeft) const;
void rotateScreen();
public:
explicit EpubReaderActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, std::unique_ptr<Epub> epub,