Support focus animation for listbox
[vuplus_dvbapp] / lib / service / listboxservice.cpp
index faee1ee..074b8cd 100644 (file)
@@ -99,6 +99,48 @@ void eListboxServiceContent::getCurrent(eServiceReference &ref)
                ref = eServiceReference();
 }
 
+void eListboxServiceContent::getPrev(eServiceReference &ref)
+{
+       if (cursorValid())
+       {
+               list::iterator cursor(m_cursor);
+               if (cursor == m_list.begin())
+               {
+                       cursor = m_list.end();
+               }
+               ref = *(--cursor);
+       }
+       else
+               ref = eServiceReference();
+}
+
+void eListboxServiceContent::getNext(eServiceReference &ref)
+{
+       if (cursorValid())
+       {
+               list::iterator cursor(m_cursor);
+               cursor++;
+               if (cursor == m_list.end())
+               {
+                       cursor = m_list.begin();
+               }
+               ref = *(cursor);
+       }
+       else
+               ref = eServiceReference();
+}
+
+PyObject *eListboxServiceContent::getList()
+{
+       ePyObject result = PyList_New(m_list.size());
+       int pos=0;
+       for (list::iterator it(m_list.begin()); it != m_list.end(); ++it)
+       {
+               PyList_SET_ITEM(result, pos++, NEW_eServiceReference(*it));
+       }
+       return result;
+}
+
 int eListboxServiceContent::getNextBeginningWithChar(char c)
 {
 //     printf("Char: %c\n", c);
@@ -528,14 +570,18 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                eServiceReference ref = *m_cursor;
                bool isMarker = ref.flags & eServiceReference::isMarker;
                bool isPlayable = !(ref.flags & eServiceReference::isDirectory || isMarker);
+               bool paintProgress = false;
                ePtr<eServiceEvent> evt;
 
+               bool serviceAvail = true;
+
                if (!marked && isPlayable && service_info && m_is_playable_ignore.valid() && !service_info->isPlayable(*m_cursor, m_is_playable_ignore))
                {
                        if (m_color_set[serviceNotAvail])
                                painter.setForegroundColor(m_color[serviceNotAvail]);
                        else
                                painter.setForegroundColor(gRGB(0xbbbbbb));
+                       serviceAvail = false;
                }
 
                if (selected && local_style && local_style->m_selection)
@@ -581,16 +627,26 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                                {
                                        if (service_info)
                                                service_info->getName(*m_cursor, text);
+#ifdef USE_LIBVUGLES2
+                                       painter.setFlush(text == "<n/a>");
+#endif
                                        break;
                                }
                                case celServiceInfo:
                                {
-                                       if ( isPlayable && evt )
+                                       if ( isPlayable && !service_info->getEvent(*m_cursor, evt) )
                                        {
                                                std::string name = evt->getEventName();
                                                if (!name.length())
                                                        continue;
                                                text = '(' + evt->getEventName() + ')';
+                                               if (serviceAvail)
+                                               {
+                                                       if (!selected && m_color_set[serviceDescriptionColor])
+                                                               painter.setForegroundColor(m_color[serviceDescriptionColor]);
+                                                       else if (selected && m_color_set[serviceDescriptionColorSelected])
+                                                               painter.setForegroundColor(m_color[serviceDescriptionColorSelected]);
+                                               }
                                        }
                                        else
                                                continue;
@@ -681,60 +737,60 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                        }
                        else if (e == celServiceEventProgressbar)
                        {
-                               int p = celServiceEventProgressbar;
-                               eRect area = m_element_position[p];
+                               eRect area = m_element_position[celServiceEventProgressbar];
                                if (area.width() > 0 && (isPlayable || isMarker))
                                {
-
-                                       if ( isPlayable && service_info && !service_info->getEvent(*m_cursor, evt) )
-                                       {
-                                               if (!selected && m_color_set[serviceEventProgressbarBorderColor])
-                                                       painter.setForegroundColor(m_color[serviceEventProgressbarBorderColor]);
-                                               else if (selected && m_color_set[serviceEventProgressbarBorderColorSelected])
-                                                       painter.setForegroundColor(m_color[serviceEventProgressbarBorderColorSelected]);
-
-                                               int border = 1;
-                                               int progressH = 6;
-                                               int progressX = area.left() + offset.x();
-                                               int progressW = area.width() - 2 * border;
-                                               int progressT = offset.y() + (m_itemsize.height() - progressH - 2*border) / 2;
-
-                                               // paint progressbar frame
-                                               painter.fill(eRect(progressX, progressT, area.width(), border));
-                                               painter.fill(eRect(progressX, progressT + border, border, progressH));
-                                               painter.fill(eRect(progressX, progressT + progressH + border, area.width(), border));
-                                               painter.fill(eRect(progressX + area.width() - border, progressT + border, border, progressH));
-
-                                               // calculate value
-                                               time_t now = time(0);
-                                               int value = progressW * (now - evt->getBeginTime()) / evt->getDuration();
-
-                                               eRect tmp = eRect(progressX + border, progressT + border, value, progressH);
-                                               ePtr<gPixmap> &pixmap = m_pixmaps[picServiceEventProgressbar];
-                                               if (pixmap)
-                                               {
-                                                       area.moveBy(offset);
-                                                       painter.clip(area);
-                                                       painter.blit(pixmap, ePoint(progressX + border, progressT + border), tmp, gPainter::BT_ALPHATEST);
-                                                       painter.clippop();
-                                               }
-                                               else
-                                               {
-                                                       if (!selected && m_color_set[serviceEventProgressbarColor])
-                                                               painter.setForegroundColor(m_color[serviceEventProgressbarColor]);
-                                                       else if (selected && m_color_set[serviceEventProgressbarColorSelected])
-                                                               painter.setForegroundColor(m_color[serviceEventProgressbarColorSelected]);
-                                                       painter.fill(tmp);
-                                               }
-                                       }
+                                       // we schedule it to paint it as last element.. so we dont need to reset fore/background color
+                                       paintProgress = isPlayable;
                                        xoffset = area.width() + 10;
                                }
                        }
                }
                if (selected && (!local_style || !local_style->m_selection))
                        style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);
