2
0

UIAnimationSlide.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Renderer/Renderer.h>
  5. #include <UI/UIAnimationSlide.h>
  6. #include <UI/UIElement.h>
  7. #include <UI/UIManager.h>
  8. JPH_IMPLEMENT_RTTI_ABSTRACT(UIAnimationSlide)
  9. {
  10. JPH_ADD_BASE_CLASS(UIAnimationSlide, UIAnimation)
  11. }
  12. UIAnimationSlide::UIAnimationSlide(EMode inMode, int inSlideDistanceH, int inSlideDistanceV, float inTimeBeforeSlide, float inSlideTime) :
  13. mSlideMode(inMode),
  14. mSlideDistanceH(inSlideDistanceH),
  15. mSlideDistanceV(inSlideDistanceV),
  16. mTimeBeforeSlide(inTimeBeforeSlide),
  17. mSlideTime(inSlideTime)
  18. {
  19. }
  20. void UIAnimationSlide::Init(UIElement *inElement)
  21. {
  22. mTargetRelativeX = inElement->GetRelativeX();
  23. mTargetRelativeY = inElement->GetRelativeY();
  24. Renderer *renderer = inElement->GetManager()->GetRenderer();
  25. int dl = inElement->GetX();
  26. int dr = renderer->GetWindowWidth() - (inElement->GetX() + inElement->GetWidth());
  27. int dt = inElement->GetY();
  28. int db = renderer->GetWindowHeight() - (inElement->GetY() + inElement->GetHeight());
  29. if (min(dl, dr) < min(dt, db))
  30. {
  31. mInitialRelativeX = mTargetRelativeX + (dl < dr? -mSlideDistanceH : mSlideDistanceH);
  32. mInitialRelativeY = mTargetRelativeY;
  33. }
  34. else
  35. {
  36. mInitialRelativeX = mTargetRelativeX;
  37. mInitialRelativeY = mTargetRelativeY + (dt < db? -mSlideDistanceV : mSlideDistanceV);
  38. }
  39. if (mSlideMode == SLIDE_ON_SCREEN)
  40. inElement->SetAnimatedVisible(true);
  41. mTime = 0.0f;
  42. }
  43. bool UIAnimationSlide::Update(UIElement *inElement, float inDeltaTime)
  44. {
  45. mTime += inDeltaTime;
  46. float factor = (mTime - mTimeBeforeSlide) / mSlideTime;
  47. if (factor >= 1.0f)
  48. return false;
  49. if (factor < 0.0f)
  50. factor = 0.0f;
  51. if (mSlideMode == SLIDE_OFF_SCREEN)
  52. factor = 1.0f - factor;
  53. float x = mInitialRelativeX * (1.0f - factor) + mTargetRelativeX * factor;
  54. float y = mInitialRelativeY * (1.0f - factor) + mTargetRelativeY * factor;
  55. inElement->SetRelativeX((int)x);
  56. inElement->SetRelativeY((int)y);
  57. return true;
  58. }
  59. void UIAnimationSlide::Exit(UIElement *inElement)
  60. {
  61. inElement->SetRelativeX(mTargetRelativeX);
  62. inElement->SetRelativeY(mTargetRelativeY);
  63. inElement->SetAnimatedVisible(mSlideMode == SLIDE_ON_SCREEN);
  64. }