/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** 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 .
*/
/******************************************************************************
*
* FILE
* $Archive: /Commando/Code/wwui/ProgressCtrl.cpp $
*
* DESCRIPTION
* Progress bar control
*
* PROGRAMMER
* Denzil E. Long, Jr.
* $Author: Denzil_l $
*
* VERSION INFO
* $Revision: 4 $
* $Modtime: 1/12/02 9:44p $
*
******************************************************************************/
#include "ProgressCtrl.h"
#include "StyleMgr.h"
#define BAR_INSET 3
/******************************************************************************
*
* NAME
* ProgressCtrlClass::ProgressCtrlClass
*
* DESCRIPTION
* Constructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
ProgressCtrlClass::ProgressCtrlClass(void) :
mBarRect(0, 0, 0, 0),
mMinLimit(0),
mMaxLimit(100),
mPosition(0),
mStep(10)
{
StyleMgrClass::Configure_Renderer(&mControlRenderer);
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::~ProgressCtrlClass
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
ProgressCtrlClass::~ProgressCtrlClass()
{
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Create_Control_Renderers
*
* DESCRIPTION
* Create the renderers for the control
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Create_Control_Renderers(void)
{
Render2DClass& renderer = mControlRenderer;
// Configure this renderer
renderer.Reset();
renderer.Enable_Texturing(false);
// Determine which color to draw the outline in
int color = StyleMgrClass::Get_Line_Color();
int bkColor = StyleMgrClass::Get_Bk_Color();
if (IsEnabled == false)
{
color = StyleMgrClass::Get_Disabled_Line_Color();
bkColor = StyleMgrClass::Get_Disabled_Bk_Color();
}
// Draw the control outline
RectClass rect = Rect;
renderer.Add_Outline(rect, 1.0F, color);
// Now draw the background
rect.Right -= 1;
rect.Bottom -= 1;
renderer.Add_Quad(rect, bkColor);
// Draw the bar
if (mPosition > mMinLimit)
{
int barColor = StyleMgrClass::Get_Text_Color();
if (IsEnabled == false)
{
barColor = StyleMgrClass::Get_Disabled_Text_Color();
}
renderer.Add_Quad(mBarRect, barColor);
}
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Calculate_Bar_Width
*
* DESCRIPTION
* Calculate the new bar width.
*
* INPUTS
* Position - Position to calculate bar width for.
*
* RESULT
* NONE
*
******************************************************************************/
float ProgressCtrlClass::Calculate_Bar_Width(unsigned int position)
{
// Adjust the bar to reflect the new position
float maxBarWidth = (Rect.Width() - (float)(2 * BAR_INSET));
float scaler = (maxBarWidth / (float)(mMaxLimit - mMinLimit));
float barWidth = (scaler * (float)(position - mMinLimit));
return barWidth;
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Update_Client_Rect
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Update_Client_Rect(void)
{
// Calculate the new bar rectangle
mBarRect.Left = Rect.Left + BAR_INSET;
mBarRect.Top = Rect.Top + BAR_INSET;
mBarRect.Bottom = Rect.Bottom - BAR_INSET;
mBarRect.Right = (mBarRect.Left + Calculate_Bar_Width(mPosition));
Set_Dirty();
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Render
*
* DESCRIPTION
* Render the control
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Render(void)
{
// Recreate the renderers (if necessary)
if (IsDirty)
{
Create_Control_Renderers();
}
// Render the progress bar's current state
mControlRenderer.Render();
DialogControlClass::Render();
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Set_Range
*
* DESCRIPTION
* Sets the minimum and maximum values for the progress bar and redraws the
* bar to reflect the new range.
*
* INPUTS
* Min - Minimum range value
* Max - Maximum range value
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Set_Range(unsigned int min, unsigned int max)
{
WWASSERT(min < max);
// Scale current position to new range
if (mPosition > mMinLimit)
{
float oldDelta = (mMaxLimit - mMinLimit);
float newDelta = (max - min);
float scaler = (oldDelta / newDelta);
unsigned int position = (unsigned int)((float)mPosition * scaler);
Set_Position(position);
}
mMinLimit = min;
mMaxLimit = max;
Set_Dirty();
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Get_Range
*
* DESCRIPTION
* Get the minimun and maximum values for the progress bar.
*
* INPUTS
* Min - On return; Minimum range value
* Max - On return; Maximum range value
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Get_Range(unsigned int& min, unsigned int& max)
{
min = mMinLimit;
max = mMaxLimit;
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Set_Position
*
* DESCRIPTION
* Set the current position for the progress bar.
*
* INPUTS
* Position - New position
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Set_Position(unsigned int position)
{
unsigned int oldPosition = mPosition;
mPosition = min(mMaxLimit, position);
mPosition = max(mMinLimit, mPosition);
if (oldPosition != mPosition)
{
mBarRect.Right = (mBarRect.Left + Calculate_Bar_Width(mPosition));
Set_Dirty();
}
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Delta_Position
*
* DESCRIPTION
* Advance the position of the progress bar by a specified increment.
*
* INPUTS
* Delta - Amount to advance the position by.
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Delta_Position(int delta)
{
Set_Position(mPosition + delta);
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Get_Position
*
* DESCRIPTION
* Get the current position of the progress bar.
*
* INPUTS
* NONE
*
* RESULT
* Position - Progress position
*
******************************************************************************/
unsigned int ProgressCtrlClass::Get_Position(void) const
{
return mPosition;
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Set_Step
*
* DESCRIPTION
* Specify the step increment for the progress bar. This is the amount
* the progress bar increases its current position whenever Step_Position()
* is called.
*
* INPUTS
* Step - New step increment.
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Set_Step(unsigned int step)
{
mStep = min((mMaxLimit - mMinLimit), step);
mStep = max(1, mStep);
}
/******************************************************************************
*
* NAME
* ProgressCtrlClass::Step_Position
*
* DESCRIPTION
* Advance the position for the progress bar by the step increment.
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void ProgressCtrlClass::Step_Position(void)
{
float stepping = ((float)(mMaxLimit - mMinLimit) / (float)mStep);
float stepPos = (floor((float)mPosition / stepping) * stepping);
Set_Position(stepPos + mStep);
}