summaryrefslogtreecommitdiff
path: root/hammer/hammerbar.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/hammerbar.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/hammerbar.cpp')
-rw-r--r--hammer/hammerbar.cpp268
1 files changed, 268 insertions, 0 deletions
diff --git a/hammer/hammerbar.cpp b/hammer/hammerbar.cpp
new file mode 100644
index 0000000..4f81bca
--- /dev/null
+++ b/hammer/hammerbar.cpp
@@ -0,0 +1,268 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Implements a special dockable dialog bar that activates itself when
+// the mouse cursor moves over it. This enables stacking of the
+// bars with only a small portion of each visible.
+//
+// $Workfile: $
+// $Date: $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "stdafx.h"
+#include "hammer.h"
+#include "HammerBar.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+BEGIN_MESSAGE_MAP(CHammerBar, CDialogBar)
+ ON_WM_SETCURSOR()
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Automagically bring this bar to the top when the mouse cursor passes
+// over it.
+// Input : pWnd -
+// nHitTest -
+// message -
+// Output : Always returns FALSE.
+//-----------------------------------------------------------------------------
+BOOL CHammerBar::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
+{
+ if (APP()->IsActiveApp())
+ {
+ // The control bar window is actually our grandparent.
+ CWnd *pwnd = GetParent();
+ if (pwnd != NULL)
+ {
+ pwnd = pwnd->GetParent();
+ if (pwnd != NULL)
+ {
+ pwnd->BringWindowToTop();
+ }
+ }
+ }
+
+ //this wasn't being called and fixes some minor cursor problems.
+ return CWnd::OnSetCursor( pWnd, nHitTest, message );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: called automatically on a resize.
+// calls the function to move the bar's controls around on a resize.
+// also calls the CWnd OnSize so it can do what it needs to.
+// Input : passed in by windows
+// UINT nType
+// int cx - change in width
+// int cy - change in height
+// Output : void
+//-----------------------------------------------------------------------------
+void CHammerBar::OnSize( UINT nType, int cx, int cy )
+{
+ CWnd::OnSize( nType, cx, cy );
+ AdjustControls();
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: called by windows when the edges of the dialog are clicked
+// returns the size of the dialog
+// Input : passed automatically by windows
+// int nLength - amount the dialog edge has moved
+// DWORD dwMode - type of dialog/movement we are dealing with
+// Output : CSize - size of the dialog
+//-----------------------------------------------------------------------------
+CSize CHammerBar::CalcDynamicLayout(int nLength, DWORD dwMode)
+{
+ CSize newSize;
+
+ // If the bar is docked, use the default size
+ if ( (dwMode & LM_VERTDOCK) || (dwMode & LM_HORZDOCK) )
+ {
+ m_sizeDocked.cy = m_sizeFloating.cy;
+ return m_sizeDocked;
+ }
+
+ //if the bar is floating, use the current floating size
+ if ( dwMode & LM_MRUWIDTH )
+ {
+ return m_sizeFloating;
+ }
+
+ // In all other cases, we are changing the length with a drag
+ if ( dwMode & LM_LENGTHY )
+ {
+ //the bar is being resized in the y direction
+ newSize = CSize( m_sizeFloating.cx, m_sizeFloating.cy = nLength );
+ }
+ else
+ {
+ //the bar is being resized in the x direction
+ newSize = CSize( m_sizeFloating.cx = nLength, m_sizeFloating.cy);
+ }
+
+ CString textTitle;
+ GetWindowText( textTitle );
+
+ //it should not be possible that a bar with no name could be dynamic; this check is just to be safe
+ if ( !textTitle.IsEmpty() )
+ {
+ //writing the new size of the bar to the registry
+ textTitle = "FloatingBarSize\\" + textTitle;
+ APP()->WriteProfileInt( textTitle, "floatX", newSize.cx );
+ APP()->WriteProfileInt( textTitle, "floatY", newSize.cy );
+ }
+
+ return newSize;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: creates the CHammerBar.
+// makes sure a bar created with this old function isn't dyanmic
+// initializes size variables.
+// Input : CWnd *pParentWnd
+// UINT nIDTemplate - the ID of the dialog to be created
+// UINT nStyle - the type of dialog we are making
+// UINT nID -
+// Output : BOOL - TRUE on success
+//-----------------------------------------------------------------------------
+BOOL CHammerBar::Create( CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID )
+{
+ //cannot have a dynamic bar with this Create function; must use the one that takes the window name
+ UINT nStyleFixed = nStyle & ~CBRS_SIZE_DYNAMIC;
+
+ if ( !CDialogBar::Create(pParentWnd,nIDTemplate,nStyleFixed,nID) )
+ return FALSE;
+
+ m_sizeFloating = m_sizeDocked = m_sizeDefault;
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: creates the CHammerBar.
+// initializes size variables.
+// reads saved dimension information from registry
+// Input : CWnd *pParentWnd
+// UINT nIDTemplate - the ID of the dialog to be created
+// UINT nStyle - the type of dialog we are making
+// UINT nID -
+// Output : BOOL - TRUE on success
+//-----------------------------------------------------------------------------
+BOOL CHammerBar::Create( CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID, char *pszName )
+{
+ UINT nStyleFixed = nStyle;
+ if ( *pszName == 0 )
+ {
+ //did not give a title and cannot have a dynamic bar. Routing back through old create
+ return Create( pParentWnd, nIDTemplate, nStyle, nID );
+ }
+ else
+ {
+ if ( !CDialogBar::Create(pParentWnd,nIDTemplate,nStyleFixed,nID) )
+ return FALSE;
+
+ SetWindowText( pszName );
+
+ CString textTitle;
+ textTitle = "FloatingBarSize\\" + CString(pszName);
+
+ //read size from registry
+ m_sizeFloating.cx = APP()->GetProfileInt( textTitle, "floatX", m_sizeDefault.cx );
+ m_sizeFloating.cy = APP()->GetProfileInt( textTitle, "floatY", m_sizeDefault.cy );
+ m_sizeDocked = m_sizeDefault;
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: moves controls based on their placement information
+//
+// Input : void
+//
+// Output : void
+//-----------------------------------------------------------------------------
+void CHammerBar::AdjustControls( void )
+{
+ CRect HammerBarPos;
+ GetWindowRect( &HammerBarPos );
+ int nHammerBarHeight = HammerBarPos.Height();
+ int nHammerBarWidth = HammerBarPos.Width();
+
+ for( int iControl = 0; iControl < m_ControlList.Size(); iControl++ )
+ {
+ ControlInfo_t currentControl = m_ControlList[ iControl ];
+ int nDialogID = currentControl.m_nIDDialogItem;
+ int nControlWidthDifference = currentControl.m_nWidthBuffer;
+ int nControlHeightDifference = currentControl.m_nHeightBuffer;
+ DWORD dwPlacement = currentControl.m_dwPlacementFlag;
+
+ CWnd* pControl = GetDlgItem( nDialogID );
+ if ( pControl != NULL )
+ {
+ if ( dwPlacement & GROUP_BOX )
+ {
+ pControl->SetWindowPos( NULL, 0, 0, nHammerBarWidth - nControlWidthDifference ,
+ nHammerBarHeight - nControlHeightDifference, SWP_NOMOVE|SWP_NOZORDER );
+ }
+ if ( dwPlacement & BOTTOM_JUSTIFY )
+ {
+ CRect controlPos;
+ pControl->GetWindowRect( &controlPos );
+ pControl->SetWindowPos( NULL, controlPos.left - HammerBarPos.left,
+ HammerBarPos.Height() - currentControl.m_nPosY, 0, 0, SWP_NOSIZE|SWP_NOZORDER );
+ }
+ if ( dwPlacement & RIGHT_JUSTIFY )
+ {
+ CRect controlPos;
+ pControl->GetWindowRect( &controlPos );
+ pControl->SetWindowPos( NULL, HammerBarPos.Width() - currentControl.m_nPosX,
+ controlPos.top - HammerBarPos.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER );
+ }
+ }
+
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: adds controls to the CHammerBar
+// determines position and stretch settings based on default design /
+// Input : int nIDTemplate - ID from .rc file of control to be added
+// DWORD dwPlacementFlag - placement information
+// GROUP_BOX - will be stretched to fit new size
+// BOTTOM_JUSTIFY - will move with the bottom of the dialog
+// RIGHT_JUSTIFY - will move with the right side of the dialog//
+// Output : void
+//-----------------------------------------------------------------------------
+void CHammerBar::AddControl( int nIDTemplate, DWORD dwPlacementFlag )
+{
+ ControlInfo_t newControl;
+ newControl.m_nIDDialogItem = nIDTemplate;
+ newControl.m_dwPlacementFlag = dwPlacementFlag;
+
+ CWnd *pControl = GetDlgItem( nIDTemplate );
+ if ( pControl != NULL )
+ {
+ CRect controlPos, hammerBarPos;
+ pControl->GetWindowRect( &controlPos );
+ GetWindowRect( &hammerBarPos );
+
+ newControl.m_nHeightBuffer = m_sizeDefault.cy - controlPos.Height();
+ newControl.m_nWidthBuffer = m_sizeDefault.cx - controlPos.Width();
+ newControl.m_nPosX = m_sizeDefault.cx + hammerBarPos.left - controlPos.left;
+ newControl.m_nPosY = m_sizeDefault.cy + hammerBarPos.top - controlPos.top;
+
+ m_ControlList.AddToTail( newControl );
+ }
+}
+
+CHammerBar::~CHammerBar()
+{
+ m_ControlList.RemoveAll();
+} \ No newline at end of file