add support for fluendo ts/ps demux (preferred above mpegdemux), add support for...
[enigma2.git] / lib / service / listboxservice.cpp
index 33afaffe5836c3ab31a6a559cf4557a0eb1eba90..f6d9e78bae92d026188a3e6ae2a0f44b7358f67a 100644 (file)
@@ -10,11 +10,11 @@ void eListboxServiceContent::addService(const eServiceReference &service, bool b
        if (beforeCurrent && m_size)
        {
                m_list.insert(m_cursor, service);
-               ++m_size;
                --m_cursor;
        }
        else
                m_list.push_back(service);
+       ++m_size;
 }
 
 void eListboxServiceContent::removeCurrent()
@@ -22,7 +22,10 @@ void eListboxServiceContent::removeCurrent()
        if (m_size && m_listbox)
        {
                if (m_cursor_number == m_size-1)
+               {
                        m_list.erase(m_cursor--);
+                       --m_cursor_number;
+               }
                else
                        m_list.erase(m_cursor++);
                --m_size;
@@ -45,15 +48,16 @@ void eListboxServiceContent::setRoot(const eServiceReference &root, bool justSet
        m_root = root;
 
        if (justSet)
+       {
+               m_lst=0;
                return;
+       }
        assert(m_service_center);
        
-       ePtr<iListableService> lst;
-       if (m_service_center->list(m_root, lst))
+       if (m_service_center->list(m_root, m_lst))
                eDebug("no list available!");
-       else
-               if (lst->getContent(m_list))
-                       eDebug("getContent failed");
+       else if (m_lst->getContent(m_list))
+               eDebug("getContent failed");
 
        FillFinished();
 }
@@ -224,10 +228,11 @@ void eListboxServiceContent::setPixmap(int type, ePtr<gPixmap> &pic)
 
 void eListboxServiceContent::sort()
 {
-       ePtr<iListableService> lst;
-       if (!m_service_center->list(m_root, lst))
+       if (!m_lst)
+               m_service_center->list(m_root, m_lst);
+       if (m_lst)
        {
-               m_list.sort(iListableServiceCompare(lst));
+               m_list.sort(iListableServiceCompare(m_lst));
                        /* FIXME: is this really required or can we somehow keep the current entry? */
                cursorHome();
                if (m_listbox)
@@ -301,13 +306,12 @@ int eListboxServiceContent::setCurrentMarked(bool state)
                m_listbox->entryChanged(m_cursor_number);
                if (!state)
                {
-                       ePtr<iListableService> lst;
-                       if (m_service_center->list(m_root, lst))
-                               eDebug("no list available!");
-                       else
+                       if (!m_lst)
+                               m_service_center->list(m_root, m_lst);
+                       if (m_lst)
                        {
                                ePtr<iMutableServiceList> list;
-                               if (lst->startEdit(list))
+                               if (m_lst->startEdit(list))
                                        eDebug("no editable list");
                                else
                                {
@@ -326,6 +330,8 @@ int eListboxServiceContent::setCurrentMarked(bool state)
                                        }
                                }
                        }
+                       else
+                               eDebug("no list available!");
                }
        }
 
@@ -425,8 +431,12 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                        /* get service information */
                ePtr<iStaticServiceInformation> service_info;
                m_service_center->info(*m_cursor, service_info);
+               eServiceReference ref = *m_cursor;
+               bool checkPlayable =
+                       (ref.flags & eServiceReference::flagDirectory) != eServiceReference::flagDirectory ||
+                       (ref.flags & eServiceReference::isGroup);
 
-               if (m_is_playable_ignore.valid() && service_info && !service_info->isPlayable(*m_cursor, m_is_playable_ignore))
+               if (checkPlayable && m_is_playable_ignore.valid() && service_info && !service_info->isPlayable(*m_cursor, m_is_playable_ignore))
                        painter.setForegroundColor(gRGB(0xbbbbbb));
 
                int xoffset=0;  // used as offset when painting the folder/marker symbol