diff --git a/es-app/src/views/SystemView.cpp b/es-app/src/views/SystemView.cpp index 8159bacbd..75683a09f 100644 --- a/es-app/src/views/SystemView.cpp +++ b/es-app/src/views/SystemView.cpp @@ -68,6 +68,10 @@ void SystemView::populate() e.name = (*it)->getName(); e.object = *it; + // Component offset. + glm::vec3 offsetLogo = {0.0f, 0.0f, 0.0f}; + glm::vec3 offsetLogoPlaceholderText = {0.0f, 0.0f, 0.0f}; + // Make logo. const ThemeData::ThemeElement* logoElem = theme->getElement("system", "logo", "image"); if (logoElem) { @@ -84,18 +88,40 @@ void SystemView::populate() e.data.logo = std::shared_ptr(logo); } } + if (!e.data.logo) { - // No logo in theme; use text. - TextComponent* text = + // No logo in theme; use placeholder. + + glm::vec2 resolution = glm::vec2{static_cast(Renderer::getScreenWidth()), + static_cast(Renderer::getScreenHeight())}; + glm::vec3 center = {resolution.x / 2.0f, resolution.y / 2.0f, 1.0f}; + glm::vec2 scale{getParent() ? getParent()->getSize() : resolution}; + + // Placeholder Image. + const ThemeData::ThemeElement* logoElem = + theme->getElement("system", "logoPlaceholderImage", "image"); + if (logoElem) { + auto path = logoElem->get("path"); + std::string defaultPath = + logoElem->has("default") ? logoElem->get("default") : ""; + if ((!path.empty() && ResourceManager::getInstance()->fileExists(path)) || + (!defaultPath.empty() && + ResourceManager::getInstance()->fileExists(defaultPath))) { + ImageComponent* logo = new ImageComponent(mWindow, false, false); + logo->applyTheme(theme, "system", "logoPlaceholderImage", ThemeFlags::ALL); + if (!logoElem->has("size")) + logo->setMaxSize(mCarousel.logoSize * mCarousel.logoScale); + offsetLogo = logo->getPosition() - center; + logo->setRotateByTargetSize(true); + e.data.logo = std::shared_ptr(logo); + } + } + + // Placeholder Text. + auto* text = new TextComponent(mWindow, (*it)->getName(), Font::get(FONT_SIZE_LARGE), 0x000000FF, ALIGN_CENTER); text->setSize(mCarousel.logoSize * mCarousel.logoScale); - text->applyTheme((*it)->getTheme(), "system", "logoText", - ThemeFlags::FONT_PATH | ThemeFlags::FONT_SIZE | ThemeFlags::COLOR | - ThemeFlags::FORCE_UPPERCASE | ThemeFlags::LINE_SPACING | - ThemeFlags::TEXT); - e.data.logo = std::shared_ptr(text); - if (mCarousel.type == VERTICAL || mCarousel.type == VERTICAL_WHEEL) { text->setHorizontalAlignment(mCarousel.logoAlignment); text->setVerticalAlignment(ALIGN_CENTER); @@ -104,6 +130,13 @@ void SystemView::populate() text->setHorizontalAlignment(ALIGN_CENTER); text->setVerticalAlignment(mCarousel.logoAlignment); } + text->applyTheme((*it)->getTheme(), "system", "logoPlaceholderText", + ThemeFlags::ALL); + offsetLogoPlaceholderText = text->getPosition() - center; + if (!e.data.logo) + e.data.logo = std::shared_ptr(text); + else + e.data.logoPlaceholderText = std::shared_ptr(text); } if (mCarousel.type == VERTICAL || mCarousel.type == VERTICAL_WHEEL) { @@ -124,7 +157,11 @@ void SystemView::populate() } glm::vec2 denormalized{mCarousel.logoSize * e.data.logo->getOrigin()}; - e.data.logo->setPosition(denormalized.x, denormalized.y, 0.0f); + glm::vec3 v = {denormalized.x, denormalized.y, 0.0f}; + e.data.logo->setPosition(v + offsetLogo); + if (e.data.logoPlaceholderText) + e.data.logoPlaceholderText->setPosition( + v + offsetLogoPlaceholderText); // e.data.logo->getPosition() + // Make background extras. e.data.backgroundExtras = ThemeData::makeExtras((*it)->getTheme(), "system", mWindow); @@ -590,6 +627,17 @@ void SystemView::renderCarousel(const glm::mat4& trans) comp->setScale(scale); comp->setOpacity(static_cast(opacity)); comp->render(logoTrans); + + if (mEntries.at(index).data.logoPlaceholderText) { + const std::shared_ptr& comp = mEntries.at(index).data.logoPlaceholderText; + if (mCarousel.type == VERTICAL_WHEEL || mCarousel.type == HORIZONTAL_WHEEL) { + comp->setRotationDegrees(mCarousel.logoRotation * distance); + comp->setRotationOrigin(mCarousel.logoRotationOrigin); + } + comp->setScale(scale); + comp->setOpacity(static_cast(opacity)); + comp->render(logoTrans); + } } Renderer::popClipRect(); } diff --git a/es-app/src/views/SystemView.h b/es-app/src/views/SystemView.h index 6e590c971..5e5cff547 100644 --- a/es-app/src/views/SystemView.h +++ b/es-app/src/views/SystemView.h @@ -29,6 +29,7 @@ enum CarouselType : unsigned int { struct SystemViewData { std::shared_ptr logo; + std::shared_ptr logoPlaceholderText; std::vector backgroundExtras; };