diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index 72f7f00..79259a8 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -59,20 +59,23 @@ void MenuDisplay::update() const auto offset = m_rotateOffset; m_rotateOffset = 0; - const auto itemCount = menuItemCount(); - - if (itemCount) + if (const auto itemCount = menuItemCount()) { if (m_selectedIndex == -1) m_selectedIndex = 0; - m_selectedIndex = m_selectedIndex + offset; + m_selectedIndex += offset; if (m_selectedIndex < 0) m_selectedIndex += itemCount; if (m_selectedIndex >= itemCount) m_selectedIndex -= itemCount; + if (getMenuItem(m_selectedIndex).skipScroll()) + { + m_selectedIndex = offset > 0 ? getNextAccessibleMenuItemIndex(m_selectedIndex) : getPreviousAccessibleMenuItemIndex(m_selectedIndex); + } + if (m_selectedIndex < m_scrollOffset) m_scrollOffset = m_selectedIndex; if (m_selectedIndex >= m_scrollOffset + m_labels.size()) @@ -87,18 +90,6 @@ void MenuDisplay::update() runForEveryMenuItem([&](MenuItem &item){ item.update(); }); - - if (m_selectedIndex >= 0 && m_selectedIndex < m_menuItems.size() && getMenuItem(m_selectedIndex).skipScroll()) - { - if (offset > 0) - { - m_rotateOffset++; - } - else if (offset < 0) - { - m_rotateOffset--; - } - } } if (m_pressed) diff --git a/src/menudisplay.h b/src/menudisplay.h index 35c2800..368bb07 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -56,6 +56,32 @@ public: return *m_menuItems[index].get(); } + int getNextAccessibleMenuItemIndex(int index) const + { + for (std::size_t i = index + 1; i < m_menuItems.size(); ++i) + if (!m_menuItems[i]->skipScroll()) + return i; + + for (std::size_t i = 0; i < index; ++i) + if (!m_menuItems[i]->skipScroll()) + return i; + + return -1; + } + + int getPreviousAccessibleMenuItemIndex(int index) const + { + for (std::size_t i = index - 1; i < m_menuItems.size(); --i) + if (!m_menuItems[i]->skipScroll()) + return i; + + for (std::size_t i = m_menuItems.size() - 1; i > index; --i) + if (!m_menuItems[i]->skipScroll()) + return i; + + return -1; + } + void runForEveryMenuItem(std::function &&callback) { for (const auto &ptr : m_menuItems) diff --git a/src/scrollinterface.h b/src/scrollinterface.h index dc0382f..0699745 100644 --- a/src/scrollinterface.h +++ b/src/scrollinterface.h @@ -7,8 +7,11 @@ public: }; template -class StaticScrollBehaviour : public ScrollInterface { +class StaticScrollBehaviour : public virtual ScrollInterface { public: bool skipScroll() const override { return TScroll; } }; + +using SkipScroll = StaticScrollBehaviour; + } // namespace espgui