mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-07 08:07:40 +03:00
fix: goes to relative position when reader settings are changed
This commit is contained in:
parent
3ce11f14ce
commit
6947804870
@ -56,12 +56,17 @@ void EpubReaderActivity::onEnter() {
|
|||||||
|
|
||||||
FsFile f;
|
FsFile f;
|
||||||
if (SdMan.openFileForRead("ERS", epub->getCachePath() + "/progress.bin", f)) {
|
if (SdMan.openFileForRead("ERS", epub->getCachePath() + "/progress.bin", f)) {
|
||||||
uint8_t data[4];
|
uint8_t data[6];
|
||||||
if (f.read(data, 4) == 4) {
|
int dataSize = f.read(data, 6);
|
||||||
|
if (dataSize == 4 || dataSize == 6) {
|
||||||
currentSpineIndex = data[0] + (data[1] << 8);
|
currentSpineIndex = data[0] + (data[1] << 8);
|
||||||
nextPageNumber = data[2] + (data[3] << 8);
|
nextPageNumber = data[2] + (data[3] << 8);
|
||||||
|
cachedSpineIndex = currentSpineIndex;
|
||||||
Serial.printf("[%lu] [ERS] Loaded cache: %d, %d\n", millis(), currentSpineIndex, nextPageNumber);
|
Serial.printf("[%lu] [ERS] Loaded cache: %d, %d\n", millis(), currentSpineIndex, nextPageNumber);
|
||||||
}
|
}
|
||||||
|
if (dataSize == 6) {
|
||||||
|
cachedChapterTotalPageCount = data[4] + (data[5] << 8);
|
||||||
|
}
|
||||||
f.close();
|
f.close();
|
||||||
}
|
}
|
||||||
// We may want a better condition to detect if we are opening for the first time.
|
// We may want a better condition to detect if we are opening for the first time.
|
||||||
@ -341,6 +346,17 @@ void EpubReaderActivity::renderScreen() {
|
|||||||
} else {
|
} else {
|
||||||
section->currentPage = nextPageNumber;
|
section->currentPage = nextPageNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handles changes in reader settings and reset to approximate position based on cached progress
|
||||||
|
if (cachedChapterTotalPageCount > 0) {
|
||||||
|
// only goes to relative position if spine index matches cached value
|
||||||
|
if (currentSpineIndex == cachedSpineIndex && section->pageCount != cachedChapterTotalPageCount) {
|
||||||
|
float progress = static_cast<float>(section->currentPage) / static_cast<float>(cachedChapterTotalPageCount);
|
||||||
|
int newPage = static_cast<int>(progress * section->pageCount);
|
||||||
|
section->currentPage = newPage;
|
||||||
|
}
|
||||||
|
cachedChapterTotalPageCount = 0; // resets to 0 to prevent reading cached progress again
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer.clearScreen();
|
renderer.clearScreen();
|
||||||
@ -376,12 +392,14 @@ void EpubReaderActivity::renderScreen() {
|
|||||||
|
|
||||||
FsFile f;
|
FsFile f;
|
||||||
if (SdMan.openFileForWrite("ERS", epub->getCachePath() + "/progress.bin", f)) {
|
if (SdMan.openFileForWrite("ERS", epub->getCachePath() + "/progress.bin", f)) {
|
||||||
uint8_t data[4];
|
uint8_t data[6];
|
||||||
data[0] = currentSpineIndex & 0xFF;
|
data[0] = currentSpineIndex & 0xFF;
|
||||||
data[1] = (currentSpineIndex >> 8) & 0xFF;
|
data[1] = (currentSpineIndex >> 8) & 0xFF;
|
||||||
data[2] = section->currentPage & 0xFF;
|
data[2] = section->currentPage & 0xFF;
|
||||||
data[3] = (section->currentPage >> 8) & 0xFF;
|
data[3] = (section->currentPage >> 8) & 0xFF;
|
||||||
f.write(data, 4);
|
data[4] = section->pageCount & 0xFF;
|
||||||
|
data[5] = (section->pageCount >> 8) & 0xFF;
|
||||||
|
f.write(data, 6);
|
||||||
f.close();
|
f.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,8 @@ class EpubReaderActivity final : public ActivityWithSubactivity {
|
|||||||
int currentSpineIndex = 0;
|
int currentSpineIndex = 0;
|
||||||
int nextPageNumber = 0;
|
int nextPageNumber = 0;
|
||||||
int pagesUntilFullRefresh = 0;
|
int pagesUntilFullRefresh = 0;
|
||||||
|
int cachedSpineIndex = 0;
|
||||||
|
int cachedChapterTotalPageCount = 0;
|
||||||
bool updateRequired = false;
|
bool updateRequired = false;
|
||||||
const std::function<void()> onGoBack;
|
const std::function<void()> onGoBack;
|
||||||
const std::function<void()> onGoHome;
|
const std::function<void()> onGoHome;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user