/!\ This PR depends on https://github.com/crosspoint-reader/crosspoint-reader/pull/732 being merged first Also requires the https://github.com/open-x4-epaper/community-sdk/pull/18 PR ## Summary Lyra theme icons on the home menu, in the file browser and on empty book covers     ## Additional Context - Added a function to the open-x4-sdk renderer to draw transparent images - Added a scripts/convert_icon.py script to convert svg/png icons into a C array that can be directly imported into the project. Usage: ```bash python ./scripts/convert_icon.py 'path/to/icon.png' cover 32 32 ``` This will create a components/icons/cover.h file with a C array called CoverIcon, of size 32x32px. Lyra uses icons from https://lucide.dev/icons with a stroke width of 2px, that can be downloaded with any desired size on the site. > The file browser is noticeably slower with the addition of icons, and using an image buffer like on the home page doesn't help very much. Any suggestions to optimize this are welcome. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**PARTIALLY**_ The icon conversion python script was generated by Copilot as I am not a python dev. --------- Co-authored-by: Dave Allie <dave@daveallie.com>
70 lines
4.2 KiB
C++
70 lines
4.2 KiB
C++
#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 = 60,
|
|
.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,
|
|
.bookProgressBarHeight = 4,
|
|
.keyboardKeyWidth = 31,
|
|
.keyboardKeyHeight = 50,
|
|
.keyboardKeySpacing = 0,
|
|
.keyboardBottomAligned = true,
|
|
.keyboardCenteredText = true};
|
|
}
|
|
|
|
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<TabInfo>& tabs,
|
|
bool selected) const override;
|
|
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<UIIcon(int index)>& rowIcon, const std::function<std::string(int index)>& 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<std::string(int index)>& buttonLabel,
|
|
const std::function<UIIcon(int index)>& rowIcon) const override;
|
|
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 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) const override;
|
|
void drawKeyboardKey(const GfxRenderer& renderer, Rect rect, const char* label, const bool isSelected) const override;
|
|
};
|