diff --git a/CMakeLists.txt b/CMakeLists.txt index 0372e2e..7e3c00e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,14 @@ set(headers src/accessorinterface.h src/actioninterface.h + src/actions/backproxyaction.h + src/actions/dummyaction.h + src/actions/multiaction.h + src/actions/popscreenaction.h + src/actions/pushscreenaction.h + src/actions/setvalueaction.h + src/actions/switchscreenaction.h + src/actions/toggleboolaction.h src/backinterface.h src/buttonsinterface.h src/changevaluedisplay.h @@ -22,27 +30,22 @@ set(headers src/graphdisplay.h src/icon.h src/iconinterface.h + src/icons/back.h + src/icons/checked.h + src/icons/unchecked.h + src/marginmenuitem.h src/menudisplay.h src/menuitem.h src/messagepopupdisplay.h src/popupdisplay.h src/richtextrenderer.h src/screenmanager.h + src/scrollinterface.h src/splitgraphdisplay.h - src/tftinstance.h src/textinterface.h src/textwithvaluehelper.h - src/actions/backproxyaction.h - src/actions/dummyaction.h - src/actions/multiaction.h - src/actions/pushscreenaction.h - src/actions/popscreenaction.h - src/actions/setvalueaction.h - src/actions/switchscreenaction.h - src/actions/toggleboolaction.h - src/icons/back.h - src/icons/checked.h - src/icons/unchecked.h + src/tftinstance.h + src/visibleinterface.h src/widgets/graph.h src/widgets/label.h src/widgets/progressbar.h diff --git a/src/marginmenuitem.h b/src/marginmenuitem.h new file mode 100644 index 0000000..e46771a --- /dev/null +++ b/src/marginmenuitem.h @@ -0,0 +1,19 @@ +#pragma once + +// local includes +#include "actioninterface.h" +#include "menuitem.h" +#include "textinterface.h" +#include "scrollinterface.h" + +namespace espgui { +class MarginMenuItem : + public virtual MenuItem, + public EmptyText, + public virtual ScrollInterface +{ +public: + void triggered() override {} + bool skipScroll() const override { return true; } +}; +} // namespace espgui diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index 6f6afb0..7a44e63 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -68,6 +68,18 @@ void MenuDisplay::update() runForEveryMenuItem([&](MenuItem &item){ item.update(); }); + + if (getMenuItem(m_selectedIndex).skipScroll()) + { + if (offset > 0) + { + m_rotateOffset++; + } + else if (offset < 0) + { + m_rotateOffset--; + } + } } else { @@ -103,6 +115,11 @@ void MenuDisplay::redraw() runForEveryMenuItem([&](MenuItem &item){ const auto index = i++; + if (!item.visible()) + { + return; + } + if (index < m_scrollOffset) return; diff --git a/src/menuitem.h b/src/menuitem.h index cf503e8..8f37187 100644 --- a/src/menuitem.h +++ b/src/menuitem.h @@ -6,6 +6,8 @@ #include "colorinterface.h" #include "iconinterface.h" #include "actioninterface.h" +#include "visibleinterface.h" +#include "scrollinterface.h" namespace espgui { using MenuItemIconInterface = IconInterface<24, 24>; @@ -20,7 +22,9 @@ class MenuItem : public virtual TextInterface, public virtual FontInterface, public virtual ColorInterface, - public virtual MenuItemIconInterface + public virtual MenuItemIconInterface, + public virtual VisibleInterface, + public virtual ScrollInterface { public: virtual ~MenuItem() = default; @@ -38,4 +42,12 @@ public: protected: T &m_menu; }; + +class EmptyMenuItem : + public MenuItem, + public EmptyText +{ +public: + void triggered() override {} +}; } // namespace espgui diff --git a/src/scrollinterface.h b/src/scrollinterface.h new file mode 100644 index 0000000..dc0382f --- /dev/null +++ b/src/scrollinterface.h @@ -0,0 +1,14 @@ +#pragma once + +namespace espgui { +class ScrollInterface { +public: + virtual bool skipScroll() const { return false; } +}; + +template +class StaticScrollBehaviour : public ScrollInterface { +public: + bool skipScroll() const override { return TScroll; } +}; +} // namespace espgui diff --git a/src/visibleinterface.h b/src/visibleinterface.h new file mode 100644 index 0000000..10b0802 --- /dev/null +++ b/src/visibleinterface.h @@ -0,0 +1,24 @@ +#pragma once + +namespace espgui { +class VisibleInterface { +public: + virtual bool visible() const { return true; } +}; + +template +class StaticVisibility : public virtual VisibleInterface +{ +public: + bool visible() const override { return TVisible; } +}; + +class ChangeableVisibility : public virtual VisibleInterface +{ +public: + void setVisible(bool visible) { m_visible = visible; } + bool visible() const override { return m_visible; } +private: + bool m_visible = true; +}; +} // namespace espgui