lib/gui/elistboxcontent.cpp: dont crash on non selectable entries
[vuplus_dvbapp] / lib / gui / elistboxcontent.cpp
index 4da1618..1d0323c 100644 (file)
@@ -49,7 +49,8 @@ int iListboxContent::currentCursorSelectable()
 
 DEFINE_REF(eListboxPythonStringContent);
 
-eListboxPythonStringContent::eListboxPythonStringContent(): m_itemheight(25)
+eListboxPythonStringContent::eListboxPythonStringContent()
+       :m_cursor(0), m_itemheight(25)
 {
 }
 
@@ -182,7 +183,7 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style,
        {
                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();
        }
 
@@ -319,7 +320,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
        {
                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();
        }
 
@@ -342,7 +343,6 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
                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>";
@@ -356,7 +356,9 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
                        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);
@@ -467,7 +469,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
                                        }
                                }
                                        /* type is borrowed */
-                       } else
+                       } else if (value)
                                eWarning("eListboxPythonConfigContent: second value of tuple is not a tuple.");
                        if (value)
                                Py_DECREF(value);
@@ -533,6 +535,8 @@ static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, con
                                painter.blit(local_style->m_background, offset, eRect(), 0);
                        return;
                }
+               else if (local_style->m_transparent_background)
+                       return;
        }
        painter.clear();
 }
@@ -907,6 +911,10 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
 
                                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;
 
@@ -939,6 +947,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
 
                                break;
                        }
+                       case TYPE_PIXMAP_ALPHABLEND:
                        case TYPE_PIXMAP_ALPHATEST:
                        case TYPE_PIXMAP: // pixmap
                        {
@@ -991,7 +1000,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                                        clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
                                }
 
-                               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;
                        }
@@ -1002,7 +1011,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                }
        }
 
-       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:
@@ -1041,7 +1050,7 @@ int eListboxPythonMultiContent::currentCursorSelectable()
                                {
                                        bool retval = ret == Py_True;
                                        Py_DECREF(ret);
-                                       return ret;
+                                       return retval;
                                }
                                eDebug("call m_selectableFunc failed!!! assume not callable");
                        }