diff --git a/source/gui/CDropDown.cpp b/source/gui/CDropDown.cpp index fc0e7fd5cc..aa3795987c 100644 --- a/source/gui/CDropDown.cpp +++ b/source/gui/CDropDown.cpp @@ -19,6 +19,7 @@ #include "CDropDown.h" +#include "gui/CGUI.h" #include "gui/CGUIColor.h" #include "lib/external_libraries/libsdl.h" #include "lib/ogl.h" diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index f0c317b30c..74d72b6dc1 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -20,7 +20,7 @@ #include #include -#include "GUI.h" +#include "CGUI.h" // Types - when including them into the engine. #include "CButton.h" @@ -102,7 +102,7 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) m_MousePos = CPos((float)ev->ev.motion.x / g_GuiScale, (float)ev->ev.motion.y / g_GuiScale); SGUIMessage msg(GUIM_MOUSE_MOTION); - m_BaseObject->RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::HandleMessage, msg); + m_BaseObject.RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::HandleMessage, msg); } // Update m_MouseButtons. (BUTTONUP is handled later.) @@ -143,7 +143,7 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) // Now we'll call UpdateMouseOver on *all* objects, // we'll input the one hovered, and they will each // update their own data and send messages accordingly - m_BaseObject->RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::UpdateMouseOver, static_cast(pNearest)); + m_BaseObject.RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::UpdateMouseOver, static_cast(pNearest)); if (ev->ev.type == SDL_MOUSEBUTTONDOWN) { @@ -204,10 +204,10 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) } // Reset all states on all visible objects - m_BaseObject->RecurseObject(&IGUIObject::IsHidden, &IGUIObject::ResetStates); + m_BaseObject.RecurseObject(&IGUIObject::IsHidden, &IGUIObject::ResetStates); // Since the hover state will have been reset, we reload it. - m_BaseObject->RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::UpdateMouseOver, static_cast(pNearest)); + m_BaseObject.RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::UpdateMouseOver, static_cast(pNearest)); } } catch (PSERROR_GUI& e) @@ -260,7 +260,7 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) void CGUI::TickObjects() { const CStr action = "tick"; - m_BaseObject->RecurseObject(nullptr, &IGUIObject::ScriptEvent, action); + m_BaseObject.RecurseObject(nullptr, &IGUIObject::ScriptEvent, action); m_Tooltip.Update(FindObjectUnderMouse(), m_MousePos, *this); } @@ -275,33 +275,28 @@ void CGUI::SendEventToAll(const CStr& EventName) // leading to a similar problem. // now fixed; case is irrelevant since all are converted to lower. const CStr EventNameLower = EventName.LowerCase(); - m_BaseObject->RecurseObject(nullptr, &IGUIObject::ScriptEvent, EventNameLower); + m_BaseObject.RecurseObject(nullptr, &IGUIObject::ScriptEvent, EventNameLower); } void CGUI::SendEventToAll(const CStr& EventName, const JS::HandleValueArray& paramData) { const CStr EventNameLower = EventName.LowerCase(); - m_BaseObject->RecurseObject(nullptr, &IGUIObject::ScriptEvent, EventNameLower, paramData); + m_BaseObject.RecurseObject(nullptr, &IGUIObject::ScriptEvent, EventNameLower, paramData); } CGUI::CGUI(const shared_ptr& runtime) - : m_MouseButtons(0), m_FocusedObject(NULL), m_InternalNameNumber(0) + : m_MouseButtons(0), m_FocusedObject(nullptr), m_InternalNameNumber(0), m_BaseObject(*this) { m_ScriptInterface.reset(new ScriptInterface("Engine", "GUIPage", runtime)); m_ScriptInterface->SetCallbackData(this); GuiScriptingInit(*m_ScriptInterface); m_ScriptInterface->LoadGlobalScripts(); - - m_BaseObject = new CGUIDummyObject(*this); } CGUI::~CGUI() { Destroy(); - - if (m_BaseObject) - delete m_BaseObject; } IGUIObject* CGUI::ConstructObject(const CStr& str) @@ -343,7 +338,7 @@ void CGUI::Draw() try { - m_BaseObject->RecurseObject(&IGUIObject::IsHidden, &IGUIObject::Draw); + m_BaseObject.RecurseObject(&IGUIObject::IsHidden, &IGUIObject::Draw); } catch (PSERROR_GUI& e) { @@ -392,14 +387,14 @@ void CGUI::Destroy() void CGUI::UpdateResolution() { // Update ALL cached - m_BaseObject->RecurseObject(nullptr, &IGUIObject::UpdateCachedSize); + m_BaseObject.RecurseObject(nullptr, &IGUIObject::UpdateCachedSize); } void CGUI::AddObject(IGUIObject* pObject) { try { - m_BaseObject->AddChild(pObject); + m_BaseObject.AddChild(pObject); // Cache tree pObject->RecurseObject(nullptr, &IGUIObject::UpdateCachedSize); @@ -421,7 +416,7 @@ void CGUI::UpdateObjects() try { // Fill freshly - m_BaseObject->RecurseObject(nullptr, &IGUIObject::AddToPointersMap, AllObjects); + m_BaseObject.RecurseObject(nullptr, &IGUIObject::AddToPointersMap, AllObjects); } catch (PSERROR_GUI&) { @@ -446,10 +441,10 @@ IGUIObject* CGUI::FindObjectByName(const CStr& Name) const return it->second; } -IGUIObject* CGUI::FindObjectUnderMouse() const +IGUIObject* CGUI::FindObjectUnderMouse() { IGUIObject* pNearest = NULL; - m_BaseObject->RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::ChooseMouseOverAndClosest, pNearest); + m_BaseObject.RecurseObject(&IGUIObject::IsHiddenOrGhost, &IGUIObject::ChooseMouseOverAndClosest, pNearest); return pNearest; } @@ -588,7 +583,7 @@ void CGUI::Xeromyces_ReadRootObjects(XMBElement Element, CXeromyces* pFile, boos Xeromyces_ReadScript(child, pFile, Paths); else // Read in this whole object into the GUI - Xeromyces_ReadObject(child, pFile, m_BaseObject, subst, Paths, 0); + Xeromyces_ReadObject(child, pFile, &m_BaseObject, subst, Paths, 0); } } @@ -917,7 +912,7 @@ void CGUI::Xeromyces_ReadObject(XMBElement Element, CXeromyces* pFile, IGUIObjec try { - if (pParent == m_BaseObject) + if (pParent == &m_BaseObject) AddObject(object); else pParent->AddChild(object); diff --git a/source/gui/CGUI.h b/source/gui/CGUI.h index dbfe39163e..0f29f31f52 100644 --- a/source/gui/CGUI.h +++ b/source/gui/CGUI.h @@ -23,9 +23,9 @@ #ifndef INCLUDED_CGUI #define INCLUDED_CGUI -#include "GUITooltip.h" -#include "GUIbase.h" - +#include "gui/GUITooltip.h" +#include "gui/GUIbase.h" +#include "gui/CGUIDummyObject.h" #include "lib/input.h" #include "ps/Shapes.h" #include "ps/XML/Xeromyces.h" @@ -50,8 +50,6 @@ struct SGUIStyle std::map m_SettingsDefaults; }; -class JSObject; // The GUI stores a JSObject*, so needs to know that JSObject exists -class IGUIObject; class CGUISpriteInstance; struct CGUIColor; class CGUIText; @@ -60,7 +58,6 @@ class CGUIString; class CGUISprite; struct SGUIImageEffects; struct SGUIScrollBarStyle; -class GUITooltip; /** * The main object that represents a whole GUI page. @@ -162,7 +159,7 @@ public: /** * Return the object which is an ancestor of every other GUI object. */ - IGUIObject* GetBaseObject() const { return m_BaseObject; }; + CGUIDummyObject& GetBaseObject() { return m_BaseObject; }; /** * Checks if object exists and return true or false accordingly @@ -184,7 +181,7 @@ public: /** * Returns the GUI object under the mouse, or NULL if none. */ - IGUIObject* FindObjectUnderMouse() const; + IGUIObject* FindObjectUnderMouse(); /** * Returns the current screen coordinates of the cursor. @@ -600,7 +597,7 @@ private: * Base Object, all its children are considered parentless * because this is not a real object per se. */ - IGUIObject* m_BaseObject; + CGUIDummyObject m_BaseObject; /** * Focused object! diff --git a/source/gui/CGUIDummyObject.h b/source/gui/CGUIDummyObject.h new file mode 100644 index 0000000000..2574e51f37 --- /dev/null +++ b/source/gui/CGUIDummyObject.h @@ -0,0 +1,49 @@ +/* Copyright (C) 2019 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +/* + * This is the top class of the whole GUI, all objects + * and settings are stored within this class. + */ + +#ifndef INCLUDED_CGUIDUMMYOBJECT +#define INCLUDED_CGUIDUMMYOBJECT + +#include "gui/IGUIObject.h" + +/** + * Dummy object are used for the base object and objects of type "empty". + */ +class CGUIDummyObject : public IGUIObject +{ + GUI_OBJECT(CGUIDummyObject) + +public: + CGUIDummyObject(CGUI& pGUI) : IGUIObject(pGUI) {} + + virtual void Draw() {} + + /** + * Empty can never be hovered. It is only a category. + */ + virtual bool IsMouseOver() const + { + return false; + } +}; + +#endif // INCLUDED_CGUIDUMMYOBJECT diff --git a/source/gui/CGUIScrollBarVertical.cpp b/source/gui/CGUIScrollBarVertical.cpp index be55cb9538..2d3a8ef6c1 100644 --- a/source/gui/CGUIScrollBarVertical.cpp +++ b/source/gui/CGUIScrollBarVertical.cpp @@ -20,6 +20,7 @@ #include "CGUIScrollBarVertical.h" #include "GUI.h" +#include "CGUI.h" #include "ps/CLogger.h" diff --git a/source/gui/CGUISetting.cpp b/source/gui/CGUISetting.cpp index 3ff8af9754..ebafe75027 100644 --- a/source/gui/CGUISetting.cpp +++ b/source/gui/CGUISetting.cpp @@ -19,6 +19,7 @@ #include "CGUISetting.h" +#include "gui/CGUI.h" #include "gui/GUI.h" template diff --git a/source/gui/CGUIString.cpp b/source/gui/CGUIString.cpp index 2ed45e44e2..04941a6dfc 100644 --- a/source/gui/CGUIString.cpp +++ b/source/gui/CGUIString.cpp @@ -20,6 +20,7 @@ #include "CGUIString.h" #include "graphics/FontMetrics.h" +#include "gui/CGUI.h" #include "gui/GUI.h" #include "lib/utf8.h" #include "ps/CLogger.h" diff --git a/source/gui/CGUIText.cpp b/source/gui/CGUIText.cpp index a5316f3578..999ad4fa3d 100644 --- a/source/gui/CGUIText.cpp +++ b/source/gui/CGUIText.cpp @@ -19,6 +19,7 @@ #include "CGUIText.h" +#include "gui/CGUI.h" #include "gui/CGUIString.h" #include "gui/IGUIObject.h" #include "graphics/FontMetrics.h" diff --git a/source/gui/CImage.cpp b/source/gui/CImage.cpp index bdb09eedb8..5c0adfe752 100644 --- a/source/gui/CImage.cpp +++ b/source/gui/CImage.cpp @@ -19,8 +19,8 @@ #include "CImage.h" -#include "GUI.h" - +#include "gui/CGUI.h" +#include "gui/GUI.h" #include "lib/ogl.h" CImage::CImage(CGUI& pGUI) diff --git a/source/gui/CInput.cpp b/source/gui/CInput.cpp index 0f6ded2719..8e16ea583e 100644 --- a/source/gui/CInput.cpp +++ b/source/gui/CInput.cpp @@ -19,6 +19,7 @@ #include "CInput.h" +#include "gui/CGUI.h" #include "gui/CGUIScrollBarVertical.h" #include "gui/GUI.h" #include "graphics/FontMetrics.h" diff --git a/source/gui/CList.cpp b/source/gui/CList.cpp index 46deb21ebf..32af716a55 100644 --- a/source/gui/CList.cpp +++ b/source/gui/CList.cpp @@ -19,6 +19,7 @@ #include "CList.h" +#include "gui/CGUI.h" #include "gui/CGUIColor.h" #include "gui/CGUIScrollBarVertical.h" #include "lib/external_libraries/libsdl.h" diff --git a/source/gui/COList.cpp b/source/gui/COList.cpp index d74aa71395..5397b41f23 100644 --- a/source/gui/COList.cpp +++ b/source/gui/COList.cpp @@ -19,6 +19,7 @@ #include "COList.h" +#include "gui/CGUI.h" #include "gui/CGUIColor.h" #include "i18n/L10n.h" #include "ps/CLogger.h" diff --git a/source/gui/CProgressBar.cpp b/source/gui/CProgressBar.cpp index 4d77cc1b3a..3abc90adda 100644 --- a/source/gui/CProgressBar.cpp +++ b/source/gui/CProgressBar.cpp @@ -17,9 +17,10 @@ #include "precompiled.h" -#include "GUI.h" #include "CProgressBar.h" +#include "gui/CGUI.h" +#include "gui/GUI.h" #include "lib/ogl.h" CProgressBar::CProgressBar(CGUI& pGUI) diff --git a/source/gui/CSlider.cpp b/source/gui/CSlider.cpp index 79bdc620aa..4b4a718330 100644 --- a/source/gui/CSlider.cpp +++ b/source/gui/CSlider.cpp @@ -16,8 +16,11 @@ */ #include "precompiled.h" + #include "CSlider.h" -#include "GUI.h" + +#include "gui/CGUI.h" +#include "gui/GUI.h" #include "lib/ogl.h" CSlider::CSlider(CGUI& pGUI) diff --git a/source/gui/CText.cpp b/source/gui/CText.cpp index 0d70d66ba9..bff95cf8f4 100644 --- a/source/gui/CText.cpp +++ b/source/gui/CText.cpp @@ -19,6 +19,7 @@ #include "CText.h" +#include "gui/CGUI.h" #include "gui/CGUIScrollBarVertical.h" #include "gui/GUI.h" #include "lib/ogl.h" diff --git a/source/gui/IGUIButtonBehavior.cpp b/source/gui/IGUIButtonBehavior.cpp index 4fe38061f5..cb75ff1877 100644 --- a/source/gui/IGUIButtonBehavior.cpp +++ b/source/gui/IGUIButtonBehavior.cpp @@ -19,6 +19,8 @@ #include "GUI.h" +#include "gui/CGUI.h" + IGUIButtonBehavior::IGUIButtonBehavior(CGUI& pGUI) : IGUIObject(pGUI), m_Pressed(false) { diff --git a/source/gui/IGUIObject.cpp b/source/gui/IGUIObject.cpp index b7442b8c18..6490924335 100644 --- a/source/gui/IGUIObject.cpp +++ b/source/gui/IGUIObject.cpp @@ -19,6 +19,7 @@ #include "GUI.h" +#include "gui/CGUI.h" #include "gui/CGUISetting.h" #include "gui/scripting/JSInterface_GUITypes.h" #include "gui/scripting/JSInterface_IGUIObject.h" @@ -516,9 +517,14 @@ bool IGUIObject::IsFocused() const return m_pGUI.GetFocusedObject() == this; } +bool IGUIObject::IsBaseObject() const +{ + return this == &m_pGUI.GetBaseObject(); +} + bool IGUIObject::IsRootObject() const { - return m_pParent == m_pGUI.GetBaseObject(); + return m_pParent == &m_pGUI.GetBaseObject(); } void IGUIObject::TraceMember(JSTracer* trc) diff --git a/source/gui/IGUIObject.h b/source/gui/IGUIObject.h index f829530c4c..f3b535b9e0 100644 --- a/source/gui/IGUIObject.h +++ b/source/gui/IGUIObject.h @@ -25,9 +25,6 @@ #ifndef INCLUDED_IGUIOBJECT #define INCLUDED_IGUIOBJECT -#include "IGUIObject.h" - -#include "gui/CGUI.h" #include "gui/GUIbase.h" #include "gui/scripting/JSInterface_IGUIObject.h" #include "lib/input.h" // just for IN_PASS @@ -268,7 +265,7 @@ public: template void RecurseObject(bool(IGUIObject::*isRestricted)() const, void(IGUIObject::*callbackFunction)(Args... args), Args&&... args) { - if (this != m_pGUI.GetBaseObject()) + if (!IsBaseObject()) { if (isRestricted && (this->*isRestricted)()) return; @@ -445,9 +442,14 @@ private: */ void ChooseMouseOverAndClosest(IGUIObject*& pObject); - // Is the object a Root object, in philosophy, this means it - // has got no parent, and technically, it's got the m_BaseObject - // as parent. + /** + * Returns whether this is the object all other objects are descendants of. + */ + bool IsBaseObject() const; + + /** + * Returns whether this object is a child of the base object. + */ bool IsRootObject() const; static void Trace(JSTracer* trc, void* data) @@ -512,21 +514,4 @@ protected: JS::PersistentRootedObject m_JSObject; }; - -/** - * Dummy object used primarily for the root object - * or objects of type 'empty' - */ -class CGUIDummyObject : public IGUIObject -{ - GUI_OBJECT(CGUIDummyObject) - -public: - CGUIDummyObject(CGUI& pGUI) : IGUIObject(pGUI) {} - - virtual void Draw() {} - // Empty can never be hovered. It is only a category. - virtual bool IsMouseOver() const { return false; } -}; - #endif // INCLUDED_IGUIOBJECT diff --git a/source/gui/IGUIScrollBar.cpp b/source/gui/IGUIScrollBar.cpp index b61065a4d1..9ea9fe5de6 100644 --- a/source/gui/IGUIScrollBar.cpp +++ b/source/gui/IGUIScrollBar.cpp @@ -18,6 +18,8 @@ #include "precompiled.h" #include "GUI.h" + +#include "gui/CGUI.h" #include "maths/MathUtil.h" IGUIScrollBar::IGUIScrollBar(CGUI& pGUI) diff --git a/source/gui/IGUIScrollBarOwner.cpp b/source/gui/IGUIScrollBarOwner.cpp index e3814829d2..7edf6a80d6 100644 --- a/source/gui/IGUIScrollBarOwner.cpp +++ b/source/gui/IGUIScrollBarOwner.cpp @@ -18,6 +18,7 @@ #include "precompiled.h" #include "GUI.h" +#include "gui/CGUI.h" IGUIScrollBarOwner::IGUIScrollBarOwner(CGUI& pGUI) : IGUIObject(pGUI) diff --git a/source/gui/IGUITextOwner.cpp b/source/gui/IGUITextOwner.cpp index bb0d348ec2..6be5d71cbf 100644 --- a/source/gui/IGUITextOwner.cpp +++ b/source/gui/IGUITextOwner.cpp @@ -20,6 +20,7 @@ #include "IGUITextOwner.h" #include "gui/GUI.h" +#include "gui/CGUI.h" #include "gui/scripting/JSInterface_IGUITextOwner.h" #include diff --git a/source/gui/MiniMap.cpp b/source/gui/MiniMap.cpp index 8e487cf6ba..0dc81ee976 100644 --- a/source/gui/MiniMap.cpp +++ b/source/gui/MiniMap.cpp @@ -28,6 +28,7 @@ #include "graphics/TerrainTextureEntry.h" #include "graphics/TerrainTextureManager.h" #include "graphics/TerritoryTexture.h" +#include "gui/CGUI.h" #include "gui/GUI.h" #include "gui/GUIManager.h" #include "gui/GUIMatrix.h" diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index 7e4b659163..418b691cce 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -35,6 +35,7 @@ #include "graphics/MapReader.h" #include "graphics/MaterialManager.h" #include "graphics/TerrainTextureManager.h" +#include "gui/CGUI.h" #include "gui/GUI.h" #include "gui/GUIManager.h" #include "i18n/L10n.h" diff --git a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp index 80b7385396..ecfe8e67a5 100644 --- a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp @@ -26,6 +26,7 @@ #include "graphics/GameView.h" #include "gui/GUIManager.h" #include "gui/GUI.h" +#include "gui/CGUI.h" #include "lib/external_libraries/libsdl.h" #include "lib/sysdep/cpu.h" #include "maths/MathUtil.h"