void eListbox::setContent(iListboxContent *content)
{
- int oldsel = m_selected;
m_content = content;
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();
}
bool eListbox::atBegin()
}
}
-void eListbox::moveSelection(int dir)
+void eListbox::moveSelection(long dir)
{
/* refuse to do anything without a valid list. */
if (!m_content)
/* redraw the old and newly selected */
gRegion inv = eRect(0, m_itemheight * (m_selected-m_top), size().width(), m_itemheight);
inv |= eRect(0, m_itemheight * (oldsel-m_top), size().width(), m_itemheight);
-
invalidate(inv);
}
}
if ((pages*m_items_per_page) < entries)
++pages;
int start=(m_top*100)/(pages*m_items_per_page);
- int vis=(m_items_per_page*100)/(pages*m_items_per_page);
+ int vis=(m_items_per_page*100+pages*m_items_per_page-1)/(pages*m_items_per_page);
if (vis < 3)
vis=3;
m_scrollbar->setStartEnd(start,start+vis);
}
}
+int eListbox::getEntryTop()
+{
+ return (m_selected - m_top) * m_itemheight;
+}
+
int eListbox::event(int event, void *data, void *data2)
{
switch (event)
if (!m_content)
return eWidget::event(event, data, data2);
- assert(m_content);
+ ASSERT(m_content);
getStyle(style);
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)
{
gRegion entry_clip_rect = paint_region & entryrect;
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
+ this shouldn't change the behavior of any
well behaving content, so it would just
degrade performance without any gain.) */
case evtAction:
if (isVisible())
{
- moveSelection((int)data2);
+ moveSelection((long)data2);
return 1;
}
return 0;
if (index == m_selected && m_content)
m_selected = m_content->cursorGet();
- moveSelection(justCheck);
+ if (m_content && m_content->cursorGet() >= m_content->size())
+ moveSelection(moveUp);
+ else
+ moveSelection(justCheck);
if ((m_top <= index) && (index < (m_top + m_items_per_page)))
{
{
m_content_changed = true;
m_prev_scrollbar_page = -1;
+ int oldsel;
if (selectionHome)
{
else
m_selected = 0;
m_content->cursorSet(m_selected);
- selectionChanged();
}
+ oldsel = m_selected;
moveSelection(justCheck);
+ /* if oldsel != m_selected, selectionChanged was already
+ emitted in moveSelection. we want it in any case, so otherwise,
+ emit it now. */
+ if (oldsel == m_selected)
+ /* emit */ selectionChanged();
invalidate();
}
m_style.m_background_color_set = 1;
}
+void eListbox::setBackgroundColorSelected(gRGB &col)
+{
+ m_style.m_background_color_selected = col;
+ m_style.m_background_color_selected_set = 1;
+}
+
void eListbox::setForegroundColor(gRGB &col)
{
m_style.m_foreground_color = col;
m_style.m_foreground_color_set = 1;
}
+void eListbox::setForegroundColorSelected(gRGB &col)
+{
+ m_style.m_foreground_color_selected = col;
+ m_style.m_foreground_color_selected_set = 1;
+}
+
void eListbox::setBackgroundPicture(ePtr<gPixmap> &pm)
{
m_style.m_background = pm;
m_style.m_selection = pm;
}
+void eListbox::invalidate(const gRegion ®ion)
+{
+ gRegion tmp(region);
+ if (m_content)
+ m_content->updateClip(tmp);
+ eWidget::invalidate(tmp);
+}
+
struct eListboxStyle *eListbox::getLocalStyle(void)
{
/* transparency is set directly in the widget */