118 lines
4.5 KiB
C
118 lines
4.5 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <functional>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
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 versionTextRightX;
|
||
|
|
int versionTextY;
|
||
|
|
|
||
|
|
int bookProgressBarHeight;
|
||
|
|
};
|
||
|
|
|
||
|
|
// 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,
|
||
|
|
.versionTextRightX = 20,
|
||
|
|
.versionTextY = 738,
|
||
|
|
.bookProgressBarHeight = 4};
|
||
|
|
}
|
||
|
|
|
||
|
|
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 drawBattery(const GfxRenderer& renderer, Rect rect, bool showPercentage = true) const;
|
||
|
|
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<std::string(int index)>& rowTitle,
|
||
|
|
const std::function<std::string(int index)>& rowSubtitle,
|
||
|
|
const std::function<std::string(int index)>& rowIcon,
|
||
|
|
const std::function<std::string(int index)>& rowValue) const;
|
||
|
|
|
||
|
|
virtual void drawHeader(const GfxRenderer& renderer, Rect rect, const char* title) const;
|
||
|
|
virtual void drawTabBar(const GfxRenderer& renderer, Rect rect, const std::vector<TabInfo>& tabs,
|
||
|
|
bool selected) const;
|
||
|
|
virtual void drawRecentBookCover(GfxRenderer& renderer, Rect rect, const std::vector<RecentBook>& recentBooks,
|
||
|
|
const int selectorIndex, bool& coverRendered, bool& coverBufferStored,
|
||
|
|
bool& bufferRestored, std::function<bool()> storeCoverBuffer) const;
|
||
|
|
virtual void drawButtonMenu(GfxRenderer& renderer, Rect rect, int buttonCount, int selectedIndex,
|
||
|
|
const std::function<std::string(int index)>& buttonLabel,
|
||
|
|
const std::function<std::string(int index)>& 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 drawBookProgressBar(const GfxRenderer& renderer, const size_t bookProgress) const;
|
||
|
|
};
|