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/progdlg.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/progdlg.cpp')
| -rw-r--r-- | hammer/progdlg.cpp | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/hammer/progdlg.cpp b/hammer/progdlg.cpp new file mode 100644 index 0000000..c36f923 --- /dev/null +++ b/hammer/progdlg.cpp @@ -0,0 +1,215 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// ProgDlg.cpp : implementation file +// CG: This file was added by the Progress Dialog component + +#include "stdafx.h" +#include "resource.h" +#include "ProgDlg.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +///////////////////////////////////////////////////////////////////////////// +// CProgressDlg dialog + +CProgressDlg::CProgressDlg(UINT nCaptionID) +{ + m_nCaptionID = CG_IDS_PROGRESS_CAPTION; + if (nCaptionID != 0) + m_nCaptionID = nCaptionID; + + m_bCancel=FALSE; + m_nLower=0; + m_nUpper=100; + m_nStep=10; + //{{AFX_DATA_INIT(CProgressDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_bParentDisabled = FALSE; +} + +CProgressDlg::~CProgressDlg() +{ + if(m_hWnd!=NULL) + DestroyWindow(); +} + +BOOL CProgressDlg::DestroyWindow() +{ + ReEnableParent(); + return CDialog::DestroyWindow(); +} + +void CProgressDlg::ReEnableParent() +{ + if(m_bParentDisabled && (m_pParentWnd!=NULL)) + m_pParentWnd->EnableWindow(TRUE); + m_bParentDisabled=FALSE; +} + +BOOL CProgressDlg::Create(CWnd *pParent) +{ + // Get the true parent of the dialog + m_pParentWnd = CWnd::GetSafeOwner(pParent); + + // m_bParentDisabled is used to re-enable the parent window + // when the dialog is destroyed. So we don't want to set + // it to TRUE unless the parent was already enabled. + + if((m_pParentWnd!=NULL) && m_pParentWnd->IsWindowEnabled()) + { + m_pParentWnd->EnableWindow(FALSE); + m_bParentDisabled = TRUE; + } + + if(!CDialog::Create(CProgressDlg::IDD,pParent)) + { + ReEnableParent(); + return FALSE; + } + + return TRUE; +} + +void CProgressDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CProgressDlg) + DDX_Control(pDX, CG_IDC_PROGDLG_PROGRESS, m_Progress); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CProgressDlg, CDialog) + //{{AFX_MSG_MAP(CProgressDlg) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +void CProgressDlg::OnCancel() +{ + m_bCancel=TRUE; +} + +void CProgressDlg::SetRange(int nLower,int nUpper) +{ + m_nLower = nLower; + m_nUpper = nUpper; + m_Progress.SetRange(nLower,nUpper); +} + +int CProgressDlg::SetPos(int nPos) +{ + PumpMessages(); + int iResult = m_Progress.SetPos(nPos); + UpdatePercent(nPos); + return iResult; +} + +int CProgressDlg::SetStep(int nStep) +{ + m_nStep = nStep; // Store for later use in calculating percentage + return m_Progress.SetStep(nStep); +} + +int CProgressDlg::OffsetPos(int nPos) +{ + PumpMessages(); + int iResult = m_Progress.OffsetPos(nPos); + UpdatePercent(iResult+nPos); + return iResult; +} + +int CProgressDlg::StepIt() +{ + PumpMessages(); + int iResult = m_Progress.StepIt(); + UpdatePercent(iResult+m_nStep); + return iResult; +} + +void CProgressDlg::PumpMessages() +{ + // Must call Create() before using the dialog + Assert(m_hWnd!=NULL); + + MSG msg; + // Handle dialog messages + while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if(!IsDialogMessage(&msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } +} + +BOOL CProgressDlg::CheckCancelButton() +{ + // Process all pending messages + PumpMessages(); + + // Reset m_bCancel to FALSE so that + // CheckCancelButton returns FALSE until the user + // clicks Cancel again. This will allow you to call + // CheckCancelButton and still continue the operation. + // If m_bCancel stayed TRUE, then the next call to + // CheckCancelButton would always return TRUE + + BOOL bResult = m_bCancel; + m_bCancel = FALSE; + + return bResult; +} + +void CProgressDlg::UpdatePercent(int nNewPos) +{ + CWnd *pWndPercent = GetDlgItem(CG_IDC_PROGDLG_PERCENT); + int nPercent; + + int nDivisor = m_nUpper - m_nLower; + Assert(nDivisor>0); // m_nLower should be smaller than m_nUpper + + int nDividend = (nNewPos - m_nLower); + Assert(nDividend>=0); // Current position should be greater than m_nLower + + nPercent = nDividend * 100 / nDivisor; + + // Since the Progress Control wraps, we will wrap the percentage + // along with it. However, don't reset 100% back to 0% + if(nPercent!=100) + nPercent %= 100; + + // Display the percentage + CString strBuf; + strBuf.Format(_T("%d%c"),nPercent,_T('%')); + + CString strCur; // get current percentage + pWndPercent->GetWindowText(strCur); + + if (strCur != strBuf) + pWndPercent->SetWindowText(strBuf); +} + +///////////////////////////////////////////////////////////////////////////// +// CProgressDlg message handlers + +BOOL CProgressDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + m_Progress.SetRange(m_nLower,m_nUpper); + m_Progress.SetStep(m_nStep); + m_Progress.SetPos(m_nLower); + + CString strCaption; + VERIFY(strCaption.LoadString(m_nCaptionID)); + SetWindowText(strCaption); + + return TRUE; +} |