Support focus animation for listbox
[vuplus_dvbapp] / lib / gui / elistbox.h
index 4c06e28..17fce5c 100644 (file)
@@ -4,6 +4,9 @@
 #include <lib/gui/ewidget.h>
 #include <connection.h>
 
+class eListbox;
+class eSlider;
+
 class iListboxContent: public iObject
 {
 public:
@@ -12,14 +15,18 @@ public:
                /* indices go from 0 to size().
                   the end is reached when the cursor is on size(), 
                   i.e. one after the last entry (this mimics 
-                  stl behaviour)
+                  stl behavior)
                   
                   cursors never invalidate - they can become invalid
                   when stuff is removed. Cursors will always try
                   to stay on the same data, however when the current
                   item is removed, this won't work. you'll be notified
                   anyway. */
-                 
+#ifndef SWIG   
+protected:
+       iListboxContent();
+       friend class eListbox;
+       virtual void updateClip(gRegion &){ };
        virtual void cursorHome()=0;
        virtual void cursorEnd()=0;
        virtual int cursorMove(int count=1)=0;
@@ -32,36 +39,131 @@ public:
        
        virtual int size()=0;
        
-       virtual RESULT connectItemChanged(const Slot0<void> &itemChanged, ePtr<eConnection> &connection)=0;
+       virtual int currentCursorSelectable();
+       
+       void setListbox(eListbox *lb);
        
        // void setOutputDevice ? (for allocating colors, ...) .. requires some work, though
        virtual void setSize(const eSize &size)=0;
        
                /* the following functions always refer to the selected item */
        virtual void paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)=0;
+       
+       virtual int getItemHeight()=0;
+       
+       eListbox *m_listbox;
+#endif
 };
 
+#ifndef SWIG
+struct eListboxStyle
+{
+       ePtr<gPixmap> m_background, m_selection;
+       int m_transparent_background;
+       gRGB m_background_color, m_background_color_selected, m_foreground_color, m_foreground_color_selected;
+       int m_background_color_set, m_foreground_color_set, m_background_color_selected_set, m_foreground_color_selected_set;
+
+               /*
+                       {m_transparent_background m_background_color_set m_background}
+                       {0 0 0} use global background color
+                       {0 1 x} use background color
+                       {0 0 p} use background picture
+                       {1 x 0} use transparent background
+                       {1 x p} use transparent background picture
+               */
+       ePtr<gFont> m_font;
+};
+#endif
+
 class eListbox: public eWidget
 {
+       void updateScrollBar();
 public:
        eListbox(eWidget *parent);
-       void setContent(iListboxContent *content);
-       
-       void moveSelection(int how);
+       ~eListbox();
+
+       PSignal0<void> selectionChanged;
+
        enum {
+               showOnDemand,
+               showAlways,
+               showNever
+       };
+       void setScrollbarMode(int mode);
+       void setWrapAround(bool);
+
+       void setContent(iListboxContent *content);
+
+/*     enum Movement {
+               moveUp,
+               moveDown,
+               moveTop,
+               moveEnd,
+               justCheck
+       }; */
+
+       int getCurrentIndex();
+       void moveSelection(long how);
+       void moveSelectionTo(int index);
+       void moveToEnd();
+       bool atBegin();
+       bool atEnd();
+
+       enum ListboxActions {
                moveUp,
                moveDown,
                moveTop,
-               moveEnd
+               moveEnd,
+               pageUp,
+               pageDown,
+               justCheck
        };
+
+       void setItemHeight(int h);
+       void setSelectionEnable(int en);
+
+       void setBackgroundColor(gRGB &col);
+       void setBackgroundColorSelected(gRGB &col);
+       void setForegroundColor(gRGB &col);
+       void setForegroundColorSelected(gRGB &col);
+       void setBackgroundPicture(ePtr<gPixmap> &pixmap);
+       void setSelectionPicture(ePtr<gPixmap> &pixmap);
+       void setFont(gFont *font);
+
+#ifndef SWIG
+       struct eListboxStyle *getLocalStyle(void);
+
+               /* entryAdded: an entry was added *before* the given index. it's index is the given number. */
+       void entryAdded(int index);
+               /* entryRemoved: an entry with the given index was removed. */
+       void entryRemoved(int index);
+               /* entryChanged: the entry with the given index was changed and should be redrawn. */
+       void entryChanged(int index);
+               /* the complete list changed. you should not attemp to keep the current index. */
+       void entryReset(bool cursorHome=true);
+
+       int getEntryTop();
+       void invalidate(const gRegion &region = gRegion::invalidRegion());
 protected:
        int event(int event, void *data=0, void *data2=0);
        void recalcSize();
+
 private:
+       int m_scrollbar_mode, m_prev_scrollbar_page;
+       bool m_content_changed;
+       bool m_enabled_wrap_around;
+
        int m_top, m_selected;
        int m_itemheight;
        int m_items_per_page;
+       int m_selection_enabled;
        ePtr<iListboxContent> m_content;
+       eSlider *m_scrollbar;
+       eListboxStyle m_style;
+#ifdef USE_LIBVUGLES2
+       long m_dir;
+#endif
+#endif
 };
 
 #endif