Feat: Implement reading rotation via long-press confirm button

This commit is contained in:
Baris Albayrak 2026-01-22 23:17:41 +11:00
parent 3ce11f14ce
commit 7d49feea18
2 changed files with 49 additions and 1 deletions

View File

@ -17,6 +17,7 @@ namespace {
// pagesPerRefresh now comes from SETTINGS.getRefreshFrequency() // pagesPerRefresh now comes from SETTINGS.getRefreshFrequency()
constexpr unsigned long skipChapterMs = 700; constexpr unsigned long skipChapterMs = 700;
constexpr unsigned long goHomeMs = 1000; constexpr unsigned long goHomeMs = 1000;
constexpr unsigned long rotateScreenMs = 1000;
constexpr int statusBarMargin = 19; constexpr int statusBarMargin = 19;
} // namespace } // namespace
@ -116,8 +117,14 @@ void EpubReaderActivity::loop() {
return; return;
} }
// Long press CONFIRM (1s+) rotates the screen
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm) && mappedInput.getHeldTime() >= rotateScreenMs) {
rotateScreen();
return;
}
// Enter chapter selection activity // 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 // Don't start activity transition while rendering
xSemaphoreTake(renderingMutex, portMAX_DELAY); xSemaphoreTake(renderingMutex, portMAX_DELAY);
const int currentPage = section ? section->currentPage : 0; const int currentPage = section ? section->currentPage : 0;
@ -500,3 +507,43 @@ void EpubReaderActivity::renderStatusBar(const int orientedMarginRight, const in
title.c_str()); title.c_str());
} }
} }
void EpubReaderActivity::rotateScreen() {
// We don't want to change orientation mid-render, so grab the semaphore
xSemaphoreTake(renderingMutex, portMAX_DELAY);
//
// 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

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