mirror of
https://github.com/FunKey-Project/RetroFE.git
synced 2025-12-15 03:08:52 +01:00
283 lines
7.1 KiB
C++
283 lines
7.1 KiB
C++
/* This file is subject to the terms and conditions defined in
|
|
* file 'LICENSE.txt', which is part of this source code package.
|
|
*/
|
|
#include "Component.h"
|
|
#include "../Animate/Tween.h"
|
|
#include "../../Graphics/ViewInfo.h"
|
|
#include "../../Utility/Log.h"
|
|
|
|
Component::Component()
|
|
{
|
|
OnEnterTweens = NULL;
|
|
OnExitTweens = NULL;
|
|
OnIdleTweens = NULL;
|
|
OnHighlightEnterTweens = NULL;
|
|
OnHighlightExitTweens = NULL;
|
|
SelectedItem = NULL;
|
|
NewItemSelectedSinceEnter = false;
|
|
FreeGraphicsMemory();
|
|
|
|
}
|
|
|
|
Component::~Component()
|
|
{
|
|
FreeGraphicsMemory();
|
|
}
|
|
|
|
void Component::FreeGraphicsMemory()
|
|
{
|
|
CurrentAnimationState = HIDDEN;
|
|
EnterRequested = false;
|
|
ExitRequested = false;
|
|
NewItemSelected = false;
|
|
HighlightExitComplete = false;
|
|
CurrentTweens = NULL;
|
|
CurrentTweenIndex = 0;
|
|
CurrentTweenComplete = false;
|
|
ElapsedTweenTime =0;
|
|
ScrollActive = false;
|
|
}
|
|
void Component::AllocateGraphicsMemory()
|
|
{
|
|
}
|
|
|
|
void Component::TriggerEnterEvent()
|
|
{
|
|
EnterRequested = true;
|
|
}
|
|
|
|
void Component::TriggerExitEvent()
|
|
{
|
|
ExitRequested = true;
|
|
}
|
|
|
|
void Component::TriggerHighlightEvent(Item *selectedItem)
|
|
{
|
|
NewItemSelected = true;
|
|
this->SelectedItem = selectedItem;
|
|
}
|
|
|
|
|
|
bool Component::IsIdle()
|
|
{
|
|
return (CurrentAnimationState == IDLE);
|
|
}
|
|
|
|
bool Component::IsHidden()
|
|
{
|
|
return (CurrentAnimationState == HIDDEN);
|
|
}
|
|
bool Component::IsWaiting()
|
|
{
|
|
return (CurrentAnimationState == HIGHLIGHT_WAIT);
|
|
}
|
|
|
|
|
|
|
|
void Component::Update(float dt)
|
|
{
|
|
ElapsedTweenTime += dt;
|
|
HighlightExitComplete = false;
|
|
if(IsHidden() || IsWaiting() || (IsIdle() && ExitRequested))
|
|
{
|
|
CurrentTweenComplete = true;
|
|
}
|
|
|
|
if(CurrentTweenComplete)
|
|
{
|
|
CurrentTweens = NULL;
|
|
|
|
// There was no request to override our state path. Continue on as normal.
|
|
switch(CurrentAnimationState)
|
|
{
|
|
case ENTER:
|
|
CurrentTweens = OnHighlightEnterTweens;
|
|
CurrentAnimationState = HIGHLIGHT_ENTER;
|
|
break;
|
|
|
|
case EXIT:
|
|
CurrentTweens = NULL;
|
|
CurrentAnimationState = HIDDEN;
|
|
|
|
break;
|
|
|
|
case HIGHLIGHT_ENTER:
|
|
CurrentTweens = OnIdleTweens;
|
|
CurrentAnimationState = IDLE;
|
|
break;
|
|
|
|
case IDLE:
|
|
// prevent us from automatically jumping to the exit tween upon enter
|
|
if(EnterRequested)
|
|
{
|
|
EnterRequested = false;
|
|
NewItemSelected = false;
|
|
}
|
|
else if(IsScrollActive() || NewItemSelected || ExitRequested)
|
|
{
|
|
CurrentTweens = OnHighlightExitTweens;
|
|
CurrentAnimationState = HIGHLIGHT_EXIT;
|
|
}
|
|
else
|
|
{
|
|
CurrentTweens = OnIdleTweens;
|
|
CurrentAnimationState = IDLE;
|
|
}
|
|
break;
|
|
|
|
case HIGHLIGHT_EXIT:
|
|
|
|
// intentionally break down
|
|
case HIGHLIGHT_WAIT:
|
|
|
|
if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_WAIT))
|
|
{
|
|
CurrentTweens = OnHighlightExitTweens;
|
|
CurrentAnimationState = HIGHLIGHT_EXIT;
|
|
|
|
}
|
|
else if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_EXIT))
|
|
{
|
|
|
|
CurrentTweens = OnExitTweens;
|
|
CurrentAnimationState = EXIT;
|
|
ExitRequested = false;
|
|
}
|
|
else if(IsScrollActive())
|
|
{
|
|
CurrentTweens = NULL;
|
|
CurrentAnimationState = HIGHLIGHT_WAIT;
|
|
}
|
|
else if(NewItemSelected)
|
|
{
|
|
CurrentTweens = OnHighlightEnterTweens;
|
|
CurrentAnimationState = HIGHLIGHT_ENTER;
|
|
HighlightExitComplete = true;
|
|
NewItemSelected = false;
|
|
}
|
|
else
|
|
{
|
|
CurrentTweens = NULL;
|
|
CurrentAnimationState = HIGHLIGHT_WAIT;
|
|
}
|
|
break;
|
|
|
|
case HIDDEN:
|
|
if(EnterRequested || ExitRequested)
|
|
{
|
|
CurrentTweens = OnEnterTweens;
|
|
CurrentAnimationState = ENTER;
|
|
}
|
|
else
|
|
{
|
|
CurrentTweens = NULL;
|
|
CurrentAnimationState = HIDDEN;
|
|
}
|
|
}
|
|
|
|
CurrentTweenIndex = 0;
|
|
CurrentTweenComplete = false;
|
|
|
|
ElapsedTweenTime = 0;
|
|
}
|
|
|
|
CurrentTweenComplete = Animate(IsIdle());
|
|
}
|
|
|
|
|
|
bool Component::Animate(bool loop)
|
|
{
|
|
bool completeDone = false;
|
|
if(!CurrentTweens || CurrentTweenIndex >= CurrentTweens->size())
|
|
{
|
|
completeDone = true;
|
|
}
|
|
else if(CurrentTweens)
|
|
{
|
|
bool currentDone = true;
|
|
std::vector<Tween *> *tweenSet = CurrentTweens->at(CurrentTweenIndex);
|
|
|
|
for(unsigned int i = 0; i < tweenSet->size(); i++)
|
|
{
|
|
Tween *tween = tweenSet->at(i);
|
|
float elapsedTime = ElapsedTweenTime;
|
|
|
|
//todo: too many levels of nesting
|
|
if(elapsedTime < tween->GetDuration())
|
|
{
|
|
currentDone = false;
|
|
}
|
|
else
|
|
{
|
|
elapsedTime = tween->GetDuration();
|
|
}
|
|
|
|
float value = tween->Animate(elapsedTime);
|
|
|
|
switch(tween->GetProperty())
|
|
{
|
|
case TWEEN_PROPERTY_X:
|
|
GetBaseViewInfo()->SetX(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_Y:
|
|
GetBaseViewInfo()->SetY(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_HEIGHT:
|
|
GetBaseViewInfo()->SetHeight(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_WIDTH:
|
|
GetBaseViewInfo()->SetWidth(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_ANGLE:
|
|
GetBaseViewInfo()->SetAngle(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_TRANSPARENCY:
|
|
GetBaseViewInfo()->SetTransparency(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_X_ORIGIN:
|
|
GetBaseViewInfo()->SetXOrigin(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_Y_ORIGIN:
|
|
GetBaseViewInfo()->SetYOrigin(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_X_OFFSET:
|
|
GetBaseViewInfo()->SetXOffset(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_Y_OFFSET:
|
|
GetBaseViewInfo()->SetYOffset(value);
|
|
break;
|
|
|
|
case TWEEN_PROPERTY_FONT_SIZE:
|
|
GetBaseViewInfo()->SetFontSize(value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(currentDone)
|
|
{
|
|
CurrentTweenIndex++;
|
|
ElapsedTweenTime = 0;
|
|
}
|
|
}
|
|
|
|
if(!CurrentTweens || CurrentTweenIndex >= CurrentTweens->size())
|
|
{
|
|
if(loop)
|
|
{
|
|
CurrentTweenIndex = 0;
|
|
}
|
|
completeDone = true;
|
|
}
|
|
|
|
return completeDone;
|
|
}
|