X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fgui%2Felistboxcontent.cpp;h=cba25a181f85b9df8e067b0b8609570b733bb01c;hb=13bd9764b67721730bb77da340717d9c40e8c740;hp=261c548bb5ffc0511bc3e9eb85c198286d96ce08;hpb=7e4013c449a7dbb31fb6a67106b913bf22a61334;p=vuplus_dvbapp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index 261c548..cba25a1 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; } @@ -236,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. @@ -266,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 */ @@ -283,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) @@ -301,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; @@ -321,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)); @@ -330,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); @@ -342,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)) @@ -387,7 +385,6 @@ int eListboxPythonConfigContent::currentCursorSelectable() RESULT SwigFromPython(ePtr &res, PyObject *obj); eListboxPythonMultiContent::eListboxPythonMultiContent() - :m_buildFunc(0) { } @@ -397,14 +394,50 @@ eListboxPythonMultiContent::~eListboxPythonMultiContent() Py_DECREF(m_buildFunc); } +void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update) +{ + if (update && m_selection_clip.valid()) + { +// redraw old selection + m_temp_clip = m_selection_clip; + m_selection_clip = eRect(); + if (m_listbox) + m_listbox->entryChanged(m_cursor); +// redraw new selection + m_selection_clip = rect; + m_temp_clip = rect; + if (m_listbox) + m_listbox->entryChanged(m_cursor); + m_temp_clip = eRect(); + } + else + m_selection_clip = rect; +} + void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { eRect itemrect(offset, m_itemsize); + if (m_temp_clip.valid()) + { + eRect tmp = m_temp_clip; + tmp.moveBy(offset); + itemrect &= tmp; + } + painter.clip(itemrect); - style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); + style.setStyle(painter, selected && !m_selection_clip.valid() ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); painter.clear(); + if (selected && m_selection_clip.valid()) + { + eRect tmp = m_selection_clip; + tmp.moveBy(offset); + painter.clip(tmp); + style.setStyle(painter, eWindowStyle::styleListboxSelected ); + painter.clear(); + painter.clippop(); + } - PyObject *items=0; + ePyObject items; if (m_list && cursorValid()) { @@ -438,7 +471,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) { @@ -446,7 +479,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, pbackColor, pbackColorSelected, pborderWidth, pborderColor; /* we have a list of tuples: @@ -491,7 +524,27 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c pstring = PyTuple_GET_ITEM(item, 7); } if (size > 8) + { pcolor = PyTuple_GET_ITEM(item, 8); + if (pcolor == Py_None) + pcolor=ePyObject(); + } + if (size > 9) + { + pbackColor = PyTuple_GET_ITEM(item, 9); + if (pbackColor == Py_None) + pbackColor=ePyObject(); + } + if (size > 10) + { + pbackColorSelected = PyTuple_GET_ITEM(item, 10); + if (pbackColorSelected == Py_None) + pbackColorSelected=ePyObject(); + } + if (size > 11) + pborderWidth = PyTuple_GET_ITEM(item, 11); + if (size > 12) + pborderColor = PyTuple_GET_ITEM(item, 12); } switch (type) @@ -511,28 +564,76 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c int height = PyInt_AsLong(pheight); int flags = PyInt_AsLong(pflags); int fnt = PyInt_AsLong(pfnt); - + int bwidth = pborderWidth ? PyInt_AsLong(pborderWidth) : 0; + 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); goto error_out; } - - eRect r = eRect(x, y, width, height); - r.moveBy(offset); - r &= itemrect; - + + eRect rc = eRect(x+bwidth, y+bwidth, width-bwidth*2, height-bwidth*2); + rc.moveBy(offset); + rc &= itemrect; + painter.clip(rc); + + if (pbackColor && !selected) + { + int color = PyInt_AsLong(pbackColor); + painter.setBackgroundColor(gRGB(color)); + painter.clear(); + } + else if (pbackColorSelected && selected) + { + int color = PyInt_AsLong(pbackColorSelected); + painter.setBackgroundColor(gRGB(color)); + painter.clear(); + } + painter.setFont(m_font[fnt]); - - painter.clip(r); - painter.renderText(r, string, flags); + painter.renderText(rc, string, flags); painter.clippop(); + + // draw border + if (bwidth) + { + rc.setRect(x, y, width, height); + rc.moveBy(offset); + rc &= itemrect; + painter.clip(rc); + if (pborderColor) + { + int color = PyInt_AsLong(pborderColor); + painter.setForegroundColor(gRGB(color)); + } + else if (pcolor) // reset to normal color + style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); + + rc.setRect(x, y, width, bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc.setRect(x, y+bwidth, bwidth, height-bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc.setRect(x+bwidth, y+height-bwidth, width-bwidth, bwidth); + rc.moveBy(offset); + painter.fill(rc); + + rc.setRect(x+width-bwidth, y+bwidth, bwidth, height-bwidth); + rc.moveBy(offset); + painter.fill(rc); + + painter.clippop(); + } + break; } case TYPE_PROGRESS: // Progress @@ -548,32 +649,32 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c int height = PyInt_AsLong(pheight); int filled = PyInt_AsLong(pfnt); - eRect r = eRect(x, y, width, height); - r.moveBy(offset); - r &= itemrect; + eRect rc = eRect(x, y, width, height); + rc.moveBy(offset); + rc &= itemrect; - painter.clip(r); + painter.clip(rc); int bwidth=2; // borderwidth hardcoded yet // border - eRect rc = eRect(x, y, width, bwidth); + rc.setRect(x, y, width, bwidth); rc.moveBy(offset); painter.fill(rc); - rc = eRect(x, y+bwidth, bwidth, height-bwidth); + rc.setRect(x, y+bwidth, bwidth, height-bwidth); rc.moveBy(offset); painter.fill(rc); - rc = eRect(x+bwidth, y+height-bwidth, width-bwidth, bwidth); + rc.setRect(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.setRect(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.setRect(x+bwidth, y+bwidth, (width-bwidth*2) * filled / 100, height-bwidth*2); rc.moveBy(offset); painter.fill(rc); @@ -615,7 +716,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c goto error_out; } - if (pcolor) + if (pcolor || pborderColor || pbackColor || pbackColorSelected) style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); } } @@ -630,7 +731,7 @@ error_out: painter.clippop(); } -void eListboxPythonMultiContent::setBuildFunc(PyObject *cb) +void eListboxPythonMultiContent::setBuildFunc(ePyObject cb) { if (m_buildFunc) Py_DECREF(m_buildFunc); @@ -644,7 +745,7 @@ 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); + ePyObject item = PyList_GET_ITEM(m_list, m_cursor); if (PyList_Check(item)) { item = PyList_GET_ITEM(item, 0); @@ -665,3 +766,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); +}