add selchanged signal to listbox
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 25 Jan 2006 12:09:25 +0000 (12:09 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 25 Jan 2006 12:09:25 +0000 (12:09 +0000)
lib/gui/elistbox.cpp
lib/gui/elistbox.h
lib/python/Components/EpgList.py
lib/python/enigma_python.i

index a5d18e6..f1efadf 100644 (file)
@@ -8,7 +8,7 @@ eListbox::eListbox(eWidget *parent)
        ,m_content_changed(false), m_top(0), m_selected(0), m_itemheight(25)
        ,m_items_per_page(0), m_selection_enabled(1), m_scrollbar(NULL)
 {
        ,m_content_changed(false), m_top(0), m_selected(0), m_itemheight(25)
        ,m_items_per_page(0), m_selection_enabled(1), m_scrollbar(NULL)
 {
-       setContent(new eListboxStringContent());
+//     setContent(new eListboxStringContent());
 
        ePtr<eActionMap> ptr;
        eActionMap::getInstance(ptr);
 
        ePtr<eActionMap> ptr;
        eActionMap::getInstance(ptr);
@@ -48,10 +48,13 @@ void eListbox::setScrollbarMode(int mode)
 
 void eListbox::setContent(iListboxContent *content)
 {
 
 void eListbox::setContent(iListboxContent *content)
 {
+       int oldsel = m_selected;
        m_content = content;
        if (content)
                m_content->setListbox(this);
        entryReset();
        m_content = content;
        if (content)
                m_content->setListbox(this);
        entryReset();
+       if (oldsel == m_selected)
+               /* emit */ selectionChanged();
 }
 
 void eListbox::moveSelection(int dir)
 }
 
 void eListbox::moveSelection(int dir)
@@ -59,15 +62,12 @@ void eListbox::moveSelection(int dir)
                /* refuse to do anything without a valid list. */
        if (!m_content)
                return;
                /* refuse to do anything without a valid list. */
        if (!m_content)
                return;
-       
                /* if our list does not have one entry, don't do anything. */
        if (!m_items_per_page)
                return;
                /* if our list does not have one entry, don't do anything. */
        if (!m_items_per_page)
                return;
-               
                /* we need the old top/sel to see what we have to redraw */
        int oldtop = m_top;
        int oldsel = m_selected;
                /* we need the old top/sel to see what we have to redraw */
        int oldtop = m_top;
        int oldsel = m_selected;
-       
                /* first, move cursor */
        switch (dir)
        {
                /* first, move cursor */
        switch (dir)
        {
@@ -128,7 +128,6 @@ void eListbox::moveSelection(int dir)
        
                /* now, look wether the current selection is out of screen */
        m_selected = m_content->cursorGet();
        
                /* now, look wether the current selection is out of screen */
        m_selected = m_content->cursorGet();
-
        while (m_selected < m_top)
        {
                m_top -= m_items_per_page;
        while (m_selected < m_top)
        {
                m_top -= m_items_per_page;
@@ -139,14 +138,16 @@ void eListbox::moveSelection(int dir)
                /* m_top should be always valid here as it's selected */
                m_top += m_items_per_page;
 
                /* m_top should be always valid here as it's selected */
                m_top += m_items_per_page;
 
+       if (oldsel != m_selected)
+               /* emit */ selectionChanged();
+
        updateScrollBar();
 
        if (m_top != oldtop)
                invalidate();
        else if (m_selected != oldsel)
        {
        updateScrollBar();
 
        if (m_top != oldtop)
                invalidate();
        else if (m_selected != oldsel)
        {
-               
-                       /* redraw the old and newly selected */
+   /* redraw the old and newly selected */
                gRegion inv = eRect(0, m_itemheight * (m_selected-m_top), size().width(), m_itemheight);
                inv |= eRect(0, m_itemheight * (oldsel-m_top), size().width(), m_itemheight);
                
                gRegion inv = eRect(0, m_itemheight * (m_selected-m_top), size().width(), m_itemheight);
                inv |= eRect(0, m_itemheight * (oldsel-m_top), size().width(), m_itemheight);
                
index df1c691..87013bc 100644 (file)
@@ -57,6 +57,8 @@ public:
        eListbox(eWidget *parent);
        ~eListbox();
 
        eListbox(eWidget *parent);
        ~eListbox();
 
+       PSignal0<void> selectionChanged;
+
        enum {
                showOnDemand,
                showAlways,
        enum {
                showOnDemand,
                showAlways,
@@ -90,7 +92,6 @@ public:
        
        void setItemHeight(int h);
        void setSelectionEnable(int en);
        
        void setItemHeight(int h);
        void setSelectionEnable(int en);
-
 #ifndef SWIG
                /* entryAdded: an entry was added *before* the given index. it's index is the given number. */
        void entryAdded(int index);
 #ifndef SWIG
                /* entryAdded: an entry was added *before* the given index. it's index is the given number. */
        void entryAdded(int index);
index 26d712e..cc5bc61 100644 (file)
@@ -42,7 +42,10 @@ class Rect:
                return self.__width
 
 class EPGList(HTMLComponent, GUIComponent):
                return self.__width
 
 class EPGList(HTMLComponent, GUIComponent):
-       def __init__(self, type=EPG_TYPE_SINGLE):
+       def __init__(self, type=EPG_TYPE_SINGLE, selChangedCB=None):
+               self.onSelChanged = [ ]
+               if selChangedCB is not None:
+                       self.onSelChanged.append(selChangedCB)
                GUIComponent.__init__(self)
                self.type=type
                if type == EPG_TYPE_SINGLE and SINGLE_CPP > 0:
                GUIComponent.__init__(self)
                self.type=type
                if type == EPG_TYPE_SINGLE and SINGLE_CPP > 0:
@@ -78,8 +81,24 @@ class EPGList(HTMLComponent, GUIComponent):
        def moveDown(self):
                self.instance.moveSelection(self.instance.moveDown)
 
        def moveDown(self):
                self.instance.moveSelection(self.instance.moveDown)
 
+       def connectSelectionChanged(func):
+               if not self.onSelChanged.count(func):
+                       self.onSelChanged.append(func)
+
+       def disconnectSelectionChanged(func):
+               self.onSelChanged.remove(func)
+
+       def selectionChanged(self):
+               for x in self.onSelChanged:
+                       if x is not None:
+                               try:
+                                       x()
+                               except:
+                                       pass
+
        def GUIcreate(self, parent):
                self.instance = eListbox(parent)
        def GUIcreate(self, parent):
                self.instance = eListbox(parent)
+               self.instance.selectionChanged.get().append(self.selectionChanged)
                self.instance.setContent(self.l)
                if SINGLE_CPP > 0:
                        self.instance.setItemHeight(25)
                self.instance.setContent(self.l)
                if SINGLE_CPP > 0:
                        self.instance.setItemHeight(25)
@@ -191,6 +210,7 @@ class EPGList(HTMLComponent, GUIComponent):
                        cnt+=1
                self.l.setList(self.list)
                print time() - t
                        cnt+=1
                self.l.setList(self.list)
                print time() - t
+               self.selectionChanged()
 
        def fillSingleEPG(self, service):
                t = time()
 
        def fillSingleEPG(self, service):
                t = time()
index 53238e4..3529023 100644 (file)
@@ -144,6 +144,7 @@ typedef long time_t;
 %immutable eComponentScan::statusChanged;
 %immutable eComponentScan::newService;
 %immutable pNavigation::m_event;
 %immutable eComponentScan::statusChanged;
 %immutable eComponentScan::newService;
 %immutable pNavigation::m_event;
+%immutable eListbox::selectionChanged;
 
 %include <lib/gdi/font.h>
 %include <lib/gdi/gpixmap.h>
 
 %include <lib/gdi/font.h>
 %include <lib/gdi/gpixmap.h>