Fix scrolling / skipScroll
This commit is contained in:
@ -59,20 +59,23 @@ void MenuDisplay::update()
|
|||||||
const auto offset = m_rotateOffset;
|
const auto offset = m_rotateOffset;
|
||||||
m_rotateOffset = 0;
|
m_rotateOffset = 0;
|
||||||
|
|
||||||
const auto itemCount = menuItemCount();
|
if (const auto itemCount = menuItemCount())
|
||||||
|
|
||||||
if (itemCount)
|
|
||||||
{
|
{
|
||||||
if (m_selectedIndex == -1)
|
if (m_selectedIndex == -1)
|
||||||
m_selectedIndex = 0;
|
m_selectedIndex = 0;
|
||||||
|
|
||||||
m_selectedIndex = m_selectedIndex + offset;
|
m_selectedIndex += offset;
|
||||||
|
|
||||||
if (m_selectedIndex < 0)
|
if (m_selectedIndex < 0)
|
||||||
m_selectedIndex += itemCount;
|
m_selectedIndex += itemCount;
|
||||||
if (m_selectedIndex >= itemCount)
|
if (m_selectedIndex >= itemCount)
|
||||||
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)
|
if (m_selectedIndex < m_scrollOffset)
|
||||||
m_scrollOffset = m_selectedIndex;
|
m_scrollOffset = m_selectedIndex;
|
||||||
if (m_selectedIndex >= m_scrollOffset + m_labels.size())
|
if (m_selectedIndex >= m_scrollOffset + m_labels.size())
|
||||||
@ -87,18 +90,6 @@ void MenuDisplay::update()
|
|||||||
runForEveryMenuItem([&](MenuItem &item){
|
runForEveryMenuItem([&](MenuItem &item){
|
||||||
item.update();
|
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)
|
if (m_pressed)
|
||||||
|
@ -56,6 +56,32 @@ public:
|
|||||||
return *m_menuItems[index].get();
|
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)
|
void runForEveryMenuItem(std::function<void(MenuItem&)> &&callback)
|
||||||
{
|
{
|
||||||
for (const auto &ptr : m_menuItems)
|
for (const auto &ptr : m_menuItems)
|
||||||
|
@ -7,8 +7,11 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<bool TScroll>
|
template<bool TScroll>
|
||||||
class StaticScrollBehaviour : public ScrollInterface {
|
class StaticScrollBehaviour : public virtual ScrollInterface {
|
||||||
public:
|
public:
|
||||||
bool skipScroll() const override { return TScroll; }
|
bool skipScroll() const override { return TScroll; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using SkipScroll = StaticScrollBehaviour<true>;
|
||||||
|
|
||||||
} // namespace espgui
|
} // namespace espgui
|
||||||
|
Reference in New Issue
Block a user