From: <au...@us...> - 2009-08-02 19:20:39
|
Revision: 3795 http://supertuxkart.svn.sourceforge.net/supertuxkart/?rev=3795&view=rev Author: auria Date: 2009-08-02 19:20:27 +0000 (Sun, 02 Aug 2009) Log Message: ----------- Simplified event handling model in GUI to be less obtuse and more predictable Modified Paths: -------------- main/branches/irrlicht/src/guiengine/event_handler.cpp main/branches/irrlicht/src/guiengine/widget.hpp main/branches/irrlicht/src/guiengine/widgets/ribbon_grid_widget.cpp Modified: main/branches/irrlicht/src/guiengine/event_handler.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/event_handler.cpp 2009-08-02 19:08:11 UTC (rev 3794) +++ main/branches/irrlicht/src/guiengine/event_handler.cpp 2009-08-02 19:20:27 UTC (rev 3795) @@ -149,16 +149,21 @@ Widget* parent = w->m_event_handler; if(w->m_event_handler != NULL) { - /* Find topmost parent. Stop looping if a widget event handler's is itself, to not fall + /* Find all parents. Stop looping if a widget event handler's is itself, to not fall in an infinite loop (this can happen e.g. in checkboxes, where they need to be notified of clicks onto themselves so they can toggle their state. ) */ while(parent->m_event_handler != NULL && parent->m_event_handler != parent) + { + parent->transmitEvent(w, w->m_properties[PROP_ID]); parent = parent->m_event_handler; + } /* notify the found event event handler, and also notify the main callback if the parent event handler says so */ if(parent->transmitEvent(w, w->m_properties[PROP_ID])) + { transmitEvent(parent, parent->m_properties[PROP_ID]); + } } else transmitEvent(w, w->m_properties[PROP_ID]); @@ -192,9 +197,7 @@ On the way, also notify everyone in the chain of the left press. */ while (widget_to_call->m_event_handler != NULL && widget_to_call->m_event_handler != widget_to_call) { - if (widget_to_call->leftPressed()) - transmitEvent(w, w->m_properties[PROP_ID]); - + widget_to_call->leftPressed(); widget_to_call = widget_to_call->m_event_handler; } @@ -218,9 +221,7 @@ On the way, also notify everyone in the chain of the right press */ while(widget_to_call->m_event_handler != NULL && widget_to_call->m_event_handler != widget_to_call) { - if(widget_to_call->rightPressed()) - transmitEvent(widget_to_call, w->m_properties[PROP_ID]); - + widget_to_call->rightPressed(); widget_to_call = widget_to_call->m_event_handler; } Modified: main/branches/irrlicht/src/guiengine/widget.hpp =================================================================== --- main/branches/irrlicht/src/guiengine/widget.hpp 2009-08-02 19:08:11 UTC (rev 3794) +++ main/branches/irrlicht/src/guiengine/widget.hpp 2009-08-02 19:20:27 UTC (rev 3795) @@ -125,8 +125,7 @@ public: /** * This is set to NULL by default; set to something else in a widget to mean - * that events happening on this widget should not go straight into the - * event handler. Instead, they will first be passed to m_event_handler->transmitEvent, + * that events happening on this widget should also be passed to m_event_handler->transmitEvent, * which is usually the parent analysing events from its children. * This is especially useful with logical widgets built with more than * one irrlicht widgets (e.g. Spinner, Ribbon) @@ -153,8 +152,10 @@ virtual void update(float delta) { } - /** used when you set parents - see m_event_handler explainations below. - returns whether main event callback should be notified or not */ + /** All widgets, including their parents (m_event_handler) will be notified on event through + this call. Must return whether main (GUI engine user) event callback should be notified or not. + Note that in the case of a hierarchy of widgets (with m_event_handler), only the topmost widget + of the chain decides whether the main handler is notified; return value is not read for others. */ virtual bool transmitEvent(Widget* w, std::string& originator) { return true; } /** Modified: main/branches/irrlicht/src/guiengine/widgets/ribbon_grid_widget.cpp =================================================================== --- main/branches/irrlicht/src/guiengine/widgets/ribbon_grid_widget.cpp 2009-08-02 19:08:11 UTC (rev 3794) +++ main/branches/irrlicht/src/guiengine/widgets/ribbon_grid_widget.cpp 2009-08-02 19:20:27 UTC (rev 3795) @@ -219,11 +219,6 @@ return false; } - // if it's something else, it might be a ribbon child with its own parent - if(w->m_event_handler != NULL && w->m_event_handler != this) - return w->m_event_handler->transmitEvent(w, originator); - - // if we got there, must be a ribbon itself. in this case we can just transmit the event directly return true; } // ----------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |