Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
2.2 kB · 51 lines
C
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#pragma once
#include <functional>#include <vector>
#include "MappedInputManager.h"
class ButtonNavigator final { using Callback = std::function<void()>; using Buttons = std::vector<MappedInputManager::Button>;
const uint16_t continuousStartMs; const uint16_t continuousIntervalMs; uint32_t lastContinuousNavTime = 0; static const MappedInputManager* mappedInput;
[[nodiscard]] bool shouldNavigateContinuously() const;
public: explicit ButtonNavigator(const uint16_t continuousIntervalMs = 500, const uint16_t continuousStartMs = 500) : continuousStartMs(continuousStartMs), continuousIntervalMs(continuousIntervalMs) {}
static void setMappedInputManager(const MappedInputManager& mappedInputManager) { mappedInput = &mappedInputManager; }
void onNext(const Callback& callback); void onPrevious(const Callback& callback); void onPressAndContinuous(const Buttons& buttons, const Callback& callback);
static void onNextPress(const Callback& callback); static void onPreviousPress(const Callback& callback); static void onPress(const Buttons& buttons, const Callback& callback);
void onNextRelease(const Callback& callback); void onPreviousRelease(const Callback& callback); void onRelease(const Buttons& buttons, const Callback& callback);
void onNextContinuous(const Callback& callback); void onPreviousContinuous(const Callback& callback); void onContinuous(const Buttons& buttons, const Callback& callback);
[[nodiscard]] static int nextIndex(int currentIndex, int totalItems); [[nodiscard]] static int previousIndex(int currentIndex, int totalItems);
[[nodiscard]] static int nextPageIndex(int currentIndex, int totalItems, int itemsPerPage); [[nodiscard]] static int previousPageIndex(int currentIndex, int totalItems, int itemsPerPage);
// Navigation uses the logical NavNext / NavPrevious buttons; MappedInputManager::mapButton resolves // them to physical buttons and applies any orientation-based direction swap, so this stays settings-free. [[nodiscard]] static Buttons getNextButtons() { return {MappedInputManager::Button::NavNext}; } [[nodiscard]] static Buttons getPreviousButtons() { return {MappedInputManager::Button::NavPrevious}; }};