git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix handy like jumping in sorted service list
[enigma2.git]
/
lib
/
gui
/
elistbox.cpp
diff --git
a/lib/gui/elistbox.cpp
b/lib/gui/elistbox.cpp
index 1dae137fdab5b0f99b0498fade511e0d9ad6fe32..e2f1c26f878691063247a066fe25aa18b36a2d7f 100644
(file)
--- a/
lib/gui/elistbox.cpp
+++ b/
lib/gui/elistbox.cpp
@@
-9,6
+9,9
@@
eListbox::eListbox(eWidget *parent): eWidget(parent)
ePtr<eActionMap> ptr;
eActionMap::getInstance(ptr);
ePtr<eActionMap> ptr;
eActionMap::getInstance(ptr);
+ m_itemheight = 25;
+ m_selection_enabled = 1;
+
ptr->bindAction("ListboxActions", 0, 0, this);
}
ptr->bindAction("ListboxActions", 0, 0, this);
}
@@
-22,11
+25,17
@@
eListbox::~eListbox()
void eListbox::setContent(iListboxContent *content)
{
m_content = content;
void eListbox::setContent(iListboxContent *content)
{
m_content = content;
+ if (content)
+ m_content->setListbox(this);
entryReset();
}
void eListbox::moveSelection(int dir)
{
entryReset();
}
void eListbox::moveSelection(int dir)
{
+ /* refuse to do anything without a valid list. */
+ if (!m_content)
+ 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;
@@
-43,17
+52,39
@@
void eListbox::moveSelection(int dir)
if (!m_content->cursorValid())
m_content->cursorMove(-1);
break;
if (!m_content->cursorValid())
m_content->cursorMove(-1);
break;
+ case pageUp:
+ if (m_content->cursorGet() >= m_items_per_page)
+ {
+ m_content->cursorMove(-m_items_per_page);
+ m_top -= m_items_per_page;
+ if (m_top < 0)
+ m_top = 0;
+ } else
+ {
+ m_top = 0;
+ m_content->cursorHome();
+ }
+ break;
case moveTop:
m_content->cursorHome();
m_top = 0; /* align with top, speeds up process */
break;
case moveTop:
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);
case moveEnd:
/* move to last existing one ("end" is already invalid) */
m_content->cursorEnd(); m_content->cursorMove(-1);
-
- m_top = m_content->cursorGet() - m_items_per_page + 1;
- if (m_top < 0)
- m_top = 0;
+ /* current selection invisible? */
+ if (m_top + m_items_per_page <= m_content->cursorGet())
+ {
+ m_top = m_content->cursorGet() - m_items_per_page + 1;
+ if (m_top < 0)
+ m_top = 0;
+ }
break;
case justCheck:
break;
break;
case justCheck:
break;
@@
-65,17
+96,16
@@
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();
-
-
if
(m_selected < m_top)
+
+
while
(m_selected < m_top)
{
m_top -= m_items_per_page;
if (m_top < 0)
m_top = 0;
{
m_top -= m_items_per_page;
if (m_top < 0)
m_top = 0;
- } else if (m_selected >= m_top + m_items_per_page)
- {
- /* m_top should be always valid here as it's selected */
- m_top += m_items_per_page;
}
}
+ while (m_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 (m_top != oldtop)
invalidate();
if (m_top != oldtop)
invalidate();
@@
-90,6
+120,14
@@
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);
+}
+
int eListbox::event(int event, void *data, void *data2)
{
switch (event)
int eListbox::event(int event, void *data, void *data2)
{
switch (event)
@@
-98,8
+136,9
@@
int eListbox::event(int event, void *data, void *data2)
{
ePtr<eWindowStyle> style;
{
ePtr<eWindowStyle> style;
+ if (!m_content)
+ return eWidget::event(event, data, data2);
assert(m_content);
assert(m_content);
- recalcSize(); // move to event
getStyle(style);
getStyle(style);
@@
-111,9
+150,9
@@
int eListbox::event(int event, void *data, void *data2)
m_content->cursorSave();
m_content->cursorMove(m_top - m_selected);
m_content->cursorSave();
m_content->cursorMove(m_top - m_selected);
- for (int y = 0, i = 0; i < m_items_per_page; y += m_itemheight, ++i)
+ for (int y = 0, i = 0; i <
=
m_items_per_page; y += m_itemheight, ++i)
{
{
- m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet());
+ m_content->paint(painter, *style, ePoint(0, y), m_selected == m_content->cursorGet()
&& m_content->size() && m_selection_enabled
);
m_content->cursorMove(+1);
}
m_content->cursorMove(+1);
}
@@
-121,9
+160,17
@@
int eListbox::event(int event, void *data, void *data2)
return 0;
}
return 0;
}
+ case evtChangedSize:
+ recalcSize();
+ return eWidget::event(event, data, data2);
+
case evtAction:
case evtAction:
- moveSelection((int)data2);
- return 1;
+ if (isVisible())
+ {
+ moveSelection((int)data2);
+ return 1;
+ }
+ return 0;
default:
return eWidget::event(event, data, data2);
}
default:
return eWidget::event(event, data, data2);
}
@@
-131,11
+178,27
@@
int eListbox::event(int event, void *data, void *data2)
void eListbox::recalcSize()
{
void eListbox::recalcSize()
{
- m_itemheight = 20;
m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
}
m_content->setSize(eSize(size().width(), m_itemheight));
m_items_per_page = size().height() / m_itemheight;
}
+void eListbox::setItemHeight(int h)
+{
+ if (h)
+ m_itemheight = h;
+ else
+ m_itemheight = 20;
+ recalcSize();
+}
+
+void eListbox::setSelectionEnable(int en)
+{
+ if (m_selection_enabled == en)
+ return;
+ m_selection_enabled = en;
+ entryChanged(m_selected); /* redraw current entry */
+}
+
void eListbox::entryAdded(int index)
{
/* manage our local pointers. when the entry was added before the current position, we have to advance. */
void eListbox::entryAdded(int index)
{
/* manage our local pointers. when the entry was added before the current position, we have to advance. */
@@
-183,9
+246,9
@@
void eListbox::entryChanged(int index)
void eListbox::entryReset()
{
void eListbox::entryReset()
{
- invalidate();
if (m_content)
m_content->cursorHome();
m_top = 0;
m_selected = 0;
if (m_content)
m_content->cursorHome();
m_top = 0;
m_selected = 0;
+ invalidate();
}
}