Browse Source

More work on window management

Marko Pintera 13 years ago
parent
commit
fe9aea1631

+ 47 - 1
CamelotEditor/CamelotEditor.vcxproj

@@ -145,8 +145,10 @@
     <ClCompile Include="GeneratedFiles\moc_CmQtDockOverlayWidget.cpp" />
     <ClCompile Include="GeneratedFiles\moc_CmQtEditor.cpp" />
     <ClCompile Include="GeneratedFiles\moc_CmQtEditorWindow.cpp" />
+    <ClCompile Include="GeneratedFiles\moc_CmQtHierarchyWindow.cpp" />
     <ClCompile Include="GeneratedFiles\moc_CmQtNewProject.cpp" />
     <ClCompile Include="GeneratedFiles\moc_CmQtProjectSelection.cpp" />
+    <ClCompile Include="GeneratedFiles\moc_CmQtSceneWindow.cpp" />
     <ClCompile Include="GeneratedFiles\qrc_CmEditor.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
       </PrecompiledHeader>
@@ -160,15 +162,20 @@
     <ClCompile Include="Include\3rdParty\pugixml\pugixml.cpp" />
     <ClCompile Include="Source\CmEditorApplication.cpp" />
     <ClCompile Include="Source\CmEditorPrefs.cpp" />
+    <ClCompile Include="Source\CmEditorWindowManager.cpp" />
+    <ClCompile Include="Source\CmHierarchyWindowFactory.cpp" />
     <ClCompile Include="Source\CmPreferences.cpp" />
     <ClCompile Include="Source\CmProjectPrefs.cpp" />
     <ClCompile Include="Source\CmQtDockOverlayWidget.cpp" />
     <ClCompile Include="Source\CmQtEditor.cpp" />
     <ClCompile Include="Source\CmQtEditorWindow.cpp" />
+    <ClCompile Include="Source\CmQtHierarchyWindow.cpp" />
     <ClCompile Include="Source\CmQtNewProject.cpp" />
     <ClCompile Include="Source\CmQtProjectSelection.cpp" />
+    <ClCompile Include="Source\CmSceneWindowFactory.cpp" />
     <ClCompile Include="Source\CmWindowDockManager.cpp" />
     <ClCompile Include="Source\main.cpp" />
+    <ClCompile Include="Source\CmQtSceneWindow.cpp" />
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="Include\CmQtEditor.h">
@@ -216,7 +223,9 @@
     <ClInclude Include="Include\CmEditorApplication.h" />
     <ClInclude Include="Include\CmEditorPrefs.h" />
     <ClInclude Include="Include\CmEditorPrerequisites.h" />
-    <ClInclude Include="Include\CmLayoutManager.h" />
+    <ClInclude Include="Include\CmEditorWindowFactory.h" />
+    <ClInclude Include="Include\CmEditorWindowManager.h" />
+    <ClInclude Include="Include\CmHierarchyWindowFactory.h" />
     <ClInclude Include="Include\CmPreferences.h" />
     <ClInclude Include="Include\CmProjectPrefs.h" />
     <CustomBuild Include="Include\CmQtDockOverlayWidget.h">
@@ -255,6 +264,43 @@
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
     </CustomBuild>
+    <CustomBuild Include="Include\CmQtHierarchyWindow.h">
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+    </CustomBuild>
+    <CustomBuild Include="Include\CmQtSceneWindow.h">
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing %(Filename)...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\moc_%(Filename).cpp</Outputs>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+    </CustomBuild>
+    <ClInclude Include="Include\CmSceneWindowFactory.h" />
     <ClInclude Include="Include\CmWindowDockManager.h" />
     <CustomBuild Include="Include\CmQtNewProject.h">
       <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"  -DQT_NO_KEYWORDS -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL  "-I.\GeneratedFiles" "-I.\Include" "-I.\Dependencies\Include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\CamelotCore\Include" "-I.\..\CamelotUtility\Include" "-I.\..\Dependencies\Include"</Command>

+ 42 - 6
CamelotEditor/CamelotEditor.vcxproj.filters

@@ -75,15 +75,36 @@
     <ClCompile Include="Source\CmQtEditorWindow.cpp">
       <Filter>Source Files\Qt</Filter>
     </ClCompile>
-    <ClCompile Include="Source\CmWindowDockManager.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="GeneratedFiles\moc_CmQtDockOverlayWidget.cpp">
       <Filter>Generated Files</Filter>
     </ClCompile>
     <ClCompile Include="GeneratedFiles\moc_CmQtEditorWindow.cpp">
       <Filter>Generated Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\CmQtSceneWindow.cpp">
