mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-26 23:13:13 +02:00
CMenuWidget: simplify up/down selection code
This commit is contained in:
@@ -483,6 +483,12 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* make sure we start with a selectable item... */
|
||||||
|
while (pos < (int)items.size()) {
|
||||||
|
if (items[pos]->isSelectable())
|
||||||
|
break;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
GenericMenuBack->setHint("", NONEXISTANT_LOCALE);
|
GenericMenuBack->setHint("", NONEXISTANT_LOCALE);
|
||||||
#endif
|
#endif
|
||||||
@@ -543,103 +549,64 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case (CRCInput::RC_page_up) :
|
case CRCInput::RC_page_up:
|
||||||
case (CRCInput::RC_page_down) :
|
case CRCInput::RC_page_down:
|
||||||
if(msg==CRCInput::RC_page_up) {
|
case CRCInput::RC_up:
|
||||||
if(current_page) {
|
case CRCInput::RC_down:
|
||||||
pos = page_start[current_page] - 1;
|
{
|
||||||
for (unsigned int count=pos ; count > 0; count--) {
|
/* dir and wrap are used when searching for a selectable item:
|
||||||
CMenuItem* item = items[pos];
|
* if the item is not selectable, try the previous (dir = -1) or
|
||||||
if ( item->isSelectable() ) {
|
* next (dir = 1) item, until a selectale item is found.
|
||||||
if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) {
|
* if wrap = true, allows to wrap around while searching */
|
||||||
items[selected]->paint( false );
|
int dir = 1;
|
||||||
item->paint( true );
|
bool wrap = false;
|
||||||
paintHint(pos);
|
switch (msg) {
|
||||||
selected = pos;
|
case CRCInput::RC_page_up:
|
||||||
} else {
|
if (current_page) {
|
||||||
selected=pos;
|
pos = page_start[current_page] - 1;
|
||||||
paintItems();
|
dir = -1; /* pg_up: search upwards */
|
||||||
}
|
} else
|
||||||
break;
|
pos = 0; /* ...but not if already at top */
|
||||||
}
|
break;
|
||||||
pos--;
|
case CRCInput::RC_page_down:
|
||||||
|
pos = page_start[current_page + 1];
|
||||||
|
if (pos >= (int)items.size()) {
|
||||||
|
pos = items.size() - 1;
|
||||||
|
dir = -1; /* if last item is not selectable, go up */
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
pos = 0;
|
case CRCInput::RC_up:
|
||||||
for (unsigned int count=0; count < items.size(); count++) {
|
dir = -1;
|
||||||
CMenuItem* item = items[pos];
|
default: /* fallthrough or RC_down => dir = 1 */
|
||||||
if ( item->isSelectable() ) {
|
pos += dir;
|
||||||
if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) {
|
if (pos < 0 || pos >= (int)items.size())
|
||||||
items[selected]->paint( false );
|
pos -= dir * items.size();
|
||||||
item->paint( true );
|
wrap = true;
|
||||||
paintHint(pos);
|
|
||||||
selected = pos;
|
|
||||||
} else {
|
|
||||||
selected=pos;
|
|
||||||
paintItems();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if(msg==CRCInput::RC_page_down) {
|
do {
|
||||||
pos = page_start[current_page + 1];// - 1;
|
CMenuItem* item = items[pos];
|
||||||
if(pos >= (int) items.size())
|
if (item->isSelectable()) {
|
||||||
pos = items.size()-1;
|
if (pos < page_start[current_page + 1] && pos >= page_start[current_page]) {
|
||||||
for (unsigned int count=pos ; count < items.size(); count++) {
|
/* in current page */
|
||||||
CMenuItem* item = items[pos];
|
items[selected]->paint(false);
|
||||||
if ( item->isSelectable() ) {
|
item->paint(true);
|
||||||
if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) {
|
paintHint(pos);
|
||||||
items[selected]->paint( false );
|
selected = pos;
|
||||||
item->paint( true );
|
} else {
|
||||||
paintHint(pos);
|
/* different page */
|
||||||
selected = pos;
|
selected = pos;
|
||||||
} else {
|
paintItems();
|
||||||
selected=pos;
|
|
||||||
paintItems();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
pos++;
|
break;
|
||||||
}
|
}
|
||||||
}
|
pos += dir;
|
||||||
break;
|
if (wrap && (pos >= (int)items.size() || pos < 0)) {
|
||||||
case (CRCInput::RC_up) :
|
pos -= dir * items.size();
|
||||||
case (CRCInput::RC_down) :
|
wrap = false; /* wrap only once, avoids endless loop */
|
||||||
{
|
}
|
||||||
//search next / prev selectable item
|
} while (pos >= 0 && pos < (int)items.size());
|
||||||
for (unsigned int count=1; count< items.size(); count++) {
|
|
||||||
if (msg==CRCInput::RC_up) {
|
|
||||||
pos = selected - count;
|
|
||||||
if ( pos < 0 )
|
|
||||||
pos += items.size();
|
|
||||||
}
|
|
||||||
else if(msg==CRCInput::RC_down) {
|
|
||||||
pos = (selected+ count)%items.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
CMenuItem* item = items[pos];
|
|
||||||
|
|
||||||
if ( item->isSelectable() ) {
|
|
||||||
if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page]))
|
|
||||||
{ // Item is currently on screen
|
|
||||||
//clear prev. selected
|
|
||||||
items[selected]->paint( false );
|
|
||||||
//select new
|
|
||||||
item->paint( true );
|
|
||||||
paintHint(pos);
|
|
||||||
selected = pos;
|
|
||||||
} else {
|
|
||||||
selected=pos;
|
|
||||||
paintItems();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case (CRCInput::RC_left):
|
case (CRCInput::RC_left):
|
||||||
{
|
{
|
||||||
if(hasItem() && selected > -1 && (int)items.size() > selected) {
|
if(hasItem() && selected > -1 && (int)items.size() > selected) {
|
||||||
|
Reference in New Issue
Block a user