From 21b167ed9b6ae02c193422f7bb480929ef6e7776 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Tue, 18 Jan 2022 22:04:05 +0100 Subject: [PATCH] Added support to the new gamelist classes for changing view styles. Also removed the deprecated 'grid' view style and corresponding menu option. --- es-app/src/guis/GuiMenu.cpp | 1 - es-app/src/views/GamelistBase.cpp | 9 ++- es-app/src/views/GamelistBase.h | 2 + es-app/src/views/GamelistView.cpp | 93 ++++++++++++++++++++++++++--- es-app/src/views/GamelistView.h | 18 +++++- es-app/src/views/ViewController.cpp | 50 +++++----------- es-app/src/views/ViewController.h | 1 - 7 files changed, 127 insertions(+), 47 deletions(-) diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp index 0884cbd4a..52836bd22 100644 --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -136,7 +136,6 @@ void GuiMenu::openUIOptions() gamelist_view_style->add("basic", "basic", selectedViewStyle == "basic"); gamelist_view_style->add("detailed", "detailed", selectedViewStyle == "detailed"); gamelist_view_style->add("video", "video", selectedViewStyle == "video"); - gamelist_view_style->add("grid (deprecated)", "grid", selectedViewStyle == "grid"); // If there are no objects returned, then there must be a manually modified entry in the // configuration file. Simply set the view style to Automatic in this case. if (gamelist_view_style->getSelectedObjects().size() == 0) diff --git a/es-app/src/views/GamelistBase.cpp b/es-app/src/views/GamelistBase.cpp index 59a120b32..e9fbe2260 100644 --- a/es-app/src/views/GamelistBase.cpp +++ b/es-app/src/views/GamelistBase.cpp @@ -19,7 +19,14 @@ GamelistBase::GamelistBase(Window* window, FileData* root) , mRoot {root} , mList {window} , mRandomGame {nullptr} - , mLastUpdated(nullptr) + , mLastUpdated {nullptr} + , mGameCount {0} + , mFavoritesGameCount {0} + , mFilteredGameCount {0} + , mFilteredGameCountAll {0} + , mIsFiltered {false} + , mIsFolder {false} + , mVideoPlaying {false} { setSize(static_cast(Renderer::getScreenWidth()), static_cast(Renderer::getScreenHeight())); diff --git a/es-app/src/views/GamelistBase.h b/es-app/src/views/GamelistBase.h index 7f0f18981..9027827f5 100644 --- a/es-app/src/views/GamelistBase.h +++ b/es-app/src/views/GamelistBase.h @@ -20,6 +20,7 @@ #include "components/ScrollableContainer.h" #include "components/TextComponent.h" #include "components/TextListComponent.h" +#include "components/VideoFFmpegComponent.h" #include @@ -96,6 +97,7 @@ protected: unsigned int mFilteredGameCountAll; bool mIsFiltered; bool mIsFolder; + bool mVideoPlaying; private: }; diff --git a/es-app/src/views/GamelistView.cpp b/es-app/src/views/GamelistView.cpp index 0b5cca0b2..e9fa8f3ce 100644 --- a/es-app/src/views/GamelistView.cpp +++ b/es-app/src/views/GamelistView.cpp @@ -17,12 +17,14 @@ GamelistView::GamelistView(Window* window, FileData* root) : GamelistBase {window, root} + , mViewStyle {ViewController::BASIC} , mHeaderText {window} , mHeaderImage {window} , mBackground {window} , mThumbnail {window} , mMarquee {window} , mImage {window} + , mVideo(nullptr) , mLblRating {window} , mLblReleaseDate {window} , mLblDeveloper {window} @@ -45,6 +47,8 @@ GamelistView::GamelistView(Window* window, FileData* root) , mDescription {window} , mGamelistInfo {window} { + mViewStyle = ViewController::getInstance()->getState().viewstyle; + mHeaderText.setText("Logo Text", false); mHeaderText.setSize(mSize.x, 0.0f); mHeaderText.setPosition(0.0f, 0.0f); @@ -66,6 +70,11 @@ GamelistView::GamelistView(Window* window, FileData* root) const float padding = 0.01f; + if (mViewStyle == ViewController::VIDEO) { + // Create the video window. + mVideo = new VideoFFmpegComponent(window); + } + mList.setPosition(mSize.x * (0.50f + padding), mList.getPosition().y); mList.setSize(mSize.x * (0.50f - padding), mList.getSize().y); mList.setAlignment(TextListComponent::ALIGN_LEFT); @@ -95,6 +104,15 @@ GamelistView::GamelistView(Window* window, FileData* root) mImage.setDefaultZIndex(30.0f); addChild(&mImage); + if (mViewStyle == ViewController::VIDEO) { + // Video. + mVideo->setOrigin(0.5f, 0.5f); + mVideo->setPosition(mSize.x * 0.25f, mSize.y * 0.4f); + mVideo->setSize(mSize.x * (0.5f - 2.0f * padding), mSize.y * 0.4f); + mVideo->setDefaultZIndex(30.0f); + addChild(mVideo); + } + // Metadata labels + values. mLblRating.setText("Rating: ", false); addChild(&mLblRating); @@ -165,6 +183,9 @@ GamelistView::~GamelistView() delete extra; } mThemeExtras.clear(); + + if (mViewStyle == ViewController::VIDEO && mVideo != nullptr) + delete mVideo; } void GamelistView::onFileChanged(FileData* file, bool reloadGamelist) @@ -235,6 +256,12 @@ void GamelistView::onThemeChanged(const std::shared_ptr& theme) POSITION | ThemeFlags::SIZE | Z_INDEX | ROTATION | VISIBLE); mImage.applyTheme(theme, getName(), "md_image", POSITION | ThemeFlags::SIZE | Z_INDEX | ROTATION | VISIBLE); + + if (mViewStyle == ViewController::VIDEO) { + mVideo->applyTheme(theme, getName(), "md_video", + POSITION | ThemeFlags::SIZE | ThemeFlags::DELAY | Z_INDEX | ROTATION | + VISIBLE); + } mName.applyTheme(theme, getName(), "md_name", ALL); mBadges.applyTheme(theme, getName(), "md_badges", ALL); @@ -277,12 +304,23 @@ void GamelistView::onThemeChanged(const std::shared_ptr& theme) void GamelistView::update(int deltaTime) { - // TEMPORARY - // BasicGamelistView::update(deltaTime); mImage.update(deltaTime); if (ViewController::getInstance()->getGameLaunchTriggered() && mImage.isAnimationPlaying(0)) mImage.finishAnimation(0); + + if (mViewStyle == ViewController::VIDEO) { + if (!mVideoPlaying) + mVideo->onHide(); + else if (mVideoPlaying && !mVideo->isVideoPaused() && !mWindow->isScreensaverActive()) + mVideo->onShow(); + + mVideo->update(deltaTime); + + if (ViewController::getInstance()->getGameLaunchTriggered() && + mVideo->isAnimationPlaying(0)) + mVideo->finishAnimation(0); + } } void GamelistView::render(const glm::mat4& parentTrans) @@ -392,7 +430,7 @@ void GamelistView::updateInfoPanel() mLastUpdated->getPath() == mLastUpdated->getSystem()->getName())) hideMetaDataFields = true; - if (hideMetaDataFields) { + if (hideMetaDataFields || mViewStyle == ViewController::BASIC) { mLblRating.setVisible(false); mRating.setVisible(false); mLblReleaseDate.setVisible(false); @@ -433,6 +471,7 @@ void GamelistView::updateInfoPanel() bool fadingOut = false; if (file == nullptr) { + mVideoPlaying = false; fadingOut = true; } else { @@ -447,19 +486,45 @@ void GamelistView::updateInfoPanel() mThumbnail.setImage(mRandomGame->getThumbnailPath()); mMarquee.setImage(mRandomGame->getMarqueePath(), false, true); mImage.setImage(mRandomGame->getImagePath()); + if (mViewStyle == ViewController::VIDEO) { + mVideo->setImage(mRandomGame->getImagePath()); + // Always stop the video before setting a new video as it will otherwise + // continue to play if it has the same path (i.e. it is the same physical video + // file) as the previously set video. That may happen when entering a folder + // with the same name as the first game file inside, or as in this case, when + // entering a custom collection. + mVideo->onHide(); + + if (!mVideo->setVideo(mRandomGame->getVideoPath())) + mVideo->setDefaultVideo(); + } } else { mThumbnail.setImage(""); mMarquee.setImage(""); mImage.setImage(""); + if (mViewStyle == ViewController::VIDEO) { + mVideo->setImage(""); + mVideo->setVideo(""); + mVideo->setDefaultVideo(); + } } } else { mThumbnail.setImage(file->getThumbnailPath()); mMarquee.setImage(file->getMarqueePath(), false, true); mImage.setImage(file->getImagePath()); + if (mViewStyle == ViewController::VIDEO) { + mVideo->setImage(file->getImagePath()); + mVideo->onHide(); + + if (!mVideo->setVideo(file->getVideoPath())) + mVideo->setDefaultVideo(); + } } + mVideoPlaying = true; + // Populate the gamelistInfo field which shows an icon if a folder has been entered // as well as the game count for the entire system (total and favorites separately). // If a filter has been applied, then the number of filtered and total games replaces @@ -495,12 +560,22 @@ void GamelistView::updateInfoPanel() mGamelistInfo.setValue(gamelistInfoString); - // Fade in the game image. - auto func = [this](float t) { - mImage.setOpacity(static_cast( - glm::mix(static_cast(FADE_IN_START_OPACITY), 1.0f, t) * 255)); - }; - mImage.setAnimation(new LambdaAnimation(func, FADE_IN_TIME), 0, nullptr, false); + if (mViewStyle == ViewController::DETAILED) { + // Fade in the game image. + auto func = [this](float t) { + mImage.setOpacity(static_cast( + glm::mix(static_cast(FADE_IN_START_OPACITY), 1.0f, t) * 255)); + }; + mImage.setAnimation(new LambdaAnimation(func, FADE_IN_TIME), 0, nullptr, false); + } + else if (mViewStyle == ViewController::VIDEO) { + // Fade in the static image. + auto func = [this](float t) { + mVideo->setOpacity(static_cast( + glm::mix(static_cast(FADE_IN_START_OPACITY), 1.0f, t) * 255)); + }; + mVideo->setAnimation(new LambdaAnimation(func, FADE_IN_TIME), 0, nullptr, false); + } mDescription.setText(file->metadata.get("desc")); mDescContainer.reset(); diff --git a/es-app/src/views/GamelistView.h b/es-app/src/views/GamelistView.h index b3694c663..05645c020 100644 --- a/es-app/src/views/GamelistView.h +++ b/es-app/src/views/GamelistView.h @@ -27,7 +27,20 @@ public: void preloadGamelist() { updateInfoPanel(); } void launch(FileData* game) override { ViewController::getInstance()->triggerGameLaunch(game); } - std::string getName() const { return "detailed"; } + std::string getName() const + { + auto selectedViewStyle = ViewController::getInstance()->getState(); + switch (selectedViewStyle.viewstyle) { + case ViewController::VIDEO: + return "video"; + case ViewController::DETAILED: + return "detailed"; + case ViewController::BASIC: + return "basic"; + default: + return "basic"; + } + } const std::shared_ptr getTheme() const { return mTheme; } void setTheme(const std::shared_ptr& theme) @@ -49,6 +62,8 @@ private: void initMDLabels(); void initMDValues(); + ViewController::GamelistViewStyle mViewStyle; + std::vector getMDLabels(); std::vector getMDValues(); @@ -62,6 +77,7 @@ private: ImageComponent mThumbnail; ImageComponent mMarquee; ImageComponent mImage; + VideoComponent* mVideo; TextComponent mLblRating; TextComponent mLblReleaseDate; diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index 2b5379e3d..dc219e818 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -545,8 +545,6 @@ void ViewController::goToGamelist(SystemData* system) mState.viewstyle = DETAILED; else if (viewStyle == "video") mState.viewstyle = VIDEO; - else if (viewStyle == "grid") - mState.viewstyle = GRID; } if (mCurrentView) @@ -736,8 +734,6 @@ std::shared_ptr ViewController::getGamelistView(SystemData* system selectedViewStyle = BASIC; if (viewPreference.compare("detailed") == 0) selectedViewStyle = DETAILED; - if (viewPreference.compare("grid") == 0) - selectedViewStyle = GRID; if (viewPreference.compare("video") == 0) selectedViewStyle = VIDEO; @@ -756,38 +752,24 @@ std::shared_ptr ViewController::getGamelistView(SystemData* system } // Create the view. - /* - switch (selectedViewStyle) { - case VIDEO: { - view = std::shared_ptr( - new VideoGamelistView(mWindow, system->getRootFolder())); - mState.viewstyle = VIDEO; - break; - } - case DETAILED: { - view = std::shared_ptr( - new DetailedGamelistView(mWindow, system->getRootFolder())); - mState.viewstyle = DETAILED; - break; - } - case GRID: { - view = std::shared_ptr( - new GridGamelistView(mWindow, system->getRootFolder())); - mState.viewstyle = GRID; - break; - } - case BASIC: { - } - default: { - view = std::shared_ptr( - new BasicGamelistView(mWindow, system->getRootFolder())); - mState.viewstyle = BASIC; - break; - } + switch (selectedViewStyle) { + case VIDEO: { + mState.viewstyle = VIDEO; + break; } - */ + case DETAILED: { + mState.viewstyle = DETAILED; + break; + } + case BASIC: { + } + default: { + mState.viewstyle = BASIC; + break; + } + } + view = std::shared_ptr(new GamelistView(mWindow, system->getRootFolder())); - mState.viewstyle = DETAILED; view->setTheme(system->getTheme()); diff --git a/es-app/src/views/ViewController.h b/es-app/src/views/ViewController.h index c91b8235e..60dff4548 100644 --- a/es-app/src/views/ViewController.h +++ b/es-app/src/views/ViewController.h @@ -89,7 +89,6 @@ public: AUTOMATIC, // Replace with AllowShortEnumsOnASingleLine: false (clang-format >=11.0). BASIC, DETAILED, - GRID, VIDEO };