Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
7.6 kB · 167 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168#pragma once
#include <cstddef>#include <cstdint>#include <functional>#include <string>#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 progressBarHeight; int progressBarMarginTop; int statusBarHorizontalMargin; int statusBarVerticalMargin;
int keyboardKeyWidth; int keyboardKeyHeight; int keyboardKeySpacing; int keyboardBottomKeyHeight; int keyboardBottomKeySpacing; bool keyboardBottomAligned; bool keyboardCenteredText; int keyboardVerticalOffset; int keyboardTextFieldWidthPercent; int keyboardWidthPercent; int keyboardKeyCornerRadius;};
enum UIIcon { Folder, Text, Image, Book, File, Recent, Settings, Transfer, Library, Wifi, Hotspot };
enum class KeyboardKeyType { Normal, Shift, Mode, Space, Del, Ok, Disabled };
// 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 = 40, .homeCoverHeight = 400, .homeCoverTileHeight = 400, .homeRecentBooksCount = 1, .buttonHintsHeight = 40, .sideButtonHintsWidth = 30, .progressBarHeight = 16, .progressBarMarginTop = 1, .statusBarHorizontalMargin = 5, .statusBarVerticalMargin = 19, .keyboardKeyWidth = 22, .keyboardKeyHeight = 40, .keyboardKeySpacing = 0, .keyboardBottomKeyHeight = 35, .keyboardBottomKeySpacing = 5, .keyboardBottomAligned = true, .keyboardCenteredText = false, .keyboardVerticalOffset = -13, .keyboardTextFieldWidthPercent = 85, .keyboardWidthPercent = 90, .keyboardKeyCornerRadius = 0};}
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<std::string(int index)>& rowTitle, const std::function<std::string(int index)>& rowSubtitle = nullptr, const std::function<UIIcon(int index)>& rowIcon = nullptr, const std::function<std::string(int index)>& 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<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<UIIcon(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 drawStatusBar(GfxRenderer& renderer, const float bookProgress, const int currentPage, const int pageCount, std::string title, const int paddingBottom = 0, const int textYOffset = 0) const; virtual void drawHelpText(const GfxRenderer& renderer, Rect rect, const char* label) const; virtual void drawTextField(const GfxRenderer& renderer, Rect rect, const int textWidth, bool cursorMode = false, int contentStartX = 0, int contentWidth = 0) const; virtual 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; virtual bool showsFileIcons() const { return false; }
// Shared constants and helpers for battery drawing (used by all themes) static constexpr int batteryPercentSpacing = 4; static void drawBatteryOutline(const GfxRenderer& renderer, int x, int y, int battWidth, int rectHeight); static void drawBatteryLightningBolt(const GfxRenderer& renderer, int boltX, int boltY);};