+      <Filter>Source Files\Qt</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmQtHierarchyWindow.cpp">
+      <Filter>Source Files\Qt</Filter>
+    </ClCompile>
+    <ClCompile Include="GeneratedFiles\moc_CmQtHierarchyWindow.cpp">
+      <Filter>Generated Files</Filter>
+    </ClCompile>
+    <ClCompile Include="GeneratedFiles\moc_CmQtSceneWindow.cpp">
+      <Filter>Generated Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmWindowDockManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmSceneWindowFactory.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmHierarchyWindowFactory.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\CmEditorWindowManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="CmEditor.qrc">
@@ -104,14 +125,17 @@
     <CustomBuild Include="Include\CmQtDockOverlayWidget.h">
       <Filter>Header Files\Qt</Filter>
     </CustomBuild>
+    <CustomBuild Include="Include\CmQtHierarchyWindow.h">
+      <Filter>Header Files\Qt</Filter>
+    </CustomBuild>
+    <CustomBuild Include="Include\CmQtSceneWindow.h">
+      <Filter>Header Files\Qt</Filter>
+    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Include\CmEditorPrefs.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="Include\CmLayoutManager.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="Include\CmEditorApplication.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -133,5 +157,17 @@
     <ClInclude Include="Include\CmWindowDockManager.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\CmEditorWindowManager.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmEditorWindowFactory.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmSceneWindowFactory.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmHierarchyWindowFactory.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 7 - 1
CamelotEditor/Include/CmEditorPrerequisites.h

@@ -12,4 +12,10 @@ namespace CamelotEditor
 	class ProjectPrefs;
 	class QtDockOverlayWidget;
 	class QtEditorWindow;
-}
+}
+
+// Qt
+class QWidget;
+class QLabel;
+class QPushButton;
+class QSplitter;

+ 17 - 0
CamelotEditor/Include/CmEditorWindowFactory.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include "CmEditorPrerequisites.h"
+#include <QtCore/QString>
+
+namespace CamelotEditor
+{
+	class EditorWindowFactory
+	{
+	public:
+		virtual QtEditorWindow* create(QWidget* parent) const = 0;
+
+		virtual const QString& getWindowName() const = 0;
+		virtual const QString& getMenuCategory() const = 0;
+		virtual const QString& getMenuItemName() const = 0;
+	};
+}

+ 19 - 0
CamelotEditor/Include/CmEditorWindowManager.h

@@ -0,0 +1,19 @@
+#pragma once
+
+#include "CmEditorPrerequisites.h"
+#include "CmModule.h"
+#include "CmEditorWindowFactory.h"
+
+namespace CamelotEditor
+{
+	class EditorWindowManager : public Module<EditorWindowManager>
+	{		
+	public:
+		void registerWindowFactory(EditorWindowFactory* factory);
+
+		QtEditorWindow* create(const QString& name) const;
+
+	private:
+		std::map<QString, EditorWindowFactory*> mFactories;
+	};
+}

+ 17 - 0
CamelotEditor/Include/CmHierarchyWindowFactory.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include "CmEditorPrerequisites.h"
+#include <QtCore/QString>
+
+namespace CamelotEditor
+{
+	class HierarchyWindowFactory
+	{
+	public:
+		QtEditorWindow* create(QWidget* parent) const;
+
+		const QString& getWindowName() const;
+		const QString& getMenuCategory() const;
+		const QString& getMenuItemName() const;
+	};
+}

+ 0 - 12
CamelotEditor/Include/CmLayoutManager.h

@@ -1,12 +0,0 @@
-#pragma  once
-
-#include "CmEditorPrerequisites.h"
-#include "CmModule.h"
-
-namespace CamelotEditor
-{
-	class LayoutManager : public CamelotEngine::Module<LayoutManager>
-	{
-
-	};
-}

+ 3 - 0
CamelotEditor/Include/CmQtEditor.h

@@ -13,6 +13,9 @@ namespace CamelotEditor
 		QtEditor(QWidget *parent = nullptr);
 		~QtEditor();
 
+		QtDockOverlayWidget* getDockOverlayWidget() const { return mDockOverlayWidget; }
+		QWidget* getCentralWidget() const { return mCentralWidget; }
+
 	private:
 		QMenuBar* mMenuBar;
 		QToolBar* mMainToolBar;

+ 8 - 2
CamelotEditor/Include/CmQtEditorWindow.h

@@ -1,6 +1,6 @@
 #pragma once
 
