浏览代码

First step of refactoring EditorWindow into separate widget, widget container and window classes (PART 1)

Marko Pintera 12 年之前
父节点
当前提交
4eefb96dec

+ 1 - 0
BansheeEngine.sln

@@ -40,6 +40,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
 	ProjectSection(SolutionItems) = preProject
 		CSharpWrap.txt = CSharpWrap.txt
 		Dependencies.txt = Dependencies.txt
+		EditorWindowDock.txt = EditorWindowDock.txt
 		Notes.txt = Notes.txt
 		TODO.txt = TODO.txt
 		TODO_2D_GUI.txt = TODO_2D_GUI.txt

+ 3 - 0
BansheeEngine/Include/BsGUIArea.h

@@ -52,6 +52,9 @@ namespace BansheeEngine
 		CM::UINT16 getDepth() const { return mDepth; }
 		void setDepth(CM::UINT16 depth) { mDepth = depth; }
 
+		void setPosition(CM::INT32 x, CM::INT32 y);
+		void setSize(CM::UINT32 width, CM::UINT32 height);
+
 		CM::UINT32 x() const { return mLeft; }
 		CM::UINT32 y() const { return mTop; }
 		CM::UINT32 width() const { return mWidth; }

+ 16 - 0
BansheeEngine/Source/BsGUIArea.cpp

@@ -103,6 +103,22 @@ namespace BansheeEngine
 		return mLayout->_isContentDirty();
 	}
 
