aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-02-03 15:37:38 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-02-03 15:37:38 +0000
commit9314a07dfcc0a5123beb50ddb198cbcc5805d7db (patch)
tree0fe71a3d2ff3d59cdd4a4fc31c5ed4d8551fb8d4
parent477c468861635555c7179f2f4397dd765f499656 (diff)
downloadenigma2-9314a07dfcc0a5123beb50ddb198cbcc5805d7db.tar.gz
enigma2-9314a07dfcc0a5123beb50ddb198cbcc5805d7db.zip
add ability to enable wrap around in listbox
-rw-r--r--lib/gui/elistbox.cpp69
-rw-r--r--lib/gui/elistbox.h5
2 files changed, 57 insertions, 17 deletions
diff --git a/lib/gui/elistbox.cpp b/lib/gui/elistbox.cpp
index f1efadfd..8520a02a 100644
--- a/lib/gui/elistbox.cpp
+++ b/lib/gui/elistbox.cpp
@@ -5,7 +5,7 @@
eListbox::eListbox(eWidget *parent)
:eWidget(parent), m_scrollbar_mode(showNever), m_prev_scrollbar_page(-1)
- ,m_content_changed(false), m_top(0), m_selected(0), m_itemheight(25)
+ ,m_content_changed(false), m_enabled_wrap_around(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());
@@ -46,6 +46,11 @@ void eListbox::setScrollbarMode(int mode)
}
}
+void eListbox::setWrapAround(bool state)
+{
+ m_enabled_wrap_around = state;
+}
+
void eListbox::setContent(iListboxContent *content)
{
int oldsel = m_selected;
@@ -57,6 +62,37 @@ void eListbox::setContent(iListboxContent *content)
/* emit */ selectionChanged();
}
+bool eListbox::atBegin()
+{
+ if (m_content && !m_selected)
+ return true;
+ return false;
+}
+
+bool eListbox::atEnd()
+{
+ if (m_content && m_content->size() == m_selected+1)
+ return true;
+ return false;
+}
+
+void eListbox::moveToEnd()
+{
+ /* move to last existing one ("end" is already invalid) */
+ m_content->cursorEnd(); m_content->cursorMove(-1);
+ /* current selection invisible? */
+ if (m_top + m_items_per_page <= m_content->cursorGet())
+ {
+ int rest = m_content->size() % m_items_per_page;
+ if ( rest )
+ m_top = m_content->cursorGet() - rest + 1;
+ else
+ m_top = m_content->cursorGet() - m_items_per_page + 1;
+ if (m_top < 0)
+ m_top = 0;
+ }
+}
+
void eListbox::moveSelection(int dir)
{
/* refuse to do anything without a valid list. */
@@ -72,13 +108,25 @@ void eListbox::moveSelection(int dir)
switch (dir)
{
case moveUp:
+ {
m_content->cursorMove(-1);
+ if ( m_enabled_wrap_around && oldsel == m_content->cursorGet() ) // must wrap around ?
+ moveToEnd();
break;
+ }
case moveDown:
m_content->cursorMove(1);
- /* ok - we could have reached the end. we just go one back then. */
+ /* ok - we could have reached the end. So we do wrap around. */
if (!m_content->cursorValid())
- m_content->cursorMove(-1);
+ {
+ if ( m_enabled_wrap_around )
+ {
+ m_top = 0;
+ m_content->cursorHome();
+ }
+ else
+ m_content->cursorMove(-1);
+ }
break;
case pageUp:
if (m_content->cursorGet() >= m_items_per_page)
@@ -97,26 +145,13 @@ void eListbox::moveSelection(int dir)
m_content->cursorHome();
m_top = 0; /* align with top, speeds up process */
break;
-
case pageDown:
m_content->cursorMove(m_items_per_page);
if (m_content->cursorValid())
break;
/* fall through */
case moveEnd:
- /* move to last existing one ("end" is already invalid) */
- m_content->cursorEnd(); m_content->cursorMove(-1);
- /* current selection invisible? */
- if (m_top + m_items_per_page <= m_content->cursorGet())
- {
- int rest = m_content->size() % m_items_per_page;
- if ( rest )
- m_top = m_content->cursorGet() - rest + 1;
- else
- m_top = m_content->cursorGet() - m_items_per_page + 1;
- if (m_top < 0)
- m_top = 0;
- }
+ moveToEnd();
break;
case justCheck:
break;
diff --git a/lib/gui/elistbox.h b/lib/gui/elistbox.h
index 87013bc1..76ad8208 100644
--- a/lib/gui/elistbox.h
+++ b/lib/gui/elistbox.h
@@ -65,6 +65,7 @@ public:
showNever
};
void setScrollbarMode(int mode);
+ void setWrapAround(bool);
void setContent(iListboxContent *content);
@@ -79,6 +80,9 @@ public:
int getCurrentIndex();
void moveSelection(int how);
void moveSelectionTo(int index);
+ void moveToEnd();
+ bool atBegin();
+ bool atEnd();
enum ListboxActions {
moveUp,
@@ -109,6 +113,7 @@ protected:
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;