X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/612e765ceb09fce886ffc02120f039f7d880048f..76ab06c06bdf77f0b0cecd225367862ef0de0d2f:/lib/gui/elistboxcontent.cpp diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index 39509064..585d6fec 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -262,7 +262,8 @@ void eListboxPythonStringContent::invalidate() int s = size(); if ( m_cursor >= s ) m_listbox->moveSelectionTo(s?s-1:0); - m_listbox->invalidate(); + else + m_listbox->invalidate(); } } @@ -430,6 +431,8 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, if (plist && PyList_Check(plist)) entries = PyList_Size(plist); + int left=0, right=0, last=-1; + eRect bbox; for (int i = 0; i < entries; ++i) { ePyObject entry = PyList_GET_ITEM(plist, i); @@ -439,15 +442,23 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style, eWarning("glyph index %d in PythonConfigList out of bounds!", num); else { + if (last+1 != num && last != -1) { + bbox = eRect(left, offset.y(), right-left, m_itemsize.height()); + painter.fill(bbox); + } para->setGlyphFlag(num, GS_INVERT); - eRect bbox; bbox = para->getGlyphBBox(num); - bbox = eRect(bbox.left(), offset.y(), bbox.width(), m_itemsize.height()); - painter.fill(bbox); + if (last+1 != num || last == -1) + left = bbox.left(); + right = bbox.left() + bbox.width(); + last = num; } /* entry is borrowed */ } - + if (last != -1) { + bbox = eRect(left, offset.y(), right-left, m_itemsize.height()); + painter.fill(bbox); + } painter.renderPara(para, ePoint(0, 0)); /* pvalue is borrowed */ /* plist is 0 or borrowed */ @@ -504,34 +515,42 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l { if (selected && sel_clip.valid()) { - bool clear=true; - painter.clip(rc-sel_clip); - if (pbackColor) + gRegion part = rc - sel_clip; + if (!part.empty()) { - int color = PyInt_AsLong(pbackColor); - painter.setBackgroundColor(gRGB(color)); - } // transparent background? - else if (local_style && local_style->m_transparent_background) - clear=false; - // if we have a local background color set, use that. - else if (local_style && local_style->m_background_color_set) - painter.setBackgroundColor(local_style->m_background_color); - else + painter.clip(part); style.setStyle(painter, eWindowStyle::styleListboxNormal); - if (clear) - painter.clear(); - painter.clippop(); - painter.clip(rc&sel_clip); - style.setStyle(painter, eWindowStyle::styleListboxSelected); - if (pbackColorSelected) + if (pbackColor) + { + int color = PyInt_AsLong(pbackColor); + painter.setBackgroundColor(gRGB(color)); + } // transparent background? + // if we have a local background color set, use that. + else if (local_style && local_style->m_background_color_set) + painter.setBackgroundColor(local_style->m_background_color); + if (!pbackColor && local_style && local_style->m_transparent_background) + ; + else + painter.clear(); + painter.clippop(); + selected = 0; + } + part = rc & sel_clip; + if (!part.empty()) { - int color = PyInt_AsLong(pbackColorSelected); - painter.setBackgroundColor(gRGB(color)); + painter.clip(part); + style.setStyle(painter, eWindowStyle::styleListboxSelected); + if (pbackColorSelected) + { + int color = PyInt_AsLong(pbackColorSelected); + painter.setBackgroundColor(gRGB(color)); + } + else if (local_style && local_style->m_background_color_selected_set) + painter.setBackgroundColor(local_style->m_background_color_selected); + painter.clear(); + painter.clippop(); + selected = 1; } - else if (local_style && local_style->m_background_color_selected_set) - painter.setBackgroundColor(local_style->m_background_color_selected); - painter.clear(); - painter.clippop(); } else { @@ -549,22 +568,18 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l } else { - bool clear=true; style.setStyle(painter, eWindowStyle::styleListboxNormal); if (pbackColor) { int color = PyInt_AsLong(pbackColor); painter.setBackgroundColor(gRGB(color)); }/* if we have a local background color set, use that. */ - else if (local_style) - { - if (local_style->m_transparent_background) - clear=false; - else if (local_style->m_background_color_set) - painter.setBackgroundColor(local_style->m_background_color); - } + else if (local_style && local_style->m_background_color_set) + painter.setBackgroundColor(local_style->m_background_color); /* if we have no transparent background */ - if (clear) + if (!pbackColor && local_style && local_style->m_transparent_background) + ; + else painter.clear(); } } @@ -572,7 +587,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l { if (pforeColorSelected) { - int color = PyInt_AsLong(pforeColor); + int color = PyInt_AsLong(pforeColorSelected); painter.setForegroundColor(gRGB(color)); } /* if we have a local foreground color set, use that. */ @@ -605,7 +620,6 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c local_style = m_listbox->getLocalStyle(); painter.clip(itemregion); - clearRegion(painter, style, local_style, ePyObject(), ePyObject(), ePyObject(), ePyObject(), selected, itemregion, sel_clip); ePyObject items; @@ -643,7 +657,6 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c for (int i = 1; i < size; ++i) { ePyObject item = PyList_GET_ITEM(items, i); // borrowed reference! - bool reset_colors=false; if (!item) { @@ -743,11 +756,10 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c eRect rect(x+bwidth, y+bwidth, width-bwidth*2, height-bwidth*2); painter.clip(rect); - if (pbackColor || pbackColorSelected || pforeColor || pforeColorSelected) + { gRegion rc(rect); clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip); - reset_colors=true; } painter.setFont(m_font[fnt]); @@ -764,8 +776,6 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c int color = PyInt_AsLong(pborderColor); painter.setForegroundColor(gRGB(color)); } - else if (pforeColor) // reset to normal color - style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); rect.setRect(x, y, width, bwidth); painter.fill(rect); @@ -841,11 +851,10 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c eRect rect(x, y, width, height); painter.clip(rect); - if (pbackColor || pbackColorSelected || pforeColor || pforeColorSelected) + { gRegion rc(rect); clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip); - reset_colors=true; } // border @@ -915,13 +924,12 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c eRect rect(x, y, width, height); painter.clip(rect); - if (pbackColor || pbackColorSelected) + { gRegion rc(rect); clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip); - reset_colors=true; } - + painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : 0); painter.clippop(); break; @@ -930,8 +938,6 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c eWarning("eListboxPythonMultiContent received unknown type (%d)", type); goto error_out; } - if (reset_colors) - style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); } } @@ -1026,3 +1032,9 @@ void eListboxPythonMultiContent::updateClip(gRegion &clip) else m_old_clip = m_clip = gRegion::invalidRegion(); } + +void eListboxPythonMultiContent::entryRemoved(int idx) +{ + if (m_listbox) + m_listbox->entryRemoved(idx); +}