## Summary I love the new screenshot feature but I can tell that soon I'm gonna have a folder full of screenshots and not know what's what. It would be great if the folder could self organize. When a screenshot is taken while reading, the filename would now include the book title, chapter (EPUB), page number, and progress percentage. Example: My-Great-Book_ch3_p5_42pct_12345.bmp * **What is the goal of this PR?** (e.g., Implements the new feature for file uploading.) * **What changes are included?** ## Additional Context * Non-reader screens keep the existing screenshot-<millis>.bmp naming. --- ### 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 >**_ I reviewed all the changes but I don't have any experience with this project so this is my best guess
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <Txt.h>
|
|
|
|
#include <vector>
|
|
|
|
#include "CrossPointSettings.h"
|
|
#include "activities/Activity.h"
|
|
|
|
class TxtReaderActivity final : public Activity {
|
|
std::unique_ptr<Txt> txt;
|
|
|
|
int currentPage = 0;
|
|
int totalPages = 1;
|
|
int pagesUntilFullRefresh = 0;
|
|
|
|
// Streaming text reader - stores file offsets for each page
|
|
std::vector<size_t> pageOffsets; // File offset for start of each page
|
|
std::vector<std::string> currentPageLines;
|
|
int linesPerPage = 0;
|
|
int viewportWidth = 0;
|
|
bool initialized = false;
|
|
|
|
// Cached settings for cache validation (different fonts/margins require re-indexing)
|
|
int cachedFontId = 0;
|
|
uint8_t cachedScreenMargin = 0;
|
|
uint8_t cachedParagraphAlignment = CrossPointSettings::LEFT_ALIGN;
|
|
int cachedOrientedMarginTop = 0;
|
|
int cachedOrientedMarginRight = 0;
|
|
int cachedOrientedMarginBottom = 0;
|
|
int cachedOrientedMarginLeft = 0;
|
|
|
|
void renderPage();
|
|
void renderStatusBar() const;
|
|
|
|
void initializeReader();
|
|
bool loadPageAtOffset(size_t offset, std::vector<std::string>& outLines, size_t& nextOffset);
|
|
void buildPageIndex();
|
|
bool loadPageIndexCache();
|
|
void savePageIndexCache() const;
|
|
void saveProgress() const;
|
|
void loadProgress();
|
|
|
|
public:
|
|
explicit TxtReaderActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, std::unique_ptr<Txt> txt)
|
|
: Activity("TxtReader", renderer, mappedInput), txt(std::move(txt)) {}
|
|
void onEnter() override;
|
|
void onExit() override;
|
|
void loop() override;
|
|
void render(RenderLock&&) override;
|
|
bool isReaderActivity() const override { return true; }
|
|
ScreenshotInfo getScreenshotInfo() const override;
|
|
};
|