ppsspp/ext/native/ui/ui_tween.cpp

87 lines
2.1 KiB
C++
Raw Normal View History

2017-12-03 17:39:50 +00:00
#include "base/colorutil.h"
#include "ui/ui_tween.h"
#include "ui/view.h"
namespace UI {
2017-12-03 18:28:53 +00:00
void Tween::Apply(View *view) {
if (!valid_)
return;
if (DurationOffset() >= duration_)
2017-12-03 18:28:53 +00:00
finishApplied_ = true;
float pos = Position();
DoApply(view, pos);
}
template <typename Value>
void TweenBase<Value>::PersistData(PersistStatus status, std::string anonId, PersistMap &storage) {
struct TweenData {
float start;
float duration;
float delay;
Value from;
Value to;
bool valid;
};
PersistBuffer &buffer = storage["TweenBase::" + anonId];
switch (status) {
case UI::PERSIST_SAVE:
buffer.resize(sizeof(TweenData) / sizeof(int));
{
TweenData &data = *(TweenData *)&buffer[0];
data.start = start_;
data.duration = duration_;
data.delay = delay_;
data.from = from_;
data.to = to_;
data.valid = valid_;
}
break;
case UI::PERSIST_RESTORE:
if (buffer.size() >= sizeof(TweenData) / sizeof(int)) {
TweenData data = *(TweenData *)&buffer[0];
start_ = data.start;
duration_ = data.duration;
delay_ = data.delay;
from_ = data.from;
to_ = data.to;
valid_ = data.valid;
// We skip finishApplied_ here so that the tween will reapply.
// This does mean it's important to remember to update tweens even after finish.
}
break;
}
}
template void TweenBase<uint32_t>::PersistData(PersistStatus status, std::string anonId, PersistMap &storage);
template void TweenBase<Visibility>::PersistData(PersistStatus status, std::string anonId, PersistMap &storage);
2017-12-03 18:28:53 +00:00
uint32_t ColorTween::Current(float pos) {
return colorBlend(to_, from_, pos);
2017-12-03 17:39:50 +00:00
}
2017-12-03 18:28:53 +00:00
void TextColorTween::DoApply(View *view, float pos) {
2017-12-03 17:39:50 +00:00
// TODO: No validation without RTTI?
TextView *tv = (TextView *)view;
2017-12-03 18:28:53 +00:00
tv->SetTextColor(Current(pos));
2017-12-03 17:39:50 +00:00
}
2017-12-03 18:28:53 +00:00
void VisibilityTween::DoApply(View *view, float pos) {
view->SetVisibility(Current(pos));
2017-12-03 17:39:50 +00:00
}
2017-12-03 18:28:53 +00:00
Visibility VisibilityTween::Current(float p) {
2017-12-03 17:39:50 +00:00
// Prefer V_VISIBLE over V_GONE/V_INVISIBLE.
if (from_ == V_VISIBLE && p < 1.0f)
return from_;
if (to_ == V_VISIBLE && p > 0.0f)
return to_;
return p >= 1.0f ? to_ : from_;
}
} // namespace