Fix scrolling / skipScroll
This commit is contained in:
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user