// SPDX-License-Identifier: MIT // // ES-DE Frontend // SystemView.h // // Main system view. // #ifndef ES_APP_VIEWS_SYSTEM_VIEW_H #define ES_APP_VIEWS_SYSTEM_VIEW_H #include "FileData.h" #include "GuiComponent.h" #include "Sound.h" #include "SystemData.h" #include "components/DateTimeComponent.h" #include "components/GIFAnimComponent.h" #include "components/GameSelectorComponent.h" #include "components/LottieAnimComponent.h" #include "components/RatingComponent.h" #include "components/ScrollableContainer.h" #include "components/TextComponent.h" #include "components/VideoFFmpegComponent.h" #include "components/primary/CarouselComponent.h" #include "components/primary/GridComponent.h" #include "components/primary/TextListComponent.h" #include "resources/Font.h" #include class SystemData; class SystemView : public GuiComponent { public: using PrimaryType = PrimaryComponent::PrimaryType; SystemView(); void onShow() override; void onHide() override; void onTransition() override; void goToSystem(SystemData* system, bool animate); bool input(InputConfig* config, Input input) override; void update(int deltaTime) override; void render(const glm::mat4& parentTrans) override; bool isScrolling() { return mPrimary->isScrolling(); } void stopScrolling() { mPrimary->stopScrolling(); mCamOffset = static_cast(mPrimary->getCursor()); } bool isSystemAnimationPlaying(unsigned char slot) { return mPrimary->isAnimationPlaying(slot); } void finishSystemAnimation(unsigned char slot) { if (mFadeTransitions && mTransitionAnim) { mPrimary->finishAnimation(slot); mTransitionAnim = false; } else { finishAnimation(slot); mPrimary->finishAnimation(slot); mMaxFade = false; } } PrimaryComponent::PrimaryType getPrimaryType() { return mPrimaryType; } CarouselComponent::CarouselType getCarouselType() { return (mCarousel != nullptr) ? mCarousel->getType() : CarouselComponent::CarouselType::NO_CAROUSEL; } SystemData* getFirstSystem() { return mPrimary->getFirst(); } void startViewVideos() override { for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents) video->startVideoPlayer(); } void stopViewVideos() override { for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents) video->stopVideoPlayer(); } void pauseViewVideos() override { for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents) { video->pauseVideoPlayer(); } } void muteViewVideos() override { for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents) video->muteVideoPlayer(); } void resetViewVideosTimer() override { for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents) video->resetVideoPlayerTimer(); } void onThemeChanged(const std::shared_ptr& theme); std::vector getHelpPrompts() override; HelpStyle getHelpStyle() override { return mSystemElements[mPrimary->getCursor()].helpStyle; } protected: void onCursorChanged(const CursorState& state); private: void populate(); void updateGameCount(SystemData* system = nullptr); void updateGameSelectors(); void renderElements(const glm::mat4& parentTrans, bool abovePrimary); struct SystemViewElements { SystemData* system; HelpStyle helpStyle; std::string name; std::string fullName; std::vector> gameSelectors; std::vector children; std::vector> imageComponents; std::vector> videoComponents; std::vector> lottieAnimComponents; std::vector> GIFAnimComponents; std::vector> containerComponents; std::vector> containerTextComponents; std::vector> gameCountComponents; std::vector> textComponents; std::vector> dateTimeComponents; std::vector> ratingComponents; }; Renderer* mRenderer; std::unique_ptr> mCarousel; std::unique_ptr> mGrid; std::unique_ptr> mTextList; std::vector mSystemElements; PrimaryComponent* mPrimary; PrimaryType mPrimaryType; int mLastCursor; // Dummy entry to keep the default SVG rating images in the texture cache so they don't // need to be re-rasterized for each gamelist that is loaded. RatingComponent mRatingDummy; float mCamOffset; float mFadeOpacity; int mPreviousScrollVelocity; bool mUpdatedGameCount; bool mViewNeedsReload; bool mNavigated; bool mMaxFade; bool mFadeTransitions; bool mTransitionAnim; }; #endif // ES_APP_VIEWS_SYSTEM_VIEW_H