Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
4.2 kB · 124 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125#include "ButtonNavigator.h"
const MappedInputManager* ButtonNavigator::mappedInput = nullptr;
void ButtonNavigator::onNext(const Callback& callback) { onNextPress(callback); onNextContinuous(callback);}
void ButtonNavigator::onPrevious(const Callback& callback) { onPreviousPress(callback); onPreviousContinuous(callback);}
void ButtonNavigator::onPressAndContinuous(const Buttons& buttons, const Callback& callback) { onPress(buttons, callback); onContinuous(buttons, callback);}
void ButtonNavigator::onNextPress(const Callback& callback) { onPress(getNextButtons(), callback); }
void ButtonNavigator::onPreviousPress(const Callback& callback) { onPress(getPreviousButtons(), callback); }
void ButtonNavigator::onNextRelease(const Callback& callback) { onRelease(getNextButtons(), callback); }
void ButtonNavigator::onPreviousRelease(const Callback& callback) { onRelease(getPreviousButtons(), callback); }
void ButtonNavigator::onNextContinuous(const Callback& callback) { onContinuous(getNextButtons(), callback); }
void ButtonNavigator::onPreviousContinuous(const Callback& callback) { onContinuous(getPreviousButtons(), callback); }
void ButtonNavigator::onPress(const Buttons& buttons, const Callback& callback) { const bool wasPressed = std::any_of(buttons.begin(), buttons.end(), [](const MappedInputManager::Button button) { return mappedInput != nullptr && mappedInput->wasPressed(button); });
if (wasPressed) { callback(); }}
void ButtonNavigator::onRelease(const Buttons& buttons, const Callback& callback) { const bool wasReleased = std::any_of(buttons.begin(), buttons.end(), [](const MappedInputManager::Button button) { return mappedInput != nullptr && mappedInput->wasReleased(button); });
if (wasReleased) { if (lastContinuousNavTime == 0) { callback(); }
lastContinuousNavTime = 0; }}
void ButtonNavigator::onContinuous(const Buttons& buttons, const Callback& callback) { const bool isPressed = std::any_of(buttons.begin(), buttons.end(), [this](const MappedInputManager::Button button) { return mappedInput != nullptr && mappedInput->isPressed(button) && shouldNavigateContinuously(); });
if (isPressed) { callback(); lastContinuousNavTime = millis(); }}
bool ButtonNavigator::shouldNavigateContinuously() const { if (!mappedInput) return false;
const bool buttonHeldLongEnough = mappedInput->getHeldTime() > continuousStartMs; const bool navigationIntervalElapsed = (millis() - lastContinuousNavTime) > continuousIntervalMs;
return buttonHeldLongEnough && navigationIntervalElapsed;}
int ButtonNavigator::nextIndex(const int currentIndex, const int totalItems) { if (totalItems <= 0) return 0;
// Calculate the next index with wrap-around return (currentIndex + 1) % totalItems;}
int ButtonNavigator::previousIndex(const int currentIndex, const int totalItems) { if (totalItems <= 0) return 0;
// Calculate the previous index with wrap-around return (currentIndex + totalItems - 1) % totalItems;}
int ButtonNavigator::nextPageIndex(const int currentIndex, const int totalItems, const int itemsPerPage) { if (totalItems <= 0 || itemsPerPage <= 0) return 0;
// When items fit on one page, use index navigation instead if (totalItems <= itemsPerPage) { return nextIndex(currentIndex, totalItems); }
const int lastPageIndex = (totalItems - 1) / itemsPerPage; const int currentPageIndex = currentIndex / itemsPerPage;
if (currentPageIndex < lastPageIndex) { return (currentPageIndex + 1) * itemsPerPage; }
return 0;}
int ButtonNavigator::previousPageIndex(const int currentIndex, const int totalItems, const int itemsPerPage) { if (totalItems <= 0 || itemsPerPage <= 0) return 0;
// When items fit on one page, use index navigation instead if (totalItems <= itemsPerPage) { return previousIndex(currentIndex, totalItems); }
const int lastPageIndex = (totalItems - 1) / itemsPerPage; const int currentPageIndex = currentIndex / itemsPerPage;
if (currentPageIndex > 0) { return (currentPageIndex - 1) * itemsPerPage; }
return lastPageIndex * itemsPerPage;}