Merge pull request #210 from fabricecaruso/dev

ScreenSaver : better video screensaver with game & system name.
This commit is contained in:
Nicolas Adenis-Lamarre
2019-10-08 22:03:29 +02:00
committed by GitHub
12 changed files with 467 additions and 198 deletions
File diff suppressed because it is too large Load Diff
+46 -11
View File
@@ -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);
}
}
}
+3 -1
View File
@@ -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
+1 -1
View File
@@ -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"));
+30 -8
View File
@@ -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"));
+1 -1
View File
@@ -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 },
+5 -2
View File
@@ -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()
+6
View File
@@ -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
+1 -20
View File
@@ -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