#pragma once #include "components/themes/BaseTheme.h" class GfxRenderer; // Lyra theme metrics (zero runtime cost) namespace LyraMetrics { constexpr ThemeMetrics values = {.batteryWidth = 16, .batteryHeight = 12, .topPadding = 5, .batteryBarHeight = 40, .headerHeight = 84, .verticalSpacing = 16, .contentSidePadding = 20, .listRowHeight = 40, .listWithSubtitleRowHeight = 68, .menuRowHeight = 64, .menuSpacing = 8, .tabSpacing = 8, .tabBarHeight = 40, .scrollBarWidth = 4, .scrollBarRightOffset = 5, .homeTopPadding = 56, .homeCoverHeight = 226, .homeCoverTileHeight = 242, .homeRecentBooksCount = 1, .buttonHintsHeight = 40, .sideButtonHintsWidth = 30, .progressBarHeight = 16, .progressBarMarginTop = 1, .statusBarHorizontalMargin = 5, .statusBarVerticalMargin = 19, .keyboardKeyWidth = 31, .keyboardKeyHeight = 40, .keyboardKeySpacing = 0, .keyboardBottomKeyHeight = 35, .keyboardBottomKeySpacing = 5, .keyboardBottomAligned = true, .keyboardCenteredText = false, .keyboardVerticalOffset = -7}; } class LyraTheme : public BaseTheme { public: // Component drawing methods // void drawProgressBar(const GfxRenderer& renderer, Rect rect, size_t current, size_t total) override; void drawBatteryLeft(const GfxRenderer& renderer, Rect rect, bool showPercentage = true) const override; void drawBatteryRight(const GfxRenderer& renderer, Rect rect, bool showPercentage = true) const override; void drawHeader(const GfxRenderer& renderer, Rect rect, const char* title, const char* subtitle) const override; void drawSubHeader(const GfxRenderer& renderer, Rect rect, const char* label, const char* rightLabel = nullptr) const override; void drawTabBar(const GfxRenderer& renderer, Rect rect, const std::vector& tabs, bool selected) const override; void drawList(const GfxRenderer& renderer, Rect rect, int itemCount, int selectedIndex, const std::function& rowTitle, const std::function& rowSubtitle, const std::function& rowIcon, const std::function& rowValue, bool highlightValue) const override; void drawButtonHints(GfxRenderer& renderer, const char* btn1, const char* btn2, const char* btn3, const char* btn4) const override; void drawSideButtonHints(const GfxRenderer& renderer, const char* topBtn, const char* bottomBtn) const override; void drawButtonMenu(GfxRenderer& renderer, Rect rect, int buttonCount, int selectedIndex, const std::function& buttonLabel, const std::function& rowIcon) const override; void drawRecentBookCover(GfxRenderer& renderer, Rect rect, const std::vector& recentBooks, const int selectorIndex, bool& coverRendered, bool& coverBufferStored, bool& bufferRestored, std::function storeCoverBuffer) const override; void drawEmptyRecents(const GfxRenderer& renderer, const Rect rect) const; Rect drawPopup(const GfxRenderer& renderer, const char* message) const override; void fillPopupProgress(const GfxRenderer& renderer, const Rect& layout, const int progress) const override; void drawTextField(const GfxRenderer& renderer, Rect rect, const int textWidth, bool cursorMode = false, int contentStartX = 0, int contentWidth = 0) const override; void drawKeyboardKey(const GfxRenderer& renderer, Rect rect, const char* label, const bool isSelected, const char* secondaryLabel = nullptr, KeyboardKeyType keyType = KeyboardKeyType::Normal, bool inactiveSelection = false) const override; bool showsFileIcons() const override { return true; } protected: static int getRecentBookProgressPercent(const RecentBook& book); static void drawProgressBadge(const GfxRenderer& renderer, Rect anchorRect, int progressPercent); };