Descent3/editor/StatusDlg.cpp
2024-06-15 20:12:48 +02:00

177 lines
5.3 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// StatusDlg.cpp : implementation file
//
#include "stdafx.h"
#include "editor.h"
#include "StatusDlg.h"
#include "pserror.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStatusDlg dialog
CStatusDlg::CStatusDlg(CWnd *pParent /*=NULL*/) : CDialog(CStatusDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CStatusDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CStatusDlg::DoDataExchange(CDataExchange *pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStatusDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
void CStatusDlg::Init(int min, int max, int delta) {
CProgressCtrl *progress;
progress = (CProgressCtrl *)GetDlgItem(IDC_STATUSPROGRESS);
progress->SetRange(min, max);
progress->SetPos(min);
progress->SetStep(delta);
mprintf(0, "Progress Control Create: Min= %d Max= %d Step= %d\n", min, max, delta);
}
int CStatusDlg::Step() {
CProgressCtrl *progress;
progress = (CProgressCtrl *)GetDlgItem(IDC_STATUSPROGRESS);
return progress->StepIt();
}
void CStatusDlg::Text(char *string) {
CWnd *text;
text = GetDlgItem(IDC_STATUSTEXT);
text->SetWindowText(string);
}
void CStatusDlg::SetTo(int set) {
CProgressCtrl *progress;
progress = (CProgressCtrl *)GetDlgItem(IDC_STATUSPROGRESS);
progress->SetPos(set);
}
BEGIN_MESSAGE_MAP(CStatusDlg, CDialog)
//{{AFX_MSG_MAP(CStatusDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStatusDlg message handlers
// Initializes the Progress Window. This MUST MUST MUST be called first, the parent parameter can be
// NULL to set the parent to the main window.
// min/max: these are the range of the progress indicator
// iterations: If you plan on using CProgress:IncreaseProgress() then this is how many times you plan on
// calling CProgress::IncreaseProgress(). If you are going to use
//CProgress::SetProgressPercentage() then you should call the version of InitProgress(CWnd *parent) below.
// Returns true if the progress dialog was created
bool CProgress::InitProgress(fix min, fix max, int32_t iterations, CWnd *parent) {
int nmin, nmax, Step;
nmin = FixToInt(min);
nmax = FixToInt(max);
float delta;
delta = (float)(((float)(nmax - nmin)) / ((float)iterations));
while (delta < 1.0) {
delta *= 10;
nmax *= 10;
}
Step = (int)delta;
m_Max = nmax;
m_Min = nmin;
if (!iterations)
return false;
m_StatusDlg = new CStatusDlg;
if (!m_StatusDlg)
return false;
m_StatusDlg->Create(IDD_STATUSDLG, parent);
m_StatusDlg->ShowWindow(SW_SHOW);
m_StatusDlg->Init(nmin, nmax, Step);
return true;
}
// This is a quick way of initializing the progress indicator, with a range 0-100 step size 1. This is what you
// should call if you plan on using CProgress::SetProgressPercentage(). Again, parent can be NULL if you want it to
// be the main application as the parent
bool CProgress::InitProgress(CWnd *parent) {
m_Max = 100;
m_Min = 0;
m_StatusDlg = new CStatusDlg;
if (!m_StatusDlg)
return false;
m_StatusDlg->Create(IDD_STATUSDLG, parent);
m_StatusDlg->ShowWindow(SW_SHOW);
m_StatusDlg->Init(0, 100, 1);
return true;
}
// YOU MUST call this after you are done with the progress indicator. This frees up some allocated memory
void CProgress::DestroyProgress() {
ASSERT(m_StatusDlg != NULL);
m_StatusDlg->DestroyWindow();
if (m_StatusDlg)
delete m_StatusDlg;
}
// By default the progress indicator says "Please wait...", here you can change that text...make sure you call
// this after InitProgress()
void CProgress::SetProgressText(char *string) {
ASSERT(m_StatusDlg != NULL);
m_StatusDlg->Text(string);
}
// This is the iterator function. Call this in your loop or whatever to increase the progress indicator. You can also
// use CProgress::SetProgressPercentage() instead
bool CProgress::IncreaseProgress() {
ASSERT(m_StatusDlg != NULL);
int ret;
ret = m_StatusDlg->Step();
if (ret >= m_Max)
return true;
else
return false;
}
// Sets the progress indicator to a certain percentage
void CProgress::SetProgressPercentage(int percent) {
ASSERT(m_StatusDlg != NULL);
float per;
per = ((float)percent) / ((float)100.0);
m_StatusDlg->SetTo(m_Min + ((int)(per * (m_Max - m_Min))));
}
void CProgress::SetProgressPercentage(float percent) {
ASSERT(m_StatusDlg != NULL);
m_StatusDlg->SetTo(m_Min + ((int)(percent * (m_Max - m_Min))));
}