From 06ee3aa566a2723ae8e50e0996c3dc0cbfc8aa60 Mon Sep 17 00:00:00 2001 From: bulzipke Date: Sun, 22 Dec 2024 03:55:24 +0900 Subject: [PATCH] [Screensaver] Added Date Time display --- es-app/src/SystemScreenSaver.cpp | 122 +++++++++++++++++- es-app/src/SystemScreenSaver.h | 6 + .../src/guis/GuiGeneralScreensaverOptions.cpp | 64 +++++++++ es-core/src/Settings.cpp | 5 +- 4 files changed, 194 insertions(+), 3 deletions(-) diff --git a/es-app/src/SystemScreenSaver.cpp b/es-app/src/SystemScreenSaver.cpp index 2cd86dec0b..800ed7ff53 100644 --- a/es-app/src/SystemScreenSaver.cpp +++ b/es-app/src/SystemScreenSaver.cpp @@ -26,7 +26,8 @@ #include "Paths.h" #include "ApiSystem.h" -#define FADE_TIME 500 +#define FADE_TIME (500) +#define DATE_TIME_UPDATE_INTERVAL (100) SystemScreenSaver::SystemScreenSaver(Window* window) : mVideoScreensaver(NULL), @@ -524,6 +525,39 @@ GameScreenSaverBase::GameScreenSaverBase(Window* window) : GuiComponent(window), mMarquee = nullptr; mLabelGame = nullptr; mLabelSystem = nullptr; + mLabelDate = nullptr; + mLabelTime = nullptr; + mDateTimeUpdateAccumulator = 0; + mDateTimeLastUpdate = 0; + + if (Settings::getInstance()->getBool("ScreenSaverDateTime")) + { + auto ph = ThemeData::getMenuTheme()->Text.font->getPath(); + auto sz = mViewport.h / 16.f; + auto margin = sz / 2.f; + auto font = Font::get(sz, ph); + int fh = font->getLetterHeight(); + + mLabelDate = new TextComponent(mWindow); + mLabelDate->setPosition(mViewport.x + margin, mViewport.y + margin); + mLabelDate->setSize(mViewport.w, sz * 0.66); + mLabelDate->setHorizontalAlignment(ALIGN_LEFT); + mLabelDate->setVerticalAlignment(ALIGN_CENTER); + mLabelDate->setColor(0xD0D0D0FF); + mLabelDate->setGlowColor(0x00000060); + mLabelDate->setGlowSize(2); + mLabelDate->setFont(ph, sz * 0.66); + + mLabelTime = new TextComponent(mWindow); + mLabelTime->setPosition(mViewport.x + margin, mViewport.y + margin + mLabelDate->getSize().y() * 1.3f); + mLabelTime->setSize(mViewport.w, fh); + mLabelTime->setHorizontalAlignment(ALIGN_LEFT); + mLabelTime->setVerticalAlignment(ALIGN_CENTER); + mLabelTime->setColor(0xFFFFFFFF); + mLabelTime->setGlowColor(0x00000040); + mLabelTime->setGlowSize(3); + mLabelTime->setFont(font); + } } GameScreenSaverBase::~GameScreenSaverBase() @@ -551,6 +585,18 @@ GameScreenSaverBase::~GameScreenSaverBase() delete mLabelSystem; mLabelSystem = nullptr; } + + if (mLabelDate != nullptr) + { + delete mLabelDate; + mLabelDate = nullptr; + } + + if (mLabelTime != nullptr) + { + delete mLabelTime; + mLabelTime = nullptr; + } } #include "guis/GuiMenu.h" @@ -766,6 +812,66 @@ void GameScreenSaverBase::render(const Transform4x4f& transform) mDecoration->setOpacity(mOpacity); mDecoration->render(transform); } + + if (mLabelDate) + { + mLabelDate->setOpacity(255); + mLabelDate->render(transform); + } + + if (mLabelTime) + { + mLabelTime->setOpacity(255); + mLabelTime->render(transform); + } +} + +void GameScreenSaverBase::update(int deltaTime) +{ + if (Settings::getInstance()->getBool("ScreenSaverDateTime")) + { + mDateTimeUpdateAccumulator += deltaTime; + if (mDateTimeUpdateAccumulator >= DATE_TIME_UPDATE_INTERVAL) + { + mDateTimeUpdateAccumulator -= DATE_TIME_UPDATE_INTERVAL; + + time_t now = time(NULL); + if (now != mDateTimeLastUpdate) + { + mDateTimeLastUpdate = now; + + struct tm* timeinfo = localtime(&now); + + const std::string& dateFormat = Settings::getInstance()->getString("ScreenSaverDateFormat"); + const std::string& timeFormat = Settings::getInstance()->getString("ScreenSaverTimeFormat"); + const std::string* dateFormatPtr = &dateFormat; + + std::string modifiedDateFormat; + std::string language = SystemConf::getInstance()->get("system.language"); + if (language == "ko_KR") // fix Korean string + { + if (dateFormat == "%A, %B %d") + modifiedDateFormat = std::string("%A, %B %d일"); + else if (dateFormat == "%b %d, %Y") + modifiedDateFormat = std::string("%b %d일, %Y년"); + } + if (!modifiedDateFormat.empty()) { + dateFormatPtr = &modifiedDateFormat; + } + + char dateBuffer[64]; + char timeBuffer[64]; + strftime(dateBuffer, sizeof(dateBuffer), dateFormatPtr->c_str(), timeinfo); + strftime(timeBuffer, sizeof(timeBuffer), timeFormat.c_str(), timeinfo); + + if (mLabelDate) + mLabelDate->setText(std::string(dateBuffer)); + + if (mLabelTime) + mLabelTime->setText(std::string(timeBuffer)); + } + } + } } void GameScreenSaverBase::setOpacity(unsigned char opacity) @@ -932,13 +1038,25 @@ void VideoScreenSaver::render(const Transform4x4f& transform) mDecoration->render(transform); } + if (mLabelDate) + { + mLabelDate->setOpacity(255); + mLabelDate->render(transform); + } + + if (mLabelTime) + { + mLabelTime->setOpacity(255); + mLabelTime->render(transform); + } + if (Settings::DebugImage()) Renderer::drawRect(mViewport.x, mViewport.y, mViewport.w, mViewport.h, 0xFFFF0090, 0xFFFF0090); } void VideoScreenSaver::update(int deltaTime) { - GameScreenSaverBase::update(deltaTime); + GameScreenSaverBase::update(deltaTime); if (mVideo) { diff --git a/es-app/src/SystemScreenSaver.h b/es-app/src/SystemScreenSaver.h index e7f2ef2dcc..03cf6beef4 100644 --- a/es-app/src/SystemScreenSaver.h +++ b/es-app/src/SystemScreenSaver.h @@ -20,6 +20,7 @@ class GameScreenSaverBase : public GuiComponent virtual void setGame(FileData* mCurrentGame); void render(const Transform4x4f& transform) override; + void update(int deltaTime) override; void setOpacity(unsigned char opacity) override; @@ -27,10 +28,15 @@ class GameScreenSaverBase : public GuiComponent ImageComponent* mMarquee; TextComponent* mLabelGame; TextComponent* mLabelSystem; + TextComponent* mLabelDate; + TextComponent* mLabelTime; ImageComponent* mDecoration; Renderer::Rect mViewport; + + int mDateTimeUpdateAccumulator; + time_t mDateTimeLastUpdate; }; class ImageScreenSaver : public GameScreenSaverBase diff --git a/es-app/src/guis/GuiGeneralScreensaverOptions.cpp b/es-app/src/guis/GuiGeneralScreensaverOptions.cpp index 7ed02c3780..4a6bb36ff4 100644 --- a/es-app/src/guis/GuiGeneralScreensaverOptions.cpp +++ b/es-app/src/guis/GuiGeneralScreensaverOptions.cpp @@ -116,6 +116,38 @@ void GuiGeneralScreensaverOptions::addVideoScreensaverOptions(int selectItem) addWithLabel(_("SHOW GAME INFO"), ss_info); addSaveFunc([ss_info, this] { Settings::getInstance()->setString("ScreenSaverGameInfo", ss_info->getSelected()); }); + // SHOW DATE TIME + { + bool showDateTime = Settings::getInstance()->getBool("ScreenSaverDateTime"); + + auto datetime_screensaver = std::make_shared(mWindow); + datetime_screensaver->setState(showDateTime); + addWithLabel(_("SHOW DATE TIME"), datetime_screensaver, selectItem == 5); + + datetime_screensaver->setOnChangedCallback([this, datetime_screensaver]() + { + if (Settings::getInstance()->setBool("ScreenSaverDateTime", datetime_screensaver->getState())) + { + Window* pw = mWindow; + delete this; + pw->pushGui(new GuiGeneralScreensaverOptions(pw, 5)); + } + }); + + if (showDateTime) + { + auto sss_date_format = std::make_shared< OptionListComponent >(mWindow, _("DATE FORMAT"), false); + sss_date_format->addRange({ "%Y-%m-%d", "%d-%m-%Y", "%A, %B %d", "%b %d, %Y" }, Settings::getInstance()->getString("ScreenSaverDateFormat")); + addWithLabel(_("DATE FORMAT"), sss_date_format); + addSaveFunc([sss_date_format] { Settings::getInstance()->setString("ScreenSaverDateFormat", sss_date_format->getSelected()); }); + + auto sss_time_format = std::make_shared< OptionListComponent >(mWindow, _("TIME FORMAT"), false); + sss_time_format->addRange({ "%H:%M:%S", "%I:%M %p", "%p %I:%M" }, Settings::getInstance()->getString("ScreenSaverTimeFormat")); + addWithLabel(_("TIME FORMAT"), sss_time_format); + addSaveFunc([sss_time_format] { Settings::getInstance()->setString("ScreenSaverTimeFormat", sss_time_format->getSelected()); }); + } + } + bool advancedOptions = true; #ifdef _RPI_ @@ -207,6 +239,38 @@ void GuiGeneralScreensaverOptions::addSlideShowScreensaverOptions(int selectItem addWithLabel(_("SHOW GAME INFO"), ss_controls); addSaveFunc([ss_controls] { Settings::getInstance()->setBool("SlideshowScreenSaverGameName", ss_controls->getState()); }); + // SHOW DATE TIME + { + bool showDateTime = Settings::getInstance()->getBool("ScreenSaverDateTime"); + + auto datetime_screensaver = std::make_shared(mWindow); + datetime_screensaver->setState(showDateTime); + addWithLabel(_("SHOW DATE TIME"), datetime_screensaver, selectItem == 6); + + datetime_screensaver->setOnChangedCallback([this, datetime_screensaver]() + { + if (Settings::getInstance()->setBool("ScreenSaverDateTime", datetime_screensaver->getState())) + { + Window* pw = mWindow; + delete this; + pw->pushGui(new GuiGeneralScreensaverOptions(pw, 6)); + } + }); + + if (showDateTime) + { + auto sss_date_format = std::make_shared< OptionListComponent >(mWindow, _("DATE FORMAT"), false); + sss_date_format->addRange({ "%Y-%m-%d", "%d-%m-%Y", "%A, %B %d", "%b %d, %Y"}, Settings::getInstance()->getString("ScreenSaverDateFormat")); + addWithLabel(_("DATE FORMAT"), sss_date_format); + addSaveFunc([sss_date_format] { Settings::getInstance()->setString("ScreenSaverDateFormat", sss_date_format->getSelected()); }); + + auto sss_time_format = std::make_shared< OptionListComponent >(mWindow, _("TIME FORMAT"), false); + sss_time_format->addRange({ "%H:%M:%S", "%I:%M %p", "%p %I:%M"}, Settings::getInstance()->getString("ScreenSaverTimeFormat")); + addWithLabel(_("TIME FORMAT"), sss_time_format); + addSaveFunc([sss_time_format] { Settings::getInstance()->setString("ScreenSaverTimeFormat", sss_time_format->getSelected()); }); + } + } + auto marquee_screensaver = std::make_shared(mWindow); marquee_screensaver->setState(Settings::getInstance()->getBool("ScreenSaverMarquee")); addWithLabel(_("USE MARQUEE AS GAME INFO"), marquee_screensaver); diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp index 67ada2dc47..5f2c67e53d 100644 --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -223,7 +223,10 @@ void Settings::setDefaults() mStringMap["ScrapperLogoSrc"] = "wheel"; mBoolMap["ScrapeVideos"] = false; mBoolMap["ScrapeShortTitle"] = false; - + + mBoolMap["ScreenSaverDateTime"] = false; + mStringMap["ScreenSaverDateFormat"] = "%Y-%m-%d"; + mStringMap["ScreenSaverTimeFormat"] = "%H:%M:%S"; mBoolMap["ScreenSaverMarquee"] = true; mBoolMap["ScreenSaverControls"] = false; mStringMap["ScreenSaverGameInfo"] = "never";