NewsState.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include <cpp3ds/System/I18n.hpp>
  2. #include <TweenEngine/Tween.h>
  3. #include <cmath>
  4. #include <cpp3ds/System/FileInputStream.hpp>
  5. #include <cpp3ds/System/FileSystem.hpp>
  6. #include "NewsState.hpp"
  7. #include "../AssetManager.hpp"
  8. #include "../Theme.hpp"
  9. #include "SleepState.hpp"
  10. #include "BrowseState.hpp"
  11. namespace FreeShop {
  12. NewsState::NewsState(StateStack &stack, Context &context, StateCallback callback)
  13. : State(stack, context, callback)
  14. , m_isClosing(false)
  15. , m_finishedFadeIn(false)
  16. , m_skippedFirstUpdate(false)
  17. {
  18. m_overlay.setSize(cpp3ds::Vector2f(400.f, 240.f));
  19. m_overlay.setFillColor(cpp3ds::Color(0, 0, 0, 0));
  20. if (!Theme::isButtonRadius9Themed) {
  21. cpp3ds::Texture &texture = AssetManager<cpp3ds::Texture>::get("images/button-radius.9.png");
  22. m_background.setTexture(&texture);
  23. } else {
  24. cpp3ds::Texture &texture = AssetManager<cpp3ds::Texture>::get(FREESHOP_DIR "/theme/images/button-radius.9.png");
  25. m_background.setTexture(&texture);
  26. }
  27. m_background.setSize(cpp3ds::Vector2f(280.f, 200.f));
  28. m_background.setPosition(20.f, 20.f);
  29. if (Theme::isTextThemed)
  30. m_background.setColor(cpp3ds::Color(Theme::dialogBackground.r, Theme::dialogBackground.g, Theme::dialogBackground.b, 128));
  31. else
  32. m_background.setColor(cpp3ds::Color(255, 255, 255, 128));
  33. m_message.setCharacterSize(12);
  34. m_message.setFillColor(cpp3ds::Color::Transparent);
  35. m_message.setPosition(35.f, 60.f);
  36. m_font.loadFromFile("fonts/grandhotel.ttf");
  37. m_title.setFont(m_font);
  38. m_title.setString(_("FreeShop %s", FREESHOP_VERSION));
  39. m_title.setCharacterSize(40);
  40. m_title.setFillColor(cpp3ds::Color(100, 100, 100, 0));
  41. m_title.setOutlineColor(cpp3ds::Color(255, 255, 255, 0));
  42. m_title.setOutlineThickness(3.f);
  43. m_title.setPosition(15.f, 0.f);
  44. m_buttonOkBackground.setSize(cpp3ds::Vector2f(110.f, 25.f));
  45. if (Theme::isTextThemed)
  46. m_buttonOkBackground.setOutlineColor(cpp3ds::Color(Theme::dialogButton.r, Theme::dialogButton.g, Theme::dialogButton.b, 0));
  47. else if (Config::get(Config::DarkTheme).GetBool())
  48. m_buttonOkBackground.setOutlineColor(cpp3ds::Color(201, 28 , 28));
  49. else
  50. m_buttonOkBackground.setOutlineColor(cpp3ds::Color(158, 158, 158, 0));
  51. m_buttonOkBackground.setOutlineThickness(1.f);
  52. m_buttonOkBackground.setPosition(175.f, 185.f);
  53. m_buttonOkBackground.setFillColor(cpp3ds::Color(255, 255, 255, 0));
  54. m_buttonOkText.setString(_("\uE000 Ok"));
  55. m_buttonOkText.setCharacterSize(14);
  56. if (Theme::isTextThemed)
  57. m_buttonOkText.setFillColor(cpp3ds::Color(Theme::dialogButtonText.r, Theme::dialogButtonText.g, Theme::dialogButtonText.b, 0));
  58. else if (Config::get(Config::DarkTheme).GetBool())
  59. m_buttonOkText.setFillColor(cpp3ds::Color(164, 44, 44));
  60. else
  61. m_buttonOkText.setFillColor(cpp3ds::Color(3, 169, 244, 0));
  62. m_buttonOkText.useSystemFont();
  63. m_buttonOkText.setPosition(m_buttonOkBackground.getPosition().x + m_buttonOkBackground.getGlobalBounds().width / 2, m_buttonOkBackground.getPosition().y + m_buttonOkBackground.getGlobalBounds().height / 2);
  64. m_buttonOkText.setOrigin(m_buttonOkText.getGlobalBounds().width / 2, m_buttonOkText.getGlobalBounds().height / 1.7f);
  65. m_bottomView.setCenter(cpp3ds::Vector2f(160.f, 120.f));
  66. m_bottomView.setSize(cpp3ds::Vector2f(320.f * 0.9f, 240.f * 0.9f));
  67. cpp3ds::FileInputStream file;
  68. if (file.open(FREESHOP_DIR "/news/" FREESHOP_VERSION ".txt"))
  69. {
  70. std::string text;
  71. text.resize(file.getSize());
  72. file.read(&text[0], text.size());
  73. m_message.setString(text);
  74. }
  75. m_scrollbar.setSize(cpp3ds::Vector2u(2, 196));
  76. m_scrollbar.setScrollAreaSize(cpp3ds::Vector2u(320, 120));
  77. m_scrollbar.setDragRect(cpp3ds::IntRect(0, 0, 320, 240));
  78. m_scrollbar.setColor(cpp3ds::Color(0, 0, 0, 40));
  79. m_scrollbar.setPosition(292.f, 22.f);
  80. m_scrollbar.setAutoHide(false);
  81. m_scrollbar.attachObject(this);
  82. m_scrollSize = cpp3ds::Vector2f(320.f, m_message.getLocalBounds().top + m_message.getLocalBounds().height);
  83. #define TWEEN_IN(obj) \
  84. TweenEngine::Tween::to(obj, obj.FILL_COLOR_ALPHA, 0.3f).target(255.f).start(m_tweenManager); \
  85. TweenEngine::Tween::to(obj, obj.OUTLINE_COLOR_ALPHA, 0.3f).target(255.f).start(m_tweenManager);
  86. TweenEngine::Tween::to(m_overlay, m_overlay.FILL_COLOR_ALPHA, 0.3f).target(150.f).start(m_tweenManager);
  87. TweenEngine::Tween::to(m_background, m_background.COLOR_ALPHA, 0.3f).target(255.f).setCallback(TweenEngine::TweenCallback::COMPLETE, [this](TweenEngine::BaseTween* source) {
  88. m_finishedFadeIn = true;
  89. }).start(m_tweenManager);
  90. TWEEN_IN(m_title);
  91. TweenEngine::Tween::to(m_title, m_title.POSITION_Y, 0.3f).target(5.f).start(m_tweenManager);
  92. TWEEN_IN(m_message);
  93. TweenEngine::Tween::to(m_buttonOkBackground, m_buttonOkBackground.OUTLINE_COLOR_ALPHA, 0.2f).target(128.f).start(m_tweenManager);
  94. TWEEN_IN(m_buttonOkText);
  95. TweenEngine::Tween::to(m_bottomView, m_bottomView.SIZE_XY, 0.3f).target(320.f, 240.f).start(m_tweenManager);
  96. }
  97. void NewsState::renderTopScreen(cpp3ds::Window &window)
  98. {
  99. window.draw(m_overlay);
  100. }
  101. void NewsState::renderBottomScreen(cpp3ds::Window &window)
  102. {
  103. cpp3ds::UintRect scissor(0, 30 + m_background.getPosition().y, 320, (240.f / m_bottomView.getSize().y) * 130.f);
  104. window.draw(m_overlay);
  105. window.setView(m_bottomView);
  106. window.draw(m_background);
  107. window.draw(m_message, scissor);
  108. window.draw(m_title);
  109. window.draw(m_buttonOkBackground);
  110. window.draw(m_buttonOkText);
  111. if (m_finishedFadeIn && !m_isClosing)
  112. window.draw(m_scrollbar);
  113. window.setView(window.getDefaultView());
  114. }
  115. bool NewsState::update(float delta)
  116. {
  117. if (m_message.getString().isEmpty())
  118. requestStackPop();
  119. if (!m_skippedFirstUpdate)
  120. {
  121. m_skippedFirstUpdate = true;
  122. return true;
  123. }
  124. m_scrollbar.update(delta);
  125. m_tweenManager.update(delta);
  126. return true;
  127. }
  128. bool NewsState::processEvent(const cpp3ds::Event &event)
  129. {
  130. BrowseState::clockDownloadInactivity.restart();
  131. SleepState::clock.restart();
  132. if (m_isClosing)
  133. return false;
  134. bool close = false;
  135. m_scrollbar.processEvent(event);
  136. if (event.type == cpp3ds::Event::TouchBegan)
  137. {
  138. if (m_buttonOkBackground.getGlobalBounds().contains(event.touch.x, event.touch.y))
  139. close = true;
  140. }
  141. else if (event.type == cpp3ds::Event::KeyPressed)
  142. {
  143. if (event.key.code == cpp3ds::Keyboard::A)
  144. close = true;
  145. }
  146. #define TWEEN_OUT(obj) \
  147. TweenEngine::Tween::to(obj, obj.FILL_COLOR_ALPHA, 0.3f).target(0.f).start(m_tweenManager); \
  148. TweenEngine::Tween::to(obj, obj.OUTLINE_COLOR_ALPHA, 0.3f).target(0.f).start(m_tweenManager);
  149. if (close)
  150. {
  151. // Highlight selected button
  152. m_buttonOkBackground.setFillColor(m_buttonOkBackground.getOutlineColor());
  153. m_buttonOkBackground.setOutlineThickness(0);
  154. m_isClosing = true;
  155. m_tweenManager.killAll();
  156. TweenEngine::Tween::to(m_background, m_background.COLOR_ALPHA, 0.3f).target(0.f).start(m_tweenManager);
  157. TWEEN_OUT(m_title);
  158. TWEEN_OUT(m_message);
  159. TWEEN_OUT(m_buttonOkBackground);
  160. TWEEN_OUT(m_buttonOkText);
  161. TweenEngine::Tween::to(m_bottomView, m_bottomView.SIZE_XY, 0.3f).target(320.f * 1.2f, 240.f * 1.2f).start(m_tweenManager);
  162. TweenEngine::Tween::to(m_overlay, m_overlay.FILL_COLOR_ALPHA, 0.3f).target(0.f)
  163. .setCallback(TweenEngine::TweenCallback::COMPLETE, [this](TweenEngine::BaseTween* source) {
  164. requestStackPop();
  165. })
  166. .delay(0.3f).start(m_tweenManager);
  167. }
  168. return false;
  169. }
  170. void NewsState::setScroll(float position)
  171. {
  172. m_scrollPos = position;
  173. m_message.setPosition(35.f, std::round(60.f + position));
  174. }
  175. float NewsState::getScroll()
  176. {
  177. return m_scrollPos;
  178. }
  179. const cpp3ds::Vector2f &NewsState::getScrollSize()
  180. {
  181. return m_scrollSize;
  182. }
  183. } // namespace FreeShop