diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index 9fb1ed140..4a16ef774 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -1423,9 +1423,9 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta const int totalWidth = (pageEnd - pageStart) * iconSize + (pageEnd - pageStart - 1) * spacing; const int xStart = (SCREEN_WIDTH - totalWidth) / 2; - // Suppress nav overlay while canned-message freetext composer is active. - const bool hideForFreeText = (cannedMessageModule && cannedMessageModule->isFreeTextUIActive()); - bool navBarVisible = !hideForFreeText && (millis() - lastFrameChangeTime <= ICON_DISPLAY_DURATION_MS); + // Suppress nav overlay while canned-message text compose UI is active (freetext + emote picker). + const bool hideForTextCompose = (cannedMessageModule && cannedMessageModule->isFreeTextUIActive()); + bool navBarVisible = !hideForTextCompose && (millis() - lastFrameChangeTime <= ICON_DISPLAY_DURATION_MS); int y = navBarVisible ? (SCREEN_HEIGHT - iconSize - 1) : SCREEN_HEIGHT; #if defined(USE_EINK) diff --git a/src/modules/CannedMessageModule.h b/src/modules/CannedMessageModule.h index ebc562b56..7dbef9645 100644 --- a/src/modules/CannedMessageModule.h +++ b/src/modules/CannedMessageModule.h @@ -74,7 +74,11 @@ class CannedMessageModule : public SinglePortModule, public ObservablegetHeight() - layout.listTop - 2); - layout.contentWidth = std::max(1, display->getWidth() - reservedScrollbarWidth); + const int listHeight = std::max(0, display->getHeight() - layout.listTop); + const int fullWidth = display->getWidth(); + layout.contentWidth = std::max(1, fullWidth); layout.columns = std::max(1, layout.contentWidth / std::max(1, layout.cellWidth)); layout.columns = std::min(layout.columns, numEmotes); - layout.visibleRows = std::max(1, listHeight / std::max(1, layout.cellHeight)); + layout.visibleRows = std::max(1, (listHeight + cellGap) / std::max(1, layout.cellHeight)); layout.totalRows = (numEmotes + layout.columns - 1) / layout.columns; + if (layout.totalRows > layout.visibleRows) { + layout.contentWidth = std::max(1, fullWidth - scrollbarWidth); + layout.columns = std::max(1, layout.contentWidth / std::max(1, layout.cellWidth)); + layout.columns = std::min(layout.columns, numEmotes); + layout.totalRows = (numEmotes + layout.columns - 1) / layout.columns; + } + return layout; } } // namespace @@ -1149,9 +1155,9 @@ int CannedMessageModule::handleEmotePickerInput(const InputEvent *event) int columns = std::max(1, layout.columns); bool moveLeft = (event->inputEvent == INPUT_BROKER_LEFT); - bool moveRight = (event->inputEvent == INPUT_BROKER_RIGHT); + bool moveRight = (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS); bool moveUp = (event->inputEvent == INPUT_BROKER_UP || event->inputEvent == INPUT_BROKER_ALT_PRESS); - bool moveDown = (event->inputEvent == INPUT_BROKER_DOWN || event->inputEvent == INPUT_BROKER_USER_PRESS); + bool moveDown = (event->inputEvent == INPUT_BROKER_DOWN); bool isSelect = isSelectEvent(event); if (runState == CANNED_MESSAGE_RUN_STATE_EMOTE_PICKER) { if (event->inputEvent == INPUT_BROKER_SELECT) { @@ -1558,7 +1564,7 @@ void CannedMessageModule::drawEmotePickerScreen(OLEDDisplay *display, OLEDDispla } if (layout.totalRows > layout.visibleRows) { - int scrollbarHeight = layout.visibleRows * layout.cellHeight; + int scrollbarHeight = std::max(1, (layout.visibleRows * layout.cellHeight) - 1); int scrollTrackX = displayWidth - 6; display->drawRect(scrollTrackX, layout.listTop, 4, scrollbarHeight); int scrollBarLen = std::max(6, (scrollbarHeight * layout.visibleRows) / layout.totalRows);