Merge branch 'bug_539_add_multicontent_pixmap_progress'
authorghost <andreas.monzner@multimedia-labs.de>
Wed, 6 Oct 2010 10:03:24 +0000 (12:03 +0200)
committerghost <andreas.monzner@multimedia-labs.de>
Wed, 6 Oct 2010 10:03:24 +0000 (12:03 +0200)
1  2 
lib/gui/elistboxcontent.cpp

index 1c671fa0a51820de556220436fc6fd219a4f7cff,dbf96375015fa273680739b8e8cd3c4e05cddea1..43fbc5945bd3b96081591dbfb29d3e874dfcc718
@@@ -343,6 -343,7 +343,6 @@@ void eListboxPythonConfigContent::paint
                if (PyTuple_Check(item))
                {
                                /* handle left part. get item from tuple, convert to string, display. */
 -
                        text = PyTuple_GET_ITEM(item, 0);
                        text = PyObject_Str(text); /* creates a new object - old object was borrowed! */
                        const char *string = (text && PyString_Check(text)) ? PyString_AsString(text) : "<not-a-string>";
                        int value_alignment_left = !*string;
  
                                /* now, handle the value. get 2nd part from tuple*/
 -                      value = PyTuple_GET_ITEM(item, 1);
 +                      if (PyTuple_Size(item) >= 2) // when no 2nd entry is in tuple this is a non selectable entry without config part
 +                              value = PyTuple_GET_ITEM(item, 1);
 +
                        if (value)
                        {
                                ePyObject args = PyTuple_New(1);
                                        }
                                }
                                        /* type is borrowed */
 -                      } else
 +                      } else if (value)
                                eWarning("eListboxPythonConfigContent: second value of tuple is not a tuple.");
                        if (value)
                                Py_DECREF(value);
@@@ -516,7 -515,7 +516,7 @@@ void eListboxPythonMultiContent::setSel
                m_listbox->entryChanged(m_cursor);
  }
  
 -static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid)
 +static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid, bool clear=true)
  {
        if (pbackColor)
        {
                else if (local_style->m_transparent_background)
                        return;
        }
 -      painter.clear();
 +      if (clear)
 +              painter.clear();
  }
  
 -static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid)
 +static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid, bool clear=true)
  {
        if (pbackColorSelected)
        {
                        return;
                }
        }
 -      painter.clear();
 +      if (clear)
 +              painter.clear();
  }
  
 -static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid)
 +static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid, bool clear=true)
  {
        if (selected && sel_clip.valid())
        {
                {
                        painter.clip(part);
                        style.setStyle(painter, eWindowStyle::styleListboxNormal);
 -                      clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
 +                      clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
                        painter.clippop();
                        selected = 0;
                }
                {
                        painter.clip(part);
                        style.setStyle(painter, eWindowStyle::styleListboxSelected);
 -                      clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
 +                      clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
                        painter.clippop();
                        selected = 1;
                }
        else if (selected)
        {
                style.setStyle(painter, eWindowStyle::styleListboxSelected);
 -              clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
 +              clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
                if (local_style && local_style->m_selection)
                        painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST);
        }
        else
        {
                style.setStyle(painter, eWindowStyle::styleListboxNormal);
 -              clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
 +              clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
        }
  
        if (selected)
@@@ -822,8 -819,7 +822,8 @@@ void eListboxPythonMultiContent::paint(
  
                                {
                                        gRegion rc(rect);
 -                                      clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
 +                                      bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
 +                                      clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
                                }
  
                                painter.setFont(m_font[fnt]);
                                }
                                break;
                        }
