aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-12-12 19:18:19 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-12-12 19:18:19 +0000
commit7a8fff2da5f732bad0beaf934e7a20395b4921bd (patch)
treeddc904ee56769a8355c747522f0bd93556160441
parent4e182b8bb929d63b9e3952524b3e39470ab26442 (diff)
downloadenigma2-7a8fff2da5f732bad0beaf934e7a20395b4921bd.tar.gz
enigma2-7a8fff2da5f732bad0beaf934e7a20395b4921bd.zip
add scrollbar to listbox
-rw-r--r--lib/gui/elistbox.cpp88
-rw-r--r--lib/gui/elistbox.h16
-rw-r--r--lib/gui/elistboxcontent.cpp4
-rw-r--r--skin.py6
4 files changed, 107 insertions, 7 deletions
diff --git a/lib/gui/elistbox.cpp b/lib/gui/elistbox.cpp
index e2f1c26f..875ae625 100644
--- a/lib/gui/elistbox.cpp
+++ b/lib/gui/elistbox.cpp
@@ -1,11 +1,15 @@
#include <lib/gui/elistbox.h>
#include <lib/gui/elistboxcontent.h>
+#include <lib/gui/eslider.h>
#include <lib/actions/action.h>
-eListbox::eListbox(eWidget *parent): eWidget(parent)
+eListbox::eListbox(eWidget *parent)
+ :eWidget(parent), m_prev_scrollbar_page(-1), m_content_changed(false), m_scrollbar(NULL)
{
setContent(new eListboxStringContent());
+ setScrollbarMode(showOnDemand); // Default show scrollbar on demand
+
ePtr<eActionMap> ptr;
eActionMap::getInstance(ptr);
@@ -22,6 +26,24 @@ eListbox::~eListbox()
ptr->unbindAction(this, 0);
}
+void eListbox::setScrollbarMode(int mode)
+{
+ m_scrollbar_mode = mode;
+ if ( m_scrollbar_mode == showNever && m_scrollbar )
+ {
+ delete m_scrollbar;
+ m_scrollbar=0;
+ }
+ else if (!m_scrollbar)
+ {
+ m_scrollbar = new eSlider(this);
+ m_scrollbar->hide();
+ m_scrollbar->setBorderWidth(1);
+ m_scrollbar->setOrientation(eSlider::orVertical);
+ m_scrollbar->setRange(0,100);
+ }
+}
+
void eListbox::setContent(iListboxContent *content)
{
m_content = content;
@@ -122,12 +144,57 @@ void eListbox::moveSelection(int dir)
void eListbox::moveSelectionTo(int index)
{
- printf("Moving to listbox-entry with index %d\n", index);
m_content->cursorHome();
m_content->cursorMove(index);
moveSelection(justCheck);
}
+void eListbox::updateScrollBar()
+{
+ int entries = m_content->size();
+ if ( m_content_changed )
+ {
+ int width = size().width();
+ int height = size().height();
+ m_content_changed = false;
+ if ( entries > m_items_per_page || m_scrollbar_mode == showAlways )
+ {
+ int sbarwidth=width/16;
+ if ( sbarwidth < 18 )
+ sbarwidth=18;
+ if ( sbarwidth > 22 )
+ sbarwidth=22;
+ m_scrollbar->move(ePoint(width-sbarwidth, 0));
+ m_scrollbar->resize(eSize(sbarwidth, height));
+ m_content->setSize(eSize(width-sbarwidth-5, m_itemheight));
+ if ( !m_scrollbar->isVisible() )
+ m_scrollbar->show();
+ }
+ else if ( m_scrollbar_mode != showAlways )
+ {
+ if ( m_scrollbar->isVisible() )
+ {
+ m_content->setSize(eSize(width, m_itemheight));
+ m_scrollbar->hide(); // why this hide dont work???
+ }
+ }
+ }
+ int curVisiblePage = m_top / m_items_per_page;
+ if ( m_scrollbar->isVisible() &&
+ m_prev_scrollbar_page != curVisiblePage)
+ {
+ m_prev_scrollbar_page = curVisiblePage;
+ int pages = entries / m_items_per_page;
+ if ( (pages*m_items_per_page) < entries )
+ ++pages;
+ int start=(m_top*100)/(pages*m_items_per_page);
+ int vis=(m_items_per_page*100)/(pages*m_items_per_page);
+ if (vis < 3)
+ vis=3;
+ m_scrollbar->setStartEnd(start,start+vis);
+ }
+}
+
int eListbox::event(int event, void *data, void *data2)
{
switch (event)
@@ -147,6 +214,9 @@ int eListbox::event(int event, void *data, void *data2)
gPainter &painter = *(gPainter*)data2;
+ if (m_scrollbar_mode != showNever)
+ updateScrollBar();
+
m_content->cursorSave();
m_content->cursorMove(m_top - m_selected);
@@ -155,9 +225,16 @@ int eListbox::event(int event, void *data, void *data2)
m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet() && m_content->size() && m_selection_enabled);
m_content->cursorMove(+1);
}
-
+
+ if ( m_scrollbar && m_scrollbar->isVisible() )
+ {
+ painter.clip(eRect(m_scrollbar->position() - ePoint(5,0), eSize(5,m_scrollbar->size().height())));
+ painter.clear();
+ painter.clippop();
+ }
+
m_content->cursorRestore();
-
+
return 0;
}
case evtChangedSize:
@@ -178,6 +255,7 @@ int eListbox::event(int event, void *data, void *data2)
void eListbox::recalcSize()
{
+ m_content_changed=true;
m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
}
@@ -246,6 +324,8 @@ void eListbox::entryChanged(int index)
void eListbox::entryReset()
{
+ m_content_changed=true;
+ m_prev_scrollbar_page=-1;
if (m_content)
m_content->cursorHome();
m_top = 0;
diff --git a/lib/gui/elistbox.h b/lib/gui/elistbox.h
index 60429d2e..08f80035 100644
--- a/lib/gui/elistbox.h
+++ b/lib/gui/elistbox.h
@@ -4,6 +4,8 @@
#include <lib/gui/ewidget.h>
#include <connection.h>
+class eSlider;
+
class iListboxContent: public iObject
{
public:
@@ -49,9 +51,18 @@ protected:
class eListbox: public eWidget
{
+ void updateScrollBar();
public:
eListbox(eWidget *parent);
~eListbox();
+
+ enum {
+ showOnDemand,
+ showAlways,
+ showNever
+ };
+ void setScrollbarMode(int mode);
+
void setContent(iListboxContent *content);
/* enum Movement {
@@ -93,13 +104,16 @@ protected:
void recalcSize();
private:
+ int m_scrollbar_mode, m_prev_scrollbar_page;
+ bool m_content_changed;
+
int m_top, m_selected;
int m_itemheight;
int m_items_per_page;
int m_selection_enabled;
ePtr<iListboxContent> m_content;
+ eSlider *m_scrollbar;
#endif
-
};
#endif
diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp
index 362a3f84..dea72a6c 100644
--- a/lib/gui/elistboxcontent.cpp
+++ b/lib/gui/elistboxcontent.cpp
@@ -246,6 +246,7 @@ void eListboxStringContent::setList(std::list<std::string> &list)
m_list = list;
m_size = list.size();
cursorHome();
+ m_listbox->entryReset();
}
//////////////////////////////////////
@@ -366,9 +367,8 @@ void eListboxPythonStringContent::setList(PyObject *list)
Py_INCREF(m_list);
}
- //always invalidate when we get a new list
if (m_listbox)
- m_listbox->invalidate();
+ m_listbox->entryReset();
}
PyObject *eListboxPythonStringContent::getCurrentSelection()
diff --git a/skin.py b/skin.py
index 27fc7d5d..8535dc81 100644
--- a/skin.py
+++ b/skin.py
@@ -130,6 +130,12 @@ def applySingleAttribute(guiObject, desktop, attrib, value):
guiObject.setBorderColor(parseColor(value))
elif attrib == "borderWidth":
guiObject.setBorderWidth(int(value))
+ elif attrib == "scrollbarMode":
+ guiObject.setScrollbarMode(
+ { "showOnDemand": guiObject.showOnDemand,
+ "showAlways": guiObject.showAlways,
+ "showNever": guiObject.showNever
+ }[value])
elif attrib != 'name':
print "unsupported attribute " + attrib + "=" + value
except int: