gui/widget/listbox.cpp: reuse selection code; add list start/end keys

This commit is contained in:
[CST] Focus
2012-06-06 16:48:09 +04:00
parent c056887406
commit 7f22f35869
2 changed files with 40 additions and 50 deletions

View File

@@ -145,6 +145,24 @@ void CListBox::paintItem(unsigned int /*itemNr*/, int paintNr, bool pselected)
g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x + 10, ypos+ fheight, width-20, "demo", color); g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x + 10, ypos+ fheight, width-20, "demo", color);
} }
void CListBox::updateSelection(unsigned int newpos)
{
if(newpos == selected)
return;
unsigned int prev_selected = selected;
selected = newpos;
unsigned int oldliststart = liststart;
liststart = (selected/listmaxshow)*listmaxshow;
if(oldliststart!=liststart) {
paint();
} else {
paintItem(prev_selected - liststart);
paintItem(selected - liststart);
}
}
int CListBox::exec(CMenuTarget* parent, const std::string & /*actionKey*/) int CListBox::exec(CMenuTarget* parent, const std::string & /*actionKey*/)
{ {
neutrino_msg_t msg; neutrino_msg_t msg;
@@ -176,67 +194,38 @@ int CListBox::exec(CMenuTarget* parent, const std::string & /*actionKey*/)
else if (msg == CRCInput::RC_up || (int) msg == g_settings.key_channelList_pageup) else if (msg == CRCInput::RC_up || (int) msg == g_settings.key_channelList_pageup)
{ {
if(getItemCount()!=0) { if(getItemCount()!=0) {
int step = 0; int step = (msg == (neutrino_msg_t)g_settings.key_channelList_pageup) ? listmaxshow : 1; // browse or step 1
int prev_selected = selected; int new_selected = selected - step;
step = ((int) msg == g_settings.key_channelList_pageup) ? listmaxshow : 1; // browse or step 1 if (new_selected < 0) {
selected -= step; if (selected != 0 && step != 1)
new_selected = 0;
if((prev_selected-step) < 0) {
if(prev_selected != 0 && step != 1)
selected = 0;
else else
selected = getItemCount() - 1; new_selected = getItemCount() - 1;
} }
updateSelection(new_selected);
#if 0
if((prev_selected-step) < 0) // because of uint
selected = getItemCount() - 1;
#endif
paintItem(prev_selected - liststart);
unsigned int oldliststart = liststart;
liststart = (selected/listmaxshow)*listmaxshow;
if(oldliststart!=liststart)
paint();
else
paintItem(selected - liststart);
} }
} }
else if (msg == CRCInput::RC_down || (int) msg == g_settings.key_channelList_pagedown) else if (msg == CRCInput::RC_down || (int) msg == g_settings.key_channelList_pagedown)
{ {
if(getItemCount()!=0) { if(getItemCount()!=0) {
unsigned int step = 0; int step = ((int) msg == g_settings.key_channelList_pagedown) ? listmaxshow : 1; // browse or step 1
unsigned int prev_selected = selected; int new_selected = selected + step;
if (new_selected >= (int) getItemCount()) {
step = ((int) msg == g_settings.key_channelList_pagedown) ? listmaxshow : 1; // browse or step 1 if ((getItemCount() - listmaxshow -1 < selected) && (selected != (getItemCount() - 1)) && (step != 1))
selected += step; new_selected = getItemCount() - 1;
if(selected >= getItemCount()) {
if((getItemCount() - listmaxshow -1 < prev_selected) && (prev_selected != (getItemCount() - 1)) && (step != 1))
selected = getItemCount() - 1;
else if (((getItemCount() / listmaxshow) + 1) * listmaxshow == getItemCount() + listmaxshow) // last page has full entries else if (((getItemCount() / listmaxshow) + 1) * listmaxshow == getItemCount() + listmaxshow) // last page has full entries
selected = 0; new_selected = 0;
else else
selected = ((step == listmaxshow) && (selected < (((getItemCount() / listmaxshow)+1) * listmaxshow))) ? (getItemCount() - 1) : 0; new_selected = ((step == (int) listmaxshow) && (new_selected < (int) (((getItemCount() / listmaxshow)+1) * listmaxshow))) ? (getItemCount() - 1) : 0;
} }
updateSelection(new_selected);
#if 0
if(selected >= getItemCount()) {
if (((getItemCount() / listmaxshow) + 1) * listmaxshow == getItemCount() + listmaxshow) // last page has full entries
selected = 0;
else
selected = ((step == listmaxshow) && (selected < (((getItemCount() / listmaxshow) + 1) * listmaxshow))) ? (getItemCount() - 1) : 0;
} }
#endif }
else if (msg == (neutrino_msg_t) g_settings.key_list_start || msg == (neutrino_msg_t) g_settings.key_list_end) {
paintItem(prev_selected - liststart); if (getItemCount()) {
unsigned int oldliststart = liststart; int new_selected = msg == (neutrino_msg_t) g_settings.key_list_start ? 0 : getItemCount() - 1;
liststart = (selected/listmaxshow)*listmaxshow; updateSelection(new_selected);
if(oldliststart!=liststart)
paint();
else
paintItem(selected - liststart);
} }
} }
else if( msg ==CRCInput::RC_ok) else if( msg ==CRCInput::RC_ok)

View File

@@ -78,6 +78,7 @@ class CListBox : public CMenuWidget
//------malen der Items------------------- //------malen der Items-------------------
virtual int getItemHeight(); virtual int getItemHeight();
virtual void paintItem(uint32_t itemNr, int paintNr, bool selected); virtual void paintItem(uint32_t itemNr, int paintNr, bool selected);
void updateSelection(unsigned int newpos);
//------Benutzung von setModified--------- //------Benutzung von setModified---------
void setModified(void); void setModified(void);