131 lines
4.2 KiB
C++
131 lines
4.2 KiB
C++
#include "EpubReaderChapterSelectionActivity.h"
|
|
|
|
#include <GfxRenderer.h>
|
|
#include <I18n.h>
|
|
|
|
#include "MappedInputManager.h"
|
|
#include "components/UITheme.h"
|
|
#include "fontIds.h"
|
|
|
|
int EpubReaderChapterSelectionActivity::getTotalItems() const { return epub->getTocItemsCount(); }
|
|
|
|
void EpubReaderChapterSelectionActivity::onEnter() {
|
|
Activity::onEnter();
|
|
|
|
if (!epub) {
|
|
return;
|
|
}
|
|
|
|
selectorIndex = epub->getTocIndexForSpineIndex(currentSpineIndex);
|
|
if (selectorIndex == -1) {
|
|
selectorIndex = 0;
|
|
}
|
|
|
|
// Trigger first update
|
|
requestUpdate();
|
|
}
|
|
|
|
void EpubReaderChapterSelectionActivity::onExit() { Activity::onExit(); }
|
|
|
|
void EpubReaderChapterSelectionActivity::loop() {
|
|
const int pageItems = UITheme::getInstance().getNumberOfItemsPerPage(renderer, true, false, true, false);
|
|
const int totalItems = getTotalItems();
|
|
|
|
if (mappedInput.wasReleased(MappedInputManager::Button::Back)) {
|
|
ActivityResult result;
|
|
result.isCancelled = true;
|
|
setResult(std::move(result));
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
auto selectChapter = [this] {
|
|
const auto tocItem = epub->getTocItem(selectorIndex);
|
|
if (tocItem.spineIndex == -1) {
|
|
ActivityResult result;
|
|
result.isCancelled = true;
|
|
setResult(std::move(result));
|
|
finish();
|
|
} else {
|
|
setResult(ChapterResult{tocItem.spineIndex, tocItem.anchor});
|
|
finish();
|
|
}
|
|
};
|
|
|
|
auto metrics = UITheme::getInstance().getMetrics();
|
|
Rect screen = UITheme::getInstance().getScreenSafeArea(renderer, true, false);
|
|
const int contentTop = screen.y + metrics.topPadding + metrics.headerHeight + metrics.verticalSpacing;
|
|
const int contentHeight = screen.height - contentTop - metrics.verticalSpacing;
|
|
switch (handleListTouch(selectorIndex, totalItems, contentTop, contentHeight, false)) {
|
|
case ListTouchResult::Activated:
|
|
selectChapter();
|
|
return;
|
|
case ListTouchResult::Consumed:
|
|
return;
|
|
case ListTouchResult::None:
|
|
break;
|
|
}
|
|
|
|
const auto swipe = mappedInput.wasSwipe();
|
|
if (swipe == MappedInputManager::SwipeDir::Up) {
|
|
selectorIndex = ButtonNavigator::nextPageIndex(selectorIndex, totalItems, pageItems);
|
|
requestUpdate();
|
|
return;
|
|
}
|
|
if (swipe == MappedInputManager::SwipeDir::Down) {
|
|
selectorIndex = ButtonNavigator::previousPageIndex(selectorIndex, totalItems, pageItems);
|
|
requestUpdate();
|
|
return;
|
|
}
|
|
|
|
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
|
|
selectChapter();
|
|
}
|
|
|
|
buttonNavigator.onNextRelease([this, totalItems] {
|
|
selectorIndex = ButtonNavigator::nextIndex(selectorIndex, totalItems);
|
|
requestUpdate();
|
|
});
|
|
|
|
buttonNavigator.onPreviousRelease([this, totalItems] {
|
|
selectorIndex = ButtonNavigator::previousIndex(selectorIndex, totalItems);
|
|
requestUpdate();
|
|
});
|
|
|
|
buttonNavigator.onNextContinuous([this, totalItems, pageItems] {
|
|
selectorIndex = ButtonNavigator::nextPageIndex(selectorIndex, totalItems, pageItems);
|
|
requestUpdate();
|
|
});
|
|
|
|
buttonNavigator.onPreviousContinuous([this, totalItems, pageItems] {
|
|
selectorIndex = ButtonNavigator::previousPageIndex(selectorIndex, totalItems, pageItems);
|
|
requestUpdate();
|
|
});
|
|
}
|
|
|
|
void EpubReaderChapterSelectionActivity::render(RenderLock&&) {
|
|
renderer.clearScreen();
|
|
|
|
auto metrics = UITheme::getInstance().getMetrics();
|
|
Rect screen = UITheme::getInstance().getScreenSafeArea(renderer, true, false);
|
|
|
|
GUI.drawHeader(renderer, Rect{screen.x, screen.y + metrics.topPadding, screen.width, metrics.headerHeight},
|
|
tr(STR_SELECT_CHAPTER));
|
|
|
|
const int contentTop = screen.y + metrics.topPadding + metrics.headerHeight + metrics.verticalSpacing;
|
|
const int contentHeight = screen.height - contentTop - metrics.verticalSpacing;
|
|
|
|
const int totalItems = getTotalItems();
|
|
GUI.drawList(renderer, Rect{screen.x, contentTop, screen.width, contentHeight}, totalItems, selectorIndex,
|
|
[this](int index) {
|
|
auto item = epub->getTocItem(index);
|
|
std::string indent((item.level - 1) * 2, ' ');
|
|
return indent + item.title;
|
|
});
|
|
|
|
const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_SELECT), tr(STR_DIR_UP), tr(STR_DIR_DOWN));
|
|
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
|
|
|
|
renderer.displayBuffer();
|
|
}
|