+eListboxPythonMultiContent::eListboxPythonMultiContent()
+ :m_clip(gRegion::invalidRegion()), m_old_clip(gRegion::invalidRegion())
+{
+}
+
+eListboxPythonMultiContent::~eListboxPythonMultiContent()
+{
+ Py_XDECREF(m_buildFunc);
+ Py_XDECREF(m_selectableFunc);
+}
+
+void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update)
+{
+ m_selection_clip = rect;
+ if (m_listbox)
+ rect.moveBy(ePoint(0, m_listbox->getEntryTop()));
+ if (m_clip.valid())
+ m_clip |= rect;
+ else
+ 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 pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip)
+{
+ if (selected && sel_clip.valid())
+ {
+ gRegion part = rc - sel_clip;
+ if (!part.empty())
+ {
+ painter.clip(part);
+ style.setStyle(painter, eWindowStyle::styleListboxNormal);
+ if (pbackColor)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(pbackColor);
+ painter.setBackgroundColor(gRGB(color));
+ } // transparent background?
+ // 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);
+ if (!pbackColor && local_style && local_style->m_transparent_background)
+ ;
+ else
+ painter.clear();
+ painter.clippop();
+ selected = 0;
+ }
+ part = rc & sel_clip;
+ if (!part.empty())
+ {
+ painter.clip(part);
+ style.setStyle(painter, eWindowStyle::styleListboxSelected);
+ if (pbackColorSelected)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(pbackColorSelected);
+ painter.setBackgroundColor(gRGB(color));
+ }
+ else if (local_style && local_style->m_background_color_selected_set)
+ painter.setBackgroundColor(local_style->m_background_color_selected);
+ painter.clear();
+ painter.clippop();
+ selected = 1;
+ }
+ }
+ else
+ {
+ if (selected)
+ {
+ style.setStyle(painter, eWindowStyle::styleListboxSelected);
+ if (pbackColorSelected)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(pbackColorSelected);
+ painter.setBackgroundColor(gRGB(color));
+ }
+ else if (local_style && local_style->m_background_color_selected_set)
+ painter.setBackgroundColor(local_style->m_background_color_selected);
+ painter.clear();
+ }
+ else
+ {
+ style.setStyle(painter, eWindowStyle::styleListboxNormal);
+ if (pbackColor)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(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);
+ /* if we have no transparent background */
+ if (!pbackColor && local_style && local_style->m_transparent_background)
+ ;
+ else
+ painter.clear();
+ }
+ }
+ if (selected)
+ {
+ if (pforeColorSelected)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(pforeColorSelected);
+ painter.setForegroundColor(gRGB(color));
+ }
+ /* if we have a local foreground color set, use that. */
+ else if (local_style && local_style->m_foreground_color_selected_set)
+ painter.setForegroundColor(local_style->m_foreground_color_selected);
+ }
+ else
+ {
+ if (pforeColor)
+ {
+ unsigned int color = PyInt_AsUnsignedLongMask(pforeColor);
+ painter.setForegroundColor(gRGB(color));
+ }
+ /* if we have a local foreground color set, use that. */
+ else if (local_style && local_style->m_foreground_color_set)
+ painter.setForegroundColor(local_style->m_foreground_color);
+ }
+}
+
+static ePyObject lookupColor(ePyObject color, ePyObject data)
+{
+ if (color == Py_None)
+ return ePyObject();
+
+ if ((!color) && (!data))
+ return color;
+
+ unsigned int icolor = PyInt_AsUnsignedLongMask(color);
+
+ /* check if we have the "magic" template color */
+ if ((icolor & 0xFF000000) == 0xFF000000)
+ {
+ int index = icolor & 0xFFFFFF;
+ eDebug("[eListboxPythonMultiContent] template color index: %d", index);
+ return PyTuple_GetItem(data, index);
+ }
+
+ if (color == Py_None)
+ return ePyObject();
+
+ return color;
+}
+