DEFINE_REF(eListboxPythonStringContent);
-eListboxPythonStringContent::eListboxPythonStringContent(): m_itemheight(25)
+eListboxPythonStringContent::eListboxPythonStringContent()
+ :m_cursor(0), m_itemheight(25)
{
}
{
if (local_style->m_background && cursorValid)
painter.blit(local_style->m_background, offset, eRect(), gPainter::BT_ALPHATEST);
- else
+ else if (selected && !local_style->m_selection)
painter.clear();
}
{
if (local_style->m_background && cursorValid)
painter.blit(local_style->m_background, offset, eRect(), gPainter::BT_ALPHATEST);
- else
+ else if (selected && !local_style->m_selection)
painter.clear();
}
if (PyTuple_Check(item))
{
/* handle left part. get item from tuple, convert to string, display. */
-
text = PyTuple_GET_ITEM(item, 0);
text = PyObject_Str(text); /* creates a new object - old object was borrowed! */
const char *string = (text && PyString_Check(text)) ? PyString_AsString(text) : "<not-a-string>";
int value_alignment_left = !*string;
/* now, handle the value. get 2nd part from tuple*/
- value = PyTuple_GET_ITEM(item, 1);
+ if (PyTuple_Size(item) >= 2) // when no 2nd entry is in tuple this is a non selectable entry without config part
+ value = PyTuple_GET_ITEM(item, 1);
+
if (value)
{
ePyObject args = PyTuple_New(1);
}
}
/* type is borrowed */
- } else
+ } else if (value)
eWarning("eListboxPythonConfigContent: second value of tuple is not a tuple.");
if (value)
Py_DECREF(value);
m_listbox->entryChanged(m_cursor);
}
-static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid)
+static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid, bool clear=true)
{
if (pbackColor)
{
painter.blit(local_style->m_background, offset, eRect(), 0);
return;
}
+ else if (local_style->m_transparent_background)
+ return;
}
- painter.clear();
+ if (clear)
+ painter.clear();
}
-static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid)
+static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid, bool clear=true)
{
if (pbackColorSelected)
{
return;
}
}
- painter.clear();
+ if (clear)
+ painter.clear();
}
-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, const ePoint &offset, bool cursorValid)
+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, const ePoint &offset, bool cursorValid, bool clear=true)
{
if (selected && sel_clip.valid())
{
{
painter.clip(part);
style.setStyle(painter, eWindowStyle::styleListboxNormal);
- clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
+ clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
painter.clippop();
selected = 0;
}
{
painter.clip(part);
style.setStyle(painter, eWindowStyle::styleListboxSelected);
- clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
+ clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
painter.clippop();
selected = 1;
}
else if (selected)
{
style.setStyle(painter, eWindowStyle::styleListboxSelected);
- clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
+ clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
if (local_style && local_style->m_selection)
painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST);
}
else
{
style.setStyle(painter, eWindowStyle::styleListboxNormal);
- clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
+ clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
}
if (selected)
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
painter.setFont(m_font[fnt]);
}
break;
}
+ case TYPE_PROGRESS_PIXMAP: // Progress
+ /*
+ (1, x, y, width, height, filled_percent, pixmap [, borderWidth, foreColor, backColor, backColorSelected] )
+ */
case TYPE_PROGRESS: // Progress
{
/*
pwidth = PyTuple_GET_ITEM(item, 3),
pheight = PyTuple_GET_ITEM(item, 4),
pfilled_perc = PyTuple_GET_ITEM(item, 5),
- pborderWidth, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected;
-
- if (!(px && py && pwidth && pheight && pfilled_perc))
+ ppixmap, pborderWidth, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected;
+ int idx = 6;
+ if (type == TYPE_PROGRESS)
{
- eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS, x, y, width, height, filled percent [,border width, foreColor, backColor, backColorSelected]))");
- goto error_out;
+ if (!(px && py && pwidth && pheight && pfilled_perc))
+ {
+ eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS, x, y, width, height, filled percent [,border width, foreColor, backColor, backColorSelected]))");
+ goto error_out;
+ }
+ }
+ else
+ {
+ ppixmap = PyTuple_GET_ITEM(item, idx++);
+ if (ppixmap == Py_None)
+ continue;
+ if (!(px && py && pwidth && pheight && pfilled_perc, ppixmap))
+ {
+ eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS_PIXMAP, x, y, width, height, filled percent, pixmap, [,border width, foreColor, backColor, backColorSelected]))");
+ goto error_out;
+ }
}
- if (size > 6)
+ if (size > idx)
{
- pborderWidth = PyTuple_GET_ITEM(item, 6);
+ pborderWidth = PyTuple_GET_ITEM(item, idx++);
if (pborderWidth == Py_None)
pborderWidth = ePyObject();
}
- if (size > 7)
+ if (size > idx)
{
- pforeColor = PyTuple_GET_ITEM(item, 7);
+ pforeColor = PyTuple_GET_ITEM(item, idx++);
if (pforeColor == Py_None)
pforeColor = ePyObject();
}
- if (size > 8)
+ if (size > idx)
{
- pforeColorSelected = PyTuple_GET_ITEM(item, 8);
+ pforeColorSelected = PyTuple_GET_ITEM(item, idx++);
if (pforeColorSelected == Py_None)
pforeColorSelected=ePyObject();
}
- if (size > 9)
+ if (size > idx)
{
- pbackColor = PyTuple_GET_ITEM(item, 9);
+ pbackColor = PyTuple_GET_ITEM(item, idx++);
if (pbackColor == Py_None)
pbackColor=ePyObject();
}
- if (size > 10)
+ if (size > idx)
{
- pbackColorSelected = PyTuple_GET_ITEM(item, 10);
+ pbackColorSelected = PyTuple_GET_ITEM(item, idx++);
if (pbackColorSelected == Py_None)
pbackColorSelected=ePyObject();
}
if ((filled < 0) && data) /* if the string is in a negative number, it refers to the 'data' list. */
filled = PyInt_AsLong(PyTuple_GetItem(data, -filled));
+
+ /* don't do anything if percent out of range */
+ if ((filled < 0) || (filled > 100))
+ continue;
int bwidth = pborderWidth ? PyInt_AsLong(pborderWidth) : 2;
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
// border
rect.setRect(x+width-bwidth, y+bwidth, bwidth, height-bwidth);
painter.fill(rect);
- // progress
rect.setRect(x+bwidth, y+bwidth, (width-bwidth*2) * filled / 100, height-bwidth*2);
- painter.fill(rect);
- painter.clippop();
+ // progress
+ if (ppixmap)
+ {
+ ePtr<gPixmap> pixmap;
+ if (PyInt_Check(ppixmap) && data) /* if the pixmap is in fact a number, it refers to the data list */
+ ppixmap = PyTuple_GetItem(data, PyInt_AsLong(ppixmap));
+
+ if (SwigFromPython(pixmap, ppixmap))
+ {
+ eDebug("eListboxPythonMultiContent (Pixmap) get pixmap failed");
+ painter.clippop();
+ continue;
+ }
+ painter.blit(pixmap, rect.topLeft(), rect, 0);
+ }
+ else
+ painter.fill(rect);
+ painter.clippop();
break;
}
+ case TYPE_PIXMAP_ALPHABLEND:
case TYPE_PIXMAP_ALPHATEST:
case TYPE_PIXMAP: // pixmap
{
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
- painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : 0);
+ painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : (type == TYPE_PIXMAP_ALPHABLEND) ? gPainter::BT_ALPHABLEND : 0);
painter.clippop();
break;
}
}
}
- if (selected && (!local_style || !local_style->m_selection))
+ if (selected && !sel_clip.valid() && (!local_style || !local_style->m_selection))
style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);
error_out:
{
bool retval = ret == Py_True;
Py_DECREF(ret);
- return ret;
+ return retval;
}
eDebug("call m_selectableFunc failed!!! assume not callable");
}