You've already forked emulationstation-next
mirror of
https://github.com/archr-linux/emulationstation-next.git
synced 2026-07-13 03:19:12 -07:00
Merge pull request #210 from fabricecaruso/dev
ScreenSaver : better video screensaver with game & system name.
This commit is contained in:
+340
-144
File diff suppressed because it is too large
Load Diff
@@ -4,32 +4,65 @@
|
||||
|
||||
#include "Window.h"
|
||||
#include "GuiComponent.h"
|
||||
#include "renderers/Renderer.h"
|
||||
|
||||
class ImageComponent;
|
||||
class Sound;
|
||||
class VideoComponent;
|
||||
class TextComponent;
|
||||
|
||||
class ImageScreenSaver : GuiComponent
|
||||
class GameScreenSaverBase : public GuiComponent
|
||||
{
|
||||
public:
|
||||
GameScreenSaverBase(Window* window);
|
||||
~GameScreenSaverBase();
|
||||
|
||||
virtual void setGame(FileData* mCurrentGame);
|
||||
|
||||
void render(const Transform4x4f& transform) override;
|
||||
|
||||
void setOpacity(unsigned char opacity) override;
|
||||
|
||||
protected:
|
||||
ImageComponent* mMarquee;
|
||||
TextComponent* mLabelGame;
|
||||
TextComponent* mLabelSystem;
|
||||
|
||||
ImageComponent* mDecoration;
|
||||
|
||||
Renderer::Rect mViewport;
|
||||
};
|
||||
|
||||
class ImageScreenSaver : public GameScreenSaverBase
|
||||
{
|
||||
public:
|
||||
ImageScreenSaver(Window* window);
|
||||
~ImageScreenSaver();
|
||||
|
||||
void setGame(FileData* mCurrentGame);
|
||||
void setImage(const std::string path);
|
||||
bool hasImage();
|
||||
|
||||
void render(const Transform4x4f& transform) override;
|
||||
void update(int deltaTime) override;
|
||||
|
||||
void setOpacity(unsigned char opacity) override;
|
||||
void render(const Transform4x4f& transform) override;
|
||||
|
||||
private:
|
||||
ImageComponent* mImage;
|
||||
ImageComponent* mMarquee;
|
||||
TextComponent* mLabelGame;
|
||||
TextComponent* mLabelSystem;
|
||||
};
|
||||
|
||||
class VideoScreenSaver : public GameScreenSaverBase
|
||||
{
|
||||
public:
|
||||
VideoScreenSaver(Window* window);
|
||||
~VideoScreenSaver();
|
||||
|
||||
void setVideo(const std::string path);
|
||||
void render(const Transform4x4f& transform) override;
|
||||
void update(int deltaTime) override;
|
||||
|
||||
private:
|
||||
VideoComponent* mVideo;
|
||||
|
||||
int mTime;
|
||||
float mFade;
|
||||
};
|
||||
|
||||
// Screensaver implementation for main window
|
||||
@@ -69,11 +102,13 @@ private:
|
||||
|
||||
private:
|
||||
bool mVideosCounted;
|
||||
unsigned long mVideoCount;
|
||||
VideoComponent* mVideoScreensaver;
|
||||
unsigned long mVideoCount;
|
||||
bool mImagesCounted;
|
||||
unsigned long mImageCount;
|
||||
|
||||
//VideoComponent* mVideoScreensaver;
|
||||
std::shared_ptr<VideoScreenSaver> mVideoScreensaver;
|
||||
|
||||
std::shared_ptr<ImageScreenSaver> mFadingImageScreensaver;
|
||||
std::shared_ptr<ImageScreenSaver> mImageScreensaver;
|
||||
|
||||
|
||||
@@ -436,17 +436,28 @@ void ScraperSearchComponent::update(int deltaTime)
|
||||
auto status = mSearchHandle->status();
|
||||
auto results = mSearchHandle->getResults();
|
||||
auto statusString = mSearchHandle->getStatusString();
|
||||
|
||||
// we reset here because onSearchDone in auto mode can call mSkipCallback() which can call
|
||||
// another search() which will set our mSearchHandle to something important
|
||||
mSearchHandle.reset();
|
||||
|
||||
if(status == ASYNC_DONE)
|
||||
|
||||
if (status == ASYNC_DONE && results.size() == 0 && mSearchType == NEVER_AUTO_ACCEPT &&
|
||||
mLastSearch.nameOverride.empty() && Settings::getInstance()->getString("Scraper") == "ScreenScraper")
|
||||
{
|
||||
onSearchDone(results);
|
||||
}else if(status == ASYNC_ERROR)
|
||||
// ScreenScraper in UI mode -> jeuInfo has no result, try with jeuRecherche
|
||||
mLastSearch.nameOverride = mLastSearch.game->getName();
|
||||
mSearchHandle = startScraperSearch(mLastSearch);
|
||||
}
|
||||
else
|
||||
{
|
||||
onSearchError(statusString);
|
||||
// we reset here because onSearchDone in auto mode can call mSkipCallback() which can call
|
||||
// another search() which will set our mSearchHandle to something important
|
||||
mSearchHandle.reset();
|
||||
|
||||
if (status == ASYNC_DONE)
|
||||
{
|
||||
onSearchDone(results);
|
||||
}
|
||||
else if (status == ASYNC_ERROR)
|
||||
{
|
||||
onSearchError(statusString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,8 +83,10 @@ private:
|
||||
|
||||
std::vector<StrInputConfig*> mLoadedInput; // used to keep information about loaded devices in case there are unpluged between device window load and save
|
||||
void clearLoadedInput();
|
||||
static std::vector<DecorationSetInfo> getDecorationsSets(SystemData* system = nullptr);
|
||||
static void createDecorationItemTemplate(Window* window, std::vector<DecorationSetInfo> sets, std::string data, ComponentListRow& row);
|
||||
|
||||
public:
|
||||
static std::vector<DecorationSetInfo> getDecorationsSets(SystemData* system = nullptr);
|
||||
};
|
||||
|
||||
#endif // ES_APP_GUIS_GUI_MENU_H
|
||||
|
||||
@@ -251,7 +251,7 @@ void GuiMetaDataEd::save()
|
||||
|
||||
void GuiMetaDataEd::fetch()
|
||||
{
|
||||
mScraperParams.nameOverride = mScraperParams.game->getName();
|
||||
// mScraperParams.nameOverride = mScraperParams.game->getName();
|
||||
|
||||
GuiGameScraper* scr = new GuiGameScraper(mWindow, mScraperParams, std::bind(&GuiMetaDataEd::fetchDone, this, std::placeholders::_1));
|
||||
mWindow->pushGui(scr);
|
||||
|
||||
@@ -28,9 +28,19 @@ GuiSlideshowScreensaverOptions::GuiSlideshowScreensaverOptions(Window* window, c
|
||||
// SHOW GAME NAME
|
||||
auto ss_controls = std::make_shared<SwitchComponent>(mWindow);
|
||||
ss_controls->setState(Settings::getInstance()->getBool("SlideshowScreenSaverGameName"));
|
||||
addWithLabel(row, _("SHOW GAME NAME"), ss_controls);
|
||||
addWithLabel(row, _("SHOW GAME INFO"), ss_controls);
|
||||
addSaveFunc([ss_controls] { Settings::getInstance()->setBool("SlideshowScreenSaverGameName", ss_controls->getState()); });
|
||||
|
||||
auto marquee_screensaver = std::make_shared<SwitchComponent>(mWindow);
|
||||
marquee_screensaver->setState(Settings::getInstance()->getBool("ScreenSaverMarquee"));
|
||||
addWithLabel(row, _("USE MARQUEE AS GAME INFO"), marquee_screensaver);
|
||||
addSaveFunc([marquee_screensaver] { Settings::getInstance()->setBool("ScreenSaverMarquee", marquee_screensaver->getState()); });
|
||||
|
||||
auto decoration_screensaver = std::make_shared<SwitchComponent>(mWindow);
|
||||
decoration_screensaver->setState(Settings::getInstance()->getBool("ScreenSaverDecoration"));
|
||||
addWithLabel(row, _("USE RANDOM DECORATION"), decoration_screensaver);
|
||||
addSaveFunc([decoration_screensaver] { Settings::getInstance()->setBool("ScreenSaverDecoration", decoration_screensaver->getState()); });
|
||||
|
||||
// stretch
|
||||
auto sss_stretch = std::make_shared<SwitchComponent>(mWindow);
|
||||
sss_stretch->setState(Settings::getInstance()->getBool("SlideshowScreenSaverStretch"));
|
||||
|
||||
@@ -19,12 +19,22 @@ GuiVideoScreensaverOptions::GuiVideoScreensaverOptions(Window* window, const cha
|
||||
PowerSaver::updateTimeouts();
|
||||
});
|
||||
|
||||
#ifdef _RPI_
|
||||
//#ifdef _RPI_
|
||||
auto ss_omx = std::make_shared<SwitchComponent>(mWindow);
|
||||
ss_omx->setState(Settings::getInstance()->getBool("ScreenSaverOmxPlayer"));
|
||||
addWithLabel(_("USE OMX PLAYER FOR SCREENSAVER"), ss_omx);
|
||||
addSaveFunc([ss_omx, this] { Settings::getInstance()->setBool("ScreenSaverOmxPlayer", ss_omx->getState()); });
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
ss_omx->setOnChangedCallback([this, ss_omx, window]()
|
||||
{
|
||||
if (Settings::getInstance()->setBool("ScreenSaverOmxPlayer", ss_omx->getState()))
|
||||
{
|
||||
Window* pw = mWindow;
|
||||
delete this;
|
||||
pw->pushGui(new GuiVideoScreensaverOptions(pw, _("VIDEO SCREENSAVER").c_str()));
|
||||
}
|
||||
});
|
||||
|
||||
// Render Video Game Name as subtitles
|
||||
auto ss_info = std::make_shared< OptionListComponent<std::string> >(mWindow, _("SHOW GAME INFO"), false);
|
||||
@@ -37,12 +47,24 @@ GuiVideoScreensaverOptions::GuiVideoScreensaverOptions(Window* window, const cha
|
||||
addWithLabel(_("SHOW GAME INFO ON SCREENSAVER"), ss_info);
|
||||
addSaveFunc([ss_info, this] { Settings::getInstance()->setString("ScreenSaverGameInfo", ss_info->getSelected()); });
|
||||
|
||||
#ifndef _RPI_
|
||||
auto captions_compatibility = std::make_shared<SwitchComponent>(mWindow);
|
||||
captions_compatibility->setState(Settings::getInstance()->getBool("CaptionsCompatibility"));
|
||||
addWithLabel(_("USE COMPATIBLE LOW RESOLUTION FOR CAPTIONS"), captions_compatibility);
|
||||
addSaveFunc([captions_compatibility] { Settings::getInstance()->setBool("CaptionsCompatibility", captions_compatibility->getState()); });
|
||||
#endif
|
||||
bool advancedOptions = true;
|
||||
|
||||
//#ifdef _RPI_
|
||||
advancedOptions = !Settings::getInstance()->getBool("ScreenSaverOmxPlayer");
|
||||
//#endif
|
||||
|
||||
if (advancedOptions)
|
||||
{
|
||||
auto marquee_screensaver = std::make_shared<SwitchComponent>(mWindow);
|
||||
marquee_screensaver->setState(Settings::getInstance()->getBool("ScreenSaverMarquee"));
|
||||
addWithLabel(_("USE MARQUEE AS GAME INFO"), marquee_screensaver);
|
||||
addSaveFunc([marquee_screensaver] { Settings::getInstance()->setBool("ScreenSaverMarquee", marquee_screensaver->getState()); });
|
||||
|
||||
auto decoration_screensaver = std::make_shared<SwitchComponent>(mWindow);
|
||||
decoration_screensaver->setState(Settings::getInstance()->getBool("ScreenSaverDecoration"));
|
||||
addWithLabel(_("USE RANDOM DECORATION"), decoration_screensaver);
|
||||
addSaveFunc([decoration_screensaver] { Settings::getInstance()->setBool("ScreenSaverDecoration", decoration_screensaver->getState()); });
|
||||
}
|
||||
|
||||
auto stretch_screensaver = std::make_shared<SwitchComponent>(mWindow);
|
||||
stretch_screensaver->setState(Settings::getInstance()->getBool("StretchVideoOnScreenSaver"));
|
||||
|
||||
@@ -23,7 +23,7 @@ const std::map<PlatformId, unsigned short> screenscraper_platformid_map{
|
||||
{ AMSTRAD_CPC, 65 },
|
||||
{ APPLE_II, 86 },
|
||||
{ ARCADE, 75 },
|
||||
{ ATARI_800, 26 }, // Use ATARI_2600 as an alias for atari 800
|
||||
{ ATARI_800, 43 },
|
||||
{ ATARI_2600, 26 },
|
||||
{ ATARI_5200, 40 },
|
||||
{ ATARI_7800, 41 },
|
||||
|
||||
@@ -124,7 +124,8 @@ void Settings::setDefaults()
|
||||
mStringMap["ScrapperThumbSrc"] = "box-2D";
|
||||
mBoolMap["ScrapeMarquee"] = false;
|
||||
mBoolMap["ScrapeVideos"] = false;
|
||||
|
||||
|
||||
mBoolMap["ScreenSaverMarquee"] = true;
|
||||
mBoolMap["ScreenSaverControls"] = true;
|
||||
mStringMap["ScreenSaverGameInfo"] = "never";
|
||||
mBoolMap["StretchVideoOnScreenSaver"] = false;
|
||||
@@ -138,6 +139,8 @@ void Settings::setDefaults()
|
||||
mStringMap["SlideshowScreenSaverImageFilter"] = ".png,.jpg";
|
||||
mBoolMap["SlideshowScreenSaverRecurse"] = false;
|
||||
mBoolMap["SlideshowScreenSaverGameName"] = true;
|
||||
mBoolMap["ScreenSaverDecoration"] = false;
|
||||
|
||||
|
||||
// This setting only applies to raspberry pi but set it for all platforms so
|
||||
// we don't get a warning if we encounter it on a different platform
|
||||
@@ -152,7 +155,7 @@ void Settings::setDefaults()
|
||||
mIntMap["ScreenSaverSwapVideoTimeout"] = 30000;
|
||||
|
||||
mBoolMap["VideoAudio"] = true;
|
||||
mBoolMap["CaptionsCompatibility"] = true;
|
||||
|
||||
// Audio out device for Video playback using OMX player.
|
||||
mStringMap["OMXAudioDev"] = "both";
|
||||
mStringMap["CollectionSystemsAuto"] = "all,favorites"; // batocera 2players,4players,favorites,recent
|
||||
|
||||
@@ -80,6 +80,9 @@ void SwitchComponent::onStateChanged()
|
||||
{
|
||||
auto theme = ThemeData::getMenuTheme();
|
||||
mImage.setImage(mState ? theme->Icons.on : theme->Icons.off);
|
||||
|
||||
if (mOnChangedCallback != nullptr)
|
||||
mOnChangedCallback();
|
||||
}
|
||||
|
||||
std::vector<HelpPrompt> SwitchComponent::getHelpPrompts()
|
||||
|
||||
@@ -26,12 +26,18 @@ public:
|
||||
|
||||
void setColor(unsigned int color);
|
||||
|
||||
inline void setOnChangedCallback(const std::function<void()>& callback) {
|
||||
mOnChangedCallback = callback;
|
||||
}
|
||||
|
||||
private:
|
||||
void onStateChanged();
|
||||
|
||||
ImageComponent mImage;
|
||||
bool mState;
|
||||
bool mInitialState; // batocera
|
||||
|
||||
std::function<void()> mOnChangedCallback; // batocera
|
||||
};
|
||||
|
||||
#endif // ES_CORE_COMPONENTS_SWITCH_COMPONENT_H
|
||||
|
||||
@@ -457,26 +457,7 @@ void VideoVlcComponent::startVideo()
|
||||
|
||||
// Make sure we found a valid video track
|
||||
if ((mVideoWidth > 0) && (mVideoHeight > 0))
|
||||
{
|
||||
#ifndef _RPI_
|
||||
if (mScreensaverMode)
|
||||
{
|
||||
if(!Settings::getInstance()->getBool("CaptionsCompatibility")) {
|
||||
|
||||
Vector2f resizeScale((Renderer::getScreenWidth() / (float)mVideoWidth), (Renderer::getScreenHeight() / (float)mVideoHeight));
|
||||
|
||||
if(resizeScale.x() < resizeScale.y())
|
||||
{
|
||||
mVideoWidth = (unsigned int) (mVideoWidth * resizeScale.x());
|
||||
mVideoHeight = (unsigned int) (mVideoHeight * resizeScale.x());
|
||||
}else{
|
||||
mVideoWidth = (unsigned int) (mVideoWidth * resizeScale.y());
|
||||
mVideoHeight = (unsigned int) (mVideoHeight * resizeScale.y());
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
if (Settings::getInstance()->getBool("OptimizeVideo"))
|
||||
{
|
||||
// Avoid videos bigger than resolution
|
||||
|
||||
Reference in New Issue
Block a user