#pragma once #include #include #include #include class GfxRenderer; struct RecentBook; struct Rect { int x; int y; int width; int height; explicit Rect(int x = 0, int y = 0, int width = 0, int height = 0) : x(x), y(y), width(width), height(height) {} }; struct TabInfo { const char* label; bool selected; }; struct ThemeMetrics { int batteryWidth; int batteryHeight; int topPadding; int batteryBarHeight; int headerHeight; int verticalSpacing; int contentSidePadding; int listRowHeight; int listWithSubtitleRowHeight; int menuRowHeight; int menuSpacing; int tabSpacing; int tabBarHeight; int scrollBarWidth; int scrollBarRightOffset; int homeTopPadding; int homeCoverHeight; int homeCoverTileHeight; int homeRecentBooksCount; int buttonHintsHeight; int sideButtonHintsWidth; int progressBarHeight; int bookProgressBarHeight; int keyboardKeyWidth; int keyboardKeyHeight; int keyboardKeySpacing; bool keyboardBottomAligned; bool keyboardCenteredText; }; // Default theme implementation (Classic Theme) // Additional themes can inherit from this and override methods as needed namespace BaseMetrics { constexpr ThemeMetrics values = {.batteryWidth = 15, .batteryHeight = 12, .topPadding = 5, .batteryBarHeight = 20, .headerHeight = 45, .verticalSpacing = 10, .contentSidePadding = 20, .listRowHeight = 30, .listWithSubtitleRowHeight = 65, .menuRowHeight = 45, .menuSpacing = 8, .tabSpacing = 10, .tabBarHeight = 50, .scrollBarWidth = 4, .scrollBarRightOffset = 5, .homeTopPadding = 20, .homeCoverHeight = 400, .homeCoverTileHeight = 400, .homeRecentBooksCount = 1, .buttonHintsHeight = 40, .sideButtonHintsWidth = 30, .progressBarHeight = 16, .bookProgressBarHeight = 4, .keyboardKeyWidth = 18, .keyboardKeyHeight = 18, .keyboardKeySpacing = 3, .keyboardBottomAligned = false, .keyboardCenteredText = false}; } class BaseTheme { public: virtual ~BaseTheme() = default; // Component drawing methods virtual void drawProgressBar(const GfxRenderer& renderer, Rect rect, size_t current, size_t total) const; virtual void drawBatteryLeft(const GfxRenderer& renderer, Rect rect, bool showPercentage = true) const; // Left aligned (reader mode) virtual void drawBatteryRight(const GfxRenderer& renderer, Rect rect, bool showPercentage = true) const; // Right aligned (UI headers) virtual void drawButtonHints(GfxRenderer& renderer, const char* btn1, const char* btn2, const char* btn3, const char* btn4) const; virtual void drawSideButtonHints(const GfxRenderer& renderer, const char* topBtn, const char* bottomBtn) const; virtual void drawList(const GfxRenderer& renderer, Rect rect, int itemCount, int selectedIndex, const std::function& rowTitle, const std::function& rowSubtitle = nullptr, const std::function& rowIcon = nullptr, const std::function& rowValue = nullptr, bool highlightValue = false) const; virtual void drawHeader(const GfxRenderer& renderer, Rect rect, const char* title, const char* subtitle = nullptr) const; virtual void drawSubHeader(const GfxRenderer& renderer, Rect rect, const char* label, const char* rightLabel = nullptr) const; virtual void drawTabBar(const GfxRenderer& renderer, Rect rect, const std::vector& tabs, bool selected) const; virtual void drawRecentBookCover(GfxRenderer& renderer, Rect rect, const std::vector& recentBooks, const int selectorIndex, bool& coverRendered, bool& coverBufferStored, bool& bufferRestored, std::function storeCoverBuffer) const; virtual void drawButtonMenu(GfxRenderer& renderer, Rect rect, int buttonCount, int selectedIndex, const std::function& buttonLabel, const std::function& rowIcon) const; virtual Rect drawPopup(const GfxRenderer& renderer, const char* message) const; virtual void fillPopupProgress(const GfxRenderer& renderer, const Rect& layout, const int progress) const; virtual void drawReadingProgressBar(const GfxRenderer& renderer, const size_t bookProgress) const; virtual void drawHelpText(const GfxRenderer& renderer, Rect rect, const char* label) const; virtual void drawTextField(const GfxRenderer& renderer, Rect rect, const int textWidth) const; virtual void drawKeyboardKey(const GfxRenderer& renderer, Rect rect, const char* label, const bool isSelected) const; };