X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/11ba2aae74be4daa35434294fab8dda86fe78d6c..1109344c9409572f9829e46971b71a7fe1d3c8cc:/lib/gui/elistboxcontent.cpp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index cec1ea8c..4fa5a65e 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include /* The basic idea is to have an interface which gives all relevant list @@ -37,6 +37,7 @@ iListboxContent::iListboxContent(): m_listbox(0) void iListboxContent::setListbox(eListbox *lb) { m_listbox = lb; + m_listbox->setItemHeight(getItemHeight()); } int iListboxContent::currentCursorSelectable() @@ -48,9 +49,8 @@ int iListboxContent::currentCursorSelectable() DEFINE_REF(eListboxPythonStringContent); -eListboxPythonStringContent::eListboxPythonStringContent() +eListboxPythonStringContent::eListboxPythonStringContent(): m_itemheight(25) { - m_list = 0; } eListboxPythonStringContent::~eListboxPythonStringContent() @@ -104,7 +104,7 @@ int eListboxPythonStringContent::currentCursorSelectable() { if (m_list && cursorValid()) { - PyObject *item = PyList_GET_ITEM(m_list, m_cursor); + ePyObject item = PyList_GET_ITEM(m_list, m_cursor); if (!PyTuple_Check(item)) return 1; if (PyTuple_Size(item) >= 2) @@ -145,7 +145,7 @@ 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! + ePyObject 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. */ @@ -177,12 +177,12 @@ void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style, painter.clippop(); } -void eListboxPythonStringContent::setList(PyObject *list) +void eListboxPythonStringContent::setList(ePyObject list) { Py_XDECREF(m_list); if (!PyList_Check(list)) { - m_list = 0; + m_list = ePyObject(); } else { m_list = list; @@ -196,11 +196,9 @@ void eListboxPythonStringContent::setList(PyObject *list) PyObject *eListboxPythonStringContent::getCurrentSelection() { if (!(m_list && cursorValid())) - { - Py_INCREF(Py_None); - return Py_None; - } - PyObject *r = PyList_GET_ITEM(m_list, m_cursor); + Py_RETURN_NONE; + + ePyObject r = PyList_GET_ITEM(m_list, m_cursor); Py_XINCREF(r); return r; } @@ -214,7 +212,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(); + } } ////////////////////////////////////// @@ -231,8 +234,8 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, if (m_list && cursorValid()) { /* get current list item */ - PyObject *item = PyList_GET_ITEM(m_list, m_cursor); // borrowed reference! - PyObject *text = 0, *value = 0; + ePyObject item = PyList_GET_ITEM(m_list, m_cursor); // borrowed reference! + ePyObject text, value; painter.setFont(fnt); /* the first tuple element is a string for the left side. @@ -261,7 +264,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, value = PyTuple_GET_ITEM(item, 1); if (value) { - PyObject *args = PyTuple_New(1); + ePyObject args = PyTuple_New(1); PyTuple_SET_ITEM(args, 0, PyInt_FromLong(selected)); /* CallObject will call __call__ which should return the value tuple */ @@ -278,14 +281,14 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, if (value && PyTuple_Check(value)) { /* convert type to string */ - PyObject *type = PyTuple_GET_ITEM(value, 0); + ePyObject type = PyTuple_GET_ITEM(value, 0); const char *atype = (type && PyString_Check(type)) ? PyString_AsString(type) : 0; if (atype) { if (!strcmp(atype, "text")) { - PyObject *pvalue = PyTuple_GET_ITEM(value, 1); + ePyObject pvalue = PyTuple_GET_ITEM(value, 1); const char *value = (pvalue && PyString_Check(pvalue)) ? PyString_AsString(pvalue) : ""; painter.setFont(fnt2); if (value_alignment_left) @@ -296,8 +299,8 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, /* pvalue is borrowed */ } else if (!strcmp(atype, "slider")) { - PyObject *pvalue = PyTuple_GET_ITEM(value, 1); - PyObject *psize = PyTuple_GET_ITEM(value, 2); + ePyObject pvalue = PyTuple_GET_ITEM(value, 1); + ePyObject psize = PyTuple_GET_ITEM(value, 2); /* convert value to Long. fallback to -1 on error. */ int value = (pvalue && PyInt_Check(pvalue)) ? PyInt_AsLong(pvalue) : -1; @@ -316,7 +319,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, /* pvalue is borrowed */ } else if (!strcmp(atype, "mtext")) { - PyObject *pvalue = PyTuple_GET_ITEM(value, 1); + ePyObject pvalue = PyTuple_GET_ITEM(value, 1); const char *text = (pvalue && PyString_Check(pvalue)) ? PyString_AsString(pvalue) : ""; int xoffs = value_alignment_left ? 0 : m_seperation; ePtr para = new eTextPara(eRect(offset + eSize(xoffs, 0), item_right)); @@ -325,7 +328,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, para->realign(value_alignment_left ? eTextPara::dirLeft : eTextPara::dirRight); int glyphs = para->size(); - PyObject *plist = 0; + ePyObject plist; if (PyTuple_Size(value) >= 3) plist = PyTuple_GET_ITEM(value, 2); @@ -337,7 +340,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, for (int i = 0; i < entries; ++i) { - PyObject *entry = PyList_GET_ITEM(plist, i); + ePyObject entry = PyList_GET_ITEM(plist, i); int num = PyInt_Check(entry) ? PyInt_AsLong(entry) : -1; if ((num < 0) || (num >= glyphs)) @@ -381,6 +384,16 @@ int eListboxPythonConfigContent::currentCursorSelectable() /* todo: make a real infrastructure here! */ RESULT SwigFromPython(ePtr &res, PyObject *obj); +eListboxPythonMultiContent::eListboxPythonMultiContent() +{ +} + +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 +401,25 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); + ePyObject items; + 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); @@ -407,7 +435,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c int size = PyList_Size(items); for (int i = 1; i < size; ++i) { - PyObject *item = PyList_GET_ITEM(items, i); // borrowed reference! + ePyObject item = PyList_GET_ITEM(items, i); // borrowed reference! if (!item) { @@ -415,7 +443,7 @@ 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, *pcolor = 0; + ePyObject px, py, pwidth, pheight, pfnt, pstring, pflags, pcolor; /* we have a list of tuples: @@ -593,22 +621,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(ePyObject 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 */ + /* 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); + ePyObject item = PyList_GET_ITEM(m_list, m_cursor); if (PyList_Check(item)) - if (PyList_Check(item)) - { - item = PyList_GET_ITEM(item, 0); - if (item != Py_None) - return 1; - } + { + 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; } @@ -620,3 +662,10 @@ void eListboxPythonMultiContent::setFont(int fnt, gFont *font) else m_font.erase(fnt); } + +void eListboxPythonMultiContent::setItemHeight(int height) +{ + m_itemheight = height; + if (m_listbox) + m_listbox->setItemHeight(height); +}