-#include "CmPrerequisites.h"
+#include "CmEditorPrerequisites.h"
 #include <QtWidgets/QWidget>
 #include <QtCore/QPoint>
 
@@ -23,7 +23,7 @@ namespace CamelotEditor
 		};
 
 	public:
-		QtEditorWindow(QWidget* parent, QWidget* content, const QString& title);
+		QtEditorWindow(QWidget* parent, const QString& title);
 		virtual ~QtEditorWindow() { }
 
 		void undock();
@@ -41,9 +41,15 @@ namespace CamelotEditor
 		bool mMoveMode;
 		QPoint mDragOffset;
 		QWidget* mTitleBar;
+		QLabel* mLblTitle;
+		QPushButton* mBtnClose;
 		QWidget* mCentralWidget;
 		bool mIsDocked;
 
+		void setupUi(QString title);
+		void setupSignals();
+		void retranslateUi(QString title);
+
 		void mousePressEvent(QMouseEvent* event);
 		void mouseReleaseEvent(QMouseEvent* event);
 		void mouseMoveEvent(QMouseEvent* event);

+ 15 - 0
CamelotEditor/Include/CmQtHierarchyWindow.h

@@ -0,0 +1,15 @@
+#pragma once
+
+#include "CmEditorPrefs.h"
+#include "CmQtEditorWindow.h"
+
+namespace CamelotEditor
+{
+	class QtHierarchyWindow: public QtEditorWindow
+	{
+		Q_OBJECT
+	public:
+		QtHierarchyWindow(QWidget* parent);
+		virtual ~QtHierarchyWindow();
+	};
+}

+ 15 - 0
CamelotEditor/Include/CmQtSceneWindow.h

@@ -0,0 +1,15 @@
+#pragma once
+
+#include "CmEditorPrefs.h"
+#include "CmQtEditorWindow.h"
+
+namespace CamelotEditor
+{
+	class QtSceneWindow: public QtEditorWindow
+	{
+		Q_OBJECT
+	public:
+		QtSceneWindow(QWidget* parent);
+		virtual ~QtSceneWindow();
+	};
+}

+ 17 - 0
CamelotEditor/Include/CmSceneWindowFactory.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include "CmEditorPrerequisites.h"
+#include <QtCore/QString>
+
+namespace CamelotEditor
+{
+	class SceneWindowFactory
+	{
+	public:
+		QtEditorWindow* create(QWidget* parent) const;
+
+		const QString& getWindowName() const;
+		const QString& getMenuCategory() const;
+		const QString& getMenuItemName() const;
+	};
+}

+ 3 - 4
CamelotEditor/Include/CmWindowDockManager.h

@@ -4,8 +4,6 @@
 #include "CmModule.h"
 #include "CmQtDockOverlayWidget.h"
 
