improve text editing. Patch by Anders Holst
[enigma2.git] / lib / gui / elistboxcontent.cpp
index 9bfe81dfb10f5b0e5c76aec3dbfbe06b3b3d270b..585d6fec3dd6a73abf0064c92eb926f8efe5fb2c 100644 (file)
@@ -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,33 +515,42 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l
 {
        if (selected && sel_clip.valid())
        {
-               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?
-               // 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 (local_style && local_style->m_transparent_background)
-                       ;
-               else
-                       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
        {
@@ -557,7 +577,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l
                        else if (local_style && local_style->m_background_color_set)
                                painter.setBackgroundColor(local_style->m_background_color);
                        /* if we have no transparent background */
-                       if (local_style && local_style->m_transparent_background)
+                       if (!pbackColor && local_style && local_style->m_transparent_background)
                                ;
                        else
                                painter.clear();
@@ -567,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. */
@@ -600,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;
@@ -638,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)
                        {
@@ -738,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]);
@@ -759,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);
@@ -836,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
@@ -910,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;
@@ -925,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);
                }
        }
 
@@ -1021,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);
+}