summaryrefslogtreecommitdiff
path: root/hammer/ToolManager.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/ToolManager.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/ToolManager.cpp')
-rw-r--r--hammer/ToolManager.cpp305
1 files changed, 305 insertions, 0 deletions
diff --git a/hammer/ToolManager.cpp b/hammer/ToolManager.cpp
new file mode 100644
index 0000000..45f36dc
--- /dev/null
+++ b/hammer/ToolManager.cpp
@@ -0,0 +1,305 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// TODO: add an autoregistration system for tools a la LINK_ENTITY_TO_CLASS
+//=============================================================================//
+
+#include "stdafx.h"
+#include "MapDoc.h"
+#include "MainFrm.h"
+#include "MapView2D.h" // FIXME: for MapView2D::updTool
+#include "ToolAxisHandle.h"
+#include "ToolDecal.h"
+#include "ToolDisplace.h"
+#include "ToolManager.h"
+#include "ToolMagnify.h"
+#include "ToolMaterial.h"
+#include "ToolPickFace.h"
+#include "ToolPickAngles.h"
+#include "ToolPickEntity.h"
+#include "ToolPointHandle.h"
+#include "ToolSphere.h"
+#include "ToolSweptHull.h"
+#include "ToolBlock.h"
+#include "ToolCamera.h"
+#include "ToolClipper.h"
+#include "ToolCordon.h"
+#include "ToolEntity.h"
+#include "ToolMorph.h"
+#include "ToolOverlay.h"
+#include "ToolSelection.h"
+#include "ToolMagnify.h"
+#include "ToolMaterial.h"
+#include "ChunkFile.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+static CToolManager s_DummyToolmanager;
+
+CToolManager* ToolManager()
+{
+ CMapDoc *pDoc = CMapDoc::GetActiveMapDoc();
+
+ if ( pDoc )
+ return pDoc->GetTools();
+
+ return &s_DummyToolmanager;
+}
+//-----------------------------------------------------------------------------
+// Purpose: Prepares the tool manager for use.
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CToolManager::Init( CMapDoc *pDocument )
+{
+
+ // add default tools
+
+ //
+ // Create the tools that are held by the tool manager and add them
+ // to the internal tools list.
+ //
+
+ RemoveAllTools();
+
+ m_pDocument = pDocument;
+
+ AddTool( new CToolDisplace );
+ AddTool( new CToolMagnify );
+ AddTool( new CToolDecal );
+ AddTool( new CToolMaterial );
+ AddTool( new CToolAxisHandle );
+ AddTool( new CToolPointHandle );
+ AddTool( new CToolSphere );
+ AddTool( new CToolPickAngles );
+ AddTool( new CToolPickEntity );
+ AddTool( new CToolPickFace );
+ AddTool( new CToolSweptPlayerHull );
+ AddTool( new Selection3D );
+ AddTool( new CToolBlock );
+ AddTool( new CToolEntity );
+ AddTool( new Camera3D );
+ AddTool( new Morph3D );
+ AddTool( new Clipper3D );
+ AddTool( new Cordon3D );
+ AddTool( new CToolOverlay );
+
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Shuts down the tool manager - called on app exit.
+//-----------------------------------------------------------------------------
+void CToolManager::Shutdown()
+{
+ m_pActiveTool = NULL;
+ m_pDocument = NULL;
+ RemoveAllTools();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor. Allocates the tools.
+//-----------------------------------------------------------------------------
+CToolManager::CToolManager()
+{
+ m_pActiveTool = NULL;
+ m_pDocument = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor. Deletes the tools.
+//-----------------------------------------------------------------------------
+CToolManager::~CToolManager()
+{
+ Shutdown();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CToolManager::AddTool(CBaseTool *pTool)
+{
+ if ( GetToolForID( pTool->GetToolID() ) )
+ {
+ Assert( !pTool );
+ Msg("CToolManager::AddTool: Tool %i already registered.\n", pTool->GetToolID());
+ return;
+ }
+
+ pTool->Init( m_pDocument );
+
+ m_Tools.AddToTail(pTool);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CBaseTool *CToolManager::GetActiveTool()
+{
+ return m_pActiveTool;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns a tool pointer for a given tool ID, NULL if there is no
+// corresponding tool.
+//-----------------------------------------------------------------------------
+CBaseTool *CToolManager::GetToolForID(ToolID_t eToolID)
+{
+ int nToolCount = GetToolCount();
+ for (int i = 0; i < nToolCount; i++)
+ {
+ CBaseTool *pTool = GetTool(i);
+ if (pTool->GetToolID() == eToolID)
+ {
+ return pTool;
+ }
+ }
+
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the ID of the active tool.
+//-----------------------------------------------------------------------------
+ToolID_t CToolManager::GetActiveToolID()
+{
+ if ( m_pActiveTool )
+ return m_pActiveTool->GetToolID();
+ else
+ return TOOL_NONE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Pushes a new tool onto the tool stack and activates it. The active
+// tool will be deactivated and reactivated when PopTool is called.
+//-----------------------------------------------------------------------------
+void CToolManager::PushTool(ToolID_t eToolID)
+{
+ //
+ // Add the new tool to the top of the tool stack.
+ //
+ if (eToolID != GetActiveToolID())
+ {
+ m_ToolIDStack.AddToHead(GetActiveToolID());
+ }
+
+ SetTool(eToolID);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Restores the active tool to what it was when PushTool was called.
+// If the stack is underflowed somehow, the pointer is restored.
+//-----------------------------------------------------------------------------
+void CToolManager::PopTool()
+{
+ int nCount = m_ToolIDStack.Count();
+ if (nCount > 0)
+ {
+ ToolID_t eNewTool = m_ToolIDStack.Element(0);
+ m_ToolIDStack.Remove(0);
+
+ SetTool(eNewTool);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Sets the current active tool by ID.
+// Input : iTool - ID of the tool to activate.
+//-----------------------------------------------------------------------------
+void CToolManager::SetTool(ToolID_t eNewTool)
+{
+ CBaseTool *pNewTool = GetToolForID(eNewTool);
+ CBaseTool *pOldTool = m_pActiveTool;
+
+ // Check to see that we can deactive the current tool
+ if ( pOldTool && (pOldTool != pNewTool) )
+ {
+ // Deactivate the current tool unless we are just 'reactivating' it.
+ if( !pOldTool->CanDeactivate() )
+ return;
+ }
+
+ // set active tool to new tool already so old tool can peek whats coming next
+ m_pActiveTool = pNewTool;
+
+ // deactivate the old tool if different.
+ if ( pOldTool && (pOldTool != pNewTool) )
+ {
+ pOldTool->Deactivate();
+ }
+
+ // always activate the new tool
+ if ( pNewTool )
+ {
+ pNewTool->Activate();
+ }
+
+ // FIXME: When we start up, we end up here before the main window is created because
+ // CFaceEditDispPage::OnSetActive() calls SetTool(TOOL_FACEEDIT_DISP). This
+ // behavior is rather nonsensical during startup.
+ CMainFrame *pwndMain = GetMainWnd();
+ if (pwndMain != NULL)
+ {
+ pwndMain->m_ObjectBar.UpdateListForTool(eNewTool);
+ }
+
+ if ( m_pDocument )
+ m_pDocument->UpdateAllViews( MAPVIEW_UPDATE_TOOL );
+}
+
+ChunkFileResult_t CToolManager::SaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo)
+{
+ for (int i=0;i<m_Tools.Count(); i++)
+ {
+ if ( m_Tools[i]->GetVMFChunkName() != NULL )
+ {
+ m_Tools[i]->SaveVMF( pFile, pSaveInfo );
+ }
+ }
+
+ return ChunkFile_Ok;
+}
+
+
+ChunkFileResult_t CToolManager::LoadCallback(CChunkFile *pFile, CBaseTool *pTool)
+{
+ return pTool->LoadVMF( pFile );
+}
+
+
+void CToolManager::AddToolHandlers( CChunkHandlerMap *pHandlersMap )
+{
+ for (int i=0;i<m_Tools.Count(); i++)
+ {
+ if ( m_Tools[i]->GetVMFChunkName() != NULL )
+ {
+ pHandlersMap->AddHandler( m_Tools[i]->GetVMFChunkName(), (ChunkHandler_t)LoadCallback, m_Tools[i] );
+ }
+ }
+}
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Removes all the document-created tools from the tools list.
+//-----------------------------------------------------------------------------
+void CToolManager::RemoveAllTools()
+{
+ m_pActiveTool = NULL;
+ m_Tools.PurgeAndDeleteElements();
+ m_ToolIDStack.RemoveAll();
+}
+
+