summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/ProgressDialog.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 /utils/hlfaceposer/ProgressDialog.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/hlfaceposer/ProgressDialog.cpp')
-rw-r--r--utils/hlfaceposer/ProgressDialog.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/utils/hlfaceposer/ProgressDialog.cpp b/utils/hlfaceposer/ProgressDialog.cpp
new file mode 100644
index 0000000..92264d5
--- /dev/null
+++ b/utils/hlfaceposer/ProgressDialog.cpp
@@ -0,0 +1,243 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "resource.h"
+#include "ProgressDialog.h"
+#include "mxtk/mx.h"
+#include "mdlviewer.h"
+#include "tier1/utlstring.h"
+#include "tier1/strtools.h"
+#include "tier1/fmtstr.h"
+
+#include <CommCtrl.h>
+
+class CProgressDialog : public IProgressDialog
+{
+public:
+ CProgressDialog();
+
+ void Start( char const *pchTitle, char const *pchText, bool bShowCancel );
+ void Update( float flZeroToOneFraction );
+ void UpdateText( char const *pchFmt, ... );
+ bool IsCancelled();
+ void Finish();
+
+ static BOOL CALLBACK ProgressDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+private:
+
+ BOOL ProgressDialogProcImpl( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ CUtlString m_sTitle;
+ CUtlString m_sStatus;
+ float m_flFraction;
+
+ bool m_bShowCancel;
+ bool m_bWantsCancel;
+
+ HWND m_hwndDlg;
+
+ double m_flStartTime;
+};
+
+static CProgressDialog g_ProgressDialog;
+IProgressDialog *g_pProgressDialog = &g_ProgressDialog;
+
+CProgressDialog::CProgressDialog() :
+ m_flFraction( 0.0f ), m_hwndDlg( 0 ), m_bShowCancel( false ), m_bWantsCancel( false ), m_flStartTime( 0.0f )
+{
+}
+
+bool CProgressDialog::IsCancelled()
+{
+ return m_bShowCancel && m_bWantsCancel;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// uMsg -
+// wParam -
+// lParam -
+// Output : static BOOL CALLBACK
+//-----------------------------------------------------------------------------
+BOOL CALLBACK CProgressDialog::ProgressDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ return g_ProgressDialog.ProgressDialogProcImpl( hwndDlg, uMsg, wParam, lParam );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *view -
+// *actor -
+// Output : int
+//-----------------------------------------------------------------------------
+void CProgressDialog::Start( char const *pchTitle, char const *pchText, bool bShowCancel )
+{
+ if ( m_hwndDlg )
+ {
+ Finish();
+ }
+ Assert( NULL == m_hwndDlg );
+
+ m_sTitle = pchTitle;
+ m_sStatus = pchText;
+ m_flFraction = 0.0f;
+ m_bShowCancel = bShowCancel;
+ m_bWantsCancel = false;
+ m_flStartTime = Plat_FloatTime();
+
+ m_hwndDlg = CreateDialog( (HINSTANCE)GetModuleHandle( 0 ),
+ MAKEINTRESOURCE( IDD_PROGRESS ),
+ (HWND)g_MDLViewer->getHandle(),
+ (DLGPROC)ProgressDialogProc );
+}
+
+void CProgressDialog::Update( float flZeroToOneFraction )
+{
+ m_flFraction = clamp( flZeroToOneFraction, 0.0f, 1.0f );
+
+ // Update the progress bar
+ HWND pb = GetDlgItem( m_hwndDlg, IDC_FP_PROGRESS );
+ int pos = clamp( (int)( 1000.0f * flZeroToOneFraction ), 0, 1000 );
+
+ SendMessage( pb, (UINT) PBM_SETPOS, pos, 0 );
+
+ HWND btn = GetDlgItem( m_hwndDlg, IDCANCEL );
+ LRESULT lr = SendMessage( btn, BM_GETSTATE, 0, 0 );
+ if ( lr & BST_PUSHED )
+ {
+ m_bWantsCancel = true;
+ }
+
+ if ( GetAsyncKeyState( VK_ESCAPE ) )
+ {
+ m_bWantsCancel = true;
+ }
+
+ mx::check();
+}
+
+void CProgressDialog::UpdateText( char const *pchFmt, ... )
+{
+ char buf[ 2048 ];
+ va_list argptr;
+ va_start( argptr, pchFmt );
+ Q_vsnprintf( buf, sizeof( buf ), pchFmt, argptr );
+ va_end( argptr );
+ m_sStatus = buf;
+
+ SetDlgItemText( m_hwndDlg, IDC_FP_PROGRESS_TEXT, CFmtStr( "%s", m_sStatus.String() ) );
+ SetDlgItemText( m_hwndDlg, IDC_FP_PROGRESS_PERCENT, CFmtStr( "%.2f %%", m_flFraction * 100.0f ) );
+
+ double elapsed = Plat_FloatTime() - m_flStartTime;
+ double flPercentagePerSecond = 0.0f;
+ if ( m_flFraction > 0.0f )
+ {
+ flPercentagePerSecond = elapsed / m_flFraction;
+ }
+
+ double flSecondsRemaining = flPercentagePerSecond * ( 1.0f - m_flFraction );
+
+ int seconds = (int)flSecondsRemaining;
+
+ CFmtStr string;
+
+ int hours = 0;
+ int minutes = seconds / 60;
+
+ if ( minutes > 0 )
+ {
+ seconds -= (minutes * 60);
+ hours = minutes / 60;
+
+ if ( hours > 0 )
+ {
+ minutes -= (hours * 60);
+ }
+ }
+
+ if ( hours > 0 )
+ {
+ string.sprintf( "Time Remaining: %2i:%02i:%02i", hours, minutes, seconds );
+ }
+ else
+ {
+ string.sprintf( "Time Remaining: %02i:%02i", minutes, seconds );
+ }
+
+ SetDlgItemText( m_hwndDlg, IDC_FP_PROGRESS_ETA, string.Access() );
+}
+
+void CProgressDialog::Finish()
+{
+ if ( !m_hwndDlg )
+ return;
+ DestroyWindow( m_hwndDlg );
+ m_hwndDlg = NULL;
+}
+
+BOOL CProgressDialog::ProgressDialogProcImpl( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ // Insert code here to put the string (to find and replace with)
+ // into the edit controls.
+ // ...
+ {
+ RECT rcDlg;
+ GetWindowRect( hwndDlg, &rcDlg );
+
+ // Get relative to primary monitor instead of actual window parent
+ RECT rcParent;
+ rcParent.left = 0;
+ rcParent.right = rcParent.left + GetSystemMetrics( SM_CXFULLSCREEN );
+ rcParent.top = 0;
+ rcParent.bottom = rcParent.top + GetSystemMetrics( SM_CYFULLSCREEN );
+
+ int dialogw, dialogh;
+ int parentw, parenth;
+
+ parentw = rcParent.right - rcParent.left;
+ parenth = rcParent.bottom - rcParent.top;
+ dialogw = rcDlg.right - rcDlg.left;
+ dialogh = rcDlg.bottom - rcDlg.top;
+
+ int dlgleft, dlgtop;
+ dlgleft = ( parentw - dialogw ) / 2;
+ dlgtop = ( parenth - dialogh ) / 2;
+
+ MoveWindow( hwndDlg,
+ dlgleft,
+ dlgtop,
+ dialogw,
+ dialogh,
+ TRUE
+ );
+
+ SetDlgItemText( hwndDlg, IDC_FP_PROGRESS_TITLE, m_sTitle.String() );
+ SetDlgItemText( hwndDlg, IDC_FP_PROGRESS_TEXT, m_sStatus.String() );
+
+ HWND pb = GetDlgItem( hwndDlg, IDC_FP_PROGRESS );
+ SendMessage( pb, (UINT) PBM_SETRANGE, 0, MAKELPARAM( 0, 1000 ) );
+
+ ShowWindow( GetDlgItem( hwndDlg, IDCANCEL ), m_bShowCancel ? SW_SHOW : SW_HIDE );
+
+ Update( 0.0f );
+ }
+ return FALSE;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDCANCEL:
+ m_bWantsCancel = true;
+ break;
+ }
+ return TRUE;
+ }
+ return FALSE;
+} \ No newline at end of file