X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8d1f62f6525ccfdbcb83c64f701dbbc325c37dbd..e51726bcb1904bf8422b62798bd9f0cd2efb53ad:/lib/gui/elistboxcontent.cpp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index fdb270f8..afffbbe4 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -105,10 +105,9 @@ int eListboxPythonStringContent::currentCursorSelectable() if (m_list && cursorValid()) { PyObject *item = PyList_GET_ITEM(m_list, m_cursor); - if (PyTuple_Check(item)) - item = PyTuple_GET_ITEM(item, 0); - - if (item != Py_None) + if (!PyTuple_Check(item)) + return 1; + if (PyTuple_Size(item) >= 2) return 1; } return 0; @@ -145,12 +144,17 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style, if (m_list && cursorValid()) { + int gray = 0; PyObject *item = PyList_GET_ITEM(m_list, m_cursor); // borrowed reference! painter.setFont(fnt); /* the user can supply tuples, in this case the first one will be displayed. */ if (PyTuple_Check(item)) + { + if (PyTuple_Size(item) == 1) + gray = 1; item = PyTuple_GET_ITEM(item, 0); + } if (item == Py_None) { @@ -161,6 +165,8 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style, { const char *string = PyString_Check(item) ? PyString_AsString(item) : ""; ePoint text_offset = offset + (selected ? ePoint(2, 2) : ePoint(1, 1)); + if (gray) + painter.setForegroundColor(gRGB(0x808080)); painter.renderText(eRect(text_offset, m_itemsize), string); } @@ -375,6 +381,17 @@ int eListboxPythonConfigContent::currentCursorSelectable() /* todo: make a real infrastructure here! */ RESULT SwigFromPython(ePtr &res, PyObject *obj); +eListboxPythonMultiContent::eListboxPythonMultiContent() + :m_buildFunc(0) +{ +} + +eListboxPythonMultiContent::~eListboxPythonMultiContent() +{ + if (m_buildFunc) + Py_DECREF(m_buildFunc); +} + void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { eRect itemrect(offset, m_itemsize); @@ -382,10 +399,25 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); + PyObject *items=0; + if (m_list && cursorValid()) { - PyObject *items = PyList_GET_ITEM(m_list, m_cursor); // borrowed reference! - + items = PyList_GET_ITEM(m_list, m_cursor); // borrowed reference! + + if (m_buildFunc) + { + if (PyCallable_Check(m_buildFunc)) // when we have a buildFunc then call it + { + if (PyTuple_Check(items)) + items = PyObject_CallObject(m_buildFunc, items); + else + eDebug("items is no tuple"); + } + else + eDebug("buildfunc is not callable"); + } + if (!items) { eDebug("eListboxPythonMultiContent: error getting item %d", m_cursor); @@ -409,12 +441,12 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c goto error_out; } - PyObject *px = 0, *py = 0, *pwidth = 0, *pheight = 0, *pfnt = 0, *pstring = 0, *pflags = 0; + PyObject *px = 0, *py = 0, *pwidth = 0, *pheight = 0, *pfnt = 0, *pstring = 0, *pflags = 0, *pcolor = 0; /* we have a list of tuples: - (0, x, y, width, height, fnt, flags, "bla" ), + (0, x, y, width, height, fnt, flags, "bla"[, color] ), or, for a progress: (1, x, y, width, height, filled_percent ) @@ -453,6 +485,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c pflags = PyTuple_GET_ITEM(item, 6); pstring = PyTuple_GET_ITEM(item, 7); } + if (size > 8) + pcolor = PyTuple_GET_ITEM(item, 8); } switch (type) @@ -461,7 +495,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c { if (!(px && py && pwidth && pheight && pfnt && pstring)) { - eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_TEXT, x, y, width, height, fnt, flags, string[, ...])"); + eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_TEXT, x, y, width, height, fnt, flags, string, [color, ]...])"); goto error_out; } @@ -473,6 +507,12 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c int flags = PyInt_AsLong(pflags); int fnt = PyInt_AsLong(pfnt); + if (pcolor) + { + int color = PyInt_AsLong(pcolor); + painter.setForegroundColor(gRGB(color)); + } + if (m_font.find(fnt) == m_font.end()) { eDebug("eListboxPythonMultiContent: specified font %d was not found!", fnt); @@ -569,6 +609,9 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c eWarning("eListboxPythonMultiContent received unknown type (%d)", type); goto error_out; } + + if (pcolor) + style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); } } @@ -576,12 +619,38 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry); error_out: + if (m_buildFunc && PyCallable_Check(m_buildFunc) && items) + Py_DECREF(items); + painter.clippop(); } +void eListboxPythonMultiContent::setBuildFunc(PyObject *cb) +{ + if (m_buildFunc) + Py_DECREF(m_buildFunc); + m_buildFunc=cb; + if (cb) + Py_INCREF(m_buildFunc); +} + int eListboxPythonMultiContent::currentCursorSelectable() { - return eListboxPythonStringContent::currentCursorSelectable(); + /* each list-entry is a list of tuples. if the first of these is none, it's not selectable */ + if (m_list && cursorValid()) + { + PyObject *item = PyList_GET_ITEM(m_list, m_cursor); + if (PyList_Check(item)) + { + item = PyList_GET_ITEM(item, 0); + if (item != Py_None) + return 1; + } + else if (m_buildFunc && PyCallable_Check(m_buildFunc)) + // FIXME .. how we can detect non selectable entrys when we have a buildFunc callback + return 1; + } + return 0; } void eListboxPythonMultiContent::setFont(int fnt, gFont *font)