fix: Render keyboard entry over multiple lines (#567)
Some checks are pending
CI / build (push) Waiting to run

## Summary

* Render keyboard entry over multiple lines
  * Grows display areas based on input text
  * Shown on OPDS entry, but applies everywhere

## Additional Context

* Fixes
https://github.com/crosspoint-reader/crosspoint-reader/issues/554

| One line | Multi-line |
| --- | --- |
|
![IMG_5925](https://github.com/user-attachments/assets/28be00a8-7b90-4bf6-9ebf-4d4ad6642bc9)
|
![IMG_5926](https://github.com/user-attachments/assets/1c69a96f-d868-49a1-866c-546ca7b784ab)
|

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? No
This commit is contained in:
Dave Allie 2026-01-28 02:43:04 +11:00 committed by GitHub
parent 140fcb9db5
commit 8c1c80787a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

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;