diff --git a/source/gui/CButton.cpp b/source/gui/CButton.cpp index 72c4e3cbcb..7be7c0029c 100644 --- a/source/gui/CButton.cpp +++ b/source/gui/CButton.cpp @@ -79,22 +79,11 @@ void CButton::SetupText() CalculateTextPosition(m_CachedActualSize, m_TextPos, *m_GeneratedTexts[0]); } -void CButton::HandleMessage(const SGUIMessage &Message) +void CButton::HandleMessage(SGUIMessage &Message) { // Important IGUIButtonBehavior::HandleMessage(Message); IGUITextOwner::HandleMessage(Message); -/* - switch (Message.type) - { - case GUIM_PRESSED: -// GetGUI()->TEMPmessage = "Button " + string((const TCHAR*)m_Name) + " was pressed!"; - break; - - default: - break; - } -*/ } void CButton::Draw() diff --git a/source/gui/CButton.h b/source/gui/CButton.h index 0d7d2eb8e3..2edf9d5015 100644 --- a/source/gui/CButton.h +++ b/source/gui/CButton.h @@ -62,14 +62,15 @@ public: CButton(); virtual ~CButton(); + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { IGUIButtonBehavior::ResetStates(); } /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Draws the Button diff --git a/source/gui/CCheckBox.cpp b/source/gui/CCheckBox.cpp index dd5e28e2d4..b0f0904784 100644 --- a/source/gui/CCheckBox.cpp +++ b/source/gui/CCheckBox.cpp @@ -85,7 +85,7 @@ void CCheckBox::SetupText() *m_GeneratedTexts[0] = GetGUI()->GenerateText(caption, font, m_CachedActualSize.GetWidth()-square_side, 0.f, this); } -void CCheckBox::HandleMessage(const SGUIMessage &Message) +void CCheckBox::HandleMessage(SGUIMessage &Message) { // Important IGUIButtonBehavior::HandleMessage(Message); diff --git a/source/gui/CCheckBox.h b/source/gui/CCheckBox.h index e6cda54221..65ff7d227c 100644 --- a/source/gui/CCheckBox.h +++ b/source/gui/CCheckBox.h @@ -63,14 +63,15 @@ public: CCheckBox(); virtual ~CCheckBox(); + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { IGUIButtonBehavior::ResetStates(); } /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Draws the control diff --git a/source/gui/CDropDown.cpp b/source/gui/CDropDown.cpp index 1b3958681e..8f8508c6f8 100644 --- a/source/gui/CDropDown.cpp +++ b/source/gui/CDropDown.cpp @@ -64,7 +64,7 @@ void CDropDown::SetupText() CList::SetupText(); } -void CDropDown::HandleMessage(const SGUIMessage &Message) +void CDropDown::HandleMessage(SGUIMessage &Message) { // Important diff --git a/source/gui/CDropDown.h b/source/gui/CDropDown.h index 237dad2aee..a3ecaa83b4 100644 --- a/source/gui/CDropDown.h +++ b/source/gui/CDropDown.h @@ -72,11 +72,9 @@ public: // virtual void ResetStates() { IGUIButtonBehavior::ResetStates(); } /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Handle events manually to catch keyboard inputting. diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index 596a770ab2..536ce5d671 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -82,8 +82,7 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) { for (size_t i = 0; i < it->second.size(); ++i) { - it->second[i]->HandleMessage(SGUIMessage(GUIM_PRESSED)); - it->second[i]->ScriptEvent("press"); + it->second[i]->SendEvent(GUIM_PRESSED, "press"); } } } @@ -95,9 +94,10 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) // float-based environment. m_MousePos = CPos((float)ev->ev.motion.x, (float)ev->ev.motion.y); + SGUIMessage msg(GUIM_MOUSE_MOTION); GUI::RecurseObject(GUIRR_HIDDEN | GUIRR_GHOST, m_BaseObject, &IGUIObject::HandleMessage, - SGUIMessage(GUIM_MOUSE_MOTION)); + msg); } // Update m_MouseButtons. (BUTTONUP is handled later.) @@ -157,41 +157,28 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) if (pNearest) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_PRESS_LEFT)); - pNearest->ScriptEvent("mouseleftpress"); - - // Block event, so things on the map (behind the GUI) won't be pressed - ret = IN_HANDLED; + ret = pNearest->SendEvent(GUIM_MOUSE_PRESS_LEFT, "mouseleftpress"); } break; case SDL_BUTTON_RIGHT: if (pNearest) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_PRESS_RIGHT)); - pNearest->ScriptEvent("mouserightpress"); - - ret = IN_HANDLED; + ret = pNearest->SendEvent(GUIM_MOUSE_PRESS_RIGHT, "mouserightpress"); } break; case SDL_BUTTON_WHEELDOWN: // wheel down if (pNearest) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_WHEEL_DOWN)); - pNearest->ScriptEvent("mousewheeldown"); - - ret = IN_HANDLED; + ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_DOWN, "mousewheeldown"); } break; case SDL_BUTTON_WHEELUP: // wheel up if (pNearest) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_WHEEL_UP)); - pNearest->ScriptEvent("mousewheelup"); - - ret = IN_HANDLED; + ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_UP, "mousewheelup"); } break; @@ -213,16 +200,12 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) //Double click? if (timeElapsed < SELECT_DBLCLICK_RATE) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_DBLCLICK_LEFT)); - pNearest->ScriptEvent("mouseleftdoubleclick"); + ret = pNearest->SendEvent(GUIM_MOUSE_DBLCLICK_LEFT, "mouseleftdoubleclick"); } else { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_RELEASE_LEFT)); - pNearest->ScriptEvent("mouseleftrelease"); + ret = pNearest->SendEvent(GUIM_MOUSE_RELEASE_LEFT, "mouseleftrelease"); } - - ret = IN_HANDLED; } break; case SDL_BUTTON_RIGHT: @@ -234,16 +217,12 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) //Double click? if (timeElapsed < SELECT_DBLCLICK_RATE) { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_DBLCLICK_RIGHT)); - //pNearest->ScriptEvent("mouserightdoubleclick"); + ret = pNearest->SendEvent(GUIM_MOUSE_DBLCLICK_RIGHT, "mouserightdoubleclick"); } else { - pNearest->HandleMessage(SGUIMessage(GUIM_MOUSE_RELEASE_RIGHT)); - //pNearest->ScriptEvent("mouserightrelease"); + ret = pNearest->SendEvent(GUIM_MOUSE_RELEASE_RIGHT, "mouserightrelease"); } - - ret = IN_HANDLED; } break; } @@ -264,14 +243,6 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) debug_warn(L"CGUI::HandleEvent error"); // TODO Gee: Handle } -// JW: what's the difference between mPress and mDown? what's the code below responsible for? -/* - // Generally if just mouse is clicked - if (m_pInput->mDown(NEMM_BUTTON1) && pNearest) - { - pNearest->HandleMessage(GUIM_MOUSE_DOWN_LEFT); - } -*/ // BUTTONUP's effect on m_MouseButtons is handled after // everything else, so that e.g. 'press' handlers (activated @@ -561,7 +532,8 @@ void CGUI::AddObject(IGUIObject* pObject) GUI<>::RecurseObject(0, pObject, &IGUIObject::UpdateCachedSize); // Loaded - GUI::RecurseObject(0, pObject, &IGUIObject::HandleMessage, SGUIMessage(GUIM_LOAD)); + SGUIMessage msg(GUIM_LOAD); + GUI::RecurseObject(0, pObject, &IGUIObject::HandleMessage, msg); } catch (PSERROR_GUI&) { @@ -619,12 +591,18 @@ void CGUI::SetFocusedObject(IGUIObject* pObject) return; if (m_FocusedObject) - m_FocusedObject->HandleMessage(SGUIMessage(GUIM_LOST_FOCUS)); + { + SGUIMessage msg(GUIM_LOST_FOCUS); + m_FocusedObject->HandleMessage(msg); + } m_FocusedObject = pObject; if (m_FocusedObject) - m_FocusedObject->HandleMessage(SGUIMessage(GUIM_GOT_FOCUS)); + { + SGUIMessage msg(GUIM_GOT_FOCUS); + m_FocusedObject->HandleMessage(msg); + } } // private struct used only in GenerateText(...) diff --git a/source/gui/CGUI.h b/source/gui/CGUI.h index 59cc7e86df..59f8b14bb4 100644 --- a/source/gui/CGUI.h +++ b/source/gui/CGUI.h @@ -125,7 +125,9 @@ public: void TickObjects(); /** - * Sends a specified event to every object + * Sends a specified script event to every object + * + * @param EventName String representation of event name */ void SendEventToAll(const CStr& EventName); diff --git a/source/gui/CGUIScrollBarVertical.cpp b/source/gui/CGUIScrollBarVertical.cpp index 8f260dc72b..f5f078bff1 100644 --- a/source/gui/CGUIScrollBarVertical.cpp +++ b/source/gui/CGUIScrollBarVertical.cpp @@ -130,7 +130,7 @@ void CGUIScrollBarVertical::Draw() } } -void CGUIScrollBarVertical::HandleMessage(const SGUIMessage &Message) +void CGUIScrollBarVertical::HandleMessage(SGUIMessage &Message) { IGUIScrollBar::HandleMessage(Message); } diff --git a/source/gui/CGUIScrollBarVertical.h b/source/gui/CGUIScrollBarVertical.h index d7b21678ce..49751a66b3 100644 --- a/source/gui/CGUIScrollBarVertical.h +++ b/source/gui/CGUIScrollBarVertical.h @@ -69,11 +69,9 @@ public: * them to the scroll-bar and it will see if the message regarded * itself. * - * @param Message SGUIMessage - * @return true if messages handled the scroll-bar some. False if - * the message should be processed by the object. + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Set m_Pos with g_mouse_x/y input, i.e. when draggin. diff --git a/source/gui/CInput.cpp b/source/gui/CInput.cpp index c29a69f80f..1e4f466db6 100644 --- a/source/gui/CInput.cpp +++ b/source/gui/CInput.cpp @@ -419,8 +419,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event_* ev) GUI::GetSetting(this, "multiline", multiline); if (!multiline) { - HandleMessage(GUIM_PRESSED); - ScriptEvent("press"); + SendEvent(GUIM_PRESSED, "press"); break; } @@ -466,7 +465,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event_* ev) return IN_PASS; } -void CInput::HandleMessage(const SGUIMessage &Message) +void CInput::HandleMessage(SGUIMessage &Message) { // TODO Gee: IGUIScrollBarOwner::HandleMessage(Message); @@ -590,19 +589,23 @@ void CInput::HandleMessage(const SGUIMessage &Message) break; case GUIM_MOUSE_WHEEL_DOWN: + { GetScrollBar(0).ScrollPlus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_MOUSE_WHEEL_UP: + { GetScrollBar(0).ScrollMinus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_LOAD: { GetScrollBar(0).SetX( m_CachedActualSize.right ); diff --git a/source/gui/CInput.h b/source/gui/CInput.h index 5e0895e3fe..eafcd7b73b 100644 --- a/source/gui/CInput.h +++ b/source/gui/CInput.h @@ -71,6 +71,9 @@ public: CInput(); virtual ~CInput(); + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { IGUIScrollBarOwner::ResetStates(); } // Check where the mouse is hovering, and get the appropriate text position. @@ -84,11 +87,9 @@ public: protected: /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Handle events manually to catch keyboard inputting. diff --git a/source/gui/CList.cpp b/source/gui/CList.cpp index e2e8b443d3..0e0aff04b5 100644 --- a/source/gui/CList.cpp +++ b/source/gui/CList.cpp @@ -146,7 +146,7 @@ void CList::SetupText() } } -void CList::HandleMessage(const SGUIMessage &Message) +void CList::HandleMessage(SGUIMessage &Message) { IGUIScrollBarOwner::HandleMessage(Message); //IGUITextOwner::HandleMessage(Message); <== placed it after the switch instead! @@ -227,19 +227,23 @@ void CList::HandleMessage(const SGUIMessage &Message) } break; case GUIM_MOUSE_WHEEL_DOWN: + { GetScrollBar(0).ScrollPlus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_MOUSE_WHEEL_UP: + { GetScrollBar(0).ScrollMinus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_LOAD: { CStr scrollbar_style; diff --git a/source/gui/CList.h b/source/gui/CList.h index efa9d25df1..4378313652 100644 --- a/source/gui/CList.h +++ b/source/gui/CList.h @@ -71,6 +71,9 @@ public: CList(); virtual ~CList(); + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { IGUIScrollBarOwner::ResetStates(); } /** @@ -86,11 +89,9 @@ protected: void SetupText(); /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Handle events manually to catch keyboard inputting. diff --git a/source/gui/CProgressBar.cpp b/source/gui/CProgressBar.cpp index 064ded4c2a..9176dd4039 100644 --- a/source/gui/CProgressBar.cpp +++ b/source/gui/CProgressBar.cpp @@ -42,7 +42,7 @@ CProgressBar::~CProgressBar() { } -void CProgressBar::HandleMessage(const SGUIMessage &Message) +void CProgressBar::HandleMessage(SGUIMessage &Message) { // Important IGUIObject::HandleMessage(Message); diff --git a/source/gui/CProgressBar.h b/source/gui/CProgressBar.h index 3572e6b0c3..1bbdff3945 100644 --- a/source/gui/CProgressBar.h +++ b/source/gui/CProgressBar.h @@ -68,7 +68,10 @@ protected: virtual void Draw(); // If caption is set, make sure it's within the interval 0-100 - void HandleMessage(const SGUIMessage &Message); + /** + * @see IGUIObject#HandleMessage() + */ + void HandleMessage(SGUIMessage &Message); }; #endif diff --git a/source/gui/CRadioButton.cpp b/source/gui/CRadioButton.cpp index 720f024f5d..4e60adc7df 100644 --- a/source/gui/CRadioButton.cpp +++ b/source/gui/CRadioButton.cpp @@ -24,7 +24,7 @@ CCheckBox #include "CRadioButton.h" -void CRadioButton::HandleMessage(const SGUIMessage &Message) +void CRadioButton::HandleMessage(SGUIMessage &Message) { // Important IGUIButtonBehavior::HandleMessage(Message); diff --git a/source/gui/CRadioButton.h b/source/gui/CRadioButton.h index 031c2518f8..9b17cacd6d 100644 --- a/source/gui/CRadioButton.h +++ b/source/gui/CRadioButton.h @@ -49,11 +49,9 @@ class CRadioButton : public CCheckBox public: /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); }; #endif diff --git a/source/gui/CText.cpp b/source/gui/CText.cpp index 783fbbcc75..b33cba24f2 100644 --- a/source/gui/CText.cpp +++ b/source/gui/CText.cpp @@ -127,7 +127,7 @@ void CText::SetupText() } } -void CText::HandleMessage(const SGUIMessage &Message) +void CText::HandleMessage(SGUIMessage &Message) { IGUIScrollBarOwner::HandleMessage(Message); //IGUITextOwner::HandleMessage(Message); <== placed it after the switch instead! @@ -154,19 +154,23 @@ void CText::HandleMessage(const SGUIMessage &Message) break; case GUIM_MOUSE_WHEEL_DOWN: + { GetScrollBar(0).ScrollPlus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_MOUSE_WHEEL_UP: + { GetScrollBar(0).ScrollMinus(); // Since the scroll was changed, let's simulate a mouse movement // to check if scrollbar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); break; - + } case GUIM_LOAD: { GetScrollBar(0).SetX( m_CachedActualSize.right ); diff --git a/source/gui/CText.h b/source/gui/CText.h index 82809f98a2..455cb09aa8 100644 --- a/source/gui/CText.h +++ b/source/gui/CText.h @@ -64,6 +64,9 @@ public: CText(); virtual ~CText(); + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { IGUIScrollBarOwner::ResetStates(); } /** @@ -79,11 +82,9 @@ protected: void SetupText(); /** - * Handle Messages - * - * @param Message GUI Message + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * Draws the Text diff --git a/source/gui/CTooltip.cpp b/source/gui/CTooltip.cpp index f5a0195cf3..3a8c0983c1 100644 --- a/source/gui/CTooltip.cpp +++ b/source/gui/CTooltip.cpp @@ -133,7 +133,7 @@ void CTooltip::SetupText() GUI::SetSetting(this, "size", size); } -void CTooltip::HandleMessage(const SGUIMessage &Message) +void CTooltip::HandleMessage(SGUIMessage &Message) { IGUITextOwner::HandleMessage(Message); } diff --git a/source/gui/CTooltip.h b/source/gui/CTooltip.h index d53885357b..6485ee8335 100644 --- a/source/gui/CTooltip.h +++ b/source/gui/CTooltip.h @@ -40,7 +40,10 @@ public: protected: void SetupText(); - virtual void HandleMessage(const SGUIMessage &Message); + /** + * @see IGUIObject#HandleMessage() + */ + virtual void HandleMessage(SGUIMessage &Message); virtual void Draw(); }; diff --git a/source/gui/GUITooltip.cpp b/source/gui/GUITooltip.cpp index bac3ca4000..6802e20714 100644 --- a/source/gui/GUITooltip.cpp +++ b/source/gui/GUITooltip.cpp @@ -203,7 +203,8 @@ void GUITooltip::ShowTooltip(IGUIObject* obj, CPos pos, const CStr& style, CGUI* debug_warn(L"Failed to set tooltip caption"); // shouldn't fail // Make the tooltip object regenerate its text - usedobj->HandleMessage(SGUIMessage(GUIM_SETTINGS_UPDATED, "caption")); + SGUIMessage msg(GUIM_SETTINGS_UPDATED, "caption"); + usedobj->HandleMessage(msg); } void GUITooltip::HideTooltip(const CStr& style, CGUI* gui) @@ -232,8 +233,8 @@ void GUITooltip::HideTooltip(const CStr& style, CGUI* gui) // Clear the caption usedobj->SetSetting("caption", L""); - usedobj->HandleMessage(SGUIMessage(GUIM_SETTINGS_UPDATED, "caption")); - + SGUIMessage msg(GUIM_SETTINGS_UPDATED, "caption"); + usedobj->HandleMessage(msg); bool hideobject = true; GUI::GetSetting(tooltipobj, "hide_object", hideobject); diff --git a/source/gui/GUIbase.h b/source/gui/GUIbase.h index 65af921251..9ffa318b29 100644 --- a/source/gui/GUIbase.h +++ b/source/gui/GUIbase.h @@ -102,8 +102,16 @@ enum EGUIMessageType */ struct SGUIMessage { - SGUIMessage(EGUIMessageType _type) : type(_type) {} - SGUIMessage(EGUIMessageType _type, const CStr& _value) : type(_type), value(_value) {} + SGUIMessage(EGUIMessageType _type) : type(_type), skipped(false) {} + SGUIMessage(EGUIMessageType _type, const CStr& _value) : type(_type), value(_value), skipped(false) {} + + /** + * This method can be used to allow other event handlers to process this GUI event, + * by default an event is not skipped (only the first handler will process it). + * + * @param skip true to allow further event handling, false to prevent it + */ + void Skip(bool skip = true) { skipped = skip; } /** * Describes what the message regards @@ -114,6 +122,11 @@ struct SGUIMessage * Optional data */ CStr value; + + /** + * Flag that specifies if object skipped handling the event + */ + bool skipped; }; /** diff --git a/source/gui/GUIutil.cpp b/source/gui/GUIutil.cpp index 72b55c23ed..220e6262f1 100644 --- a/source/gui/GUIutil.cpp +++ b/source/gui/GUIutil.cpp @@ -280,9 +280,9 @@ void CInternalCGUIAccessorBase::QueryResetting(IGUIObject *pObject) GUI<>::RecurseObject(0, pObject, &IGUIObject::ResetStates); } -void CInternalCGUIAccessorBase::HandleMessage(IGUIObject *pObject, const SGUIMessage &message) +void CInternalCGUIAccessorBase::HandleMessage(IGUIObject *pObject, SGUIMessage &message) { - pObject->HandleMessage(message); + pObject->HandleMessage(message); } @@ -393,7 +393,10 @@ PSRETURN GUI::SetSetting(IGUIObject *pObject, const CStr& Setting, } if (!SkipMessage) - HandleMessage(pObject, SGUIMessage(GUIM_SETTINGS_UPDATED, Setting)); + { + SGUIMessage msg(GUIM_SETTINGS_UPDATED, Setting); + HandleMessage(pObject, msg); + } return PSRETURN_OK; } diff --git a/source/gui/GUIutil.h b/source/gui/GUIutil.h index c78b18b262..24279f6ceb 100644 --- a/source/gui/GUIutil.h +++ b/source/gui/GUIutil.h @@ -83,7 +83,7 @@ protected: /// Wrapper for ResetStates static void QueryResetting(IGUIObject *pObject); - static void HandleMessage(IGUIObject *pObject, const SGUIMessage &message); + static void HandleMessage(IGUIObject *pObject, SGUIMessage &message); }; diff --git a/source/gui/IGUIButtonBehavior.cpp b/source/gui/IGUIButtonBehavior.cpp index 5bef9f793c..f0ce0775d3 100644 --- a/source/gui/IGUIButtonBehavior.cpp +++ b/source/gui/IGUIButtonBehavior.cpp @@ -34,7 +34,7 @@ IGUIButtonBehavior::~IGUIButtonBehavior() { } -void IGUIButtonBehavior::HandleMessage(const SGUIMessage &Message) +void IGUIButtonBehavior::HandleMessage(SGUIMessage &Message) { // TODO Gee: easier access functions switch (Message.type) @@ -63,8 +63,7 @@ void IGUIButtonBehavior::HandleMessage(const SGUIMessage &Message) { m_Pressed = false; // BUTTON WAS CLICKED - HandleMessage(GUIM_PRESSED); - ScriptEvent("press"); + SendEvent(GUIM_PRESSED, "press"); } } break; diff --git a/source/gui/IGUIButtonBehavior.h b/source/gui/IGUIButtonBehavior.h index 2b0b557096..be6122890e 100644 --- a/source/gui/IGUIButtonBehavior.h +++ b/source/gui/IGUIButtonBehavior.h @@ -70,7 +70,7 @@ public: /** * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * This is a function that lets a button being drawn, @@ -98,12 +98,18 @@ public: int cell_id); /** - * Choosing which color of the following according to + * Choosing which color of the following according to object enabled/hovered/pressed status: + * textcolor_disabled -- disabled + * textcolor_pressed -- pressed + * textcolor_over -- hovered */ CColor ChooseColor(); protected: + /** + * @see IGUIObject#ResetStates() + */ virtual void ResetStates() { m_MouseHovering = false; diff --git a/source/gui/IGUIObject.cpp b/source/gui/IGUIObject.cpp index bf94d9cdc8..97e4b62ab6 100644 --- a/source/gui/IGUIObject.cpp +++ b/source/gui/IGUIObject.cpp @@ -217,24 +217,21 @@ void IGUIObject::UpdateMouseOver(IGUIObject * const &pMouseOver) if (!m_MouseHovering) { // It wasn't hovering, so that must mean it just entered - HandleMessage(GUIM_MOUSE_ENTER); - ScriptEvent("mouseenter"); + SendEvent(GUIM_MOUSE_ENTER, "mouseenter"); } // Either way, set to true m_MouseHovering = true; // call mouse over - HandleMessage(GUIM_MOUSE_OVER); - ScriptEvent("mousemove"); + SendEvent(GUIM_MOUSE_OVER, "mousemove"); } else // Some other object (or none) is hovered { if (m_MouseHovering) { m_MouseHovering = false; - HandleMessage(GUIM_MOUSE_LEAVE); - ScriptEvent("mouseleave"); + SendEvent(GUIM_MOUSE_LEAVE, "mouseleave"); } } } @@ -453,8 +450,7 @@ void IGUIObject::CheckSettingsValidity() try { // Send message to itself - HandleMessage(GUIM_SETTINGS_UPDATED); - ScriptEvent("update"); + SendEvent(GUIM_SETTINGS_UPDATED, "update"); } catch (PSERROR_GUI&) { @@ -497,6 +493,16 @@ void IGUIObject::SetScriptHandler(const CStr& Action, JSObject* Function) m_ScriptHandlers[Action] = obj; } +InReaction IGUIObject::SendEvent(EGUIMessageType type, const CStr& EventName) +{ + SGUIMessage msg(type); + HandleMessage(msg); + + ScriptEvent(EventName); + + return (msg.skipped ? IN_PASS : IN_HANDLED); +} + void IGUIObject::ScriptEvent(const CStr& Action) { std::map::iterator it = m_ScriptHandlers.find(Action); diff --git a/source/gui/IGUIObject.h b/source/gui/IGUIObject.h index 24ce4afabf..22b5413853 100644 --- a/source/gui/IGUIObject.h +++ b/source/gui/IGUIObject.h @@ -332,7 +332,7 @@ public: * * @param Message GUI Message */ - virtual void HandleMessage(const SGUIMessage& UNUSED(Message)) {} + virtual void HandleMessage(SGUIMessage& UNUSED(Message)) {} protected: /** @@ -383,9 +383,14 @@ protected: void SetGUI(CGUI * const &pGUI) { m_pGUI = pGUI; } - // Set parent + /** + * Set parent of this object + */ void SetParent(IGUIObject *pParent) { m_pParent = pParent; } + /** + * Reset internal state of this object + */ virtual void ResetStates() { m_MouseHovering = false; @@ -440,6 +445,15 @@ protected: */ CRect m_CachedActualSize; + /** + * Send event to this GUI object (HandleMessage and ScriptEvent) + * + * @param type Type of GUI message to be handled + * @param EventName String representation of event name + * @return IN_HANDLED if event was handled, or IN_PASS if skipped + */ + InReaction SendEvent(EGUIMessageType type, const CStr& EventName); + /** * Execute the script for a particular action. * Does nothing if no script has been registered for that action. diff --git a/source/gui/IGUIScrollBar.cpp b/source/gui/IGUIScrollBar.cpp index 128328b166..4c7d489d27 100644 --- a/source/gui/IGUIScrollBar.cpp +++ b/source/gui/IGUIScrollBar.cpp @@ -76,7 +76,7 @@ void IGUIScrollBar::UpdatePosBoundaries() m_Pos = m_ScrollRange - m_ScrollSpace; } -void IGUIScrollBar::HandleMessage(const SGUIMessage &Message) +void IGUIScrollBar::HandleMessage(SGUIMessage &Message) { switch (Message.type) { @@ -150,7 +150,8 @@ void IGUIScrollBar::HandleMessage(const SGUIMessage &Message) ScrollPlusPlenty(); // Simulate mouse movement to see if bar now is hovered - HandleMessage(SGUIMessage(GUIM_MOUSE_MOTION)); + SGUIMessage msg(GUIM_MOUSE_MOTION); + HandleMessage(msg); } } } break; diff --git a/source/gui/IGUIScrollBar.h b/source/gui/IGUIScrollBar.h index 5985ecadd1..a99a3f3810 100644 --- a/source/gui/IGUIScrollBar.h +++ b/source/gui/IGUIScrollBar.h @@ -163,11 +163,9 @@ public: * them to the scroll-bar and it will see if the message regarded * itself. * - * @param Message SGUIMessage - * @return true if messages handled the scroll-bar some. False if - * the message should be processed by the object. + * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message)=0; + virtual void HandleMessage(SGUIMessage &Message)=0; /** * Set m_Pos with g_mouse_x/y input, i.e. when draggin. diff --git a/source/gui/IGUIScrollBarOwner.cpp b/source/gui/IGUIScrollBarOwner.cpp index 5511d4a7d7..9117147980 100644 --- a/source/gui/IGUIScrollBarOwner.cpp +++ b/source/gui/IGUIScrollBarOwner.cpp @@ -76,7 +76,7 @@ const SGUIScrollBarStyle * IGUIScrollBarOwner::GetScrollBarStyle(const CStr& sty return &it->second; } -void IGUIScrollBarOwner::HandleMessage(const SGUIMessage &Message) +void IGUIScrollBarOwner::HandleMessage(SGUIMessage &Message) { std::vector::iterator it; for (it=m_ScrollBars.begin(); it!=m_ScrollBars.end(); ++it) diff --git a/source/gui/IGUIScrollBarOwner.h b/source/gui/IGUIScrollBarOwner.h index de8ea4951d..3e09f8668c 100644 --- a/source/gui/IGUIScrollBarOwner.h +++ b/source/gui/IGUIScrollBarOwner.h @@ -71,10 +71,10 @@ public: /** * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** - * + * @see IGUIObject#ResetStates() */ virtual void ResetStates(); diff --git a/source/gui/IGUITextOwner.cpp b/source/gui/IGUITextOwner.cpp index 90137faabd..6244b92112 100644 --- a/source/gui/IGUITextOwner.cpp +++ b/source/gui/IGUITextOwner.cpp @@ -45,7 +45,7 @@ void IGUITextOwner::AddText(SGUIText * text) m_GeneratedTexts.push_back(text); } -void IGUITextOwner::HandleMessage(const SGUIMessage &Message) +void IGUITextOwner::HandleMessage(SGUIMessage &Message) { switch (Message.type) { diff --git a/source/gui/IGUITextOwner.h b/source/gui/IGUITextOwner.h index 6347a44791..35234e6bf2 100644 --- a/source/gui/IGUITextOwner.h +++ b/source/gui/IGUITextOwner.h @@ -71,7 +71,7 @@ public: /** * @see IGUIObject#HandleMessage() */ - virtual void HandleMessage(const SGUIMessage &Message); + virtual void HandleMessage(SGUIMessage &Message); /** * @see IGUIObject#UpdateCachedSize() diff --git a/source/gui/MiniMap.cpp b/source/gui/MiniMap.cpp index 5c1bb722b4..63b779e7ff 100644 --- a/source/gui/MiniMap.cpp +++ b/source/gui/MiniMap.cpp @@ -66,7 +66,7 @@ CMiniMap::~CMiniMap() Destroy(); } -void CMiniMap::HandleMessage(const SGUIMessage &Message) +void CMiniMap::HandleMessage(SGUIMessage &Message) { switch(Message.type) { @@ -91,7 +91,9 @@ void CMiniMap::HandleMessage(const SGUIMessage &Message) case GUIM_MOUSE_DBLCLICK_LEFT: { if(m_Hovering && m_Clicking) + { SetCameraPos(); + } m_Clicking = false; break; } @@ -102,6 +104,7 @@ void CMiniMap::HandleMessage(const SGUIMessage &Message) } case GUIM_MOUSE_LEAVE: { + m_Clicking = false; m_Hovering = false; break; } @@ -118,9 +121,15 @@ void CMiniMap::HandleMessage(const SGUIMessage &Message) case GUIM_MOUSE_MOTION: { if (m_Hovering && m_Clicking) + { SetCameraPos(); + } break; } + case GUIM_MOUSE_WHEEL_DOWN: + case GUIM_MOUSE_WHEEL_UP: + Message.Skip(); + break; default: break; diff --git a/source/gui/MiniMap.h b/source/gui/MiniMap.h index a915011ba6..74711ac012 100644 --- a/source/gui/MiniMap.h +++ b/source/gui/MiniMap.h @@ -32,7 +32,10 @@ public: protected: virtual void Draw(); - virtual void HandleMessage(const SGUIMessage &Message); + /** + * @see IGUIObject#HandleMessage() + */ + virtual void HandleMessage(SGUIMessage &Message); // create the minimap textures void CreateTextures();