+                       case TYPE_PROGRESS_PIXMAP: // Progress
+                       /*
+                               (1, x, y, width, height, filled_percent, pixmap [, borderWidth, foreColor, backColor, backColorSelected] )
+                       */
                        case TYPE_PROGRESS: // Progress
                        {
                        /*
                                                        pwidth = PyTuple_GET_ITEM(item, 3),
                                                        pheight = PyTuple_GET_ITEM(item, 4),
                                                        pfilled_perc = PyTuple_GET_ITEM(item, 5),
-                                                       pborderWidth, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected;
-                               if (!(px && py && pwidth && pheight && pfilled_perc))
+                                                       ppixmap, pborderWidth, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected;
+                               int idx = 6;
+                               if (type == TYPE_PROGRESS)
                                {
-                                       eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS, x, y, width, height, filled percent [,border width, foreColor, backColor, backColorSelected]))");
-                                       goto error_out;
+                                       if (!(px && py && pwidth && pheight && pfilled_perc))
+                                       {
+                                               eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS, x, y, width, height, filled percent [,border width, foreColor, backColor, backColorSelected]))");
+                                               goto error_out;
+                                       }
+                               }
+                               else
+                               {
+                                       ppixmap = PyTuple_GET_ITEM(item, idx++);
+                                       if (ppixmap == Py_None)
+                                               continue;
+                                       if (!(px && py && pwidth && pheight && pfilled_perc, ppixmap))
+                                       {
+                                               eDebug("eListboxPythonMultiContent received too small tuple (must be (TYPE_PROGRESS_PIXMAP, x, y, width, height, filled percent, pixmap, [,border width, foreColor, backColor, backColorSelected]))");
+                                               goto error_out;
+                                       }
                                }
  
-                               if (size > 6)
+                               if (size > idx)
                                {
-                                       pborderWidth = PyTuple_GET_ITEM(item, 6);
+                                       pborderWidth = PyTuple_GET_ITEM(item, idx++);
                                        if (pborderWidth == Py_None)
                                                pborderWidth = ePyObject();
                                }
-                               if (size > 7)
+                               if (size > idx)
                                {
-                                       pforeColor = PyTuple_GET_ITEM(item, 7);
+                                       pforeColor = PyTuple_GET_ITEM(item, idx++);
                                        if (pforeColor == Py_None)
                                                pforeColor = ePyObject();
                                }
-                               if (size > 8)
+                               if (size > idx)
                                {
-                                       pforeColorSelected = PyTuple_GET_ITEM(item, 8);
+                                       pforeColorSelected = PyTuple_GET_ITEM(item, idx++);
                                        if (pforeColorSelected == Py_None)
                                                pforeColorSelected=ePyObject();
                                }
-                               if (size > 9)
+                               if (size > idx)
                                {
-                                       pbackColor = PyTuple_GET_ITEM(item, 9);
+                                       pbackColor = PyTuple_GET_ITEM(item, idx++);
                                        if (pbackColor == Py_None)
                                                pbackColor=ePyObject();
                                }
-                               if (size > 10)
+                               if (size > idx)
                                {
-                                       pbackColorSelected = PyTuple_GET_ITEM(item, 10);
+                                       pbackColorSelected = PyTuple_GET_ITEM(item, idx++);
                                        if (pbackColorSelected == Py_None)
                                                pbackColorSelected=ePyObject();
                                }
  
                                {
                                        gRegion rc(rect);
 -                                      clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
 +                                      bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
 +                                      clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
                                }
  
                                // border
                                rect.setRect(x+width-bwidth, y+bwidth, bwidth, height-bwidth);
                                painter.fill(rect);
  
-                               // progress
                                rect.setRect(x+bwidth, y+bwidth, (width-bwidth*2) * filled / 100, height-bwidth*2);
-                               painter.fill(rect);
  
-                               painter.clippop();
+                               // progress
+                               if (ppixmap)
+                               {
+                                       ePtr<gPixmap> pixmap;
+                                       if (SwigFromPython(pixmap, ppixmap))
+                                       {
+                                               eDebug("eListboxPythonMultiContent (Pixmap) get pixmap failed");
+                                               painter.clippop();
+                                               continue;
+                                       }
+                                       painter.blit(pixmap, rect.topLeft(), rect, 0);
+                               }
+                               else
+                                       painter.fill(rect);
  
+                               painter.clippop();
                                break;
                        }
                        case TYPE_PIXMAP_ALPHABLEND:
  
                                {
                                        gRegion rc(rect);
 -                                      clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
 +                                      bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
 +                                      clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
                                }
  
                                painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : (type == TYPE_PIXMAP_ALPHABLEND) ? gPainter::BT_ALPHABLEND : 0);