diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/ToolPointHandle.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/ToolPointHandle.cpp')
| -rw-r--r-- | hammer/ToolPointHandle.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/hammer/ToolPointHandle.cpp b/hammer/ToolPointHandle.cpp new file mode 100644 index 0000000..c7a52b1 --- /dev/null +++ b/hammer/ToolPointHandle.cpp @@ -0,0 +1,265 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "stdafx.h" +#include "History.h" +#include "MainFrm.h" // FIXME: For ObjectProperties +#include "MapDoc.h" +#include "MapView2D.h" +#include "MapPointHandle.h" +#include "PopupMenus.h" +#include "Render2D.h" +#include "StatusBarIDs.h" // For SetStatusText +#include "ToolManager.h" +#include "ToolPointHandle.h" +#include "Selection.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +class CToolPointHandleMsgWnd : public CWnd +{ + public: + + bool Create(void); + void PreMenu2D(CToolPointHandle *pTool, CMapView2D *pView); + + protected: + + //{{AFX_MSG_MAP(CToolPointHandleMsgWnd) + afx_msg void OnCenter(); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() + + private: + + CToolPointHandle *m_pToolPointHandle; + CMapView2D *m_pView2D; +}; + + +static CToolPointHandleMsgWnd s_wndToolMessage; +static const char *g_pszClassName = "ValveEditor_PointHandleToolWnd"; + + +BEGIN_MESSAGE_MAP(CToolPointHandleMsgWnd, CWnd) + //{{AFX_MSG_MAP(CToolPointHandleMsgWnd) + ON_COMMAND(ID_CENTER_ON_ENTITY, OnCenter) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: Creates the hidden window that receives context menu commands for the +// block tool. +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CToolPointHandleMsgWnd::Create(void) +{ + WNDCLASS wndcls; + memset(&wndcls, 0, sizeof(WNDCLASS)); + wndcls.lpfnWndProc = AfxWndProc; + wndcls.hInstance = AfxGetInstanceHandle(); + wndcls.lpszClassName = g_pszClassName; + + if (!AfxRegisterClass(&wndcls)) + { + return(false); + } + + return(CWnd::CreateEx(0, g_pszClassName, g_pszClassName, 0, CRect(0, 0, 10, 10), NULL, 0) == TRUE); +} + + +//----------------------------------------------------------------------------- +// Purpose: Attaches the tool to this window before activating the context menu. +//----------------------------------------------------------------------------- +void CToolPointHandleMsgWnd::PreMenu2D(CToolPointHandle *pToolPointHandle, CMapView2D *pView) +{ + Assert(pToolPointHandle != NULL); + m_pToolPointHandle = pToolPointHandle; + m_pView2D = pView; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CToolPointHandleMsgWnd::OnCenter() +{ + if (m_pToolPointHandle) + { + m_pToolPointHandle->CenterOnParent(m_pView2D); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Constructor. +//----------------------------------------------------------------------------- +CToolPointHandle::CToolPointHandle(void) +{ + m_pPoint = NULL; +} + + +//----------------------------------------------------------------------------- +// Purpose: Attaches the point to the tool for manipulation. +//----------------------------------------------------------------------------- +void CToolPointHandle::Attach(CMapPointHandle *pPoint) +{ + m_pPoint = pPoint; +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles left button down events in the 2D view. +// Input : Per CWnd::OnLButtonDown. +// Output : Returns true if the message was handled, false if not. +//----------------------------------------------------------------------------- +bool CToolPointHandle::OnLMouseDown2D(CMapView2D *pView, UINT nFlags, const Vector2D &VPoint) +{ + // + // Activate this tool and start dragging the axis endpoint. + // + ToolManager()->PushTool(TOOL_POINT_HANDLE); + pView->SetCapture(); + + GetHistory()->MarkUndoPosition( m_pDocument->GetSelection()->GetList(), "Modify Origin"); + GetHistory()->Keep(m_pPoint); + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles left button up events in the 2D view. +// Input : Per CWnd::OnLButtonUp. +// Output : Returns true if the message was handled, false if not. +//----------------------------------------------------------------------------- +bool CToolPointHandle::OnLMouseUp2D(CMapView2D *pView, UINT nFlags, const Vector2D &VPoint) +{ + m_pPoint->UpdateOrigin(m_pPoint->m_Origin); + + ToolManager()->PopTool(); + ReleaseCapture(); + + m_pDocument->UpdateAllViews( MAPVIEW_UPDATE_TOOL ); + + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles mouse move events in the 2D view. +// Input : Per CWnd::OnMouseMove. +// Output : Returns true if the message was handled, false if not. +//----------------------------------------------------------------------------- +bool CToolPointHandle::OnMouseMove2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint) +{ + // + // Make sure the point is visible. + // + pView->ToolScrollToPoint( vPoint ); + + // + // Snap the point to half the grid size. Do this so that we can always center + // the origin even on odd-width objects. + // + Vector vecWorld; + pView->ClientToWorld(vecWorld, vPoint); + + m_pDocument->Snap(vecWorld, constrainHalfSnap); + + // + // Move to the snapped position. + // + m_pPoint->m_Origin[pView->axHorz] = vecWorld[pView->axHorz]; + m_pPoint->m_Origin[pView->axVert] = vecWorld[pView->axVert]; + + // + // Update the status bar and the views. + // + char szBuf[128]; + sprintf(szBuf, " @%.0f, %.0f ", m_pPoint->m_Origin[pView->axHorz], m_pPoint->m_Origin[pView->axVert]); + SetStatusText(SBI_COORDS, szBuf); + + m_pDocument->UpdateAllViews( MAPVIEW_UPDATE_TOOL ); + + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: Renders the tool in the 2D view. +// Input : pRender - The interface to use for rendering. +//----------------------------------------------------------------------------- +void CToolPointHandle::RenderTool2D(CRender2D *pRender) +{ + SelectionState_t eState = m_pPoint->SetSelectionState(SELECT_MODIFY); + m_pPoint->Render2D(pRender); + m_pPoint->SetSelectionState(eState); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *pView - +// point - +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CToolPointHandle::OnContextMenu2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint) +{ + static CMenu menu, menuCreate; + static bool bInit = false; + + if (!bInit) + { + bInit = true; + + // Create the menu. + menu.LoadMenu(IDR_POPUPS); + menuCreate.Attach(::GetSubMenu(menu.m_hMenu, IDM_POPUP_POINT_HANDLE)); + + // Create the window that handles menu messages. + s_wndToolMessage.Create(); + } + + if (!pView->PointInClientRect(vPoint) ) + { + return false; + } + + CPoint ptScreen( vPoint.x,vPoint.y); + pView->ClientToScreen(&ptScreen); + + s_wndToolMessage.PreMenu2D(this, pView); + menuCreate.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN, ptScreen.x, ptScreen.y, &s_wndToolMessage); + + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CToolPointHandle::CenterOnParent(CMapView *pView) +{ + if (m_pPoint) + { + GetHistory()->MarkUndoPosition(m_pDocument->GetSelection()->GetList(), "Center Origin"); + GetHistory()->Keep(m_pPoint); + + CMapClass *pParent = m_pPoint->GetParent(); + + Vector vecCenter; + pParent->GetBoundsCenter(vecCenter); + m_pPoint->UpdateOrigin(vecCenter); + m_pDocument->UpdateAllViews( MAPVIEW_UPDATE_TOOL ); + } +} + |