Support Uno4k/Ultimo4k
[vuplus_dvbapp] / lib / gui / elistboxcontent.cpp
index 1c671fa..3dcea7b 100644 (file)
@@ -138,7 +138,7 @@ void eListboxPythonStringContent::setSize(const eSize &size)
 
 void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)
 {
-       ePtr<gFont> fnt = new gFont("Regular", 20);
+       ePtr<gFont> fnt;
        painter.clip(eRect(offset, m_itemsize));
        style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal);
 
@@ -151,6 +151,7 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style,
 
        if (local_style)
        {
+               fnt = local_style->m_font;
                if (selected)
                {
                        /* if we have a local background color set, use that. */
@@ -170,6 +171,7 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style,
                                painter.setForegroundColor(local_style->m_foreground_color);
                }
        }
+       if (!fnt) fnt = new gFont("Regular", 20);
 
        /* if we have no transparent background */
        if (!local_style || !local_style->m_transparent_background)
@@ -273,8 +275,8 @@ void eListboxPythonStringContent::invalidate()
 
 void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)
 {
-       ePtr<gFont> fnt = new gFont("Regular", 20);
-       ePtr<gFont> fnt2 = new gFont("Regular", 16);
+       ePtr<gFont> fnt;
+       ePtr<gFont> fnt2;
        eRect itemrect(offset, m_itemsize);
        eListboxStyle *local_style = 0;
        bool cursorValid = this->cursorValid();
@@ -288,6 +290,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
 
        if (local_style)
        {
+               fnt = local_style->m_font;
                if (selected)
                {
                        /* if we have a local background color set, use that. */
@@ -308,6 +311,16 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
                }
        }
 
+       if (fnt)
+       {
+               fnt2 = new gFont(fnt->family, fnt->pointSize - fnt->pointSize/5);
+       }
+       else
+       {
+               fnt = new gFont("Regular", 20);
+               fnt2 = new gFont("Regular", 16);
+       }
+
        if (!local_style || !local_style->m_transparent_background)
                /* if we have no transparent background */
        {
@@ -501,6 +514,7 @@ eListboxPythonMultiContent::~eListboxPythonMultiContent()
 {
        Py_XDECREF(m_buildFunc);
        Py_XDECREF(m_selectableFunc);
+       Py_XDECREF(m_template);
 }
 
 void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update)
@@ -640,7 +654,8 @@ static ePyObject lookupColor(ePyObject color, ePyObject data)
        if ((icolor & 0xFF000000) == 0xFF000000)
        {
                int index = icolor & 0xFFFFFF;
-               eDebug("[eListboxPythonMultiContent] template color index: %d", index);
+               if (PyTuple_GetItem(data, index) == Py_None)
+                       return ePyObject();
                return PyTuple_GetItem(data, index);
        }
 
@@ -857,6 +872,10 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                                }
                                break;
                        }
+                       case TYPE_PROGRESS_PIXMAP: // Progress
+                       /*
+                               (1, x, y, width, height, filled_percent, pixmap [, borderWidth, foreColor, backColor, backColorSelected] )
+                       */
                        case TYPE_PROGRESS: // Progress
                        {
                        /*
@@ -867,41 +886,55 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                                                        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();
                                }
@@ -943,12 +976,27 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                                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:
@@ -1125,5 +1173,7 @@ void eListboxPythonMultiContent::entryRemoved(int idx)
 
 void eListboxPythonMultiContent::setTemplate(ePyObject tmplate)
 {
+       Py_XDECREF(m_template);
        m_template = tmplate;
+       Py_XINCREF(m_template);
 }