feat: Auto Page Turn for Epub Reader#1219
Conversation
📝 Walkthrough🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/activities/reader/EpubReaderActivity.cpp (1)
29-30: Consider documenting or refactoring the first element's purpose.
PAGE_TURN_LABELS[0] = 1is used to prevent division by zero, but this value is misleading since index 0 represents "OFF" in the menu. The boundary check at line 506 (selectedPageTurnOption == 0) prevents this value from being used in duration calculations, so it's safe. However, documenting this or using a clearer approach would improve maintainability.Consider adding a comment or using a sentinel value that makes the intent clearer:
// pages per minute, first item is 1 to prevent division by zero if accessed -const std::vector<int> PAGE_TURN_LABELS = {1, 1, 3, 6, 12}; +// Index 0 = OFF (unused in calculations), indices 1-4 = pages per minute settings +const std::vector<int> PAGE_TURN_LABELS = {0, 1, 3, 6, 12}; // Index 0 never used for divisionAlternatively, keep the current approach but add an assertion or static_assert to document the invariant.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/activities/reader/EpubReaderActivity.cpp` around lines 29 - 30, PAGE_TURN_LABELS currently uses a misleading 1 at index 0 solely to avoid division-by-zero but index 0 actually means "OFF" (see selectedPageTurnOption), so either add an explanatory comment on PAGE_TURN_LABELS stating that index 0 is a sentinel and is never used in duration calculations, or replace the value with a clearer sentinel (e.g., 0 or std::numeric_limits<int>::min()) and update consumers accordingly; additionally add a runtime assert or static_assert near where selectedPageTurnOption is read (or where PAGE_TURN_LABELS is defined) to document the invariant that selectedPageTurnOption == 0 will not be used for timing calculations.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/activities/reader/EpubReaderActivity.cpp`:
- Around line 29-30: PAGE_TURN_LABELS currently uses a misleading 1 at index 0
solely to avoid division-by-zero but index 0 actually means "OFF" (see
selectedPageTurnOption), so either add an explanatory comment on
PAGE_TURN_LABELS stating that index 0 is a sentinel and is never used in
duration calculations, or replace the value with a clearer sentinel (e.g., 0 or
std::numeric_limits<int>::min()) and update consumers accordingly; additionally
add a runtime assert or static_assert near where selectedPageTurnOption is read
(or where PAGE_TURN_LABELS is defined) to document the invariant that
selectedPageTurnOption == 0 will not be used for timing calculations.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
lib/I18n/translations/english.yamlsrc/activities/ActivityResult.hsrc/activities/reader/EpubReaderActivity.cppsrc/activities/reader/EpubReaderActivity.hsrc/activities/reader/EpubReaderMenuActivity.cppsrc/activities/reader/EpubReaderMenuActivity.hsrc/activities/reader/TxtReaderActivity.cppsrc/activities/settings/StatusBarSettingsActivity.cppsrc/components/UITheme.cppsrc/components/UITheme.hsrc/components/themes/BaseTheme.cppsrc/components/themes/BaseTheme.h
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: cppcheck
🧰 Additional context used
🧠 Learnings (10)
📚 Learning: 2026-02-22T19:13:22.166Z
Learnt from: ngxson
Repo: crosspoint-reader/crosspoint-reader PR: 1016
File: src/activities/reader/EpubReaderActivity.cpp:138-146
Timestamp: 2026-02-22T19:13:22.166Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, the EpubReaderMenuActivity result callback intentionally applies orientation changes (via applyOrientation) before checking result.isCancelled. This differs from other callbacks in the file because orientation is treated as an immediate setting that should persist even when the user cancels the menu, rather than a deferred action requiring confirmation.
Applied to files:
src/activities/ActivityResult.hsrc/activities/reader/EpubReaderMenuActivity.hsrc/activities/reader/EpubReaderActivity.hsrc/activities/reader/EpubReaderMenuActivity.cppsrc/activities/reader/EpubReaderActivity.cppsrc/activities/settings/StatusBarSettingsActivity.cpp
📚 Learning: 2026-02-21T16:47:45.578Z
Learnt from: Uri-Tauber
Repo: crosspoint-reader/crosspoint-reader PR: 1031
File: src/activities/reader/EpubReaderActivity.cpp:816-853
Timestamp: 2026-02-21T16:47:45.578Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, the navigateToHref() function uses a fixed-size mini-stack (MAX_FOOTNOTE_DEPTH = 3) for saved positions rather than a dynamic stack. This is intentional to minimize RAM usage on ESP32-C3, which has limited memory. The design accepts that failed navigation at max depth may decrement footnoteDepth even when no push occurred, as a tradeoff for memory efficiency. Users exit by pressing Back three times maximum.
Applied to files:
src/activities/reader/EpubReaderMenuActivity.hsrc/activities/reader/EpubReaderActivity.hsrc/activities/reader/EpubReaderMenuActivity.cppsrc/activities/reader/EpubReaderActivity.cpp
📚 Learning: 2026-02-16T20:43:19.339Z
Learnt from: Levrk
Repo: crosspoint-reader/crosspoint-reader PR: 909
File: src/activities/reader/EpubReaderActivity.cpp:461-461
Timestamp: 2026-02-16T20:43:19.339Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, when using ConfirmationActivity with enterNewActivity(), it's not necessary to call exitActivity() beforehand. The ConfirmationActivity operates as a modal dialog and cleanup is handled via the pendingSubactivityExit flag in the callback lambda. This differs from other activities like EpubReaderChapterSelectionActivity or KOReaderSyncActivity which do require exitActivity() before enterNewActivity().
Applied to files:
src/activities/reader/EpubReaderMenuActivity.hsrc/activities/reader/EpubReaderActivity.hsrc/activities/reader/EpubReaderMenuActivity.cppsrc/activities/reader/EpubReaderActivity.cppsrc/activities/settings/StatusBarSettingsActivity.cpp
📚 Learning: 2026-02-19T17:46:36.345Z
Learnt from: Tritlo
Repo: crosspoint-reader/crosspoint-reader PR: 1003
File: src/activities/reader/EpubReaderActivity.cpp:657-674
Timestamp: 2026-02-19T17:46:36.345Z
Learning: In src/activities/reader/EpubReaderActivity.cpp's renderContents() method, when uncached images exist, Phase 1 intentionally calls displayBuffer(forceFullRefresh) to perform a HALF_REFRESH (if needed), while Phase 2 intentionally calls renderer.displayBuffer() directly without forceFullRefresh. This is by design: Phase 1's refresh clears the screen properly to prevent ghosting, so Phase 2 can use a faster refresh mode for better performance. The grayscale anti-aliasing is handled separately after renderContents() via displayGrayBuffer().
Applied to files:
src/activities/reader/EpubReaderActivity.hsrc/activities/reader/TxtReaderActivity.cpp
📚 Learning: 2026-02-16T22:25:35.674Z
Learnt from: whyte-j
Repo: crosspoint-reader/crosspoint-reader PR: 733
File: lib/I18n/I18nKeys.h:271-272
Timestamp: 2026-02-16T22:25:35.674Z
Learning: In the crosspoint-reader i18n system (lib/I18n/), missing translation keys in non-English YAML files are automatically filled with English strings at build time by the gen_i18n.py script. All generated string arrays (STRINGS_EN, STRINGS_ES, etc.) have identical lengths, so runtime array indexing is safe without per-string fallback logic. The system prints "INFO: '{key}' missing in {lang_code}, using English fallback" during code generation when this occurs.
Applied to files:
lib/I18n/translations/english.yaml
📚 Learning: 2026-02-23T22:11:42.181Z
Learnt from: ariel-lindemann
Repo: crosspoint-reader/crosspoint-reader PR: 1133
File: lib/I18n/translations/finnish.yaml:92-92
Timestamp: 2026-02-23T22:11:42.181Z
Learning: In translation YAML files located in lib/I18n/translations/, literal percent signs (%) in strings (e.g., STR_HIDE_BATTERY, STR_GO_TO_PERCENT, STR_PERCENT_STEP_HINT) do not require escaping as %% and this convention is consistent across all language translations. Ensure that this pattern is followed for all YAML files in this directory to avoid introducing incorrect formatting markers in localized strings.
Applied to files:
lib/I18n/translations/english.yaml
📚 Learning: 2026-02-19T17:46:26.871Z
Learnt from: Tritlo
Repo: crosspoint-reader/crosspoint-reader PR: 1003
File: src/activities/reader/EpubReaderActivity.cpp:657-674
Timestamp: 2026-02-19T17:46:26.871Z
Learning: In EpubReaderActivity.cpp, renderContents() behavior is intentional: if uncached images exist, Phase 1 should call displayBuffer(forceFullRefresh) to perform a HALF_REFRESH and clear ghosting; Phase 2 should call renderer.displayBuffer() without forceFullRefresh for a faster refresh. Grayscale anti-aliasing is applied separately after renderContents() via displayGrayBuffer(). This guidance applies specifically to this file and situation.
Applied to files:
src/activities/reader/EpubReaderActivity.cpp
📚 Learning: 2026-02-16T22:59:07.687Z
Learnt from: whyte-j
Repo: crosspoint-reader/crosspoint-reader PR: 733
File: src/components/StatusBar.cpp:63-78
Timestamp: 2026-02-16T22:59:07.687Z
Learning: In the CrossPoint Reader codebase, screen margin values are preset in settings with constrained options, so calculations involving margins (like `rendererableScreenWidth` or `availableTitleSpace` in StatusBar rendering) are unlikely to produce negative values in practice given these bounds.
Applied to files:
src/activities/reader/EpubReaderActivity.cppsrc/components/themes/BaseTheme.cpp
📚 Learning: 2026-02-12T06:57:35.955Z
Learnt from: CaptainFrito
Repo: crosspoint-reader/crosspoint-reader PR: 725
File: src/activities/network/CalibreConnectActivity.cpp:218-264
Timestamp: 2026-02-12T06:57:35.955Z
Learning: In src/activities/network/CalibreConnectActivity.cpp, button hints (« Exit) are intentionally omitted from the SERVER_STARTING and ERROR states—only the SERVER_RUNNING state displays navigation hints. This is a deliberate design decision by the author.
Applied to files:
src/activities/settings/StatusBarSettingsActivity.cpp
📚 Learning: 2026-02-23T06:18:08.408Z
Learnt from: raygan
Repo: crosspoint-reader/crosspoint-reader PR: 1116
File: src/activities/settings/WallabagSettingsActivity.cpp:57-75
Timestamp: 2026-02-23T06:18:08.408Z
Learning: When navigating from a settings activity to KeyboardEntryActivity (e.g., KOReaderSettingsActivity, WallabagSettingsActivity), call exitActivity() on the parent before calling enterNewActivity(new KeyboardEntryActivity(...)). The KeyboardEntryActivity should then call exitActivity() via its callbacks to return to the parent. Note: ConfirmationActivity does not require exitActivity() before entering KeyboardEntryActivity. Apply this pattern to similar settings activities in this module.
Applied to files:
src/activities/settings/StatusBarSettingsActivity.cpp
🧬 Code graph analysis (6)
src/components/UITheme.h (1)
src/components/UITheme.cpp (2)
getProgressBarHeight(107-112)getProgressBarHeight(107-107)
src/activities/reader/EpubReaderActivity.h (1)
src/activities/reader/EpubReaderActivity.cpp (4)
toggleAutoPageTurn(502-529)toggleAutoPageTurn(502-502)resetLastPageTurnTime(531-536)resetLastPageTurnTime(531-531)
src/components/UITheme.cpp (1)
src/components/UITheme.h (1)
getInstance(15-15)
src/activities/reader/EpubReaderMenuActivity.cpp (2)
src/activities/Activity.cpp (6)
requestUpdate(9-9)requestUpdate(9-9)setResult(26-26)setResult(26-26)finish(28-28)finish(28-28)src/activities/ActivityManager.cpp (2)
requestUpdate(217-227)requestUpdate(217-217)
src/activities/reader/EpubReaderActivity.cpp (2)
src/activities/Activity.cpp (2)
requestUpdate(9-9)requestUpdate(9-9)src/activities/ActivityManager.cpp (2)
requestUpdate(217-227)requestUpdate(217-217)
src/components/themes/BaseTheme.cpp (1)
src/components/UITheme.h (1)
getInstance(15-15)
🔇 Additional comments (22)
src/activities/reader/TxtReaderActivity.cpp (1)
434-437: Good conditional title rendering.This cleanly respects the “hide title” setting and keeps status-bar content consistent with user preferences.
src/activities/settings/StatusBarSettingsActivity.cpp (1)
159-160: Nice explicit title-mode branching.Using a dedicated
CHAPTER_TITLEbranch makes preview behavior clearer and less error-prone than relying on a generic fallback.lib/I18n/translations/english.yaml (1)
338-339: Translation keys look good.The new labels are clear and map directly to the auto page-turn UI states.
src/components/themes/BaseTheme.h (1)
139-140: Good API extension for status-bar text positioning.Adding
textYOffsetwith a default keeps existing call sites compatible while enabling finer layout control where needed.src/components/themes/BaseTheme.cpp (1)
632-633: Solid status-bar offset handling.The new
textYOffsetintegration is well-contained, and applying it only whentitleis present prevents unintended shifts in non-title layouts.Also applies to: 641-641, 691-693
src/activities/ActivityResult.h (1)
23-23: MenuResult extension is clean.Adding
pageTurnOptionwith a default value is a straightforward, low-risk way to carry the new auto-turn selection through activity results.src/components/UITheme.h (1)
26-26: Good theme API addition.
getProgressBarHeight()is a useful accessor to keep layout calculations consistent across reader/status components.src/components/UITheme.cpp (1)
107-112: Implementation is consistent and correct.This helper cleanly encapsulates progress-bar height logic and matches the existing theme-driven rendering model.
src/activities/reader/EpubReaderMenuActivity.h (1)
18-18: LGTM!The
AUTO_PAGE_TURNenum value andselectedPageTurnOptionmember are appropriately added. The default value of 0 correctly maps to the "OFF" state inpageTurnLabels.Also applies to: 52-52
src/activities/reader/EpubReaderActivity.h (1)
17-18: LGTM!The new timing variables (
lastPageTurnTime,pageTurnDuration), state flags (automaticPageTurnActive,updateLastPageTurnTime), and method declarations (toggleAutoPageTurn,resetLastPageTurnTime) are well-structured and appropriately typed for managing the auto page turn feature.Also applies to: 26-27, 47-48
src/activities/reader/EpubReaderMenuActivity.cpp (3)
68-72: LGTM!The
AUTO_PAGE_TURNaction handling correctly cycles through the available options using modulo arithmetic, consistent with howROTATE_SCREENhandles orientation cycling.
74-74: LGTM!The
MenuResultconstruction now correctly includes thepageTurnOptionfield in both the confirm and cancel paths, ensuring the selected auto page turn setting is always communicated back to the parent activity.Also applies to: 80-80
143-149: LGTM!The rendering of the auto page turn value follows the same pattern as the orientation display, providing consistent UI behavior.
src/activities/reader/EpubReaderActivity.cpp (9)
131-168: LGTM!The auto page turn loop logic is well-structured:
- Correctly disables auto turn on any button press
- Properly waits for section readiness before page advancement
- Uses
updateLastPageTurnTimeflag to handle render/indexing delays- Appropriately uses
RenderLockwhen modifying shared state
502-529: LGTM!The
toggleAutoPageTurnimplementation correctly:
- Validates the option index with proper boundary checks
- Calculates the page turn duration from the pages-per-minute setting
- Preserves reading position when resetting the section for indicator space
- Follows the same pattern as
applyOrientationfor position preservation
531-536: LGTM!The
resetLastPageTurnTimeimplementation correctly resets the timer only when auto page turn is active, and sets the fallback flag to handle cases where indexing or rendering takes longer than expected.
558-559: LGTM!The auto page turn feature is correctly disabled in all edge cases:
- End of book reached
- Empty chapter (no pages)
- Page out of bounds
- Page load failure
This prevents the feature from continuing in error states.
Also applies to: 644-645, 654-655, 667-668
570-581: LGTM!The margin adjustment logic correctly reserves space for the auto page turn indicator when the status bar is hidden or minimal, ensuring the indicator doesn't overlap with content.
778-803: LGTM!The status bar rendering correctly:
- Displays the auto page turn indicator with the calculated pages-per-minute rate
- Adjusts text position when status bar is minimal
- Prioritizes the auto turn indicator over normal title display
187-187: LGTM!The
toggleAutoPageTurncall is positioned before theisCancelledcheck, following the same pattern asapplyOrientation. This ensures the auto page turn setting persists even when the user cancels the menu, which is consistent with how orientation is treated as an immediate setting. Based on learnings, this is the intentional design pattern in this codebase.
239-240: LGTM!The
resetLastPageTurnTime()calls are correctly placed in all manual navigation paths (chapter skip, previous page, next page), ensuring the auto page turn timer resets after user interaction.Also applies to: 259-259, 273-273
686-688: LGTM!Setting
updateLastPageTurnTime = falseat render completion ensures the page turn timer starts counting from when the page is actually displayed, preventing premature page turns during long render operations.
|
Apologies for recent refactorings that put additional strain on contributors with open PRs. We will try to review this soon |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/activities/reader/EpubReaderActivity.cpp`:
- Around line 131-137: Disabling auto-turn currently only flips
automaticPageTurnActive and calls requestUpdate(), but doesn’t perform the
reverse reflow done when enabling (the block that resets section when extra
indicator space is reserved), leaving pagination stuck in the reduced viewport;
when setting automaticPageTurnActive = false in the mappedInput.wasReleased
handlers, mirror the enable-path by resetting the section (to the same
sentinel/resetting logic used in the enable block), clearing any "extra
indicator reserved" state, and then calling requestUpdate() so the
layout/pagination is recomputed.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
src/activities/ActivityManager.cppsrc/activities/RenderLock.hsrc/activities/reader/EpubReaderActivity.cppsrc/activities/reader/EpubReaderActivity.h
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: cppcheck
- GitHub Check: build
🧰 Additional context used
🧠 Learnings (7)
📚 Learning: 2026-02-22T19:13:22.166Z
Learnt from: ngxson
Repo: crosspoint-reader/crosspoint-reader PR: 1016
File: src/activities/reader/EpubReaderActivity.cpp:138-146
Timestamp: 2026-02-22T19:13:22.166Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, the EpubReaderMenuActivity result callback intentionally applies orientation changes (via applyOrientation) before checking result.isCancelled. This differs from other callbacks in the file because orientation is treated as an immediate setting that should persist even when the user cancels the menu, rather than a deferred action requiring confirmation.
Applied to files:
src/activities/reader/EpubReaderActivity.cppsrc/activities/reader/EpubReaderActivity.h
📚 Learning: 2026-02-16T20:43:19.339Z
Learnt from: Levrk
Repo: crosspoint-reader/crosspoint-reader PR: 909
File: src/activities/reader/EpubReaderActivity.cpp:461-461
Timestamp: 2026-02-16T20:43:19.339Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, when using ConfirmationActivity with enterNewActivity(), it's not necessary to call exitActivity() beforehand. The ConfirmationActivity operates as a modal dialog and cleanup is handled via the pendingSubactivityExit flag in the callback lambda. This differs from other activities like EpubReaderChapterSelectionActivity or KOReaderSyncActivity which do require exitActivity() before enterNewActivity().
Applied to files:
src/activities/reader/EpubReaderActivity.cppsrc/activities/reader/EpubReaderActivity.h
📚 Learning: 2026-02-21T16:47:45.578Z
Learnt from: Uri-Tauber
Repo: crosspoint-reader/crosspoint-reader PR: 1031
File: src/activities/reader/EpubReaderActivity.cpp:816-853
Timestamp: 2026-02-21T16:47:45.578Z
Learning: In src/activities/reader/EpubReaderActivity.cpp, the navigateToHref() function uses a fixed-size mini-stack (MAX_FOOTNOTE_DEPTH = 3) for saved positions rather than a dynamic stack. This is intentional to minimize RAM usage on ESP32-C3, which has limited memory. The design accepts that failed navigation at max depth may decrement footnoteDepth even when no push occurred, as a tradeoff for memory efficiency. Users exit by pressing Back three times maximum.
Applied to files:
src/activities/reader/EpubReaderActivity.cppsrc/activities/reader/EpubReaderActivity.h
📚 Learning: 2026-02-19T17:46:26.871Z
Learnt from: Tritlo
Repo: crosspoint-reader/crosspoint-reader PR: 1003
File: src/activities/reader/EpubReaderActivity.cpp:657-674
Timestamp: 2026-02-19T17:46:26.871Z
Learning: In EpubReaderActivity.cpp, renderContents() behavior is intentional: if uncached images exist, Phase 1 should call displayBuffer(forceFullRefresh) to perform a HALF_REFRESH and clear ghosting; Phase 2 should call renderer.displayBuffer() without forceFullRefresh for a faster refresh. Grayscale anti-aliasing is applied separately after renderContents() via displayGrayBuffer(). This guidance applies specifically to this file and situation.
Applied to files:
src/activities/reader/EpubReaderActivity.cpp
📚 Learning: 2026-02-18T15:43:12.258Z
Learnt from: GavinHigham
Repo: crosspoint-reader/crosspoint-reader PR: 966
File: src/activities/ActivityWithSubactivity.h:20-21
Timestamp: 2026-02-18T15:43:12.258Z
Learning: In the crosspoint-reader activity architecture, when using ActivityWithSubactivity, the currentActivity global variable remains at the top-level activity (e.g., ReaderActivity) even when nested subactivities are active. The supportsOrientation() delegation chain starts from the top-level activity and stops when it reaches a subactivity that overrides the method (e.g., EpubReaderActivity returns true). Deeper nested subactivities (like EpubReaderChapterSelectionActivity or EpubReaderPercentSelectionActivity) do not need to override supportsOrientation() because they never become the currentActivity and the delegation chain doesn't reach them.
Applied to files:
src/activities/reader/EpubReaderActivity.cpp
📚 Learning: 2026-02-16T22:59:07.687Z
Learnt from: whyte-j
Repo: crosspoint-reader/crosspoint-reader PR: 733
File: src/components/StatusBar.cpp:63-78
Timestamp: 2026-02-16T22:59:07.687Z
Learning: In the CrossPoint Reader codebase, screen margin values are preset in settings with constrained options, so calculations involving margins (like `rendererableScreenWidth` or `availableTitleSpace` in StatusBar rendering) are unlikely to produce negative values in practice given these bounds.
Applied to files:
src/activities/reader/EpubReaderActivity.cpp
📚 Learning: 2026-02-19T17:46:36.345Z
Learnt from: Tritlo
Repo: crosspoint-reader/crosspoint-reader PR: 1003
File: src/activities/reader/EpubReaderActivity.cpp:657-674
Timestamp: 2026-02-19T17:46:36.345Z
Learning: In src/activities/reader/EpubReaderActivity.cpp's renderContents() method, when uncached images exist, Phase 1 intentionally calls displayBuffer(forceFullRefresh) to perform a HALF_REFRESH (if needed), while Phase 2 intentionally calls renderer.displayBuffer() directly without forceFullRefresh. This is by design: Phase 1's refresh clears the screen properly to prevent ghosting, so Phase 2 can use a faster refresh mode for better performance. The grayscale anti-aliasing is handled separately after renderContents() via displayGrayBuffer().
Applied to files:
src/activities/reader/EpubReaderActivity.h
🧬 Code graph analysis (2)
src/activities/RenderLock.h (1)
src/activities/ActivityManager.cpp (2)
peek(261-261)peek(261-261)
src/activities/reader/EpubReaderActivity.h (1)
src/activities/reader/EpubReaderActivity.cpp (4)
toggleAutoPageTurn(463-486)toggleAutoPageTurn(463-463)pageTurn(488-516)pageTurn(488-488)
🔇 Additional comments (4)
src/activities/RenderLock.h (1)
16-16:RenderLockinterface update looks clean.
peek()is declared in the right place and keeps the locking utility cohesive.src/activities/ActivityManager.cpp (1)
254-261: Busy-check implementation matches its contract.The function and its return semantics are consistent with the added documentation and expected reader-loop usage.
src/activities/reader/EpubReaderActivity.h (1)
17-18: Header additions are well-scoped.The new state and helper declarations fit the class responsibilities and cleanly support the auto-turn feature.
Also applies to: 26-26, 46-47
src/activities/reader/EpubReaderActivity.cpp (1)
488-516: Nice consolidation of turn behavior intopageTurn().This removes duplicated branch logic and keeps timer/update handling unified for manual and automatic turns.
…er#1169,crosspoint-reader#1031 feat: Auto Page Turn for Epub Reader (crosspoint-reader#1219) fix: clarity issue with ambiguous string SET (crosspoint-reader#1169) feat: slim footnotes support (crosspoint-reader#1031)
## Summary * **What is the goal of this PR?** Add missing strings and tweaks for polish language * **What changes are included?** ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO >**_
…t-reader#1169,crosspoint-reader#1031 +tweaks (crosspoint-reader#1227) ## Summary * **What is the goal of this PR?** Add missing strings and tweaks for polish language * **What changes are included?** ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO >**_
## Summary * **What changes are included?** New Ukrainian localization strings ## Additional Context auto turn functionality #1219 --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO **_
Summary
What is the goal of this PR? (e.g., Implements the new feature for file uploading.)
What changes are included?
OFF, 1, 3, 6, 12pages per minuteAdditional Context
specific areas to focus on).
AI Usage
While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
helps set the right context for reviewers.
Did you use AI tools to help write this code? Partially (mainly code reviews)