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/op_groups.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'hammer/op_groups.cpp')
| -rw-r--r-- | hammer/op_groups.cpp | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/hammer/op_groups.cpp b/hammer/op_groups.cpp new file mode 100644 index 0000000..3447784 --- /dev/null +++ b/hammer/op_groups.cpp @@ -0,0 +1,297 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Implements the groups page of the Object Properties dialog. This +// allows the user to edit which visgroups the selected objects belong to. +// +//=============================================================================// + +#include "stdafx.h" +#include "hammer.h" +#include "MapWorld.h" +#include "OP_Groups.h" +#include "EditGroups.h" +#include "GlobalFunctions.h" +#include "CustomMessages.h" +#include "ObjectProperties.h" +#include "VisGroup.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +const char *NO_GROUP_STRING = "(no group)"; +const DWORD NO_GROUP_ID = 0xffff; +const DWORD VALUE_DIFFERENT_ID = 0xfffe; + + +static const unsigned int g_uToggleStateMsg = ::RegisterWindowMessage(GROUPLIST_MSG_TOGGLE_STATE); + + +BEGIN_MESSAGE_MAP(COP_Groups, CObjectPage) + //{{AFX_MSG_MAP(COP_Groups) + ON_BN_CLICKED(IDC_EDITGROUPS, OnEditgroups) + ON_REGISTERED_MESSAGE(g_uToggleStateMsg, OnListToggleState) + ON_WM_SIZE() + //}}AFX_MSG_MAP + ON_WM_SETFOCUS() +END_MESSAGE_MAP() + +IMPLEMENT_DYNCREATE(COP_Groups, CObjectPage) + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +COP_Groups::COP_Groups() + : CObjectPage(COP_Groups::IDD) +{ + //{{AFX_DATA_INIT(COP_Groups) + //}}AFX_DATA_INIT + m_pEditObjectRuntimeClass = RUNTIME_CLASS(editCMapClass); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +COP_Groups::~COP_Groups() +{ +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pDX - +//----------------------------------------------------------------------------- +void COP_Groups::DoDataExchange(CDataExchange* pDX) +{ + CObjectPage::DoDataExchange(pDX); + //{{AFX_DATA_MAP(COP_Model) + DDX_Control(pDX, IDC_EDITGROUPS, m_EditGroupsControl); + //}}AFX_DATA_MAP +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : b - +//----------------------------------------------------------------------------- +void COP_Groups::SetMultiEdit(bool b) +{ + CObjectPage::SetMultiEdit(b); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool COP_Groups::SaveData(void) +{ + if (!IsWindow(m_hWnd)) + { + return false; + } + + int nCount = m_cGroups.GetVisGroupCount(); + for (int i = 0; i < nCount; i++) + { + CVisGroup *pVisGroup = m_cGroups.GetVisGroup(i); + + // Don't let users edit Auto VisGroup membership! + if ( pVisGroup->IsAutoVisGroup() ) + continue; + + int nCheck = m_cGroups.GetCheck(pVisGroup); + + if (nCheck != -1) + { + FOR_EACH_OBJ( *m_pObjectList, pos ) + { + CMapClass *pObject = m_pObjectList->Element(pos); + if (nCheck) + { + pObject->AddVisGroup(pVisGroup); + } + else + { + pObject->RemoveVisGroup(pVisGroup); + } + } + } + } + + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : Mode - +// pData - +//----------------------------------------------------------------------------- +void COP_Groups::UpdateData( int Mode, void *pData, bool bCanEdit ) +{ + __super::UpdateData( Mode, pData, bCanEdit ); + + if ( !IsWindow(m_hWnd) ) + { + return; + } + + static int s_checkState[128]; + + if (Mode == LoadData || Mode == LoadFirstData) + { + CMapClass *pObject = (CMapClass *)pData; + + if (Mode == LoadFirstData) + { + UpdateGroupList(); + + // + // Loading the first object. check each group this object is in. + // + int nCount = m_cGroups.GetVisGroupCount(); + for (int i = 0; i < nCount; i++) + { + CVisGroup *pVisGroup = m_cGroups.GetVisGroup(i); + s_checkState[i] = pObject->IsInVisGroup(pVisGroup); + } + } + else + { + // + // Loading subsequent objects. + // + int nCount = m_cGroups.GetVisGroupCount(); + for (int i = 0; i < nCount; i++) + { + if ( s_checkState[i] != -1) + { + CVisGroup *pVisGroup = m_cGroups.GetVisGroup(i); + + if ( pObject->IsInVisGroup(pVisGroup) != s_checkState[i] ) + { + s_checkState[i] = -1; + } + } + } + } + } + else if ( Mode == LoadFinished ) + { + int nCount = m_cGroups.GetVisGroupCount(); + for (int i = 0; i < nCount; i++) + { + CVisGroup *pVisGroup = m_cGroups.GetVisGroup(i); + m_cGroups.SetCheck(pVisGroup, s_checkState[i]); + } + } + + m_cGroups.EnableWindow( ( m_bCanEdit ? TRUE : FALSE ) ); + m_EditGroupsControl.EnableWindow( ( m_bCanEdit ? TRUE : FALSE ) ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void COP_Groups::UpdateGroupList(void) +{ + if (!IsWindow(m_hWnd)) + { + return; + } + + m_cGroups.SetRedraw(false); + m_cGroups.DeleteAllItems(); + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + int nCount = pDoc->VisGroups_GetCount(); + for (int i = 0; i < nCount; i++) + { + CVisGroup *pGroup = pDoc->VisGroups_GetVisGroup(i); + if (!pGroup->GetParent()) + { + m_cGroups.AddVisGroup(pGroup); + } + } + } + + m_cGroups.ExpandAll(); + m_cGroups.SetRedraw(true); + m_cGroups.Invalidate(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void COP_Groups::OnEditgroups() +{ + CEditGroups dlg; + dlg.DoModal(); + + UpdateGroupList(); + // dvs: TODO: update the check state for all groups +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL COP_Groups::OnInitDialog() +{ + CObjectPage::OnInitDialog(); + + m_cGroups.SubclassDlgItem(IDC_GROUPS, this); + m_cGroups.EnableChecks(); + + CAnchorDef anchorDefs[] = + { + CAnchorDef( IDC_GROUPS, k_eSimpleAnchorAllSides ), + CAnchorDef( IDC_EDITGROUPS, k_eSimpleAnchorBottomRight ) + }; + m_AnchorMgr.Init( GetSafeHwnd(), anchorDefs, ARRAYSIZE( anchorDefs ) ); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: Called when the check state of a group is toggled in the groups list. +// Input : wParam - Index of item in the groups list that was toggled. +// lParam - New check state. +// Output : Returns zero. +//----------------------------------------------------------------------------- +LRESULT COP_Groups::OnListToggleState(WPARAM wParam, LPARAM lParam) +{ + CVisGroup *pVisGroup = (CVisGroup *)wParam; + + // Don't let users edit Auto VisGroup membership! + if ( pVisGroup->IsAutoVisGroup() ) + return 0; + + m_cGroups.SetCheck(pVisGroup, (int)lParam); + + return 0; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *pOld - +//----------------------------------------------------------------------------- +void COP_Groups::OnSetFocus(CWnd *pOld) +{ + // fixme: + //UpdateGrouplist(); + CPropertyPage::OnSetFocus(pOld); +} + +void COP_Groups::OnSize( UINT nType, int cx, int cy ) +{ + m_AnchorMgr.OnSize(); +} |