Browse Source

GUIMenu can now return data used for initializing a GUIDropDownBox

Marko Pintera 12 years ago
parent
commit
2b6ff54e6d

+ 4 - 0
BansheeEngine/Include/BsGUIMenu.h

@@ -16,6 +16,7 @@ namespace BansheeEngine
 		CM::UINT32 getNumChildren() const { return (CM::UINT32)mChildren.size(); }
 		CM::UINT32 getNumChildren() const { return (CM::UINT32)mChildren.size(); }
 		const GUIMenuItem* getParent() const { return mParent; }
 		const GUIMenuItem* getParent() const { return mParent; }
 		const CM::WString& getName() const { return mName; }
 		const CM::WString& getName() const { return mName; }
+		std::function<void()> getCallback() const { return mCallback; }
 		bool isSeparator() const { return mIsSeparator; }
 		bool isSeparator() const { return mIsSeparator; }
 		const GUIMenuItem* findChild(const CM::WString& name) const;
 		const GUIMenuItem* findChild(const CM::WString& name) const;
 
 
@@ -44,9 +45,12 @@ namespace BansheeEngine
 		const GUIMenuItem* addSeparator(const CM::WString& path);
 		const GUIMenuItem* addSeparator(const CM::WString& path);
 		const GUIMenuItem* getMenuItem(const CM::WString& path) const;
 		const GUIMenuItem* getMenuItem(const CM::WString& path) const;
 		void removeMenuItem(const GUIMenuItem* item);
 		void removeMenuItem(const GUIMenuItem* item);
+
+		CM::Vector<GUIDropDownData>::type getDropDownData() const;
 	protected:
 	protected:
 		GUIMenuItem mRootElement;
 		GUIMenuItem mRootElement;
 
 
 		const GUIMenuItem* addMenuItemInternal(const CM::WString& path, std::function<void()> callback, bool isSeparator);
 		const GUIMenuItem* addMenuItemInternal(const CM::WString& path, std::function<void()> callback, bool isSeparator);
+		CM::Vector<GUIDropDownData>::type getDropDownDataInternal(const GUIMenuItem& menu) const;
 	};
 	};
 }
 }

+ 1 - 0
BansheeEngine/Include/BsPrerequisites.h

@@ -54,6 +54,7 @@ namespace BansheeEngine
 	struct GUILayoutOptions;
 	struct GUILayoutOptions;
 	class GUIToggleGroup;
 	class GUIToggleGroup;
 	class GUIListBox;
 	class GUIListBox;
+	class GUIDropDownData;
 	class GUIDropDownBox;
 	class GUIDropDownBox;
 	class DragAndDropManager;
 	class DragAndDropManager;
 	class GUIMenu;
 	class GUIMenu;

+ 4 - 3
BansheeEngine/Source/BsGUIManager.cpp

@@ -22,6 +22,7 @@
 #include "BsGUIInputSelection.h"
 #include "BsGUIInputSelection.h"
 #include "BsGUIListBox.h"
 #include "BsGUIListBox.h"
 #include "BsGUIDropDownBox.h"
 #include "BsGUIDropDownBox.h"
+#include "BsGUIContextMenu.h"
 #include "BsDragAndDropManager.h"
 #include "BsDragAndDropManager.h"
 
 
 using namespace CamelotFramework;
 using namespace CamelotFramework;
@@ -551,10 +552,10 @@ namespace BansheeEngine
 		mDropDownSO = SceneObject::create("DropDownBox");
 		mDropDownSO = SceneObject::create("DropDownBox");
 		mDropDownBox = mDropDownSO->addComponent<GUIDropDownBox>();
 		mDropDownBox = mDropDownSO->addComponent<GUIDropDownBox>();
 
 
-		//Vector<GUIDropDownData>::type dropDownData = menu->getDropDownData();
+		Vector<GUIDropDownData>::type dropDownData = menu->getDropDownData();
 
 
-		//mDropDownBox->initialize(widget.getTarget(), widget.getOwnerWindow(), 
-		//	GUIDropDownAreaPlacement::aroundPosition(position), dropDownData, widget.getSkin(), GUIDropDownType::ContextMenu);
+		mDropDownBox->initialize(widget.getTarget(), widget.getOwnerWindow(), 
+			GUIDropDownAreaPlacement::aroundPosition(position), dropDownData, widget.getSkin(), GUIDropDownType::ContextMenu);
 
 
 		mDropDownBoxOpenScheduled = true;
 		mDropDownBoxOpenScheduled = true;
 	}
 	}

+ 32 - 0
BansheeEngine/Source/BsGUIMenu.cpp

@@ -1,4 +1,5 @@
 #include "BsGUIMenu.h"
 #include "BsGUIMenu.h"
+#include "BsGUIDropDownBox.h"
 
 
 using namespace CamelotFramework;
 using namespace CamelotFramework;
 
 
@@ -143,4 +144,35 @@ namespace BansheeEngine
 
 
 		parent->removeChild(item->getName());
 		parent->removeChild(item->getName());
 	}
 	}
+
+	Vector<GUIDropDownData>::type GUIMenu::getDropDownData() const
+	{
+		return getDropDownDataInternal(mRootElement);
+	}
+
+	Vector<GUIDropDownData>::type GUIMenu::getDropDownDataInternal(const GUIMenuItem& menu) const
+	{
+		Vector<GUIDropDownData>::type dropDownData;
+
+		for(auto& menuItem : menu.mChildren)
+		{
+			if(menuItem->isSeparator())
+			{
+				dropDownData.push_back(GUIDropDownData::separator());
+			}
+			else
+			{
+				if(menuItem->getNumChildren() == 0)
+				{
+					dropDownData.push_back(GUIDropDownData::button(menuItem->getName(), menuItem->getCallback()));
+				}
+				else
+				{
+					dropDownData.push_back(GUIDropDownData::subMenu(menuItem->getName(), getDropDownData(*menuItem)));
+				}
+			}
+		}
+
+		return dropDownData;
+	}
 }
 }

+ 0 - 1
DropDown.txt

@@ -2,7 +2,6 @@ GUI ignores image in GUIContent for most elements.
 
 
 Doesn't belong here but as an additional reminder: Remove Component::initialize and instead make multi paramter addComponent
 Doesn't belong here but as an additional reminder: Remove Component::initialize and instead make multi paramter addComponent
 
 
-GUIDropDownBox needs to properly handle different GUIDropDownPlacement types! Currently it just assumes BoundsHorz
 GUIContextMenu::getDropDownData needs to be implemented
 GUIContextMenu::getDropDownData needs to be implemented
 
 
 ListBox: Clicking on ListBox once the DropDownBox is open should close the drop down box (I assume it does, it just re-opens it immediately again?)
 ListBox: Clicking on ListBox once the DropDownBox is open should close the drop down box (I assume it does, it just re-opens it immediately again?)