+	void GUIArea::setPosition(INT32 x, INT32 y)
+	{
+		mLeft = x;
+		mTop = y;
+
+		mIsDirty = true;
+	}
+
+	void GUIArea::setSize(UINT32 width, UINT32 height)
+	{
+		mWidth = width;
+		mHeight = height;
+
+		mIsDirty = true;
+	}
+
 	void GUIArea::notifyWindowResized(UINT32 newWidth, UINT32 newHeight)
 	{
 		if(mResizeXWithWidget)

+ 2 - 6
CamelotClient/CamelotClient.cpp

@@ -26,7 +26,7 @@
 
 #include "CmDebugCamera.h"
 #include "CmTestTextSprite.h"
-#include "CmEditorWindow.h"
+#include "DbgEditorWidget1.h"
 #include "CmRTTIType.h"
 #include "CmCursor.h"
 
@@ -284,14 +284,10 @@ int CALLBACK WinMain(
 
 	dbgCursor.reset();
 
-	EditorWindow* newWindow = new EditorWindow("Test window");
+	DbgEditorWidget1::open();
 
 	gBansheeApp().runMainLoop();
 
-	// Release everything before shutdown
-	
-	delete newWindow;
-
 	//testMaterial->destroy();
 #ifdef DX11
 	gpuProgInclude.reset();

+ 23 - 12
CamelotClient/CamelotClient.vcxproj

@@ -131,7 +131,7 @@
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
@@ -148,7 +148,7 @@
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
@@ -168,7 +168,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <DebugInformationFormat>None</DebugInformationFormat>
@@ -191,7 +191,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <MinimalRebuild>true</MinimalRebuild>
@@ -214,7 +214,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <DebugInformationFormat>None</DebugInformationFormat>
@@ -237,7 +237,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.\Include;..\CamelotCore\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;..\BansheeEngine\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <MinimalRebuild>true</MinimalRebuild>
@@ -255,21 +255,32 @@
     <Text Include="ReadMe.txt" />
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="BsGUITabbedTitleBar.h" />
-    <ClInclude Include="BsGUIWindowFrameWidget.h" />
     <ClInclude Include="CmDebugCamera.h" />
-    <ClInclude Include="CmEditorWindow.h" />
     <ClInclude Include="CmTestTextSprite.h" />
+    <ClInclude Include="Include\BsEditorPrerequisites.h" />
+    <ClInclude Include="Include\BsEditorWidget.h" />
+    <ClInclude Include="Include\BsEditorWidgetContainer.h" />
+    <ClInclude Include="Include\BsEditorWindow.h" />
+    <ClInclude Include="Include\BsEditorWindowBase.h" />
+    <ClInclude Include="Include\BsGUITabbedTitleBar.h" />
+    <ClInclude Include="Include\BsGUIWindowFrameWidget.h" />
+    <ClInclude Include="Include\DbgEditorWidget1.h" />
+    <ClInclude Include="Include\DbgEditorWidget2.h" />
     <ClInclude Include="stdafx.h" />
     <ClInclude Include="targetver.h" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="BsGUITabbedTitleBar.cpp" />
-    <ClCompile Include="BsGUIWindowFrameWidget.cpp" />
     <ClCompile Include="CamelotClient.cpp" />
     <ClCompile Include="CmDebugCamera.cpp" />
-    <ClCompile Include="CmEditorWindow.cpp" />
     <ClCompile Include="CmTestTextSprite.cpp" />
+    <ClCompile Include="Source\BsEditorWidget.cpp" />
+    <ClCompile Include="Source\BsEditorWidgetContainer.cpp" />
+    <ClCompile Include="Source\BsEditorWindow.cpp" />
+    <ClCompile Include="Source\BsEditorWindowBase.cpp" />
+    <ClCompile Include="Source\BsGUITabbedTitleBar.cpp" />
+    <ClCompile Include="Source\BsGUIWindowFrameWidget.cpp" />
+    <ClCompile Include="Source\DbgEditorWidget1.cpp" />
+    <ClCompile Include="Source\DbgEditorWidget2.cpp" />
     <ClCompile Include="stdafx.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+ 47 - 8
CamelotClient/CamelotClient.vcxproj.filters

@@ -13,6 +13,12 @@
       <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
       <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
     </Filter>
+    <Filter Include="Header Files\Editor">
+      <UniqueIdentifier>{b51df1f7-00a9-49af-a616-e0dbf141c3d9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Source Files\Editor">
+      <UniqueIdentifier>{ccd6be96-5773-46cc-a751-18a7007716c3}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <Text Include="ReadMe.txt" />
@@ -30,15 +36,33 @@
     <ClInclude Include="CmTestTextSprite.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="CmEditorWindow.h">
-      <Filter>Header Files</Filter>
+    <ClInclude Include="Include\BsEditorWidgetContainer.h">
+      <Filter>Header Files\Editor</Filter>
     </ClInclude>
-    <ClInclude Include="BsGUITabbedTitleBar.h">
+    <ClInclude Include="Include\DbgEditorWidget1.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="BsGUIWindowFrameWidget.h">
+    <ClInclude Include="Include\DbgEditorWidget2.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsEditorWindowBase.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsEditorWindow.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsGUITabbedTitleBar.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsGUIWindowFrameWidget.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsEditorWidget.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsEditorPrerequisites.h">
+      <Filter>Header Files\Editor</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="stdafx.cpp">
@@ -53,14 +77,29 @@
     <ClCompile Include="CmTestTextSprite.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="CmEditorWindow.cpp">
-      <Filter>Source Files</Filter>
+    <ClCompile Include="Source\BsEditorWidgetContainer.cpp">
+      <Filter>Source Files\Editor</Filter>
     </ClCompile>
-    <ClCompile Include="BsGUITabbedTitleBar.cpp">
+    <ClCompile Include="Source\DbgEditorWidget1.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="BsGUIWindowFrameWidget.cpp">
+    <ClCompile Include="Source\DbgEditorWidget2.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsEditorWindowBase.cpp">
+      <Filter>Source Files\Editor</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsEditorWindow.cpp">
+      <Filter>Source Files\Editor</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsGUITabbedTitleBar.cpp">
+      <Filter>Source Files\Editor</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsGUIWindowFrameWidget.cpp">
+      <Filter>Source Files\Editor</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsEditorWidget.cpp">
+      <Filter>Source Files\Editor</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 12 - 0
CamelotClient/Include/BsEditorPrerequisites.h

@@ -0,0 +1,12 @@
+#pragma once
+
+#include "BsPrerequisites.h"
+
+namespace BansheeEditor
+{
+	// GUI
+	class EditorWindowBase;
+	class EditorWindow;
+	class EditorWidget;
+	class EditorWidgetContainer;
+}

+ 25 - 0
CamelotClient/Include/BsEditorWidget.h

@@ -0,0 +1,25 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+
+namespace BansheeEditor
+{
+	class EditorWidget
+	{
+	public:
+		virtual ~EditorWidget();
+
+		const CM::WString& getName() const { return mName; }
+
+		virtual void _initialize(BS::GUIWidget& widget, CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height);
+		void _setArea(CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height);
+		void _changeParent(BS::GUIWidget& widget);
+
+	protected:
+		EditorWidget(const CM::WString& name);
+
+		CM::WString mName;
+		BS::GUIWidget* mParentWidget;
+		BS::GUIArea* mContent;
+	};
+}

+ 17 - 0
CamelotClient/Include/BsEditorWidgetContainer.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+
+namespace BansheeEditor
+{
+	class EditorWidgetContainer
+	{
+	public:
+		EditorWidgetContainer();
+		virtual ~EditorWidgetContainer();
+
+		void add(EditorWidget& widget);
+		void remove(EditorWidget& widget);
+		void move(EditorWidget& widget, CM::UINT32 newPosition);
+	};
+}

+ 18 - 0
CamelotClient/Include/BsEditorWindow.h

@@ -0,0 +1,18 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+#include "BsEditorWindowBase.h"
+
+namespace BansheeEditor
+{
+	class EditorWindow : public EditorWindowBase
+	{
+	public:
+		EditorWindow();
+		virtual ~EditorWindow();
+
+		EditorWidgetContainer& getWidgets() const { return *mWidgets; }
+	private:
+		EditorWidgetContainer* mWidgets;
+	};
+}

+ 22 - 0
CamelotClient/Include/BsEditorWindowBase.h

@@ -0,0 +1,22 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+
+namespace BansheeEditor
+{
+	class EditorWindowBase
+	{
+	public:
+		EditorWindowBase();
+		virtual ~EditorWindowBase();
+
+		void setPosition(CM::INT32 x, CM::INT32 y);
+		void setSize(CM::UINT32 width, CM::UINT32 height);
+
+	private:
+		CM::RenderWindowPtr mRenderWindow;
+
+		CM::HSceneObject mSceneObject;
+		BS::HGUIWidget mGUI;
+	};
+}

+ 0 - 0
CamelotClient/BsGUITabbedTitleBar.h → CamelotClient/Include/BsGUITabbedTitleBar.h


+ 0 - 0
CamelotClient/BsGUIWindowFrameWidget.h → CamelotClient/Include/BsGUIWindowFrameWidget.h


+ 24 - 0
CamelotClient/Include/DbgEditorWidget1.h

@@ -0,0 +1,24 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+#include "BsEditorWidget.h"
+
+namespace BansheeEditor
+{
+	class DbgEditorWidget1 : public EditorWidget
+	{
+	public:
+		virtual ~DbgEditorWidget1();
+
+		static std::shared_ptr<DbgEditorWidget1> instance();
+		static std::shared_ptr<DbgEditorWidget1> open();
+		static void close();
+
+	protected:
+		DbgEditorWidget1();
+
+		virtual void _initialize(BS::GUIWidget& widget, CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height);
+	private:
+		static std::shared_ptr<DbgEditorWidget1> Instance;
+	};
+}

+ 8 - 0
CamelotClient/Include/DbgEditorWidget2.h

@@ -0,0 +1,8 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+
+namespace BansheeEditor
+{
+
+}

+ 51 - 0
CamelotClient/Source/BsEditorWidget.cpp

@@ -0,0 +1,51 @@
+#include "BsEditorWidget.h"
+#include "BsGUIManager.h"
+#include "BsGUIWidget.h"
+#include "BsGUITexture.h"
+#include "BsGUISkin.h"
+#include "BsGUILayout.h"
+#include "BsEngineGUI.h"
+#include "BsGUIArea.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+	EditorWidget::EditorWidget(const WString& name)
+		:mName(name), mParentWidget(nullptr)
+	{
+		
+	}
+
+	EditorWidget::~EditorWidget()
+	{
+
+	}
+
+	void EditorWidget::_initialize(GUIWidget& widget, INT32 x, INT32 y, UINT32 width, UINT32 height)
+	{
+		_changeParent(widget);
+		_setArea(x, y, width, height);
+	}
+
+	void EditorWidget::_setArea(INT32 x, INT32 y, UINT32 width, UINT32 height)
+	{
+		if(mContent != nullptr)
+			return;
+
+		mContent->setPosition(x, y);
+		mContent->setSize(width, height);
+	}
+
+	void EditorWidget::_changeParent(BS::GUIWidget& widget)
+	{
+		if(mParentWidget != &widget) 
+		{
+			// TODO - GUIArea mContent should be recreated (or moved) to the new widget
+		}
+
+		mParentWidget = &widget;
+		mContent = GUIArea::create(widget, 0, 0, 0, 0, 10000);
+	}
+}

+ 37 - 0
CamelotClient/Source/BsEditorWidgetContainer.cpp

@@ -0,0 +1,37 @@
+#include "BsEditorWidgetContainer.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+	EditorWidgetContainer::EditorWidgetContainer()
+	{
+		// TODO - This should somehow initialize a title bar that will be visible in the parent editor window or dock manager
+
+		//GameObjectHandle<TabbedTitleBar> titleBar = so->addComponent<TabbedTitleBar>();
+		//titleBar->setSkin(&EngineGUI::instance().getSkin());
+		//titleBar->initialize(camera->getViewport().get(), mRenderWindow.get());
+		//titleBar->setDepth(127);
+	}
+
+	EditorWidgetContainer::~EditorWidgetContainer()
+	{
+
+	}
+
+	void EditorWidgetContainer::add(EditorWidget& widget)
+	{
+		// TODO
+	}
+
+	void EditorWidgetContainer::remove(EditorWidget& widget)
+	{
+		// TODO
+	}
+
+	void EditorWidgetContainer::move(EditorWidget& widget, CM::UINT32 newPosition)
+	{
+		// TODO
+	}
+}

+ 19 - 0
CamelotClient/Source/BsEditorWindow.cpp

@@ -0,0 +1,19 @@
+#include "BsEditorWindow.h"
+#include "BsEditorWidgetContainer.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+	EditorWindow::EditorWindow()
+		:mWidgets(cm_new<EditorWidgetContainer>())
+	{
+
+	}
+
+	EditorWindow::~EditorWindow()
+	{
+		cm_delete(mWidgets);
+	}
+}

