X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8173cd589424b450c648ccd565e3933d570bc741..c16d405383c4be419e4a88db6d02894b7cfbf74d:/lib/gui/elistboxcontent.cpp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index b4c80809..261c548b 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -214,7 +214,12 @@ void eListboxPythonStringContent::invalidateEntry(int index) void eListboxPythonStringContent::invalidate() { if (m_listbox) + { + int s = size(); + if ( m_cursor >= s ) + m_listbox->moveSelectionTo(s?s-1:0); m_listbox->invalidate(); + } } ////////////////////////////////////// @@ -381,6 +386,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); @@ -388,10 +404,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); @@ -593,25 +624,36 @@ 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() { + /* 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 (PyTuple_Check(item)) - { - item = PyTuple_GET_ITEM(item, 0); - if (item != Py_None) - return 1; - } + 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; }