Files
crosspoint-reader-mod/src/activities/home/BookManageMenuActivity.cpp

119 lines
3.8 KiB
C++
Raw Normal View History

#include "BookManageMenuActivity.h"
#include <GfxRenderer.h>
#include <I18n.h>
#include "ActivityResult.h"
#include "MappedInputManager.h"
#include "components/UITheme.h"
#include "fontIds.h"
void BookManageMenuActivity::buildMenuItems() {
menuItems.clear();
if (archived) {
menuItems.push_back({Action::UNARCHIVE, StrId::STR_UNARCHIVE_BOOK});
} else {
menuItems.push_back({Action::ARCHIVE, StrId::STR_ARCHIVE_BOOK});
}
menuItems.push_back({Action::DELETE, StrId::STR_DELETE_BOOK});
menuItems.push_back({Action::DELETE_CACHE, StrId::STR_DELETE_CACHE_ONLY});
menuItems.push_back({Action::REINDEX, StrId::STR_REINDEX_BOOK});
}
void BookManageMenuActivity::onEnter() {
Activity::onEnter();
selectedIndex = 0;
requestUpdate();
}
void BookManageMenuActivity::onExit() { Activity::onExit(); }
void BookManageMenuActivity::loop() {
// Long-press detection: REINDEX_FULL when long-pressing on the Reindex item
if (mappedInput.isPressed(MappedInputManager::Button::Confirm) && mappedInput.getHeldTime() >= LONG_PRESS_MS) {
if (!ignoreNextConfirmRelease && selectedIndex < static_cast<int>(menuItems.size()) &&
menuItems[selectedIndex].action == Action::REINDEX) {
ignoreNextConfirmRelease = true;
setResult(MenuResult{.action = static_cast<int>(Action::REINDEX_FULL)});
finish();
return;
}
}
buttonNavigator.onNext([this] {
selectedIndex = ButtonNavigator::nextIndex(selectedIndex, static_cast<int>(menuItems.size()));
requestUpdate();
});
buttonNavigator.onPrevious([this] {
selectedIndex = ButtonNavigator::previousIndex(selectedIndex, static_cast<int>(menuItems.size()));
requestUpdate();
});
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
if (ignoreNextConfirmRelease) {
ignoreNextConfirmRelease = false;
return;
}
if (selectedIndex < static_cast<int>(menuItems.size())) {
setResult(MenuResult{.action = static_cast<int>(menuItems[selectedIndex].action)});
finish();
return;
}
}
if (mappedInput.wasReleased(MappedInputManager::Button::Back)) {
ActivityResult r;
r.isCancelled = true;
setResult(std::move(r));
finish();
return;
}
}
void BookManageMenuActivity::render(RenderLock&&) {
renderer.clearScreen();
const auto pageWidth = renderer.getScreenWidth();
const auto pageHeight = renderer.getScreenHeight();
constexpr int popupMargin = 20;
constexpr int lineHeight = 30;
constexpr int titleHeight = 40;
const int optionCount = static_cast<int>(menuItems.size());
const int popupH = titleHeight + popupMargin + lineHeight * optionCount + popupMargin;
const int popupW = pageWidth - 60;
const int popupX = (pageWidth - popupW) / 2;
const int popupY = (pageHeight - popupH) / 2;
// Popup border and background
renderer.fillRect(popupX - 2, popupY - 2, popupW + 4, popupH + 4, true);
renderer.fillRect(popupX, popupY, popupW, popupH, false);
// Title
renderer.drawText(UI_12_FONT_ID, popupX + popupMargin, popupY + 8, tr(STR_MANAGE_BOOK), true, EpdFontFamily::BOLD);
// Divider line
const int dividerY = popupY + titleHeight;
renderer.fillRect(popupX + 4, dividerY, popupW - 8, 1, true);
// Menu items
const int startY = dividerY + popupMargin / 2;
for (int i = 0; i < optionCount; ++i) {
const int itemY = startY + i * lineHeight;
const bool isSelected = (i == selectedIndex);
if (isSelected) {
renderer.fillRect(popupX + 2, itemY, popupW - 4, lineHeight, true);
}
renderer.drawText(UI_10_FONT_ID, popupX + popupMargin, itemY, I18N.get(menuItems[i].labelId), !isSelected);
}
// Button hints
const auto labels = mappedInput.mapLabels(tr(STR_CANCEL), tr(STR_SELECT), tr(STR_DIR_UP), tr(STR_DIR_DOWN));
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
renderer.displayBuffer();
}