diff --git a/src/iconinterface.h b/src/iconinterface.h index 8ff1fe9..2adf241 100644 --- a/src/iconinterface.h +++ b/src/iconinterface.h @@ -4,6 +4,7 @@ #include "icon.h" namespace espgui { + template class IconInterface { @@ -11,10 +12,25 @@ public: virtual const Icon *icon() const { return nullptr; } }; +template +class SelectedIconInterface +{ +public: + virtual const Icon *selectedIcon() const { return nullptr; } +}; + template *T> class StaticIcon : public virtual IconInterface { public: virtual const Icon *icon() const { return T; } }; + +template *T> +class StaticSelectedIcon : public virtual SelectedIconInterface +{ +public: + virtual const Icon *selectedIcon() const { return T; } +}; + } // namespace espgui diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index b4cf223..bed1a6b 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -161,6 +161,13 @@ void MenuDisplay::redraw() drawItemRect(*labelsIter, TFT_GREY); *iconsIter = nullptr; labelsIter->start(); + + if (auto icon = item.selectedIcon()) + { + tft.setSwapBytes(true); + tft.pushImage(tft.width() - 6 - icon->WIDTH, labelsIter->y() + 1, icon->WIDTH, icon->HEIGHT, icon->buffer); + tft.setSwapBytes(false); + } } } else if (relativeIndex == m_highlightedIndex) @@ -176,16 +183,15 @@ void MenuDisplay::redraw() if (item.icon() != *iconsIter) { - if (*iconsIter) - tft.fillRect(6, labelsIter->y()+1, 24, 24, selected ? TFT_GREY : TFT_BLACK); - auto icon = item.icon(); if (icon) { tft.setSwapBytes(true); - tft.pushImage(6, labelsIter->y()+1, icon->WIDTH, icon->HEIGHT, icon->buffer); + tft.pushImage(6, labelsIter->y() + 1, icon->WIDTH, icon->HEIGHT, icon->buffer); tft.setSwapBytes(false); } + else if (*iconsIter) + tft.fillRect(6, labelsIter->y() + 1, 24, 24, selected ? TFT_GREY : TFT_BLACK); *iconsIter = icon; } diff --git a/src/menuitem.h b/src/menuitem.h index 8f37187..5434e81 100644 --- a/src/menuitem.h +++ b/src/menuitem.h @@ -10,19 +10,26 @@ #include "scrollinterface.h" namespace espgui { -using MenuItemIconInterface = IconInterface<24, 24>; using MenuItemIcon = Icon<24, 24>; +using MenuItemIconInterface = IconInterface<24, 24>; + +using MenuItemSelectedIconInterface = SelectedIconInterface<24, 24>; + template using StaticMenuItemIcon = StaticIcon<24, 24, T>; +template +using StaticMenuItemSelectedIcon = StaticSelectedIcon<24, 24, T>; + class MenuItem : public virtual ActionInterface, public virtual TextInterface, public virtual FontInterface, public virtual ColorInterface, public virtual MenuItemIconInterface, + public virtual MenuItemSelectedIconInterface, public virtual VisibleInterface, public virtual ScrollInterface { @@ -44,8 +51,8 @@ protected: }; class EmptyMenuItem : - public MenuItem, - public EmptyText + public MenuItem, + public EmptyText { public: void triggered() override {}