#include "EpubReaderChapterSelectionActivity.h" #include #include #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(); }