/* Please confirm that this is a bug */
When we working with SEvent, we check EventType first, and then we work with proper part of the event. For example:
Code: Select all
if (event.EventType == EET_GUI_EVENT)
{
// here we can use/check event.GUIEvent freely
}
Code: Select all
gui::IGUIElement * Caller; // IGUIElement who called the event.
gui::IGUIElement * Element; // If the event has something to do with another element, it will be held here.
gui::EGUI_EVENT_TYPE EventType; // Type of GUI Event.
In most cases it filled correctly: with a pointer if used and 0 if not used, BUT there is few places where this behavior omitted and this field left without attention.
Please note, currently we cannot write next:
Code: Select all
if (event.EventType == EET_GUI_EVENT)
{
s32 callerID = event.GUIEvent.Caller->getID();
s32 elementID = event.GUIEvent.Element != 0 ? event.GUIEvent.Element->getID() : -1;
}
EGET_ELEMENT_LEFT
EGET_TABLE_HEADER_CHANGED
EGET_TABLE_CHANGED
EGET_TABLE_SELECTED_AGAIN
EGET_TREEVIEW_NODE_EXPAND
EGET_TREEVIEW_NODE_COLLAPS
EGET_TREEVIEW_NODE_DESELECT
EGET_TREEVIEW_NODE_SELECT
Next list of places shows where bug is:
CGUIEnvironment.cpp:
Code: Select all
...
if (Hovered != lastHovered)
{
SEvent event;
event.EventType = EET_GUI_EVENT;
if (lastHovered)
{
event.GUIEvent.Caller = lastHovered;
event.GUIEvent.EventType = EGET_ELEMENT_LEFT;
lastHovered->OnEvent(event); // <<<<<<<<<<<<<<<<<---- Element IS NOT FILLED HERE!!!
}
if ( Hovered )
{
event.GUIEvent.Caller = Hovered;
event.GUIEvent.Element = Hovered;
event.GUIEvent.EventType = EGET_ELEMENT_HOVERED;
Hovered->OnEvent(event);
}
}
...
Code: Select all
...
case EGCO_CUSTOM:
CurrentOrdering = EGOM_NONE;
if (Parent)
{
SEvent event;
event.EventType = EET_GUI_EVENT;
event.GUIEvent.Caller = this;
event.GUIEvent.EventType = EGET_TABLE_HEADER_CHANGED;
Parent->OnEvent(event); // <<<<<<<<<<<<<<<<<---- Element IS NOT FILLED HERE!!!
}
break;
...
if (changed)
{
SEvent event;
event.EventType = EET_GUI_EVENT;
event.GUIEvent.Caller = this;
event.GUIEvent.EventType = EGET_TABLE_HEADER_CHANGED;
Parent->OnEvent(event); // <<<<<<<<<<<<<<<<<---- Element IS NOT FILLED HERE!!!
}
...
// post the news
if (Parent && !onlyHover)
{
SEvent event;
event.EventType = EET_GUI_EVENT;
event.GUIEvent.Caller = this;
event.GUIEvent.EventType = (Selected != oldSelected) ? EGET_TABLE_CHANGED : EGET_TABLE_SELECTED_AGAIN;
Parent->OnEvent(event); // <<<<<<<<<<<<<<<<<---- Element IS NOT FILLED HERE!!!
}
...
Code: Select all
...
SEvent event;
event.EventType = EET_GUI_EVENT;
event.GUIEvent.Caller = this;
// <<<<<<<<<<<<<<<<< event.GUIEvent.Element = 0; <<<<<< MUST BE HERE!!!
xpos -= AbsoluteRect.UpperLeftCorner.X;
ypos -= AbsoluteRect.UpperLeftCorner.Y;
...
At all this places should be done next patch: after each "event.GUIEvent.Caller = " line, should be added line "event.GUIEvent.Element = 0;".
Thank You!