Fix scrolling / skipScroll

This commit is contained in:
Florian Wetzel
2025-02-25 14:48:40 +01:00
parent beab503d28
commit 5f889d4d73
3 changed files with 37 additions and 17 deletions

View File

@ -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)

View File

@ -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<void(MenuItem&)> &&callback)
{
for (const auto &ptr : m_menuItems)

View File

@ -7,8 +7,11 @@ public:
};
template<bool TScroll>
class StaticScrollBehaviour : public ScrollInterface {
class StaticScrollBehaviour : public virtual ScrollInterface {
public:
bool skipScroll() const override { return TScroll; }
};
using SkipScroll = StaticScrollBehaviour<true>;
} // namespace espgui