metaforce/Runtime/GuiSys/CAuiMeter.cpp

117 lines
2.9 KiB
C++

#include "CAuiMeter.hpp"
namespace urde
{
CAuiMeter::CAuiMeter(const CGuiWidgetParms& parms, bool noRoundUp,
u32 maxCapacity, u32 workerCount)
: CGuiGroup(parms, 0, false), xc4_noRoundUp(noRoundUp),
xc8_maxCapacity(maxCapacity), xcc_capacity(maxCapacity)
{
xd4_workers.reserve(workerCount);
}
void CAuiMeter::UpdateMeterWorkers()
{
float scale = xd4_workers.size() / float(xc8_maxCapacity);
int etankCap;
if (xc4_noRoundUp)
etankCap = xcc_capacity * scale;
else
etankCap = xcc_capacity * scale + 0.5f;
int etankFill;
if (xc4_noRoundUp)
etankFill = xd0_value * scale;
else
etankFill = xd0_value * scale + 0.5f;
for (int i=0 ; i<xd4_workers.size() ; ++i)
{
CGuiGroup* worker = xd4_workers[i];
if (!worker)
continue;
CGuiWidget* fullTank = worker->GetWorkerWidget(0);
CGuiWidget* emptyTank = worker->GetWorkerWidget(1);
if (i < etankFill)
{
if (fullTank)
fullTank->SetIsVisible(true);
if (emptyTank)
emptyTank->SetIsVisible(false);
}
else if (i < etankCap)
{
if (fullTank)
fullTank->SetIsVisible(false);
if (emptyTank)
emptyTank->SetIsVisible(true);
}
else
{
if (fullTank)
fullTank->SetIsVisible(false);
if (emptyTank)
emptyTank->SetIsVisible(false);
}
}
}
void CAuiMeter::OnVisibleChange()
{
if (GetIsVisible())
UpdateMeterWorkers();
}
void CAuiMeter::SetCurrValue(s32 val)
{
xd0_value = zeus::clamp(0, val, xcc_capacity);
UpdateMeterWorkers();
}
void CAuiMeter::SetCapacity(s32 cap)
{
xcc_capacity = zeus::clamp(0, cap, xc8_maxCapacity);
xd0_value = std::min(xcc_capacity, xd0_value);
UpdateMeterWorkers();
}
void CAuiMeter::SetMaxCapacity(s32 cap)
{
xc8_maxCapacity = std::max(0, cap);
xcc_capacity = std::min(xc8_maxCapacity, xcc_capacity);
xd0_value = std::min(xcc_capacity, xd0_value);
UpdateMeterWorkers();
}
CGuiWidget* CAuiMeter::GetWorkerWidget(int id) const
{
return xd4_workers[id];
}
bool CAuiMeter::AddWorkerWidget(CGuiWidget* worker)
{
CGuiGroup::AddWorkerWidget(worker);
if (worker->GetWorkerId() >= xd4_workers.size())
xd4_workers.resize(worker->GetWorkerId() + 1);
xd4_workers[worker->GetWorkerId()] = static_cast<CGuiGroup*>(worker);
return true;
}
CAuiMeter* CAuiMeter::Create(CGuiFrame* frame, CInputStream& in, bool flag)
{
CGuiWidgetParms parms = ReadWidgetHeader(frame, in, flag);
in.readBool();
bool noRoundUp = in.readBool();
u32 maxCapacity = in.readUint32Big();
u32 workerCount = in.readUint32Big();
CAuiMeter* ret = new CAuiMeter(parms, noRoundUp, maxCapacity, workerCount);
ret->ParseBaseInfo(frame, in, parms);
return ret;
}
}