mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-10 15:12:06 +00:00
Scroll navigation bar to next page when too long
This commit is contained in:
parent
06a65bd80e
commit
8f717d58e7
@ -3296,8 +3296,7 @@ static int8_t lastFrameIndex = -1;
|
|||||||
static uint32_t lastFrameChangeTime = 0;
|
static uint32_t lastFrameChangeTime = 0;
|
||||||
constexpr uint32_t ICON_DISPLAY_DURATION_MS = 1000;
|
constexpr uint32_t ICON_DISPLAY_DURATION_MS = 1000;
|
||||||
|
|
||||||
// Bottom navigation icons
|
void NavigationBar(OLEDDisplay *display, OLEDDisplayUiState *state)
|
||||||
void drawCustomFrameIcons(OLEDDisplay *display, OLEDDisplayUiState *state)
|
|
||||||
{
|
{
|
||||||
int currentFrame = state->currentFrame;
|
int currentFrame = state->currentFrame;
|
||||||
|
|
||||||
@ -3313,10 +3312,15 @@ void drawCustomFrameIcons(OLEDDisplay *display, OLEDDisplayUiState *state)
|
|||||||
const int bigOffset = useBigIcons ? 1 : 0;
|
const int bigOffset = useBigIcons ? 1 : 0;
|
||||||
|
|
||||||
const size_t totalIcons = screen->indicatorIcons.size();
|
const size_t totalIcons = screen->indicatorIcons.size();
|
||||||
if (totalIcons == 0)
|
if (totalIcons == 0) return;
|
||||||
return;
|
|
||||||
|
|
||||||
const int totalWidth = totalIcons * iconSize + (totalIcons - 1) * spacing;
|
const int iconsPerPage = (SCREEN_WIDTH + spacing) / (iconSize + spacing);
|
||||||
|
const int totalPages = (totalIcons + iconsPerPage - 1) / iconsPerPage;
|
||||||
|
const int currentPage = currentFrame / iconsPerPage;
|
||||||
|
const int pageStart = currentPage * iconsPerPage;
|
||||||
|
const int pageEnd = min(pageStart + iconsPerPage, totalIcons);
|
||||||
|
|
||||||
|
const int totalWidth = (pageEnd - pageStart) * iconSize + (pageEnd - pageStart - 1) * spacing;
|
||||||
const int xStart = (SCREEN_WIDTH - totalWidth) / 2;
|
const int xStart = (SCREEN_WIDTH - totalWidth) / 2;
|
||||||
|
|
||||||
// Only show bar briefly after switching frames (unless on E-Ink)
|
// Only show bar briefly after switching frames (unless on E-Ink)
|
||||||
@ -3340,10 +3344,10 @@ void drawCustomFrameIcons(OLEDDisplay *display, OLEDDisplayUiState *state)
|
|||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
display->drawRect(rectX, y - 2, rectWidth, rectHeight);
|
display->drawRect(rectX, y - 2, rectWidth, rectHeight);
|
||||||
|
|
||||||
// Icon drawing loop
|
// Icon drawing loop for the current page
|
||||||
for (size_t i = 0; i < totalIcons; ++i) {
|
for (size_t i = pageStart; i < pageEnd; ++i) {
|
||||||
const uint8_t *icon = screen->indicatorIcons[i];
|
const uint8_t *icon = screen->indicatorIcons[i];
|
||||||
const int x = xStart + i * (iconSize + spacing);
|
const int x = xStart + (i - pageStart) * (iconSize + spacing);
|
||||||
const bool isActive = (i == static_cast<size_t>(currentFrame));
|
const bool isActive = (i == static_cast<size_t>(currentFrame));
|
||||||
|
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
@ -3405,7 +3409,7 @@ void Screen::setup()
|
|||||||
// === Set custom overlay callbacks ===
|
// === Set custom overlay callbacks ===
|
||||||
static OverlayCallback overlays[] = {
|
static OverlayCallback overlays[] = {
|
||||||
drawFunctionOverlay, // For mute/buzzer modifiers etc.
|
drawFunctionOverlay, // For mute/buzzer modifiers etc.
|
||||||
drawCustomFrameIcons // Custom indicator icons for each frame
|
NavigationBar // Custom indicator icons for each frame
|
||||||
};
|
};
|
||||||
ui->setOverlays(overlays, sizeof(overlays) / sizeof(overlays[0]));
|
ui->setOverlays(overlays, sizeof(overlays) / sizeof(overlays[0]));
|
||||||
|
|
||||||
@ -3923,7 +3927,7 @@ void Screen::setFrames(FrameFocus focus)
|
|||||||
ui->disableAllIndicators();
|
ui->disableAllIndicators();
|
||||||
|
|
||||||
// Add overlays: frame icons and alert banner)
|
// Add overlays: frame icons and alert banner)
|
||||||
static OverlayCallback overlays[] = {drawCustomFrameIcons, drawAlertBannerOverlay};
|
static OverlayCallback overlays[] = {NavigationBar, drawAlertBannerOverlay};
|
||||||
ui->setOverlays(overlays, sizeof(overlays) / sizeof(overlays[0]));
|
ui->setOverlays(overlays, sizeof(overlays) / sizeof(overlays[0]));
|
||||||
|
|
||||||
prevFrame = -1; // Force drawNodeInfo to pick a new node (because our list
|
prevFrame = -1; // Force drawNodeInfo to pick a new node (because our list
|
||||||
|
Loading…
Reference in New Issue
Block a user