summaryrefslogtreecommitdiff
path: root/hammer/filtercontrol.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/filtercontrol.cpp
downloadarchived-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.cpp621
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();
+}