diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp index 0d34e885f..97ee64cec 100644 --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -197,6 +197,7 @@ void GuiMenu::openUIOptions() s->setNeedsReloading(); s->setNeedsGoToStart(); s->setNeedsCollectionsUpdate(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -211,6 +212,7 @@ void GuiMenu::openUIOptions() Settings::getInstance()->setString("ThemeVariant", themeVariant->getSelected()); s->setNeedsSaving(); s->setNeedsReloading(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -271,6 +273,7 @@ void GuiMenu::openUIOptions() Settings::getInstance()->setString("ThemeColorScheme", themeColorScheme->getSelected()); s->setNeedsSaving(); s->setNeedsReloading(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -323,6 +326,7 @@ void GuiMenu::openUIOptions() Settings::getInstance()->setString("ThemeFontSize", themeFontSize->getSelected()); s->setNeedsSaving(); s->setNeedsReloading(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -366,6 +370,7 @@ void GuiMenu::openUIOptions() Settings::getInstance()->setString("ThemeAspectRatio", themeAspectRatio->getSelected()); s->setNeedsSaving(); s->setNeedsReloading(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -524,6 +529,7 @@ void GuiMenu::openUIOptions() Settings::getInstance()->setString("ThemeLanguage", themeLanguage->getSelected()); s->setNeedsSaving(); s->setNeedsReloading(); + s->setNeedsClearHelpPromptsImageCache(); s->setInvalidateCachedBackground(); } }); @@ -601,6 +607,7 @@ void GuiMenu::openUIOptions() s->setNeedsRescanROMDirectory(); s->setNeedsReloading(); s->setNeedsCollectionsUpdate(); + s->setNeedsClearHelpPromptsImageCache(); } }); @@ -1356,6 +1363,7 @@ void GuiMenu::openInputDeviceOptions() Settings::getInstance()->setString("InputControllerType", inputControllerType->getSelected()); s->setNeedsSaving(); + s->setNeedsClearHelpPromptsImageCache(); } }); @@ -2395,6 +2403,7 @@ void GuiMenu::openThemeDownloader(GuiSettings* settings) } else { openUIOptions(); + mWindow->clearHelpPromptsImageCache(); mWindow->invalidateCachedBackground(); } }; diff --git a/es-app/src/guis/GuiSettings.cpp b/es-app/src/guis/GuiSettings.cpp index 13636a7c7..6120e5375 100644 --- a/es-app/src/guis/GuiSettings.cpp +++ b/es-app/src/guis/GuiSettings.cpp @@ -38,6 +38,7 @@ GuiSettings::GuiSettings(std::string title) , mNeedsGoToSystem {false} , mNeedsGoToGroupedCollections {false} , mNeedsUpdateStatusComponents {false} + , mNeedsClearHelpPromptsImageCache {false} , mInvalidateCachedBackground {false} { addChild(&mMenu); @@ -154,6 +155,9 @@ void GuiSettings::save() mWindow->updateSystemStatusComponents(); } + if (mNeedsClearHelpPromptsImageCache) + mWindow->clearHelpPromptsImageCache(); + if (mNeedsCollectionsUpdate) { auto state = ViewController::getInstance()->getState(); // If we're in any view other than the grouped custom collections, always jump to the diff --git a/es-app/src/guis/GuiSettings.h b/es-app/src/guis/GuiSettings.h index 7eae3caab..4ce62605a 100644 --- a/es-app/src/guis/GuiSettings.h +++ b/es-app/src/guis/GuiSettings.h @@ -59,6 +59,7 @@ public: }; void setNeedsGoToGroupedCollections() { mNeedsGoToGroupedCollections = true; } void setNeedsUpdateStatusComponents() { mNeedsUpdateStatusComponents = true; } + void setNeedsClearHelpPromptsImageCache() { mNeedsClearHelpPromptsImageCache = true; } void setNeedsCloseMenu(std::function closeFunction) { mCloseMenuFunction = closeFunction; @@ -86,6 +87,7 @@ private: bool mNeedsGoToSystem; bool mNeedsGoToGroupedCollections; bool mNeedsUpdateStatusComponents; + bool mNeedsClearHelpPromptsImageCache; bool mInvalidateCachedBackground; }; diff --git a/es-core/src/Window.cpp b/es-core/src/Window.cpp index e144d806d..918e8ff90 100644 --- a/es-core/src/Window.cpp +++ b/es-core/src/Window.cpp @@ -217,6 +217,7 @@ void Window::deinit() (*it)->onHide(); mPostprocessedBackground.reset(); + sHelpPromptsImageCache.clear(); mHelp.reset(); if (mHelpComponents != nullptr) { mHelpComponents->clear(); diff --git a/es-core/src/Window.h b/es-core/src/Window.h index 20d4c20e7..1b29b6de0 100644 --- a/es-core/src/Window.h +++ b/es-core/src/Window.h @@ -123,6 +123,12 @@ public: void renderHelpPromptsEarly(); // Used to render HelpPrompts before a fade. void setHelpPrompts(const std::vector& prompts); + std::map>& getHelpPromptsImageCache() + { + return sHelpPromptsImageCache; + } + void clearHelpPromptsImageCache() { sHelpPromptsImageCache.clear(); } + // GuiInfoPopup notifications. void queueInfoPopup(const std::string& message, const int& duration) { @@ -210,6 +216,8 @@ private: unsigned int color; }; + static inline std::map> sHelpPromptsImageCache; + Renderer* mRenderer; std::vector>* mHelpComponents; std::unique_ptr mHelp; diff --git a/es-core/src/components/ComponentGrid.cpp b/es-core/src/components/ComponentGrid.cpp index 3ba896330..b41d722d5 100644 --- a/es-core/src/components/ComponentGrid.cpp +++ b/es-core/src/components/ComponentGrid.cpp @@ -106,7 +106,6 @@ void ComponentGrid::setEntry(const std::shared_ptr& comp, { assert(pos.x >= 0 && pos.x < mGridSize.x && pos.y >= 0 && pos.y < mGridSize.y); assert(comp != nullptr); - assert(comp->getParent() == nullptr); comp->setAutoCalcExtent(autoCalcExtent); GridEntry entry {pos, size, comp, canFocus, resize, updateType, border}; diff --git a/es-core/src/components/HelpComponent.cpp b/es-core/src/components/HelpComponent.cpp index d6614d13b..914cbcd8c 100644 --- a/es-core/src/components/HelpComponent.cpp +++ b/es-core/src/components/HelpComponent.cpp @@ -611,8 +611,18 @@ void HelpComponent::updateGrid() std::find(mEntries.cbegin(), mEntries.cend(), (*it).first) == mEntries.cend()) continue; - std::shared_ptr icon {std::make_shared(false, true)}; - icon->setImage(mIconPathMap[it->first]); + std::shared_ptr icon; + auto& imageCache = mWindow->getHelpPromptsImageCache(); + + if (imageCache.find(mIconPathMap[it->first]) != imageCache.end()) { + icon = imageCache[mIconPathMap[it->first]]; + } + else { + icon = std::make_shared(false, true); + icon->setImage(mIconPathMap[it->first]); + imageCache[mIconPathMap[it->first]] = icon; + } + icon->setColorShift(isDimmed ? mStyleIconColorDimmed : mStyleIconColor); icon->setResize(0, height); icon->setOpacity(isDimmed ? mStyleOpacityDimmed : mStyleOpacity);