- beautified network cursor, added 'selected' argument to __call__
[enigma2.git] / lib / gui / elistboxcontent.cpp
index 54e3a24d95a7910e700f19d406b3088b75e8100c..fe5f38dd3716def80eb1588b8063e6125ec74a7f 100644 (file)
@@ -1,5 +1,6 @@
 #include <lib/gui/elistbox.h>
 #include <lib/gui/elistboxcontent.h>
+#include <lib/gdi/font.h>
 #include <Python.h>
 
 /*
@@ -379,7 +380,8 @@ PyObject *eListboxPythonStringContent::getCurrentSelection()
 
 void eListboxPythonStringContent::invalidateEntry(int index)
 {
-       m_listbox->entryChanged(index);
+       if (m_listbox)
+               m_listbox->entryChanged(index);
 }
 
 //////////////////////////////////////
@@ -394,34 +396,127 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
 
        if (m_list && cursorValid())
        {
+                       /* get current list item */
                PyObject *item = PyList_GetItem(m_list, m_cursor); // borrowed reference!
                PyObject *text = 0, *value = 0;
                painter.setFont(fnt);
 
-                       /* the user can supply tuples, in this case the first one will be displayed. */         
+                       /* the first tuple element is a string for the left side.
+                          the second one will be called, and the result shall be an tuple.
+                          
+                          of this tuple,
+                          the first one is the type (string).
+                          the second one is the value. */
                if (PyTuple_Check(item))
                {
+                               /* handle left part. get item from tuple, convert to string, display. */
+                               
                        text = PyTuple_GetItem(item, 0);
+                       text = PyObject_Str(text);
+                       const char *string = (text && PyString_Check(text)) ? PyString_AsString(text) : "<not-a-string>";
+                       eSize item_left = eSize(m_seperation, m_itemsize.height());
+                       eSize item_right = eSize(m_itemsize.width() - m_seperation, m_itemsize.height());
+                       painter.renderText(eRect(offset, item_left), string, gPainter::RT_HALIGN_LEFT);
+                       Py_XDECREF(text);
+                       
+                               /* now, handle the value. get 2nd part from tuple*/
                        value = PyTuple_GetItem(item, 1);
+                       if (value)
+                       {
+                               PyObject *args = PyTuple_New(1);
+                               PyTuple_SetItem(args, 0, PyInt_FromLong(selected));
+                               
+                                       /* CallObject will call __call__ which should return the value tuple */
+                               value = PyObject_CallObject(value, args);
+
+                               Py_DECREF(args);
+                                       /* the PyInt was stolen. */
+                       }
+                       
+                               /*  check if this is really a tuple */
+                       if (PyTuple_Check(value))
+                       {
+                                       /* convert type to string */
+                               PyObject *type = PyTuple_GetItem(value, 0);
+                               const char *atype = (type && PyString_Check(type)) ? PyString_AsString(type) : 0;
+                               
+                               if (atype)
+                               {
+                                       if (!strcmp(atype, "text"))
+                                       {
+                                               PyObject *pvalue = PyTuple_GetItem(value, 1);
+                                               const char *value = (pvalue && PyString_Check(pvalue)) ? PyString_AsString(pvalue) : "<not-a-string>";
+                                               painter.setFont(fnt2);
+                                               painter.renderText(eRect(offset + eSize(m_seperation, 0), item_right), value, gPainter::RT_HALIGN_RIGHT);
+
+                                                       /* pvalue is borrowed */
+                                       } else if (!strcmp(atype, "slider"))
+                                       {
+                                               PyObject *pvalue = PyTuple_GetItem(value, 1);
+                                               
+                                                       /* convert value to Long. fallback to -1 on error. */
+                                               int value = (pvalue && PyInt_Check(pvalue)) ? PyInt_AsLong(pvalue) : -1;
+                                               
+                                                       /* calc. slider length */
+                                               int width = item_right.width() * value / 100;
+                                               int height = item_right.height();
+                                               
+                                                                                               
+                                                       /* draw slider */
+                                               //painter.fill(eRect(offset.x() + m_seperation, offset.y(), width, height));
+                                               //hack - make it customizable
+                                               painter.fill(eRect(offset.x() + m_seperation, offset.y() + 5, width, height-10));
+                                               
+                                                       /* pvalue is borrowed */
+                                       } else if (!strcmp(atype, "mtext"))
+                                       {
+                                               PyObject *pvalue = PyTuple_GetItem(value, 1);
+                                               const char *text = (pvalue && PyString_Check(pvalue)) ? PyString_AsString(pvalue) : "<not-a-string>";
+                                               
+                                               ePtr<eTextPara> para = new eTextPara(eRect(offset + eSize(m_seperation, 0), item_right));
+                                               para->setFont(fnt2);
+                                               para->renderString(text, 0);
+                                               para->realign(eTextPara::dirRight);
+                                               int glyphs = para->size();
+                                               
+                                               PyObject *plist = 0;
+                                               
+                                               if (PyTuple_Size(value) >= 3)
+                                                       plist = PyTuple_GetItem(value, 2);
+                                               
+                                               int entries = 0;
+
+                                               if (plist && PyList_Check(plist))
+                                                       entries = PyList_Size(plist);
+                                               
+                                               for (int i = 0; i < entries; ++i)
+                                               {
+                                                       PyObject *entry = PyList_GetItem(plist, i);
+                                                       int num = PyInt_Check(entry) ? PyInt_AsLong(entry) : -1;
+                                                       
+                                                       if ((num < 0) || (num >= glyphs))
+                                                               eWarning("glyph index %d in PythonConfigList out of bounds!");
+                                                       else
+                                                       {
+                                                               para->setGlyphFlag(num, GS_INVERT);
+                                                               eRect bbox;
+                                                               bbox = para->getGlyphBBox(num);
+                                                               bbox = eRect(bbox.left(), offset.y(), bbox.width(), m_itemsize.height());
+                                                               painter.fill(bbox);
+                                                       }
+                                                               /* entry is borrowed */
+                                               }
+                                               
+                                               painter.renderPara(para, ePoint(0, 0));
+                                                       /* pvalue is borrowed */
+                                                       /* plist is 0 or borrowed */
+                                       }
+                               }
+                               Py_XDECREF(type);
+                       }
+                               /* value is borrowed */
                }
-               
-               text = PyObject_Str(text);
-               value = PyObject_Str(value);
-               
-               const char *string = (text && PyString_Check(text)) ? PyString_AsString(text) : "<not-a-string>";
-               const char *string_val = (value && PyString_Check(value)) ? PyString_AsString(value) : "<not-a-string>";
-               
-               eSize item_left = eSize(m_seperation, m_itemsize.height());
-               eSize item_right = eSize(m_itemsize.width() - m_seperation, m_itemsize.height());
-               
-               painter.renderText(eRect(offset, item_left), string, gPainter::RT_HALIGN_LEFT);
-               
-               painter.setFont(fnt2);
-               painter.renderText(eRect(offset + eSize(m_seperation, 0), item_right), string_val, gPainter::RT_HALIGN_RIGHT);
-               
-               Py_XDECREF(text);
-               Py_XDECREF(value);
-               
+
                if (selected)
                        style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);
        }
@@ -456,7 +551,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                }
                
                int size = PyList_Size(items);
-               for (int i = 0; i < size; ++i)
+               for (int i = 1; i < size; ++i)
                {
                        PyObject *item = PyList_GetItem(items, i); // borrowed reference!