if (content)
m_content->setListbox(this);
entryReset();
+ /* if oldsel != m_selected, selectionChanged was already
+ emitted in entryReset. we want it in any case, so otherwise,
+ emit it now. */
if (oldsel == m_selected)
/* emit */ selectionChanged();
}
void eListbox::moveToEnd()
{
+ if (!m_content)
+ return;
/* move to last existing one ("end" is already invalid) */
m_content->cursorEnd(); m_content->cursorMove(-1);
/* current selection invisible? */
if (m_content->cursorValid() && !m_content->currentCursorSelectable())
{
- eDebug("position not selectable");
/* ok, our cursor position is valid (i.e. in list), but not selectable. */
/* when moving up, continue until we found a valid position. */
if ((dir == moveUp) || (dir == pageDown))
{
- eDebug("moving up");
while (m_content->cursorGet())
{
- eDebug("tick");
m_content->cursorMove(-1);
if (m_content->currentCursorSelectable())
{
- eDebug("now ok");
break;
}
}
} else
{
- eDebug("moving down");
+ /* else move down */
while (m_content->cursorValid())
{
- eDebug("TICK");
m_content->cursorMove(+1);
if (m_content->currentCursorSelectable())
{
- eDebug("NOW ok");
break;
}
}
if (!m_content->cursorValid())
- {
- eDebug("not valid (i.e.: end)");
m_content->cursorMove(-1);
- }
}
if (!m_content->currentCursorSelectable())
- {
- eDebug("can't move!");
m_content->cursorSet(oldsel);
- }
}
/* note that we could be on an invalid cursor position, but we don't
m_content->cursorSave();
m_content->cursorMove(m_top - m_selected);
+ gRegion entryrect = eRect(0, 0, size().width(), m_itemheight);
+ const gRegion &paint_region = *(gRegion*)data;
+
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->size() && m_selection_enabled);
+ gRegion entry_clip_rect = paint_region & entryrect;
+
+ if (!entry_clip_rect.empty())
+ m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet() && m_content->size() && m_selection_enabled);
+
+ /* (we could clip with entry_clip_rect, but
+ this shouldn't change the behaviour of any
+ well behaving content, so it would just
+ degrade performance without any gain.) */
+
m_content->cursorMove(+1);
+ entryrect.moveBy(ePoint(0, m_itemheight));
}
+ // clear/repaint empty/unused space between scrollbar and listboxentrys
if (m_scrollbar && m_scrollbar->isVisible())
{
+ style->setStyle(painter, eWindowStyle::styleListboxNormal);
painter.clip(eRect(m_scrollbar->position() - ePoint(5,0), eSize(5,m_scrollbar->size().height())));
painter.clear();
painter.clippop();
return 0;
}
+
case evtChangedSize:
recalcSize();
return eWidget::event(event, data, data2);
{
m_content_changed=true;
m_prev_scrollbar_page=-1;
- m_content->setSize(eSize(size().width(), m_itemheight));
+ if (m_content)
+ m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
if (m_items_per_page < 0) /* TODO: whyever - our size could be invalid, or itemheigh could be wrongly specified. */
void eListbox::entryAdded(int index)
{
- /* manage our local pointers. when the entry was added before the current position, we have to advance. */
+ if (m_content && (m_content->size() % m_items_per_page) == 1)
+ m_content_changed=true;
+ /* manage our local pointers. when the entry was added before the current position, we have to advance. */
/* we need to check <= - when the new entry has the (old) index of the cursor, the cursor was just moved down. */
if (index <= m_selected)
void eListbox::entryRemoved(int index)
{
- if (index == m_selected)
+ if (m_content && !(m_content->size() % m_items_per_page))
+ m_content_changed=true;
+
+ if (index == m_selected && m_content)
m_selected = m_content->cursorGet();
moveSelection(justCheck);