//! Set the maximal number of rows for the selection listbox void CGUIComboBox::setMaxSelectionRows(u32 max) { MaxSelectionRows = max; // force recalculation of open listbox if (ListBox) { openCloseMenu(); openCloseMenu(); } }
//! draws the element and its children void CGUIComboBox::draw() { if (!IsVisible) return; IGUISkin* skin = Environment->getSkin(); // font changed while the listbox is open? if ( ActiveFont != skin->getFont() && ListBox ) { // close and re-open to use new font-size openCloseMenu(); openCloseMenu(); } IGUIElement *currentFocus = Environment->getFocus(); if (currentFocus != LastFocus) { HasFocus = currentFocus == this || isMyChild(currentFocus); LastFocus = currentFocus; } // set colors each time as skin-colors can be changed SelectedText->setBackgroundColor(skin->getColor(EGDC_HIGH_LIGHT)); if(isEnabled()) { SelectedText->setDrawBackground(HasFocus); SelectedText->setOverrideColor(skin->getColor(HasFocus ? EGDC_HIGH_LIGHT_TEXT : EGDC_BUTTON_TEXT)); } else { SelectedText->setDrawBackground(false); SelectedText->setOverrideColor(skin->getColor(EGDC_GRAY_TEXT)); } ListButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_CURSOR_DOWN), skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL)); ListButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_CURSOR_DOWN), skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL)); core::rect<s32> frameRect(AbsoluteRect); // draw the border skin->draw3DSunkenPane(this, skin->getColor(EGDC_3D_HIGH_LIGHT), true, true, frameRect, &AbsoluteClippingRect); // draw children IGUIElement::draw(); }
//! called if an event happened. bool CGUIComboBox::OnEvent(const SEvent& event) { if (IsEnabled) { switch(event.EventType) { case EET_KEY_INPUT_EVENT: if (ListBox && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE) { // hide list box openCloseMenu(); return true; } else if (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE) { if (!event.KeyInput.PressedDown) openCloseMenu(); ListButton->setPressed(ListBox == 0); return true; } else if (event.KeyInput.PressedDown) { s32 oldSelected = Selected; bool absorb = true; switch (event.KeyInput.Key) { case KEY_DOWN: setSelected(Selected+1); break; case KEY_UP: setSelected(Selected-1); break; case KEY_HOME: case KEY_PRIOR: setSelected(0); break; case KEY_END: case KEY_NEXT: setSelected((s32)Items.size()-1); break; default: absorb = false; } if (Selected <0) setSelected(0); if (Selected >= (s32)Items.size()) setSelected((s32)Items.size() -1); if (Selected != oldSelected) sendSelectionChangedEvent(); if (absorb) return true; } break; case EET_GUI_EVENT: switch(event.GUIEvent.EventType) { case EGET_ELEMENT_FOCUS_LOST: if (ListBox && (Environment->hasFocus(ListBox) || ListBox->isMyChild(event.GUIEvent.Caller) ) && event.GUIEvent.Element != this && event.GUIEvent.Element != ListButton && event.GUIEvent.Element != ListBox && !ListBox->isMyChild(event.GUIEvent.Element)) { openCloseMenu(); } break; case EGET_BUTTON_CLICKED: if (event.GUIEvent.Caller == ListButton) { openCloseMenu(); return true; } break; case EGET_LISTBOX_SELECTED_AGAIN: case EGET_LISTBOX_CHANGED: if (event.GUIEvent.Caller == ListBox) { setSelected(ListBox->getSelected()); if (Selected <0 || Selected >= (s32)Items.size()) setSelected(-1); openCloseMenu(); sendSelectionChangedEvent(); } return true; default: break; } break; case EET_MOUSE_INPUT_EVENT: switch(event.MouseInput.Event) { case EMIE_LMOUSE_PRESSED_DOWN: { core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y); // send to list box if (ListBox && ListBox->isPointInside(p) && ListBox->OnEvent(event)) return true; return true; } case EMIE_LMOUSE_LEFT_UP: { core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y); // send to list box if (!(ListBox && ListBox->getAbsolutePosition().isPointInside(p) && ListBox->OnEvent(event))) openCloseMenu(); return true; } case EMIE_MOUSE_WHEEL: { s32 oldSelected = Selected; setSelected( Selected + ((event.MouseInput.Wheel < 0) ? 1 : -1)); if (Selected <0) setSelected(0); if (Selected >= (s32)Items.size()) setSelected((s32)Items.size() -1); if (Selected != oldSelected) sendSelectionChangedEvent(); } default: break; } break; default: break; } } return IGUIElement::OnEvent(event); }