#include <lib/actions/action.h>
eListbox::eListbox(eWidget *parent)
- :eWidget(parent), m_prev_scrollbar_page(-1), m_content_changed(false)
- , m_scrollbar_mode(showNever), m_scrollbar(NULL)
+ :eWidget(parent), m_scrollbar_mode(showNever), m_prev_scrollbar_page(-1)
+ ,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());
+// setContent(new eListboxStringContent());
ePtr<eActionMap> ptr;
eActionMap::getInstance(ptr);
-
- m_itemheight = 25;
- m_selection_enabled = 1;
-
ptr->bindAction("ListboxActions", 0, 0, this);
}
}
}
+void eListbox::setWrapAround(bool state)
+{
+ m_enabled_wrap_around = state;
+}
+
void eListbox::setContent(iListboxContent *content)
{
+ int oldsel = m_selected;
m_content = content;
if (content)
m_content->setListbox(this);
entryReset();
+ if (oldsel == m_selected)
+ /* 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. */
if (!m_content)
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;
-
/* first, move cursor */
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)
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;
/* 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;
/* 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)
{
-
- /* 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);
void eListbox::moveSelectionTo(int index)
{
- m_content->cursorHome();
- m_content->cursorMove(index);
- moveSelection(justCheck);
+ if ( m_content )
+ {
+ m_content->cursorHome();
+ m_content->cursorMove(index);
+ moveSelection(justCheck);
+ }
+}
+
+int eListbox::getCurrentIndex()
+{
+ if ( m_content && m_content->cursorValid() )
+ return m_content->cursorGet();
+ return 0;
}
void eListbox::updateScrollBar()
m_prev_scrollbar_page=-1;
m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
+
+ if (m_items_per_page < 0) /* TODO: whyever - our size could be invalid, or itemheigh could be wrongly specified. */
+ m_items_per_page = 0;
+
moveSelection(justCheck);
}