fix: Render keyboard entry over multiple lines

Fixes https://github.com/crosspoint-reader/crosspoint-reader/issues/554
This commit is contained in:
Dave Allie 2026-01-28 02:32:20 +11:00
parent 140fcb9db5
commit acadc50181
No known key found for this signature in database
GPG Key ID: F2FDDB3AD8D0276F

View File

@ -256,8 +256,9 @@ void KeyboardEntryActivity::render() const {
renderer.drawCenteredText(UI_10_FONT_ID, startY, title.c_str()); renderer.drawCenteredText(UI_10_FONT_ID, startY, title.c_str());
// Draw input field // Draw input field
const int inputY = startY + 22; const int inputStartY = startY + 22;
renderer.drawText(UI_10_FONT_ID, 10, inputY, "["); int inputEndY = startY + 22;
renderer.drawText(UI_10_FONT_ID, 10, inputStartY, "[");
std::string displayText; std::string displayText;
if (isPassword) { if (isPassword) {
@ -269,19 +270,29 @@ void KeyboardEntryActivity::render() const {
// Show cursor at end // Show cursor at end
displayText += "_"; displayText += "_";
// Truncate if too long for display - use actual character width from font // Render input text across multiple lines
int approxCharWidth = renderer.getSpaceWidth(UI_10_FONT_ID); int lineStartIdx = 0;
if (approxCharWidth < 1) approxCharWidth = 8; // Fallback to approximate width int lineEndIdx = displayText.length();
const int maxDisplayLen = (pageWidth - 40) / approxCharWidth; while (true) {
if (displayText.length() > static_cast<size_t>(maxDisplayLen)) { std::string lineText = displayText.substr(lineStartIdx, lineEndIdx - lineStartIdx);
displayText = "..." + displayText.substr(displayText.length() - maxDisplayLen + 3); const int textWidth = renderer.getTextWidth(UI_10_FONT_ID, lineText.c_str());
} if (textWidth <= pageWidth - 40) {
renderer.drawText(UI_10_FONT_ID, 20, inputEndY, lineText.c_str());
if (lineEndIdx == displayText.length()) {
break;
}
renderer.drawText(UI_10_FONT_ID, 20, inputY, displayText.c_str()); inputEndY += renderer.getLineHeight(UI_10_FONT_ID);
renderer.drawText(UI_10_FONT_ID, pageWidth - 15, inputY, "]"); lineStartIdx = lineEndIdx;
lineEndIdx = displayText.length();
} else {
lineEndIdx -= 1;
}
}
renderer.drawText(UI_10_FONT_ID, pageWidth - 15, inputEndY, "]");
// Draw keyboard - use compact spacing to fit 5 rows on screen // Draw keyboard - use compact spacing to fit 5 rows on screen
const int keyboardStartY = inputY + 25; const int keyboardStartY = inputEndY + 25;
constexpr int keyWidth = 18; constexpr int keyWidth = 18;
constexpr int keyHeight = 18; constexpr int keyHeight = 18;
constexpr int keySpacing = 3; constexpr int keySpacing = 3;