+ 61 - 0
CamelotClient/Source/BsEditorWindowBase.cpp

@@ -0,0 +1,61 @@
+#include "BsEditorWindowBase.h"
+#include "CmApplication.h"
+#include "CmSceneObject.h"
+#include "CmRenderWindow.h"
+
+#include "BsCamera.h"
+#include "BsGUIWindowFrameWidget.h"
+#include "BsEngineGUI.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+	EditorWindowBase::EditorWindowBase()
+	{
+		RENDER_WINDOW_DESC renderWindowDesc;
+		renderWindowDesc.width = 200;
+		renderWindowDesc.height = 200;
+		renderWindowDesc.title = "EditorWindow";
+		renderWindowDesc.fullscreen = false;
+		renderWindowDesc.border = WindowBorder::None;
+		renderWindowDesc.toolWindow = true;
+
+		mRenderWindow = RenderWindow::create(renderWindowDesc, gApplication().getPrimaryWindow());
+
+		mSceneObject = SceneObject::create("EditorWindow");
+
+		HCamera camera = mSceneObject->addComponent<Camera>();
+		camera->initialize(mRenderWindow, 0.0f, 0.0f, 1.0f, 1.0f, 0);
+		camera->setNearClipDistance(5);
+		camera->setAspectRatio(1.0f);
+		camera->setIgnoreSceneRenderables(true);
+
+		mGUI = mSceneObject->addComponent<GUIWidget>();
+		mGUI->initialize(camera->getViewport().get(), mRenderWindow.get());
+		mGUI->setDepth(128);
+
+		mGUI->setSkin(&EngineGUI::instance().getSkin());
+
+		GameObjectHandle<WindowFrameWidget> frame = mSceneObject->addComponent<WindowFrameWidget>();
+		frame->setSkin(&EngineGUI::instance().getSkin());
+		frame->initialize(camera->getViewport().get(), mRenderWindow.get());
+		frame->setDepth(129);
+	}
+
+	EditorWindowBase::~EditorWindowBase()
+	{
+		mRenderWindow->destroy();
+	}
+
+	void EditorWindowBase::setPosition(CM::INT32 x, CM::INT32 y)
+	{
+		// TODO
+	}
+
+	void EditorWindowBase::setSize(CM::UINT32 width, CM::UINT32 height)
+	{
+		// TODO
+	}
+}

