CMenuWidget: simplify up/down selection code

Origin commit data
------------------
Branch: ni/coolstream
Commit: 49f875508e
Author: Stefan Seyfried <seife@tuxbox-git.slipkontur.de>
Date: 2013-06-02 (Sun, 02 Jun 2013)


------------------
No further description and justification available within origin commit message!

------------------
This commit was generated by Migit
This commit is contained in:
Stefan Seyfried
2013-06-02 23:39:51 +02:00
parent cf52c972db
commit 0b7367ec22

View File

@@ -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) {