#pragma once #include #include #include #include #include #include #include "../Activity.h" class MyLibraryActivity final : public Activity { public: enum class Tab { Recent, Files }; private: TaskHandle_t displayTaskHandle = nullptr; SemaphoreHandle_t renderingMutex = nullptr; Tab currentTab = Tab::Recent; int selectorIndex = 0; bool updateRequired = false; // State machine for button press detection enum class ButtonState { Idle, FirstPress, WaitingForSecondPress, DoublePressDetected, WaitingForReleaseAfterLongPress }; ButtonState buttonState = ButtonState::Idle; unsigned long firstPressTime = 0; // Time of first PRESS unsigned long firstReleaseTime = 0; // Time of first RELEASE bool isPrevButtonPressed = false; // Which button was pressed first // Action execution functions void executeMoveItem(bool isPrevButton); void executeSkipPage(bool isPrevButton); void executeSwitchTab(bool isPrevButton); // Recent tab state std::vector bookTitles; // Display titles for each book std::vector bookPaths; // Paths for each visible book (excludes missing) // Files tab state (from FileSelectionActivity) std::string basepath = "/"; std::vector files; // Callbacks const std::function onGoHome; const std::function onSelectBook; // Number of items that fit on a page int getPageItems() const; int getCurrentItemCount() const; int getTotalPages() const; int getCurrentPage() const; // Data loading void loadRecentBooks(); void loadFiles(); size_t findEntry(const std::string& name) const; // Rendering static void taskTrampoline(void* param); [[noreturn]] void displayTaskLoop(); void render() const; void renderRecentTab() const; void renderFilesTab() const; public: explicit MyLibraryActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, const std::function& onGoHome, const std::function& onSelectBook, Tab initialTab = Tab::Recent, std::string initialPath = "/") : Activity("MyLibrary", renderer, mappedInput), currentTab(initialTab), basepath(initialPath.empty() ? "/" : std::move(initialPath)), onGoHome(onGoHome), onSelectBook(onSelectBook) {} void onEnter() override; void onExit() override; void loop() override; };