+ 0 - 0
CamelotClient/BsGUITabbedTitleBar.cpp → CamelotClient/Source/BsGUITabbedTitleBar.cpp


+ 0 - 0
CamelotClient/BsGUIWindowFrameWidget.cpp → CamelotClient/Source/BsGUIWindowFrameWidget.cpp


+ 114 - 0
CamelotClient/Source/DbgEditorWidget1.cpp

@@ -0,0 +1,114 @@
+#include "DbgEditorWidget1.h"
+#include "BsEditorWindow.h"
+#include "BsGUILabel.h"
+#include "BsGUIButton.h"
+#include "BsGUIInputBox.h"
+#include "BsGUIScrollArea.h"
+#include "BsGUIArea.h"
+#include "BsGUILayout.h"
+#include "BsEditorWindow.h"
+#include "BsEditorWidgetContainer.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+	std::shared_ptr<DbgEditorWidget1> DbgEditorWidget1::Instance;
+
+	DbgEditorWidget1::DbgEditorWidget1()
+		:EditorWidget(L"DbgEditorWidget1")
+	{
+		
+	}
+
+	DbgEditorWidget1::~DbgEditorWidget1()
+	{
+
+	}
+
+	void DbgEditorWidget1::_initialize(BS::GUIWidget& widget, CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height)
+	{
+		EditorWidget::_initialize(widget, x, y, width, height);
+
+		GUILayout& layout = mContent->getLayout();
+		//
+		//mDbgLabel = GUILabel::create(*mGUI, "Testing test");
+		//layout.addElement(mDbgLabel);
+
+		//layout.addElement(GUIInputBox::create(*mGUI));
+		//layout.addElement(GUIInputBox::create(*mGUI, GUILayoutOptions::fixed(100, 100), true));
+
+		GUIScrollArea* scrollArea = GUIScrollArea::create(*mParentWidget);
+		layout.addElement(scrollArea);
+
+		GUILayout& scrollLayout = scrollArea->getLayout().addLayoutX();
+
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test A"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test B"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test C"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test D"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test E"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test F"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test G"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test H"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test I"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test J"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test K"));
+		//scrollLayout.addElement(GUIButton::create(*mGUI, L"Test L"));
+
+		scrollLayout.addElement(GUIInputBox::create(*mParentWidget, GUILayoutOptions::fixed(100, 100), true));
+		scrollLayout.addElement(GUIInputBox::create(*mParentWidget, GUILayoutOptions::fixed(100, 100), true));
+		scrollLayout.addElement(GUIInputBox::create(*mParentWidget, GUILayoutOptions::fixed(100, 100), true));
+
+		//GUIFlexibleSpace& space4 = otherLayout.addFlexibleSpace();
+		//otherLayout.addElement(mDbgLabel);
+
+		//GUIFixedSpace& space = otherLayout.addSpace(10); // Due to bug in MSVC compiler I need to store return value
+		//GUIFlexibleSpace& space3 = otherLayout.addFlexibleSpace();
+		//otherLayout.addElement(GUIWindowFrame::create(*mGUI, GUILayoutOptions::fixed(100, 100)));
+		//GUIFixedSpace& space2 = otherLayout.addSpace(10);
+		//otherLayout.addElement(GUIButton::create(*mGUI, "Test"));
+		//otherLayout.addElement(GUIWindowFrame::create(*mGUI));
+
+		//GUIArea* backgroundArea = GUIArea::create(*mGUI, 0, 0, 0, 0, 2000);
+		//backgroundArea->getLayout().addElement(GUITexture::create(*mGUI, GUILayoutOptions::expandableXY(), GUIImageScaleMode::RepeatToFit, mGUI->getSkin()->getStyle("WindowBackground")));
+
+		//GUIArea* windowFrameArea = GUIArea::create(*mGUI, 0, 0, 0, 0, 1999);
+		//windowFrameArea->getLayout().addElement(GUIWindowFrame::create(*mGUI));
+
+		//GUIArea* titleBarBackgroundArea = GUIArea::create(*mGUI, 0, 1, 0, 11, 1999);
+		//titleBarBackgroundArea->getLayout().addSpace(1);
+		//titleBarBackgroundArea->getLayout().addElement(GUITexture::create(*mGUI, GUIImageScaleMode::RepeatToFit, GUILayoutOptions::expandableXY(), mGUI->getGUISkin()->getStyle("TitleBarBg")));
+		//titleBarBackgroundArea->getLayout().addSpace(1);
+
+		//mRenderWindow->resize(300, 250);
+		//mRenderWindow->setVisible(false);
+	}
+
+	std::shared_ptr<DbgEditorWidget1> DbgEditorWidget1::instance()
+	{
+		return Instance;
+	}
+
+	std::shared_ptr<DbgEditorWidget1> DbgEditorWidget1::open()
+	{
+		if(Instance != nullptr)
+			return Instance;
+
+		EditorWindow* newWindow = cm_new<EditorWindow>();
+		std::shared_ptr<DbgEditorWidget1> newWidget = std::shared_ptr<DbgEditorWidget1>(new (cm_alloc<DbgEditorWidget1>()) DbgEditorWidget1());
+		newWindow->getWidgets().add(*newWidget);
+
+		return newWidget;
+	}
+
+	void DbgEditorWidget1::close()
+	{
+		// TODO - Unregister widget from EditorWidgetContainer
+		// TODO - Unregister widget from DockManager
+		// TODO - Release widget resources
+		
+		Instance = nullptr; // TODO - What happens when something ends up keeping the reference to the widget?
+	}
+}

