/* 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);
}
}
}
}
+int eListbox::getEntryTop()
+{
+ return (m_selected - m_top) * m_itemheight;
+}
+
int eListbox::event(int event, void *data, void *data2)
{
switch (event)
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_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 */
RESULT SwigFromPython(ePtr<gPixmap> &res, PyObject *obj);
eListboxPythonMultiContent::eListboxPythonMultiContent()
- :m_temp_clip(gRegion::invalidRegion())
+ :m_clip(gRegion::invalidRegion()), m_old_clip(gRegion::invalidRegion())
{
}
void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update)
{
- if (update && m_selection_clip.valid())
- {
- m_temp_clip = m_selection_clip;
- m_temp_clip |= rect;
- m_selection_clip = rect;
- if (m_listbox)
- m_listbox->entryChanged(m_cursor);
- }
+ m_selection_clip = rect;
+ if (m_listbox)
+ rect.moveBy(ePoint(0, m_listbox->getEntryTop()));
+ if (m_clip.valid())
+ m_clip |= rect;
else
- m_selection_clip = rect;
+ m_clip = rect;
+ if (update && m_listbox)
+ m_listbox->entryChanged(m_cursor);
}
static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip)
{
- /* if we have a local background color set, use that. */
- if (local_style && local_style->m_background_color_set)
- painter.setBackgroundColor(local_style->m_background_color);
-
if (selected && sel_clip.valid())
{
- /* if we have no transparent background */
- if (!local_style || !local_style->m_transparent_background)
+ bool clear=true;
+ painter.clip(rc-sel_clip);
+ if (pbackColor)
{
- painter.clip(rc-sel_clip);
- if (pbackColor)
- {
- int color = PyInt_AsLong(pbackColor);
- painter.setBackgroundColor(gRGB(color));
- }/* if we have a local background color set, use that. */
- else if (local_style && local_style->m_background_color_set)
+ int color = PyInt_AsLong(pbackColor);
+ painter.setBackgroundColor(gRGB(color));
+ }
+ else if (local_style)
+ {
+ // transparent background?
+ if (local_style->m_transparent_background)
+ clear=false;
+ // if we have a local background color set, use that.
+ else if (local_style->m_background_color_set)
painter.setBackgroundColor(local_style->m_background_color);
- else
- style.setStyle(painter, eWindowStyle::styleListboxNormal);
- painter.clear();
- painter.clippop();
}
+ else
+ style.setStyle(painter, eWindowStyle::styleListboxNormal);
+ if (clear)
+ painter.clear();
+ painter.clippop();
painter.clip(rc&sel_clip);
style.setStyle(painter, eWindowStyle::styleListboxSelected);
if (pbackColorSelected)
}
else
{
+ bool clear=true;
style.setStyle(painter, eWindowStyle::styleListboxNormal);
if (pbackColor)
{
int color = PyInt_AsLong(pbackColor);
painter.setBackgroundColor(gRGB(color));
}/* if we have a local background color set, use that. */
- else if (local_style && local_style->m_background_color_set)
- painter.setBackgroundColor(local_style->m_background_color);
+ else if (local_style)
+ {
+ if (local_style->m_transparent_background)
+ clear=false;
+ else if (local_style->m_background_color_set)
+ painter.setBackgroundColor(local_style->m_background_color);
+ }
/* if we have no transparent background */
- if (!local_style || !local_style->m_transparent_background)
+ if (clear)
painter.clear();
}
}
if (sel_clip.valid())
sel_clip.moveBy(offset);
- if (m_temp_clip.valid())
- {
- m_temp_clip.moveBy(offset);
- itemregion &= m_temp_clip;
- m_temp_clip = eRect();
- }
-
/* get local listbox style, if present */
if (m_listbox)
local_style = m_listbox->getLocalStyle();
if (m_listbox)
m_listbox->setItemHeight(height);
}
+
+void eListboxPythonMultiContent::setList(ePyObject list)
+{
+ m_old_clip = m_clip = gRegion::invalidRegion();
+ eListboxPythonStringContent::setList(list);
+}
+
+void eListboxPythonMultiContent::updateClip(gRegion &clip)
+{
+ if (m_clip.valid())
+ {
+ clip &= m_clip;
+ if (m_old_clip.valid() && !(m_clip-m_old_clip).empty())
+ m_clip -= m_old_clip;
+ m_old_clip = m_clip;
+ }
+ else
+ m_old_clip = m_clip = gRegion::invalidRegion();
+}
ePyObject m_buildFunc;
ePyObject m_selectableFunc;
eRect m_selection_clip;
- gRegion m_temp_clip;
+ gRegion m_clip, m_old_clip;
public:
eListboxPythonMultiContent();
~eListboxPythonMultiContent();
enum { TYPE_TEXT, TYPE_PROGRESS, TYPE_PIXMAP, TYPE_PIXMAP_ALPHATEST };
void paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected);
int currentCursorSelectable();
-
+ void setList(SWIG_PYOBJECT(ePyObject) list);
void setFont(int fnt, gFont *fnt);
void setBuildFunc(SWIG_PYOBJECT(ePyObject) func);
void setSelectableFunc(SWIG_PYOBJECT(ePyObject) func);
void setItemHeight(int height);
void setSelectionClip(eRect &rect, bool update=false);
+ void updateClip(gRegion &);
private:
std::map<int, ePtr<gFont> > m_font;
};