+               if (paintProgress && evt)
+               {
+                       eRect area = m_element_position[celServiceEventProgressbar];
+                       if (!selected && m_color_set[serviceEventProgressbarBorderColor])
+                               painter.setForegroundColor(m_color[serviceEventProgressbarBorderColor]);
+                       else if (selected && m_color_set[serviceEventProgressbarBorderColorSelected])
+                               painter.setForegroundColor(m_color[serviceEventProgressbarBorderColorSelected]);
+
+                       int border = 1;
+                       int progressH = 6;
+                       int progressX = area.left() + offset.x();
+                       int progressW = area.width() - 2 * border;
+                       int progressT = offset.y() + (m_itemsize.height() - progressH - 2*border) / 2;
+
+                       // paint progressbar frame
+                       painter.fill(eRect(progressX, progressT, area.width(), border));
+                       painter.fill(eRect(progressX, progressT + border, border, progressH));
+                       painter.fill(eRect(progressX, progressT + progressH + border, area.width(), border));
+                       painter.fill(eRect(progressX + area.width() - border, progressT + border, border, progressH));
+
+                       // calculate value
+                       time_t now = time(0);
+                       int value = progressW * (now - evt->getBeginTime()) / evt->getDuration();
+
+                       eRect tmp = eRect(progressX + border, progressT + border, value, progressH);
+                       ePtr<gPixmap> &pixmap = m_pixmaps[picServiceEventProgressbar];
+                       if (pixmap)
+                       {
+                               area.moveBy(offset);
+                               painter.clip(area);
+                               painter.blit(pixmap, ePoint(progressX + border, progressT + border), tmp, gPainter::BT_ALPHATEST);
+                               painter.clippop();
+                       }
+                       else
+                       {
+                               if (!selected && m_color_set[serviceEventProgressbarColor])
+                                       painter.setForegroundColor(m_color[serviceEventProgressbarColor]);
+                               else if (selected && m_color_set[serviceEventProgressbarColorSelected])
+                                       painter.setForegroundColor(m_color[serviceEventProgressbarColorSelected]);
+                               painter.fill(tmp);
+                       }
+               }
        }
-       
        painter.clippop();
 }