X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cc6908402d34d4633d3b27297bdbde3b9a94e403..ce8c818df531da2954eeeadd181c15706549b0a5:/lib/gui/elistboxcontent.cpp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index 63d94b09..67acd83f 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -110,7 +110,7 @@ void eListboxTestContent::setSize(const eSize &size) void eListboxTestContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { - ePtr fnt = new gFont("Arial", 20); + ePtr fnt = new gFont("Regular", 20); painter.clip(eRect(offset, m_size)); style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); @@ -219,7 +219,7 @@ void eListboxStringContent::setSize(const eSize &size) void eListboxStringContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { - ePtr fnt = new gFont("Arial", 20); + ePtr fnt = new gFont("Regular", 20); painter.clip(eRect(offset, m_itemsize)); style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); @@ -246,6 +246,7 @@ void eListboxStringContent::setList(std::list &list) m_list = list; m_size = list.size(); cursorHome(); + m_listbox->entryReset(false); } ////////////////////////////////////// @@ -327,7 +328,7 @@ void eListboxPythonStringContent::setSize(const eSize &size) void eListboxPythonStringContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { - ePtr fnt = new gFont("Arial", 20); + ePtr fnt = new gFont("Regular", 20); painter.clip(eRect(offset, m_itemsize)); style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); @@ -365,6 +366,9 @@ void eListboxPythonStringContent::setList(PyObject *list) m_list = list; Py_INCREF(m_list); } + + if (m_listbox) + m_listbox->entryReset(false); } PyObject *eListboxPythonStringContent::getCurrentSelection() @@ -387,16 +391,17 @@ void eListboxPythonStringContent::invalidateEntry(int index) void eListboxPythonStringContent::invalidate() { if (m_listbox) - m_listbox->entryReset(); + m_listbox->invalidate(); } ////////////////////////////////////// void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { - ePtr fnt = new gFont("Arial", 20); - ePtr fnt2 = new gFont("Arial", 16); - painter.clip(eRect(offset, m_itemsize)); + ePtr fnt = new gFont("Regular", 20); + ePtr fnt2 = new gFont("Regular", 16); + eRect itemrect(offset, m_itemsize); + painter.clip(itemrect); style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); @@ -418,7 +423,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, /* handle left part. get item from tuple, convert to string, display. */ text = PyTuple_GetItem(item, 0); - text = PyObject_Str(text); + text = PyObject_Str(text); /* creates a new object - old object was borrowed! */ const char *string = (text && PyString_Check(text)) ? PyString_AsString(text) : ""; eSize item_left = eSize(m_seperation, m_itemsize.height()); eSize item_right = eSize(m_itemsize.width() - m_seperation, m_itemsize.height()); @@ -521,7 +526,7 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, /* plist is 0 or borrowed */ } } - Py_XDECREF(type); + /* type is borrowed */ } else eWarning("eListboxPythonConfigContent: second value of tuple is not a tuple."); /* value is borrowed */ @@ -536,9 +541,13 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, ////////////////////////////////////// + /* todo: make a real infrastructure here! */ +RESULT SwigFromPython(ePtr &res, PyObject *obj); + void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { - painter.clip(eRect(offset, m_itemsize)); + eRect itemrect(offset, m_itemsize); + painter.clip(itemrect); style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); @@ -549,95 +558,192 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c if (!items) { eDebug("eListboxPythonMultiContent: error getting item %d", m_cursor); - painter.clippop(); - return; + goto error_out; } if (!PyList_Check(items)) { eDebug("eListboxPythonMultiContent: list entry %d is not a list", m_cursor); - painter.clippop(); - return; + goto error_out; } int size = PyList_Size(items); for (int i = 1; i < size; ++i) { - PyObject *item = PyList_GetItem(items, i); // borrowed reference! + PyObject *item = PyList_GET_ITEM(items, i); // borrowed reference! if (!item) { eDebug("eListboxPythonMultiContent: ?"); - painter.clippop(); - return; + goto error_out; } - - PyObject *px, *py, *pwidth, *pheight, *pfnt, *pstring, *pflags; + PyObject *px = 0, *py = 0, *pwidth = 0, *pheight = 0, *pfnt = 0, *pstring = 0, *pflags = 0; /* we have a list of tuples: - (x, y, width, height, fnt, flags, "bla" ), + (0, x, y, width, height, fnt, flags, "bla" ), + + or, for a progress: + (1, x, y, width, height, filled_percent ) + + or, for a pixmap: + + (2, x, y, width, height, pixmap ) */ if (!PyTuple_Check(item)) { eDebug("eListboxPythonMultiContent did not receive a tuple."); - painter.clippop(); - return; + goto error_out; + } + + int size = PyTuple_Size(item); + + if (!size) + { + eDebug("eListboxPythonMultiContent receive empty tuple."); + goto error_out; + } + + int type = PyInt_AsLong(PyTuple_GET_ITEM(item, 0)); + + if (size > 5) + { + px = PyTuple_GET_ITEM(item, 1); + py = PyTuple_GET_ITEM(item, 2); + pwidth = PyTuple_GET_ITEM(item, 3); + pheight = PyTuple_GET_ITEM(item, 4); + pfnt = PyTuple_GET_ITEM(item, 5); /* could also be an pixmap or an int (progress filled percent) */ + if (size > 7) + { + pflags = PyTuple_GET_ITEM(item, 6); + pstring = PyTuple_GET_ITEM(item, 7); + } } - - px = PyTuple_GetItem(item, 0); - py = PyTuple_GetItem(item, 1); - pwidth = PyTuple_GetItem(item, 2); - pheight = PyTuple_GetItem(item, 3); - pfnt = PyTuple_GetItem(item, 4); - pflags = PyTuple_GetItem(item, 5); - pstring = PyTuple_GetItem(item, 6); - if (!(px && py && pwidth && pheight && pfnt && pstring)) + switch (type) + { + case TYPE_TEXT: // text { - eDebug("eListboxPythonMultiContent received too small tuple (must be (x, y, width, height, fnt, flags, string[, ...])"); + if (!(px && py && pwidth && pheight && pfnt && pstring)) + { + eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_TEXT, x, y, width, height, fnt, flags, string[, ...])"); + goto error_out; + } + + const char *string = (PyString_Check(pstring)) ? PyString_AsString(pstring) : ""; + int x = PyInt_AsLong(px); + int y = PyInt_AsLong(py); + int width = PyInt_AsLong(pwidth); + int height = PyInt_AsLong(pheight); + int flags = PyInt_AsLong(pflags); + int fnt = PyInt_AsLong(pfnt); + + if (m_font.find(fnt) == m_font.end()) + { + eDebug("eListboxPythonMultiContent: specified font %d was not found!", fnt); + goto error_out; + } + + eRect r = eRect(x, y, width, height); + r.moveBy(offset); + r &= itemrect; + + painter.setFont(m_font[fnt]); + + painter.clip(r); + painter.renderText(r, string, flags); painter.clippop(); - return; + break; } - - pstring = PyObject_Str(pstring); - - const char *string = (PyString_Check(pstring)) ? PyString_AsString(pstring) : ""; - - int x = PyInt_AsLong(px); - int y = PyInt_AsLong(py); - int width = PyInt_AsLong(pwidth); - int height = PyInt_AsLong(pheight); - int flags = PyInt_AsLong(pflags); - - int fnt = PyInt_AsLong(pfnt); - - if (m_font.find(fnt) == m_font.end()) + case TYPE_PROGRESS: // Progress { - eDebug("eListboxPythonMultiContent: specified font %d was not found!", fnt); - Py_XDECREF(pstring); + if (!(px && py && pwidth && pheight && pfnt)) + { + eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS, x, y, width, height, filled percent))"); + goto error_out; + } + int x = PyInt_AsLong(px); + int y = PyInt_AsLong(py); + int width = PyInt_AsLong(pwidth); + int height = PyInt_AsLong(pheight); + int filled = PyInt_AsLong(pfnt); + + eRect r = eRect(x, y, width, height); + r.moveBy(offset); + r &= itemrect; + + painter.clip(r); + int bwidth=2; // borderwidth hardcoded yet + + // border + eRect rc = eRect(x, y, width, bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc = eRect(x, y+bwidth, bwidth, height-bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc = eRect(x+bwidth, y+height-bwidth, width-bwidth, bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc = eRect(x+width-bwidth, y+bwidth, bwidth, height-bwidth); + rc.moveBy(offset); + painter.fill(rc); + + // progress + rc = eRect(x+bwidth, y+bwidth, (width-bwidth*2) * filled / 100, height-bwidth*2); + rc.moveBy(offset); + painter.fill(rc); + painter.clippop(); - return; + + break; + } + case TYPE_PIXMAP: // pixmap + { + if (!(px && py && pwidth && pheight && pfnt)) + { + eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PIXMAP, x, y, width, height, pixmap))"); + goto error_out; + } + int x = PyInt_AsLong(px); + int y = PyInt_AsLong(py); + int width = PyInt_AsLong(pwidth); + int height = PyInt_AsLong(pheight); + ePtr pixmap; + if (SwigFromPython(pixmap, pfnt)) + { + eDebug("eListboxPythonMultiContent (Pixmap) get pixmap failed"); + goto error_out; + } + + eRect r = eRect(x, y, width, height); + r.moveBy(offset); + r &= itemrect; + + painter.clip(r); + painter.blit(pixmap, r.topLeft(), r); + painter.clippop(); + + break; + } + default: + eWarning("eListboxPythonMultiContent received unknown type (%d)", type); + goto error_out; } - - eRect r = eRect(x, y, width, height); - r.moveBy(offset); - - painter.setFont(m_font[fnt]); - - painter.renderText(r, string, flags); - - Py_XDECREF(pstring); - - if (selected) - style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry); } } + if (selected) + style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry); + +error_out: painter.clippop(); }