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/filtercontrol.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/filtercontrol.cpp')
| -rw-r--r-- | hammer/filtercontrol.cpp | 621 |
1 files changed, 621 insertions, 0 deletions
diff --git a/hammer/filtercontrol.cpp b/hammer/filtercontrol.cpp new file mode 100644 index 0000000..8d692cc --- /dev/null +++ b/hammer/filtercontrol.cpp @@ -0,0 +1,621 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "stdafx.h" +#include "hammer.h" +#include "FilterControl.h" +#include "ControlBarIDs.h" +#include "MapWorld.h" +#include "GlobalFunctions.h" +#include "EditGroups.h" +#include "CustomMessages.h" +#include "VisGroup.h" +#include "Selection.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +typedef struct +{ + CVisGroup *pGroup; + CMapDoc *pDoc; + SelectMode_t eSelectMode; +} MARKMEMBERSINFO; + + +static const unsigned int g_uToggleStateMsg = ::RegisterWindowMessage(GROUPLIST_MSG_TOGGLE_STATE); +static const unsigned int g_uLeftDragDropMsg = ::RegisterWindowMessage(GROUPLIST_MSG_LEFT_DRAG_DROP); +static const unsigned int g_uRightDragDropMsg = ::RegisterWindowMessage(GROUPLIST_MSG_RIGHT_DRAG_DROP); + + +BEGIN_MESSAGE_MAP(CFilterControl, CHammerBar) + //{{AFX_MSG_MAP(CFilterControl) + ON_BN_CLICKED(IDC_EDITGROUPS, OnEditGroups) + ON_BN_CLICKED(IDC_MARKMEMBERS, OnMarkMembers) + ON_BN_CLICKED(IDC_SHOW_ALL, OnShowAllGroups) + ON_COMMAND_EX(IDC_VISGROUP_MOVEUP, OnMoveUpDown) + ON_COMMAND_EX(IDC_VISGROUP_MOVEDOWN, OnMoveUpDown) + ON_UPDATE_COMMAND_UI(IDC_GROUPS, UpdateControlGroups) + ON_UPDATE_COMMAND_UI(IDC_EDITGROUPS, UpdateControl) + ON_UPDATE_COMMAND_UI(IDC_MARKMEMBERS, UpdateControl) + ON_UPDATE_COMMAND_UI(IDC_SHOW_ALL, UpdateControl) + ON_UPDATE_COMMAND_UI(IDC_VISGROUP_MOVEUP, UpdateControl) + ON_UPDATE_COMMAND_UI(IDC_VISGROUP_MOVEDOWN, UpdateControl) + ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelChangeTab) + ON_WM_ACTIVATE() + ON_WM_SHOWWINDOW() + ON_WM_SIZE() + ON_WM_WINDOWPOSCHANGED() + ON_REGISTERED_MESSAGE(g_uToggleStateMsg, OnListToggleState) + ON_REGISTERED_MESSAGE(g_uLeftDragDropMsg, OnListLeftDragDrop) + ON_REGISTERED_MESSAGE(g_uRightDragDropMsg, OnListRightDragDrop) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pParentWnd - +// Output : Returns TRUE on success, FALSE on failure. +//----------------------------------------------------------------------------- +BOOL CFilterControl::Create(CWnd *pParentWnd) +{ + if (!CHammerBar::Create(pParentWnd, IDD_FILTERCONTROL, CBRS_RIGHT | CBRS_SIZE_DYNAMIC, IDCB_FILTERCONTROL, "Filter Control")) + + { + return FALSE; + } + + m_cGroupBox.SubclassDlgItem(IDC_GROUPS, this); + m_cGroupBox.EnableChecks(); + + m_cTabControl.SubclassDlgItem(IDC_TAB1, this); + m_cTabControl.InsertItem(0, "User"); + m_cTabControl.InsertItem(1, "Auto"); + + // + // Set up button icons. + // + CWinApp *pApp = AfxGetApp(); + HICON hIcon = pApp->LoadIcon(IDI_MOVE_UP); + ((CButton *)GetDlgItem(IDC_VISGROUP_MOVEUP))->SetIcon(hIcon); + + hIcon = pApp->LoadIcon(IDI_MOVE_DOWN); + ((CButton *)GetDlgItem(IDC_VISGROUP_MOVEDOWN))->SetIcon(hIcon); + + AddControl( IDC_GROUPS, GROUP_BOX ); + AddControl( IDC_VISGROUP_MOVEUP, BOTTOM_JUSTIFY ); + AddControl( IDC_VISGROUP_MOVEDOWN, BOTTOM_JUSTIFY ); + AddControl( IDC_SHOW_ALL, BOTTOM_JUSTIFY ); + AddControl( IDC_EDITGROUPS, BOTTOM_JUSTIFY ); + AddControl( IDC_MARKMEMBERS, BOTTOM_JUSTIFY ); + AddControl( IDC_TAB1, GROUP_BOX ); + + // Add all the VisGroups to the list. + UpdateGroupList(); + + bInitialized = TRUE; + m_bShowingAuto = FALSE; + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : nLength - +// dwMode - +// Output : CSize +//----------------------------------------------------------------------------- +CSize CFilterControl::CalcDynamicLayout(int nLength, DWORD dwMode) +{ + // TODO: make larger / resizable when floating + //if (IsFloating()) + //{ + // return CSize(200, 300); + //} + + return CHammerBar::CalcDynamicLayout(nLength, dwMode); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : nType - +// cx - +// cy - +//----------------------------------------------------------------------------- +void CFilterControl::OnSize(UINT nType, int cx, int cy) +{ + // TODO: make larger / resizable when floating + //if (IsFloating()) + //{ + // CWnd *pwnd = GetDlgItem(IDC_GROUPS); + // if (pwnd && IsWindow(pwnd->GetSafeHwnd())) + // { + // pwnd->MoveWindow(2, 10, cx - 2, cy - 2, TRUE); + // } + //} + + CHammerBar::OnSize(nType, cx, cy); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFilterControl::UpdateGroupList(void) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc == NULL) + { + m_cGroupBox.DeleteAllItems(); + return; + } + + m_cGroupBox.SaveVisGroupExpandStates(); + + CVisGroup *pVisGroup = m_cGroupBox.GetSelectedVisGroup(); + + m_cGroupBox.SetRedraw(false); + m_cGroupBox.DeleteAllItems(); + + int nCount = pDoc->VisGroups_GetRootCount(); + + for (int i = 0; i < nCount; i++) + { + CVisGroup *pGroup = pDoc->VisGroups_GetRootVisGroup(i); + int compareValue = strcmp( pGroup->GetName(), "Auto" ); + if ( (compareValue == 0 && m_bShowingAuto) ||(compareValue != 0 && !m_bShowingAuto) ) + { + m_cGroupBox.AddVisGroup(pGroup); + } + } + + UpdateGroupListChecks(); + + if (pVisGroup) + { + m_cGroupBox.EnsureVisible(pVisGroup); + m_cGroupBox.SelectVisGroup(pVisGroup); + } + + m_cGroupBox.RestoreVisGroupExpandStates(); + m_cGroupBox.SetRedraw(true); + m_cGroupBox.Invalidate(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pCmdUI - +//----------------------------------------------------------------------------- +void CFilterControl::UpdateControl(CCmdUI *pCmdUI) +{ + pCmdUI->Enable(GetActiveWorld() ? TRUE : FALSE); +} + + +//----------------------------------------------------------------------------- +// Purpose: Disables the group list when there's no active world or when the +// visgroups are currently overridden by the "Show All" button. +//----------------------------------------------------------------------------- +void CFilterControl::UpdateControlGroups(CCmdUI *pCmdUI) +{ + pCmdUI->Enable((GetActiveWorld() != NULL) && !CVisGroup::IsShowAllActive()); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pTarget - +// bDisableIfNoHndler - +//----------------------------------------------------------------------------- +void CFilterControl::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) +{ + UpdateDialogControls(pTarget, FALSE); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFilterControl::OnShowAllGroups(void) +{ + CButton *pButton = (CButton *)GetDlgItem(IDC_SHOW_ALL); + if (pButton != NULL) + { + UINT uCheck = pButton->GetCheck(); + CVisGroup::ShowAllVisGroups(uCheck == 1); + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + pDoc->UpdateVisibilityAll(); + + UpdateGroupListChecks(); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CFilterControl::OnMoveUpDown(UINT uCmd) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (!pDoc) + { + return TRUE; + } + + CVisGroup *pVisGroup = m_cGroupBox.GetSelectedVisGroup(); + if (pVisGroup == NULL) + { + return TRUE; + } + + if (uCmd == IDC_VISGROUP_MOVEUP) + { + pDoc->VisGroups_MoveUp(pVisGroup); + } + else + { + pDoc->VisGroups_MoveDown(pVisGroup); + } + + UpdateGroupList(); + + m_cGroupBox.EnsureVisible(pVisGroup); + m_cGroupBox.SelectVisGroup(pVisGroup); + + pDoc->SetModifiedFlag(); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFilterControl::OnEditGroups(void) +{ + CEditGroups dlg; + dlg.DoModal(); + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + pDoc->SetModifiedFlag(); + } + + UpdateGroupList(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pObject - +// pInfo - +// Output : Returns TRUE to continue enumerating, FALSE to stop. +//----------------------------------------------------------------------------- +static BOOL MarkMembersOfGroup(CMapClass *pObject, MARKMEMBERSINFO *pInfo) +{ + if (pObject->IsInVisGroup(pInfo->pGroup)) + { + if (!pObject->IsVisible()) + { + return TRUE; + } + + CMapClass *pSelectObject = pObject->PrepareSelection(pInfo->eSelectMode); + if (pSelectObject) + { + pInfo->pDoc->SelectObject(pSelectObject, scSelect); + } + } + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: Selects all objects that belong to the currently selected visgroup. +//----------------------------------------------------------------------------- +void CFilterControl::OnMarkMembers(void) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc) + { + CVisGroup *pVisGroup = m_cGroupBox.GetSelectedVisGroup(); + if (pVisGroup) + { + pDoc->GetSelection()->SetMode(selectObjects); + + // Clear the selection. + pDoc->SelectObject(NULL, scClear|scSaveChanges); + + // + // Select all objects that belong to the visgroup. + // + CMapWorld *pWorld = pDoc->GetMapWorld(); + EnumChildrenPos_t pos; + CMapClass *pChild = pWorld->GetFirstDescendent(pos); + while (pChild) + { + if (pChild->IsInVisGroup(pVisGroup)) + { + if (pChild->IsVisible()) + { + CMapClass *pSelectObject = pChild->PrepareSelection(pDoc->GetSelection()->GetMode()); + if (pSelectObject) + { + pDoc->SelectObject(pSelectObject, scSelect); + } + } + } + + pChild = pWorld->GetNextDescendent(pos); + } + } + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pPos - +//----------------------------------------------------------------------------- +void CFilterControl::OnWindowPosChanged(WINDOWPOS *pPos) +{ + if (bInitialized && pPos->flags & SWP_SHOWWINDOW) + { + UpdateGroupList(); + } + + CHammerBar::OnWindowPosChanged(pPos); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : bShow - +// nStatus - +//----------------------------------------------------------------------------- +void CFilterControl::OnShowWindow(BOOL bShow, UINT nStatus) +{ + if (bShow) + { + UpdateGroupList(); + } + + CHammerBar::OnShowWindow(bShow, nStatus); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : nState - +// pWnd - +// bMinimized - +//----------------------------------------------------------------------------- +void CFilterControl::OnActivate(UINT nState, CWnd* pWnd, BOOL bMinimized) +{ + if (nState == WA_ACTIVE) + { + UpdateGroupList(); + } + + CHammerBar::OnActivate(nState, pWnd, bMinimized); +} + + +//----------------------------------------------------------------------------- +// Purpose: Called when the visibility of a group is toggled in the groups list. +// Input : wParam - Index of item in the groups list that was toggled. +// lParam - 0 to hide, 1 to show. +// Output : Returns zero. +//----------------------------------------------------------------------------- +LRESULT CFilterControl::OnListToggleState(WPARAM wParam, LPARAM lParam) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + // + // Update the visibility of the group. + // + CVisGroup *pVisGroup = (CVisGroup *)wParam; + if (pVisGroup != NULL) + { + pDoc->VisGroups_ShowVisGroup(pVisGroup, pVisGroup->GetVisible() == VISGROUP_HIDDEN); + } + + UpdateGroupListChecks(); + } + + return 0; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wParam - +// lParam - +// Output : LRESULT +//----------------------------------------------------------------------------- +LRESULT CFilterControl::OnListLeftDragDrop(WPARAM wParam, LPARAM lParam) +{ + if ( m_bShowingAuto == TRUE ) + { + UpdateGroupList(); + return 0; + } + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + CVisGroup *pDragGroup = (CVisGroup *)wParam; + CVisGroup *pDropGroup = (CVisGroup *)lParam; + + if (pDropGroup != NULL) + { + if (pDragGroup->FindDescendent(pDropGroup)) + { + CString str; + str.Format("Cannot combine the groups because '%s' is a sub-group of '%s'.", pDropGroup->GetName(), pDragGroup->GetName()); + AfxMessageBox(str); + UpdateGroupList(); + return 0; + } + + CString str; + str.Format("Combine group '%s' into group '%s'?", pDragGroup->GetName(), pDropGroup->GetName()); + if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDNO) + { + UpdateGroupList(); + return 0; + } + + pDoc->VisGroups_CombineGroups(pDragGroup, pDropGroup); + } + else + { + CString str; + str.Format("Delete group '%s'?", pDragGroup->GetName()); + if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDNO) + { + UpdateGroupList(); + return 0; + } + + // Show the visgroup that's being deleted so that member objects are shown. + pDoc->VisGroups_CheckMemberVisibility(pDragGroup); + pDoc->VisGroups_RemoveGroup(pDragGroup); + } + } + + UpdateGroupList(); + + return 0; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wParam - +// lParam - +// Output : LRESULT +//----------------------------------------------------------------------------- +LRESULT CFilterControl::OnListRightDragDrop(WPARAM wParam, LPARAM lParam) +{ + if ( m_bShowingAuto == TRUE ) + { + UpdateGroupList(); + return 0; + } + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + CVisGroup *pDragGroup = (CVisGroup *)wParam; + CVisGroup *pDropGroup = (CVisGroup *)lParam; + + if (pDragGroup->FindDescendent(pDropGroup)) + { + CString str; + str.Format("Cannot move the group because '%s' is a sub-group of '%s'.", pDropGroup->GetName(), pDragGroup->GetName()); + AfxMessageBox(str); + return 0; + } + + pDoc->VisGroups_SetParent(pDragGroup, pDropGroup); + UpdateGroupList(); + } + + return 0; +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wParam - +// lParam - +// pResult - +// Output : Returns TRUE on success, FALSE on failure. +//----------------------------------------------------------------------------- +BOOL CFilterControl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT *pResult) +{ + NMHDR *pnmh = (NMHDR *)lParam; + + if (pnmh->idFrom == IDC_GROUPS) + { + switch (pnmh->code) + { + case TVN_SELCHANGED: + { + CVisGroup *pGroup = m_cGroupBox.GetSelectedVisGroup(); + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pGroup && pDoc) + { + bool bCanMoveUp = pDoc->VisGroups_CanMoveUp(pGroup); + bool bCanMoveDown = pDoc->VisGroups_CanMoveDown(pGroup); + GetDlgItem(IDC_VISGROUP_MOVEUP)->EnableWindow(bCanMoveUp); + GetDlgItem(IDC_VISGROUP_MOVEDOWN)->EnableWindow(bCanMoveDown); + } + + return(TRUE); + } + } + } + + return(CWnd::OnNotify(wParam, lParam, pResult)); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CFilterControl::OnInitDialog(void) +{ + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFilterControl::UpdateGroupListChecks(void) +{ + int nCount = m_cGroupBox.GetVisGroupCount(); + for (int i = 0; i < nCount; i++) + { + CVisGroup *pVisGroup = m_cGroupBox.GetVisGroup(i); + if (pVisGroup->GetVisible() == VISGROUP_HIDDEN) + { + m_cGroupBox.SetCheck(pVisGroup, 0); + } + else if (pVisGroup->GetVisible() == VISGROUP_SHOWN) + { + m_cGroupBox.SetCheck(pVisGroup, 1); + } + else + { + m_cGroupBox.SetCheck(pVisGroup, -1); + } + } +} + +void CFilterControl::OnSelChangeTab(NMHDR *header, LRESULT *result) +{ + if ( m_cTabControl.GetCurSel() == 0 ) + { + m_bShowingAuto = FALSE; + } + else + { + m_bShowingAuto = TRUE; + } + UpdateGroupList(); +} |