mirror of
https://github.com/crosspoint-reader/crosspoint-reader.git
synced 2026-04-29 10:26:52 -07:00
## Summary This fixes navigating back from the BMP Viewer to the FileBrowser which was broken when moving to the new ActivityManager This is fixed by making FileBrowserActivity able to take a full file path on enter and splitting the basePath and fileName from it and navigating to the correct place. fixes: https://github.com/crosspoint-reader/crosspoint-reader/issues/1553 duplicates: https://github.com/crosspoint-reader/crosspoint-reader/pull/910 to some extend but mine has the file cursor at the correct file instead of the first one in the folder ## 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? _**PARTIALLY**_ --------- Co-authored-by: Jan Ivanov <jan.ivanov@sirma.com>
134 lines
3.9 KiB
C++
134 lines
3.9 KiB
C++
#include "ReaderActivity.h"
|
|
|
|
#include <FsHelpers.h>
|
|
#include <HalStorage.h>
|
|
|
|
#include "CrossPointSettings.h"
|
|
#include "Epub.h"
|
|
#include "EpubReaderActivity.h"
|
|
#include "Txt.h"
|
|
#include "TxtReaderActivity.h"
|
|
#include "Xtc.h"
|
|
#include "XtcReaderActivity.h"
|
|
#include "activities/util/BmpViewerActivity.h"
|
|
#include "activities/util/FullScreenMessageActivity.h"
|
|
|
|
bool ReaderActivity::isXtcFile(const std::string& path) { return FsHelpers::hasXtcExtension(path); }
|
|
|
|
bool ReaderActivity::isTxtFile(const std::string& path) {
|
|
return FsHelpers::hasTxtExtension(path) ||
|
|
FsHelpers::hasMarkdownExtension(path); // Treat .md as txt files (until we have a markdown reader)
|
|
}
|
|
|
|
bool ReaderActivity::isBmpFile(const std::string& path) { return FsHelpers::hasBmpExtension(path); }
|
|
|
|
std::unique_ptr<Epub> ReaderActivity::loadEpub(const std::string& path) {
|
|
if (!Storage.exists(path.c_str())) {
|
|
LOG_ERR("READER", "File does not exist: %s", path.c_str());
|
|
return nullptr;
|
|
}
|
|
|
|
auto epub = std::unique_ptr<Epub>(new Epub(path, "/.crosspoint"));
|
|
if (epub->load(true, SETTINGS.embeddedStyle == 0)) {
|
|
return epub;
|
|
}
|
|
|
|
LOG_ERR("READER", "Failed to load epub");
|
|
return nullptr;
|
|
}
|
|
|
|
std::unique_ptr<Xtc> ReaderActivity::loadXtc(const std::string& path) {
|
|
if (!Storage.exists(path.c_str())) {
|
|
LOG_ERR("READER", "File does not exist: %s", path.c_str());
|
|
return nullptr;
|
|
}
|
|
|
|
auto xtc = std::unique_ptr<Xtc>(new Xtc(path, "/.crosspoint"));
|
|
if (xtc->load()) {
|
|
return xtc;
|
|
}
|
|
|
|
LOG_ERR("READER", "Failed to load XTC");
|
|
return nullptr;
|
|
}
|
|
|
|
std::unique_ptr<Txt> ReaderActivity::loadTxt(const std::string& path) {
|
|
if (!Storage.exists(path.c_str())) {
|
|
LOG_ERR("READER", "File does not exist: %s", path.c_str());
|
|
return nullptr;
|
|
}
|
|
|
|
auto txt = std::unique_ptr<Txt>(new Txt(path, "/.crosspoint"));
|
|
if (txt->load()) {
|
|
return txt;
|
|
}
|
|
|
|
LOG_ERR("READER", "Failed to load TXT");
|
|
return nullptr;
|
|
}
|
|
|
|
void ReaderActivity::goToLibrary(const std::string& fromBookPath) {
|
|
// If coming from a book, start in that book's folder; otherwise start from root
|
|
auto initialPath = fromBookPath.empty() ? "/" : FsHelpers::extractFolderPath(fromBookPath);
|
|
activityManager.goToFileBrowser(std::move(initialPath));
|
|
}
|
|
|
|
void ReaderActivity::onGoToEpubReader(std::unique_ptr<Epub> epub) {
|
|
const auto epubPath = epub->getPath();
|
|
currentBookPath = epubPath;
|
|
activityManager.replaceActivity(std::make_unique<EpubReaderActivity>(renderer, mappedInput, std::move(epub)));
|
|
}
|
|
|
|
void ReaderActivity::onGoToBmpViewer(const std::string& path) {
|
|
activityManager.replaceActivity(std::make_unique<BmpViewerActivity>(renderer, mappedInput, path));
|
|
}
|
|
|
|
void ReaderActivity::onGoToXtcReader(std::unique_ptr<Xtc> xtc) {
|
|
const auto xtcPath = xtc->getPath();
|
|
currentBookPath = xtcPath;
|
|
activityManager.replaceActivity(std::make_unique<XtcReaderActivity>(renderer, mappedInput, std::move(xtc)));
|
|
}
|
|
|
|
void ReaderActivity::onGoToTxtReader(std::unique_ptr<Txt> txt) {
|
|
const auto txtPath = txt->getPath();
|
|
currentBookPath = txtPath;
|
|
activityManager.replaceActivity(std::make_unique<TxtReaderActivity>(renderer, mappedInput, std::move(txt)));
|
|
}
|
|
|
|
void ReaderActivity::onEnter() {
|
|
Activity::onEnter();
|
|
|
|
if (initialBookPath.empty()) {
|
|
goToLibrary(); // Start from root when entering via Browse
|
|
return;
|
|
}
|
|
|
|
currentBookPath = initialBookPath;
|
|
if (isBmpFile(initialBookPath)) {
|
|
onGoToBmpViewer(initialBookPath);
|
|
} else if (isXtcFile(initialBookPath)) {
|
|
auto xtc = loadXtc(initialBookPath);
|
|
if (!xtc) {
|
|
onGoBack();
|
|
return;
|
|
}
|
|
onGoToXtcReader(std::move(xtc));
|
|
} else if (isTxtFile(initialBookPath)) {
|
|
auto txt = loadTxt(initialBookPath);
|
|
if (!txt) {
|
|
onGoBack();
|
|
return;
|
|
}
|
|
onGoToTxtReader(std::move(txt));
|
|
} else {
|
|
auto epub = loadEpub(initialBookPath);
|
|
if (!epub) {
|
|
onGoBack();
|
|
return;
|
|
}
|
|
onGoToEpubReader(std::move(epub));
|
|
}
|
|
}
|
|
|
|
void ReaderActivity::onGoBack() { finish(); }
|