-class QSplitter;
-
 namespace CamelotEditor
 {
 	class WindowDockManager : public Module<WindowDockManager>
@@ -17,8 +15,6 @@ namespace CamelotEditor
 		void windowReleased(QtEditorWindow* window, const QPoint& mousePos);
 		void windowClosed(QtEditorWindow* window);
 
-		void dockWindow(QtEditorWindow* windowToDock, QtEditorWindow* dockAtWidget, WindowDragDropLocation dockAtPosition);
-		void undockWindow(QtEditorWindow* windowToUndock);
 	private:
 		QtDockOverlayWidget* mDockOverlayWidget;
 		QWidget* mCentralWidget;
@@ -28,6 +24,9 @@ namespace CamelotEditor
 
 		std::vector<QtEditorWindow*> mDockedWindows;
 
+		void dockWindow(QtEditorWindow* windowToDock, QtEditorWindow* dockAtWidget, WindowDragDropLocation dockAtPosition);
+		void undockWindow(QtEditorWindow* windowToUndock);
+
 		QtEditorWindow* getDockedWindowAtPosition(const QPoint& globalPos);
 		bool isPositionInDockArea(const QPoint& globalPos);
 

+ 20 - 14
CamelotEditor/Source/CmEditorApplication.cpp

@@ -1,9 +1,10 @@
 #include "CmEditorApplication.h"
-#include "CmLayoutManager.h"
 #include "CmEditorPrefs.h"
 #include "CmProjectPrefs.h"
 #include "CmQtEditor.h"
 #include "CmQtProjectSelection.h"
+#include "CmEditorWindowManager.h"
+#include "CmWindowDockManager.h"
 #include "CmFileSystem.h"
 #include "CmException.h"
 #include <QtWidgets/QApplication>
@@ -16,13 +17,15 @@ namespace CamelotEditor
 
 	struct EditorApplication::PImpl
 	{
-
+		QApplication* mApp;
+		QtEditor* mEditor;
 	};
 
 	EditorApplication::EditorApplication()
 		:p(new PImpl())
 	{
-
+		p->mApp = nullptr;
+		p->mEditor = nullptr;
 	}
 
 	EditorApplication::~EditorApplication()
@@ -38,31 +41,34 @@ namespace CamelotEditor
 			gEditorPrefs().load(getEditorPrefsPath());
 		
 		ProjectPrefs::startUp(new ProjectPrefs());
-		LayoutManager::startUp(new LayoutManager());
+
+		int argc = 0;
+		p->mApp = new QApplication(argc, nullptr);
+		p->mEditor = new QtEditor();
+
+		EditorWindowManager::startUp(new EditorWindowManager());
+		WindowDockManager::startUp(new WindowDockManager(p->mEditor->getCentralWidget(), p->mEditor->getDockOverlayWidget()));
 	}
 
 	void EditorApplication::run()
 	{
-		int argc = 0;
-		QApplication a(argc, nullptr);
-
 		QtProjectSelection projSelection;
 		projSelection.onProjectSelected.connect(boost::bind(&EditorApplication::loadProject, this, _1));
 		
 		if(projSelection.exec() == QDialog::Rejected)
 			return;
 
-		QtEditor w;
-		w.show();
-
-		//WindowDockManager::startUp(new WindowDockManager())
-
-		a.exec();
+		p->mEditor->show();
+		p->mApp->exec();
 	}
 
 	void EditorApplication::shutDown()
 	{
-		LayoutManager::shutDown();
+		WindowDockManager::shutDown();
+		EditorWindowManager::shutDown();
+
+		delete p->mApp;
+
 		ProjectPrefs::shutDown();
 
 		gEditorPrefs().save(getEditorPrefsPath());

+ 24 - 0
CamelotEditor/Source/CmEditorWindowManager.cpp

@@ -0,0 +1,24 @@
+#include "CmEditorWindowManager.h"
+#include "CmException.h"
+
+namespace CamelotEditor
+{
+	void EditorWindowManager::registerWindowFactory(EditorWindowFactory* factory)
+	{
+		assert(factory != nullptr);
+
+		mFactories[factory->getWindowName()] = factory;
+	}
+
+	QtEditorWindow* EditorWindowManager::create(const QString& name) const
+	{
+		auto iterFind = mFactories.find(name);
+
+		if(iterFind == mFactories.end())
+			CM_EXCEPT(InvalidParametersException, "Window with the name: \"" + name.toStdString() + "\" doesn't exist.");
+
+
+
+		//QtEditorWindow* window = iterFind->second.create(parent);
+	}
+}

+ 28 - 0
CamelotEditor/Source/CmHierarchyWindowFactory.cpp

@@ -0,0 +1,28 @@
+#include "CmHierarchyWindowFactory.h"
+#include "CmQtSceneWindow.h"
+
+namespace CamelotEditor
+{
+	QtEditorWindow* HierarchyWindowFactory::create(QWidget* parent) const
+	{
+		return new QtSceneWindow(parent);
+	}
+
+	const QString& HierarchyWindowFactory::getWindowName() const
+	{
+		static QString name = "Hierarchy";
+		return name;
+	}
+
+	const QString& HierarchyWindowFactory::getMenuCategory() const
+	{
+		static QString name = "Windows";
+		return name;
+	}
+
+	const QString& HierarchyWindowFactory::getMenuItemName() const
+	{
+		static QString name = "Hierarchy";
+		return name;
+	}
+}

+ 34 - 19
CamelotEditor/Source/CmQtEditorWindow.cpp

@@ -11,47 +11,50 @@
 #include "CmDebug.h"
 #include "CmWindowDockManager.h"
 
-using namespace CamelotEngine;
-
 namespace CamelotEditor
 {
-	QtEditorWindow::QtEditorWindow(QWidget* parent, QWidget* content, const QString& title)
-		:QWidget(parent), mContent(content), mResizeMode(RM_NONE), mMoveMode(false), mIsDocked(false)
+	QtEditorWindow::QtEditorWindow(QWidget* parent, const QString& title)
+		:QWidget(parent), mResizeMode(RM_NONE), mMoveMode(false), mIsDocked(false)
+	{
+		setupUi(title);
+	}
+
+	void QtEditorWindow::setupUi(QString title)
 	{
 		setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
 
 		/************************************************************************/
 		/* 								TITLE BAR	                     		*/
 		/************************************************************************/
-		mTitleBar = new QWidget();
+		mTitleBar = new QWidget(this);
 		mTitleBar->setObjectName("titleBar");
 
-		QLabel* titleLabel = new QLabel();
-		titleLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
-		titleLabel->setText(title);
-
-		QPushButton* closeBtn = new QPushButton();
-		closeBtn->setText("Close");
-
-		QHBoxLayout* titleLayout = new QHBoxLayout();
+		mLblTitle = new QLabel(this);
+		mLblTitle->setAttribute(Qt::WA_TransparentForMouseEvents);
+		
+		mBtnClose = new QPushButton(this);
+		
+		QHBoxLayout* titleLayout = new QHBoxLayout(this);
 		titleLayout->setMargin(0);
-		titleLayout->addWidget(titleLabel, 1);
-		titleLayout->addWidget(closeBtn);
+		titleLayout->addWidget(mLblTitle, 1);
+		titleLayout->addWidget(mBtnClose);
 		mTitleBar->setLayout(titleLayout);
 
 		/************************************************************************/
 		/* 							CENTRAL LAYOUT                      		*/
 		/************************************************************************/
 
-		mCentralWidget = new QWidget();
+		mCentralWidget = new QWidget(this);
 		mCentralWidget->setObjectName("window");
 
-		QVBoxLayout* centralLayout = new QVBoxLayout();
+		mContent = new QWidget(this);
+
+		QVBoxLayout* centralLayout = new QVBoxLayout(this);
 		centralLayout->setMargin(0);
 		centralLayout->addWidget(mCentralWidget);
 		setLayout(centralLayout);
 
-		QVBoxLayout* mainLayout = new QVBoxLayout();
+		QVBoxLayout* mainLayout = new QVBoxLayout(this);
 		mainLayout->setMargin(0);
 		mainLayout->setContentsMargins(2, 0, 2, 2);
 		mainLayout->setSpacing(0);
@@ -69,7 +72,19 @@ namespace CamelotEditor
 
 		//setAttribute(Qt::WA_TransparentForMouseEvents);
 		
-		connect(closeBtn, SIGNAL(clicked()), this, SLOT(closeWindow()));
+		retranslateUi(title);
+		setupSignals();
+	}
+
+	void QtEditorWindow::setupSignals()
+	{
+		connect(mBtnClose, SIGNAL(clicked()), this, SLOT(closeWindow()));
+	}
+
+	void QtEditorWindow::retranslateUi(QString title)
+	{
+		mLblTitle->setText(title);
+		mBtnClose->setText(tr("Close"));
 	}
 
 	QSizePolicy	QtEditorWindow::sizePolicy() const

+ 12 - 0
CamelotEditor/Source/CmQtHierarchyWindow.cpp

@@ -0,0 +1,12 @@
+#include "CmQtHierarchyWindow.h"
+
+namespace CamelotEditor
+{
+	QtHierarchyWindow::QtHierarchyWindow(QWidget* parent)
+		:QtEditorWindow(parent, "Hierarchy")
+	{
+
+	}
+
+	QtHierarchyWindow::~QtHierarchyWindow() { }
+}

+ 12 - 0
CamelotEditor/Source/CmQtSceneWindow.cpp

@@ -0,0 +1,12 @@
+#include "CmQtSceneWindow.h"
+
+namespace CamelotEditor
+{
+	QtSceneWindow::QtSceneWindow(QWidget* parent)
+		:QtEditorWindow(parent, "Scene")
+	{
+
+	}
+
+	QtSceneWindow::~QtSceneWindow() { }
+}

+ 28 - 0
CamelotEditor/Source/CmSceneWindowFactory.cpp

@@ -0,0 +1,28 @@
+#include "CmSceneWindowFactory.h"
+#include "CmQtSceneWindow.h"
+
+namespace CamelotEditor
+{
+	QtEditorWindow* SceneWindowFactory::create(QWidget* parent) const
+	{
+		return new QtSceneWindow(parent);
+	}
+
+	const QString& SceneWindowFactory::getWindowName() const
+	{
+		static QString name = "Scene";
+		return name;
+	}
+
+	const QString& SceneWindowFactory::getMenuCategory() const
+	{
+		static QString name = "Windows";
+		return name;
+	}
+
+	const QString& SceneWindowFactory::getMenuItemName() const
+	{
+		static QString name = "Scene";
+		return name;
+	}
+}