ePtr<eActionMap> ptr;
eActionMap::getInstance(ptr);
+ m_itemheight = 25;
+
ptr->bindAction("ListboxActions", 0, 0, this);
}
if (!m_content->cursorValid())
m_content->cursorMove(-1);
break;
+ case pageUp:
+ if (m_content->cursorGet() >= m_items_per_page)
+ {
+ m_content->cursorMove(-m_items_per_page);
+ m_top -= m_items_per_page;
+ if (m_top < 0)
+ m_top = 0;
+ } else
+ {
+ m_top = 0;
+ m_content->cursorHome();
+ }
+ break;
case moveTop:
m_content->cursorHome();
m_top = 0; /* align with top, speeds up process */
break;
+
+ case pageDown:
+ m_content->cursorMove(m_items_per_page);
+ if (m_content->cursorValid())
+ break;
+ /* fall through */
case moveEnd:
/* move to last existing one ("end" is already invalid) */
m_content->cursorEnd(); m_content->cursorMove(-1);
-
- m_top = m_content->cursorGet() - m_items_per_page + 1;
- if (m_top < 0)
- m_top = 0;
+ /* current selection invisible? */
+ if (m_top + m_items_per_page <= m_content->cursorGet())
+ {
+ m_top = m_content->cursorGet() - m_items_per_page + 1;
+ if (m_top < 0)
+ m_top = 0;
+ }
break;
case justCheck:
break;
if (!m_content)
return eWidget::event(event, data, data2);
assert(m_content);
- recalcSize(); // move to event
getStyle(style);
for (int y = 0, i = 0; i < m_items_per_page; y += m_itemheight, ++i)
{
- m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet());
+ m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet() && m_content->size());
m_content->cursorMove(+1);
}
return 0;
}
+ case evtChangedSize:
+ recalcSize();
+ return eWidget::event(event, data, data2);
+
case evtAction:
if (isVisible())
{
moveSelection((int)data2);
return 1;
}
- break;
+ return 0;
default:
return eWidget::event(event, data, data2);
}
void eListbox::recalcSize()
{
- m_itemheight = 20;
m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
}
+void eListbox::setItemHeight(int h)
+{
+ if (h)
+ m_itemheight = h;
+ else
+ m_itemheight = 20;
+ recalcSize();
+}
+
void eListbox::entryAdded(int index)
{
/* manage our local pointers. when the entry was added before the current position, we have to advance. */