- Update open-x4-sdk submodule to 9f76376 (BatteryMonitor ESP-IDF 5.x compat) - Add RTC_NOINIT bounds check for logHead in Logging.cpp - Add drawTextRotated90CCW to GfxRenderer for dictionary UI - Add getWordXpos() accessor to TextBlock for dictionary word selection - Fix bare include paths (ActivityResult.h, RenderLock.h) across 10 files - Fix rvalue ref binding in setResult() lambdas (std::move pattern) - Fix std::max type mismatch (uint8_t vs int) in EpubReaderActivity - Fix FsFile forward declaration conflict in Dictionary.h - Restore StringUtils::checkFileExtension() and sortFileList() - Restore RecentBooksStore::removeBook() Made-with: Cursor
105 lines
3.0 KiB
C++
105 lines
3.0 KiB
C++
#include "NumericStepperActivity.h"
|
|
|
|
#include <GfxRenderer.h>
|
|
#include <I18n.h>
|
|
|
|
#include <algorithm>
|
|
#include <cstdio>
|
|
|
|
#include "activities/ActivityResult.h"
|
|
#include "MappedInputManager.h"
|
|
#include "components/UITheme.h"
|
|
#include "fontIds.h"
|
|
|
|
void NumericStepperActivity::onEnter() {
|
|
Activity::onEnter();
|
|
requestUpdate();
|
|
}
|
|
|
|
void NumericStepperActivity::onExit() { Activity::onExit(); }
|
|
|
|
void NumericStepperActivity::loop() {
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Back)) {
|
|
ActivityResult r;
|
|
r.isCancelled = true;
|
|
setResult(std::move(r));
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Confirm)) {
|
|
setResult(PageResult{.page = static_cast<uint32_t>(value)});
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
// Side buttons: ±1
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Up)) {
|
|
if (value < maxValue) {
|
|
value++;
|
|
requestUpdate();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Down)) {
|
|
if (value > minValue) {
|
|
value--;
|
|
requestUpdate();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Front face buttons: ±10
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Right)) {
|
|
value = std::min(value + 10, maxValue);
|
|
requestUpdate();
|
|
return;
|
|
}
|
|
|
|
if (mappedInput.wasPressed(MappedInputManager::Button::Left)) {
|
|
value = std::max(value - 10, minValue);
|
|
requestUpdate();
|
|
return;
|
|
}
|
|
}
|
|
|
|
void NumericStepperActivity::render(RenderLock&&) {
|
|
renderer.clearScreen();
|
|
|
|
const auto pageWidth = renderer.getScreenWidth();
|
|
const int lineHeight12 = renderer.getLineHeight(UI_12_FONT_ID);
|
|
|
|
const auto& metrics = UITheme::getInstance().getMetrics();
|
|
GUI.drawHeader(renderer, Rect{0, metrics.topPadding, pageWidth, metrics.headerHeight}, title.c_str());
|
|
|
|
char valueStr[16];
|
|
snprintf(valueStr, sizeof(valueStr), "%d", value);
|
|
|
|
const int textWidth = renderer.getTextWidth(UI_12_FONT_ID, valueStr);
|
|
const int startX = (pageWidth - textWidth) / 2;
|
|
const int valueY = metrics.topPadding + metrics.headerHeight + 60;
|
|
|
|
constexpr int highlightPad = 10;
|
|
renderer.fillRoundedRect(startX - highlightPad, valueY - 4, textWidth + highlightPad * 2, lineHeight12 + 8, 6,
|
|
Color::LightGray);
|
|
renderer.drawText(UI_12_FONT_ID, startX, valueY, valueStr, true);
|
|
|
|
const int arrowX = pageWidth / 2;
|
|
const int arrowUpY = valueY - 20;
|
|
const int arrowDownY = valueY + lineHeight12 + 12;
|
|
constexpr int arrowSize = 6;
|
|
for (int row = 0; row < arrowSize; row++) {
|
|
renderer.drawLine(arrowX - row, arrowUpY + row, arrowX + row, arrowUpY + row);
|
|
}
|
|
for (int row = 0; row < arrowSize; row++) {
|
|
renderer.drawLine(arrowX - row, arrowDownY + arrowSize - 1 - row, arrowX + row, arrowDownY + arrowSize - 1 - row);
|
|
}
|
|
|
|
const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_SAVE), "-10", "+10");
|
|
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
|
|
GUI.drawSideButtonHints(renderer, "+1", "-1");
|
|
|
|
renderer.displayBuffer();
|
|
}
|