# HG changeset patch
# User koryspansel
# Date 1316114020 25200
# Node ID 51718795f0190bf66a91041107556991ee6b5a67
# Parent 33cb6979ac515d71ef7c4bb54a7bdc2713b9d3c9
Adding event handling & drag and drop to GuiInterface
diff -r 33cb6979ac51 -r 51718795f019 LightClone/LightClone.vcproj
--- a/LightClone/LightClone.vcproj Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/LightClone.vcproj Thu Sep 15 12:13:40 2011 -0700
@@ -245,10 +245,6 @@
>
-
-
@@ -395,10 +391,6 @@
>
-
-
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/ArrayList.h
--- a/LightClone/Source/ArrayList.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/ArrayList.h Thu Sep 15 12:13:40 2011 -0700
@@ -82,6 +82,27 @@
}
/*
+ * Remove
+ */
+ ErrorCode Remove(Type& kItem)
+ {
+ for(uint32 i = 0; i < nSize; ++i)
+ {
+ if(pList[i] == kItem)
+ {
+ --nSize;
+
+ for(; i < nSize; ++i)
+ pList[i] = pList[i + 1];
+
+ return Error_Success;
+ }
+ }
+
+ return Error_Fail;
+ }
+
+ /*
* Clear
*/
void Clear()
@@ -90,9 +111,9 @@
}
/*
- * GetSize
+ * Size
*/
- uint32 GetSize() const
+ uint32 Size() const
{
return nSize;
}
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/CodePanel.cpp
--- a/LightClone/Source/CodePanel.cpp Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/CodePanel.cpp Thu Sep 15 12:13:40 2011 -0700
@@ -17,7 +17,7 @@
*/
ErrorCode CodePanel::Initialize(ResourceManager* pResourceManager)
{
- ErrorCode eCode = GuiContainer::Initialize(pResourceManager);
+ ErrorCode eCode = GuiElement::Initialize(pResourceManager);
if(eCode == Error_Success)
{
for(uint32 i = 0; i < 4; ++i)
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/CodePanel.h
--- a/LightClone/Source/CodePanel.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/CodePanel.h Thu Sep 15 12:13:40 2011 -0700
@@ -6,13 +6,18 @@
#define __CODEPANEL_H__
#include "Core.h"
-#include "GuiContainer.h"
+#include "GuiImage.h"
/*
* CodePanel
*/
-class CodePanel : public GuiContainer
+class CodePanel : public GuiElement
{
+ /*
+ * pSlot
+ */
+ GuiImage** pSlot;
+
public:
/*
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/EventSystem.cpp
--- a/LightClone/Source/EventSystem.cpp Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/EventSystem.cpp Thu Sep 15 12:13:40 2011 -0700
@@ -48,7 +48,7 @@
*/
void EventSystem::Post(const Event& kEvent)
{
- for(uint32 i = 0; i < kSinks.GetSize(); ++i)
+ for(uint32 i = 0; i < kSinks.Size(); ++i)
{
if(kSinks[i]->ProcessEvent(kEvent) == EventResult_Stop)
{
@@ -62,7 +62,7 @@
*/
void EventSystem::Update(float fElapsed)
{
- for(uint32 i = 0; i < kSources.GetSize(); ++i)
+ for(uint32 i = 0; i < kSources.Size(); ++i)
{
kSources[i]->Update(this, fElapsed);
}
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiContainer.cpp
--- a/LightClone/Source/GuiContainer.cpp Wed Sep 14 17:24:49 2011 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
- * GuiContainer
- */
-
-#include "GuiContainer.h"
-
-/*
- * GuiContainer
- */
-GuiContainer::GuiContainer()
-{
-}
-
-/*
- * ~GuiContainer
- */
-GuiContainer::~GuiContainer()
-{
- for(uint32 i = 0; i < kChildren.GetSize(); ++i)
- {
- delete kChildren[i];
- }
-
- kChildren.Clear();
-}
-
-/*
- * Initialize
- */
-ErrorCode GuiContainer::Initialize(ResourceManager* pResourceManager)
-{
- ErrorCode eCode = Error_Success;
-
- for(uint32 i = 0; i < kChildren.GetSize() && eCode == Error_Success; ++i)
- {
- eCode = kChildren[i]->Initialize(pResourceManager);
- }
-
- return eCode;
-}
-
-/*
- * Terminate
- */
-void GuiContainer::Terminate()
-{
- for(uint32 i = 0; i < kChildren.GetSize(); ++i)
- {
- kChildren[i]->Terminate();
- }
-}
-
-/*
- * Update
- */
-void GuiContainer::Update(float fElapsed)
-{
- for(uint32 i = 0; i < kChildren.GetSize(); ++i)
- {
- kChildren[i]->Update(fElapsed);
- }
-
- Layout(kChildren);
-}
-
-/*
- * Render
- */
-void GuiContainer::Render(RenderContext& kContext, Camera& kCamera)
-{
- for(uint32 i = 0; i < kChildren.GetSize(); ++i)
- {
- kChildren[i]->Render(kContext, kCamera);
- }
-}
-
-/*
- * Pick
- */
-GuiElement* GuiContainer::Pick(float fX, float fY)
-{
- GuiElement* pElement = NULL;
-
- for(uint32 i = 0; i < kChildren.GetSize() && !pElement; ++i)
- {
- pElement = kChildren[i]->Pick(fX, fY);
- }
-
- return pElement;
-}
-
-/*
- * Add
- */
-ErrorCode GuiContainer::Add(GuiElement* pElement)
-{
- return kChildren.Add(pElement);
-}
-
-/*
- * Layout
- */
-void GuiContainer::Layout(GuiElementList& kElements)
-{
-}
\ No newline at end of file
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiContainer.h
--- a/LightClone/Source/GuiContainer.h Wed Sep 14 17:24:49 2011 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * GuiContainer
- */
-
-#ifndef __GUICONTAINER_H__
-#define __GUICONTAINER_H__
-
-#include "Core.h"
-#include "GuiElement.h"
-
-/*
- * GuiContainer
- */
-class GuiContainer : public GuiElement
-{
- /*
- * pChildren
- */
- GuiElementList kChildren;
-
-public:
-
- /*
- * GuiContainer
- */
- GuiContainer();
-
- /*
- * ~GuiContainer
- */
- ~GuiContainer();
-
- /*
- * Initialize
- */
- virtual ErrorCode Initialize(ResourceManager* pResourceManager);
-
- /*
- * Terminate
- */
- virtual void Terminate();
-
- /*
- * Update
- */
- virtual void Update(float fElapsed);
-
- /*
- * Render
- */
- virtual void Render(RenderContext& kContext, Camera& kCamera);
-
- /*
- * Pick
- */
- virtual GuiElement* Pick(float fX, float fY);
-
- /*
- * Add
- */
- ErrorCode Add(GuiElement* pElement);
-
-protected:
-
- /*
- * Layout
- */
- virtual void Layout(GuiElementList& kElements);
-};
-
-#endif //__GUICONTAINER_H__
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiElement.cpp
--- a/LightClone/Source/GuiElement.cpp Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/GuiElement.cpp Thu Sep 15 12:13:40 2011 -0700
@@ -19,6 +19,43 @@
}
/*
+ * Initialize
+ */
+ErrorCode GuiElement::Initialize(ResourceManager* pResourceManager)
+{
+ return Error_Success;
+}
+
+/*
+ * Terminate
+ */
+void GuiElement::Terminate()
+{
+}
+
+/*
+ * Update
+ */
+void GuiElement::Update(float fElapsed)
+{
+ for(uint32 i = 0; i < kChildren.Size(); ++i)
+ {
+ kChildren[i]->Update(fElapsed);
+ }
+}
+
+/*
+ * Render
+ */
+void GuiElement::Render(RenderContext& kContext, Camera& kCamera)
+{
+ for(uint32 i = 0; i < kChildren.Size(); ++i)
+ {
+ kChildren[i]->Render(kContext, kCamera);
+ }
+}
+
+/*
* Attach
*/
void GuiElement::Attach(GuiElement* pInstance)
@@ -103,3 +140,85 @@
return Rectangle2(kLocation.y, kLocation.y, kDimensions.x, kDimensions.y).Contains(fX, fY) ? this : NULL;
}
+
+/*
+ * Add
+ */
+ErrorCode GuiElement::Add(GuiElement* pElement)
+{
+ ErrorCode eCode = Error_Fail;
+
+ if(pElement)
+ {
+ eCode = kChildren.Add(pElement);
+ if(eCode == Error_Success)
+ {
+ pElement->Attach(this);
+ }
+ }
+
+ return eCode;
+}
+
+/*
+ * Remove
+ */
+ErrorCode GuiElement::Remove(GuiElement* pElement)
+{
+ ErrorCode eCode = Error_Fail;
+
+ if(pElement)
+ {
+ eCode = kChildren.Remove(pElement);
+ if(eCode == Error_Success)
+ {
+ pElement->Detach();
+ }
+ }
+
+ return eCode;
+}
+
+/*
+ * AllowDrag
+ */
+bool GuiElement::AllowDrag() const
+{
+ return false;
+}
+
+/*
+ * AllowDrop
+ */
+bool GuiElement::AllowDrop() const
+{
+ return false;
+}
+
+/*
+ * OnMouseDown
+ */
+void GuiElement::OnMouseDown(uint32 nButton, float fX, float fY)
+{
+}
+
+/*
+ * OnMouseUp
+ */
+void GuiElement::OnMouseUp(uint32 nButton, float fX, float fY)
+{
+}
+
+/*
+ * OnDrag
+ */
+void GuiElement::OnDrag(float fX, float fY)
+{
+}
+
+/*
+ * OnDrop
+ */
+void GuiElement::OnDrop(GuiElement* pSource, float fX, float fY)
+{
+}
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiElement.h
--- a/LightClone/Source/GuiElement.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/GuiElement.h Thu Sep 15 12:13:40 2011 -0700
@@ -16,6 +16,13 @@
*/
class GuiElement
{
+public:
+
+ /*
+ * List
+ */
+ typedef ArrayList List;
+
protected:
/*
@@ -33,6 +40,16 @@
*/
D3DXVECTOR2 kDimensions;
+ /*
+ * kColor
+ */
+ D3DCOLOR kColor;
+
+ /*
+ * kChildren
+ */
+ List kChildren;
+
public:
/*
@@ -48,22 +65,22 @@
/*
* Initialize
*/
- virtual ErrorCode Initialize(ResourceManager* pResourceManager) = 0;
+ virtual ErrorCode Initialize(ResourceManager* pResourceManager);
/*
* Terminate
*/
- virtual void Terminate() = 0;
+ virtual void Terminate();
/*
* Update
*/
- virtual void Update(float fElapsed) = 0;
+ virtual void Update(float fElapsed);
/*
* Render
*/
- virtual void Render(RenderContext& kContext, Camera& kCamera) = 0;
+ virtual void Render(RenderContext& kContext, Camera& kCamera);
/*
* Attach
@@ -114,11 +131,46 @@
* Pick
*/
virtual GuiElement* Pick(float fX, float fY);
+
+ /*
+ * Add
+ */
+ ErrorCode Add(GuiElement* pElement);
+
+ /*
+ * Remove
+ */
+ ErrorCode Remove(GuiElement* pElement);
+
+ /*
+ * AllowDrag
+ */
+ virtual bool AllowDrag() const;
+
+ /*
+ * AllowDrop
+ */
+ virtual bool AllowDrop() const;
+
+ /*
+ * OnMouseDown
+ */
+ virtual void OnMouseDown(uint32 nButton, float fX, float fY);
+
+ /*
+ * OnMouseUp
+ */
+ virtual void OnMouseUp(uint32 nButton, float fX, float fY);
+
+ /*
+ * OnDrag
+ */
+ virtual void OnDrag(float fX, float fY);
+
+ /*
+ * OnDrop
+ */
+ virtual void OnDrop(GuiElement* pSource, float fX, float fY);
};
-/*
- * GuiElementList
- */
-typedef ArrayList GuiElementList;
-
#endif //__GUIELEMENT_H__
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiInterface.cpp
--- a/LightClone/Source/GuiInterface.cpp Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/GuiInterface.cpp Thu Sep 15 12:13:40 2011 -0700
@@ -7,26 +7,23 @@
/*
* GuiInterface
*/
-GuiInterface::GuiInterface()
+GuiInterface::GuiInterface() : pInputManager(NULL), pDragSource(NULL)
{
- pRoot = new GuiContainer();
-}
-
-/*
- * ~GuiInterface
- */
-GuiInterface::~GuiInterface()
-{
- delete pRoot;
- pRoot = NULL;
}
/*
* Initialize
*/
-ErrorCode GuiInterface::Initialize(ResourceManager* pResourceManager)
+ErrorCode GuiInterface::Initialize(ResourceManager* pResourceManager, InputManager* pInput)
{
- return pRoot->Initialize(pResourceManager);
+ ErrorCode eCode = GuiElement::Initialize(pResourceManager);
+ if(eCode == Error_Success)
+ {
+ pInputManager = pInput;
+ //ASSERT(pInputManager);
+ }
+
+ return eCode;
}
/*
@@ -34,7 +31,7 @@
*/
void GuiInterface::Terminate()
{
- pRoot->Terminate();
+ GuiElement::Terminate();
}
/*
@@ -42,34 +39,48 @@
*/
void GuiInterface::Update(float fElapsed)
{
- pRoot->Update(fElapsed);
-}
+ const float fX = pInputManager->GetMouseX();
+ const float fY = pInputManager->GetMouseY();
+
+ GuiElement::Update(fElapsed);
-/*
- * Render
- */
-void GuiInterface::Render(RenderContext& kContext, Camera& kCamera)
-{
- //TODO: Should I send the camera down the tree? Ideally I would have a
- // single VB for all UI quads, so really the interface could setup
- // the camera and effect at this point. May also need a wrapper
- // around render context (GuiRenderContext)
+ if(pInputManager->IsButtonDown(MouseButton_Left) && !pInputManager->WasButtonDown(MouseButton_Left))
+ {
+ GuiElement* pElement = Pick(fX, fY);
+ if(pElement)
+ {
+ pElement->OnMouseDown(MouseButton_Left, fX, fY);
- pRoot->Render(kContext, kCamera);
-}
+ //TODO: pElement could also be the source of a drag operation
+ }
+ }
+ else
-/*
- * Pick
- */
-GuiElement* GuiInterface::Pick(float fX, float fY)
-{
- return pRoot->Pick(fX, fY);
-}
+ if(!pInputManager->IsButtonDown(MouseButton_Left) && pInputManager->WasButtonDown(MouseButton_Left))
+ {
+ GuiElement* pElement = Pick(fX, fY);
+ if(pElement)
+ {
+ GuiElement* pContainer = pElement;
+
+ if(pDragSource)
+ {
+ while(pContainer && !pElement->AllowDrop())
+ {
+ pContainer = pContainer->GetContainer();
+ }
-/*
- * GetRoot
- */
-GuiContainer* GuiInterface::GetRoot()
-{
- return pRoot;
+ if(pContainer)
+ {
+ pContainer->OnDrop(pDragSource, fX, fY);
+ }
+ }
+ else
+ {
+ pElement->OnMouseUp(MouseButton_Left, fX, fY);
+ }
+
+ pDragSource = NULL;
+ }
+ }
}
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/GuiInterface.h
--- a/LightClone/Source/GuiInterface.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/GuiInterface.h Thu Sep 15 12:13:40 2011 -0700
@@ -6,17 +6,23 @@
#define __GUIINTERFACE_H__
#include "Core.h"
-#include "GuiContainer.h"
+#include "GuiElement.h"
+#include "InputManager.h"
/*
* GuiInterface
*/
-class GuiInterface
+class GuiInterface : public GuiElement
{
/*
- * pRoot
+ * pInputManager
*/
- GuiContainer* pRoot;
+ InputManager* pInputManager;
+
+ /*
+ * pDragSource
+ */
+ GuiElement* pDragSource;
public:
@@ -26,14 +32,9 @@
GuiInterface();
/*
- * ~GuiInterface
- */
- ~GuiInterface();
-
- /*
* Initialize
*/
- ErrorCode Initialize(ResourceManager* pResourceManager);
+ ErrorCode Initialize(ResourceManager* pResourceManager, InputManager* pInputManager);
/*
* Terminate
@@ -45,20 +46,9 @@
*/
void Update(float fElapsed);
- /*
- * Render
- */
- void Render(RenderContext& kContext, Camera& kCamera);
+private:
- /*
- * Pick
- */
- GuiElement* Pick(float fX, float fY);
-
- /*
- * GetRoot
- */
- GuiContainer* GetRoot();
+ using GuiElement::Initialize;
};
#endif //__GUIINTERFACE_H__
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/InputManager.h
--- a/LightClone/Source/InputManager.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/InputManager.h Thu Sep 15 12:13:40 2011 -0700
@@ -28,6 +28,16 @@
};
/*
+ * MouseButton
+ */
+enum
+{
+ MouseButton_Left,
+ MouseButton_Right,
+ MouseButton_Middle,
+};
+
+/*
* InputEvent
*/
struct InputEvent : public Event
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/Interface.h
--- a/LightClone/Source/Interface.h Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/Interface.h Thu Sep 15 12:13:40 2011 -0700
@@ -8,7 +8,6 @@
#include "Core.h"
#include "RenderContext.h"
#include "ResourceManager.h"
-#include "GuiContainer.h"
#include "EventSystem.h"
#include "InputManager.h"
diff -r 33cb6979ac51 -r 51718795f019 LightClone/Source/World.cpp
--- a/LightClone/Source/World.cpp Wed Sep 14 17:24:49 2011 -0700
+++ b/LightClone/Source/World.cpp Thu Sep 15 12:13:40 2011 -0700
@@ -260,6 +260,7 @@
kContext.Begin(nColor);
+ //TODO: Remove
if(nGameState >= GameState_Active)
{
kCameraController.SetMode(CameraMode_3D);
@@ -277,9 +278,6 @@
*/
ErrorCode World::InitializeInterface(ResourceManager* pResourceManager)
{
- GuiContainer* pRoot = kInterface.GetRoot();
- //ASSERT(pRoot != NULL);
-
GuiLabel*
pLabel = new GuiLabel();
pLabel->Initialize(pResourceManager);
@@ -288,15 +286,10 @@
pLabel->SetFlags(GuiLabelFlag_CenterX | GuiLabelFlag_CenterY);
pLabel->SetPosition(0.5f * ScreenSizeX, 0.5f * ScreenSizeY);
- pRoot->Add(pLabel);
-
- //return kInterface.Initialize(pResourceManager);
-
/*
- GuiElement* pRoot = kInterface.GetRoot();
-
//CodePanel*
pToolbar = new CodePanel(8);
+ pToolbar->Initialize(pResourceManager);
pToolbar->SetBackgroundTexture("Data\\Textures\\CodePanel.tga");
pToolbar->SetSlotTexture("Data\\Textures\\Slot.tga");
@@ -304,47 +297,43 @@
pMain = new CodePanel(16);
pMain->SetBackgroundTexture("Data\\Textures\\CodePanel.tga");
pMain->SetSlotTexture("Data\\Textures\\Slot.tga");
+ pMain->Subscribe(CodePanel::Drop, &World::OnDrop, this);
//CodePanel*
pFunctionA = new CodePanel(16);
pFunctionA->SetBackgroundTexture("Data\\Textures\\CodePanel.tga");
pFunctionA->SetSlotTexture("Data\\Textures\\Slot.tga");
+ pFunctionA->Subscribe(CodePanel::Drop, &World::OnDrop, this);
//CodePanel*
pFunctionB = new CodePanel(16);
pFunctionB->SetBackgroundTexture("Data\\Textures\\CodePanel.tga");
pFunctionB->SetSlotTexture("Data\\Textures\\Slot.tga");
-
- //SelectorPanel*
- pSelectorPanel = new SelectorPanel();
- pSelectorPanel->SetLeftTexture("Data\\Textures\\Left.tga");
- pSelectorPanel->SetRightTexture("Data\\Textures\\Right.tga");
- pSelectorPanel->Add(pFunctionA);
- pSelectorPanel->Add(pFunctionB);
+ pFunctionB->Subscribe(CodePanel::Drop, &World::OnDrop, this);
//GuiButton*
pButtonStart = new GuiButton();
pButtonStart->SetTexture("Data\\Textures\\Play.tga");
pButtonStart->SetDimensions(...);
- pButtonStart->SetCallback(&World::OnClick, this);
+ pButtonStart->Subscribe(GuiButton::Click, &World::OnClick, this);
//GuiButton*
pButtonStop = new GuiButton();
pButtonStop->SetTexture("Data\\Textures\\Stop.tga");
pButtonStop->SetDimensions(...);
- pButtonStop->SetCallback(&World::OnClick, this);
+ pButtonStart->Subscribe(GuiButton::Click, &World::OnClick, this);
//GuiButton*
pButtonReset = new GuiButton();
pButtonReset->SetTexture("Data\\Textures\\Reset.tga");
pButtonReset->SetDimensions(...);
- pButtonReset->SetCallback(&World::OnClick, this);
+ pButtonStart->Subscribe(GuiButton::Click, &World::OnClick, this);
//GuiButton*
pButtonExit = new GuiButton();
pButtonExit->SetTexture("Data\\Textures\\Exit.tga");
pButtonExit->SetDimensions(...);
- pButtonExit->SetCallback(&World::OnClick, this);
+ pButtonStart->Subscribe(GuiButton::Click, &World::OnClick, this);
//GuiPanel*
pControlPanel = new GuiPanel();
@@ -385,6 +374,8 @@
pRoot->Add(pConfirmDialog);
*/
+ kInterface.Add(pLabel);
+
return Error_Success;
}