mirror of https://github.com/AxioDL/metaforce.git
102 lines
2.8 KiB
C++
102 lines
2.8 KiB
C++
#include "Runtime/GuiSys/CAuiMeter.hpp"
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
|
|
#include <zeus/Math.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);
|
|
|
|
size_t etankCap;
|
|
if (xc4_noRoundUp)
|
|
etankCap = xcc_capacity * scale;
|
|
else
|
|
etankCap = xcc_capacity * scale + 0.5f;
|
|
|
|
size_t etankFill;
|
|
if (xc4_noRoundUp)
|
|
etankFill = xd0_value * scale;
|
|
else
|
|
etankFill = xd0_value * scale + 0.5f;
|
|
|
|
for (size_t 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;
|
|
}
|
|
|
|
std::shared_ptr<CGuiWidget> CAuiMeter::Create(CGuiFrame* frame, CInputStream& in, CSimplePool* sp) {
|
|
CGuiWidgetParms parms = ReadWidgetHeader(frame, in);
|
|
in.readBool();
|
|
bool noRoundUp = in.readBool();
|
|
u32 maxCapacity = in.readUint32Big();
|
|
u32 workerCount = in.readUint32Big();
|
|
std::shared_ptr<CAuiMeter> ret = std::make_shared<CAuiMeter>(parms, noRoundUp, maxCapacity, workerCount);
|
|
ret->ParseBaseInfo(frame, in, parms);
|
|
return ret;
|
|
}
|
|
|
|
} // namespace urde
|