forked from Mirrorlandia_minetest/irrlicht
Revert "Fix: Listbox was sometimes sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED."
This broke scrolling in listboxes, as they would always reset to top position. reverts commit 1967d71cfba23fb54ac88cea64673f73af13bfda
This commit is contained in:
parent
aa1696a7e6
commit
2d81374b34
@ -22,10 +22,10 @@ namespace gui
|
|||||||
CGUIListBox::CGUIListBox(IGUIEnvironment* environment, IGUIElement* parent,
|
CGUIListBox::CGUIListBox(IGUIEnvironment* environment, IGUIElement* parent,
|
||||||
s32 id, core::rect<s32> rectangle, bool clip,
|
s32 id, core::rect<s32> rectangle, bool clip,
|
||||||
bool drawBack, bool moveOverSelect)
|
bool drawBack, bool moveOverSelect)
|
||||||
: IGUIListBox(environment, parent, id, rectangle), Selected(-1), HoverSelected(-1),
|
: IGUIListBox(environment, parent, id, rectangle), Selected(-1),
|
||||||
ItemHeight(0),ItemHeightOverride(0),
|
ItemHeight(0),ItemHeightOverride(0),
|
||||||
TotalItemHeight(0), ItemsIconWidth(0), Font(0), IconBank(0),
|
TotalItemHeight(0), ItemsIconWidth(0), Font(0), IconBank(0),
|
||||||
ScrollBar(0), SelectTime(0), LastKeyTime(0), Selecting(false), DrawBack(drawBack),
|
ScrollBar(0), selectTime(0), LastKeyTime(0), Selecting(false), DrawBack(drawBack),
|
||||||
MoveOverSelect(moveOverSelect), AutoScroll(true), HighlightWhenNotFocused(true)
|
MoveOverSelect(moveOverSelect), AutoScroll(true), HighlightWhenNotFocused(true)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -116,7 +116,7 @@ void CGUIListBox::removeItem(u32 id)
|
|||||||
else if ((u32)Selected > id)
|
else if ((u32)Selected > id)
|
||||||
{
|
{
|
||||||
Selected -= 1;
|
Selected -= 1;
|
||||||
SelectTime = os::Timer::getTime();
|
selectTime = os::Timer::getTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
Items.erase(id);
|
Items.erase(id);
|
||||||
@ -148,7 +148,6 @@ void CGUIListBox::clear()
|
|||||||
Items.clear();
|
Items.clear();
|
||||||
ItemsIconWidth = 0;
|
ItemsIconWidth = 0;
|
||||||
Selected = -1;
|
Selected = -1;
|
||||||
HoverSelected = -1;
|
|
||||||
|
|
||||||
ScrollBar->setPos(0);
|
ScrollBar->setPos(0);
|
||||||
|
|
||||||
@ -193,7 +192,7 @@ void CGUIListBox::recalculateItemHeight()
|
|||||||
//! returns id of selected item. returns -1 if no item is selected.
|
//! returns id of selected item. returns -1 if no item is selected.
|
||||||
s32 CGUIListBox::getSelected() const
|
s32 CGUIListBox::getSelected() const
|
||||||
{
|
{
|
||||||
return HoverSelected >= 0 ? HoverSelected : Selected;
|
return Selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -205,8 +204,7 @@ void CGUIListBox::setSelected(s32 id)
|
|||||||
else
|
else
|
||||||
Selected = id;
|
Selected = id;
|
||||||
|
|
||||||
HoverSelected = -1;
|
selectTime = os::Timer::getTime();
|
||||||
SelectTime = os::Timer::getTime();
|
|
||||||
|
|
||||||
recalculateScrollPos();
|
recalculateScrollPos();
|
||||||
}
|
}
|
||||||
@ -456,19 +454,14 @@ void CGUIListBox::selectNew(s32 ypos, bool onlyHover)
|
|||||||
u32 now = os::Timer::getTime();
|
u32 now = os::Timer::getTime();
|
||||||
s32 oldSelected = Selected;
|
s32 oldSelected = Selected;
|
||||||
|
|
||||||
HoverSelected = getItemAt(AbsoluteRect.UpperLeftCorner.X, ypos);
|
Selected = getItemAt(AbsoluteRect.UpperLeftCorner.X, ypos);
|
||||||
if (HoverSelected<0 && !Items.empty())
|
if (Selected<0 && !Items.empty())
|
||||||
HoverSelected = 0;
|
Selected = 0;
|
||||||
if (!onlyHover)
|
|
||||||
{
|
|
||||||
Selected = HoverSelected;
|
|
||||||
HoverSelected = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
recalculateScrollPos();
|
recalculateScrollPos();
|
||||||
|
|
||||||
gui::EGUI_EVENT_TYPE eventType = (Selected == oldSelected && now < SelectTime + 500) ? EGET_LISTBOX_SELECTED_AGAIN : EGET_LISTBOX_CHANGED;
|
gui::EGUI_EVENT_TYPE eventType = (Selected == oldSelected && now < selectTime + 500) ? EGET_LISTBOX_SELECTED_AGAIN : EGET_LISTBOX_CHANGED;
|
||||||
SelectTime = now;
|
selectTime = now;
|
||||||
// post the news
|
// post the news
|
||||||
if (Parent && !onlyHover)
|
if (Parent && !onlyHover)
|
||||||
{
|
{
|
||||||
@ -534,14 +527,13 @@ void CGUIListBox::draw()
|
|||||||
frameRect.LowerRightCorner.Y -= ScrollBar->getPos();
|
frameRect.LowerRightCorner.Y -= ScrollBar->getPos();
|
||||||
|
|
||||||
bool hl = (HighlightWhenNotFocused || Environment->hasFocus(this) || Environment->hasFocus(ScrollBar));
|
bool hl = (HighlightWhenNotFocused || Environment->hasFocus(this) || Environment->hasFocus(ScrollBar));
|
||||||
const irr::s32 selected = getSelected();
|
|
||||||
|
|
||||||
for (s32 i=0; i<(s32)Items.size(); ++i)
|
for (s32 i=0; i<(s32)Items.size(); ++i)
|
||||||
{
|
{
|
||||||
if (frameRect.LowerRightCorner.Y >= AbsoluteRect.UpperLeftCorner.Y &&
|
if (frameRect.LowerRightCorner.Y >= AbsoluteRect.UpperLeftCorner.Y &&
|
||||||
frameRect.UpperLeftCorner.Y <= AbsoluteRect.LowerRightCorner.Y)
|
frameRect.UpperLeftCorner.Y <= AbsoluteRect.LowerRightCorner.Y)
|
||||||
{
|
{
|
||||||
if (i == selected && hl)
|
if (i == Selected && hl)
|
||||||
skin->draw2DRectangle(this, skin->getColor(EGDC_HIGH_LIGHT), frameRect, &clientClip);
|
skin->draw2DRectangle(this, skin->getColor(EGDC_HIGH_LIGHT), frameRect, &clientClip);
|
||||||
|
|
||||||
core::rect<s32> textRect = frameRect;
|
core::rect<s32> textRect = frameRect;
|
||||||
@ -555,24 +547,24 @@ void CGUIListBox::draw()
|
|||||||
iconPos.Y += textRect.getHeight() / 2;
|
iconPos.Y += textRect.getHeight() / 2;
|
||||||
iconPos.X += ItemsIconWidth/2;
|
iconPos.X += ItemsIconWidth/2;
|
||||||
|
|
||||||
if ( i==selected && hl )
|
if ( i==Selected && hl )
|
||||||
{
|
{
|
||||||
IconBank->draw2DSprite( (u32)Items[i].Icon, iconPos, &clientClip,
|
IconBank->draw2DSprite( (u32)Items[i].Icon, iconPos, &clientClip,
|
||||||
hasItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) ?
|
hasItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) ?
|
||||||
getItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) : getItemDefaultColor(EGUI_LBC_ICON_HIGHLIGHT),
|
getItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) : getItemDefaultColor(EGUI_LBC_ICON_HIGHLIGHT),
|
||||||
SelectTime, os::Timer::getTime(), false, true);
|
selectTime, os::Timer::getTime(), false, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IconBank->draw2DSprite( (u32)Items[i].Icon, iconPos, &clientClip,
|
IconBank->draw2DSprite( (u32)Items[i].Icon, iconPos, &clientClip,
|
||||||
hasItemOverrideColor(i, EGUI_LBC_ICON) ? getItemOverrideColor(i, EGUI_LBC_ICON) : getItemDefaultColor(EGUI_LBC_ICON),
|
hasItemOverrideColor(i, EGUI_LBC_ICON) ? getItemOverrideColor(i, EGUI_LBC_ICON) : getItemDefaultColor(EGUI_LBC_ICON),
|
||||||
0 , (i==selected) ? os::Timer::getTime() : 0, false, true);
|
0 , (i==Selected) ? os::Timer::getTime() : 0, false, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
textRect.UpperLeftCorner.X += ItemsIconWidth+3;
|
textRect.UpperLeftCorner.X += ItemsIconWidth+3;
|
||||||
|
|
||||||
if ( i==selected && hl )
|
if ( i==Selected && hl )
|
||||||
{
|
{
|
||||||
Font->draw(Items[i].Text.c_str(), textRect,
|
Font->draw(Items[i].Text.c_str(), textRect,
|
||||||
hasItemOverrideColor(i, EGUI_LBC_TEXT_HIGHLIGHT) ?
|
hasItemOverrideColor(i, EGUI_LBC_TEXT_HIGHLIGHT) ?
|
||||||
|
@ -154,7 +154,6 @@ namespace gui
|
|||||||
|
|
||||||
core::array< ListItem > Items;
|
core::array< ListItem > Items;
|
||||||
s32 Selected;
|
s32 Selected;
|
||||||
s32 HoverSelected; // When >= 0 we're in the middle of changing selection while mouse is pressed. We need to know so selected again isn't called too often.
|
|
||||||
s32 ItemHeight;
|
s32 ItemHeight;
|
||||||
s32 ItemHeightOverride;
|
s32 ItemHeightOverride;
|
||||||
s32 TotalItemHeight;
|
s32 TotalItemHeight;
|
||||||
@ -162,7 +161,7 @@ namespace gui
|
|||||||
gui::IGUIFont* Font;
|
gui::IGUIFont* Font;
|
||||||
gui::IGUISpriteBank* IconBank;
|
gui::IGUISpriteBank* IconBank;
|
||||||
gui::IGUIScrollBar* ScrollBar;
|
gui::IGUIScrollBar* ScrollBar;
|
||||||
u32 SelectTime;
|
u32 selectTime;
|
||||||
u32 LastKeyTime;
|
u32 LastKeyTime;
|
||||||
core::stringw KeyBuffer;
|
core::stringw KeyBuffer;
|
||||||
bool Selecting;
|
bool Selecting;
|
||||||
|
Loading…
Reference in New Issue
Block a user