+ 9 - 0
CamelotClient/Source/DbgEditorWidget2.cpp

@@ -0,0 +1,9 @@
+#include "BsEditorWidgetContainer.h"
+
+using namespace CamelotFramework;
+using namespace BansheeEngine;
+
+namespace BansheeEditor
+{
+
+}

+ 73 - 0
EditorWindowDock.txt

@@ -0,0 +1,73 @@
+EditorWindow
+ - Actual render window containing a window frame
+ - Has a content area that is automatically managed as the window resizes
+ - Optionally it has a title bar (SEPARATE from the docked title bar)
+ - (Later) Optionally also a context menu
+ - Used for both main and editor windows
+
+EditorWidgetContainer
+ - Contains a tabbed title bar
+ - Used for dealing with multiple editor widgets
+ - More specific:
+   - Has add/remove/move methods that allow you to manipulate which EditorWidgets it contains.
+
+EditorWidget
+ - What we have so far called EditorWindow
+ - Contains a GUIArea that is managed by its parent EditorWindow or DockManager
+ - This is the only user-friendly part of the Editor window system. User should never need to touch the other bits.
+ - More specific
+   - Contains the window name
+   - Has open/close method (Open automatically creates an EditorWindow)
+
+DragAndDropManager
+ - Very simple interface
+ - dragObject(icon, type, data, dropCallback) - starts item drag (data is just a void user an cast based on type)
+ - while something is being dragged GUIManager sends ObjectDragged events to all GUI elements under the mouse
+   - (normally GUIManager only sends MouseDrag to the element that initiated the drag)
+ - when mouse button is released GUIManager sends ObjectDropped to the GUIElement under the cursor
+ - manager is reponsible for drawing the provided icon while the object is being dragged
+ - "dropCallback" is called when the object is dropped. Most useful to determine if the object is dropped in an unsupported area in which case we need to do some special action.
+
+DockManager
+ - DOCKING: When user drags a window, EditorWidgetContainer detects that and reacts accordingly
+   - For title bar it draws the drop locations, and does the same for content
+   - After the drop is done it just notifies the DockManager (if the drop was on contents) with addWidgetRelativeToMe(this, location, draggedWidget)
+      - (If the drop was done on the title bar, then the EditorWidgetContainer can handle that internally)
+	  - Drop manager creates two new DockedWindowContainers
+	   - Existing a new widgets are moved into each. Existing container (for the existing widget) now becomes the parent of the two new containers.
+	   - Size of the new containers are adjusted (and containers internally adjust the size of their widgets, and/or their child containers)
+	  - A spacer widget is added between them, that may be used for resizing. DockedWindowContainers on both sides of the spacer and kept as a reference
+   - Also, make sure to detect a case when there are no widgets in the dock manager
+   - Resizing a DockedWindowContainer recursivelly resizes all child containers
+ - UNDOCKING: If the last EditorWidget is removed from EditorWidgetContainer, DockManager is notified and it takes care of removing the relevant
+   DockedWindowContainer and the spacer.
+
+TODO - Possibly add a way to have hidden widgets in the EditorWidgetContainer (like side-bars that pop on mouse over in Visual Studio)
+TODO - A way to persist window states
+
+------------------------
+
+Implementation plan:
+ - Split EditorWindow, EditorWidget and EditorWidgetContainer
+ - Implement a couple of debug EditorWidgets and set them up in a single container and a window
+  - Hook up the buttons so clicking them switches the active widget
+ - Implement basic DragAndDropManager (without special icon yet)
+  - Attemp to drag and drop a single item from and to the title bar
+   - Will require implementing most of the DragAndDropManager and improve GUIManager
+ - Continue with DockManager (flesh it out later)
+
+ TODO - I don't release EditorWindow or EditorWidget anywhere!!!
+
+------------------------
+
+Some use cases:
+ 1. User drags one of the tabs on EditorWindow and then drops it
+  - If user drags for N pixels the draged tab (and its EditorWidget) is removed from the EditorWindow and added to DragAndDropManager
+  - If user drops the window onto empty/unsupported element drag and drop manager "dropCallback" is executed and EditorWidget is restored in its own EditorWindow.
+  - If user drags the window over a title bar, drop positions get highlighted on the title bar
+    - If the user releases over the title bar, the window is added at the specified drop position
+  - If the user drags over an EditorWidget content area, semi-transparent drop areas are shown, and current area is highlighted
+    - Dropping the window in that area will split the available space between existng and new window contents
+
+ 2. User organizes his windows and the quits and restarts the program
+  - TODO