diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index df181b7fd..06e3a6b2e 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -127,6 +127,7 @@ std::map> {"itemsBeforeCenter", UNSIGNED_INTEGER}, {"itemsAfterCenter", UNSIGNED_INTEGER}, {"itemStacking", STRING}, + {"selectedItemMargins", NORMALIZED_PAIR}, {"itemSize", NORMALIZED_PAIR}, {"itemScale", FLOAT}, {"itemRotation", FLOAT}, diff --git a/es-core/src/components/primary/CarouselComponent.h b/es-core/src/components/primary/CarouselComponent.h index da5bb04b3..0ea9e42df 100644 --- a/es-core/src/components/primary/CarouselComponent.h +++ b/es-core/src/components/primary/CarouselComponent.h @@ -139,6 +139,7 @@ private: int mItemsBeforeCenter; int mItemsAfterCenter; ItemStacking mItemStacking; + glm::vec2 mSelectedItemMargins; glm::vec2 mItemSize; float mItemScale; float mItemRotation; @@ -192,6 +193,7 @@ CarouselComponent::CarouselComponent() , mItemsBeforeCenter {8} , mItemsAfterCenter {8} , mItemStacking {ItemStacking::CENTERED} + , mSelectedItemMargins {0.0f, 0.0f} , mItemSize {glm::vec2 {Renderer::getScreenWidth() * 0.25f, Renderer::getScreenHeight() * 0.155f}} , mItemScale {1.2f} @@ -812,7 +814,7 @@ template void CarouselComponent::render(const glm::mat4& parentT std::vector renderItems; std::vector renderItemsSorted; - for (int i = center - itemInclusion - itemInclusionBefore; + for (int i {center - itemInclusion - itemInclusionBefore}; i < center + itemInclusion + itemInclusionAfter; ++i) { int index {i}; @@ -839,12 +841,33 @@ template void CarouselComponent::render(const glm::mat4& parentT scale = std::max(mItemScale, std::min(1.0f, scale)); } + glm::vec2 selectedItemMargins {0.0f, 0.0f}; + + if (mSelectedItemMargins != glm::vec2 {0.0f, 0.0f}) { + if (i < camOffset) { + if (mType == CarouselType::HORIZONTAL) + selectedItemMargins.x = -mSelectedItemMargins.x; + else + selectedItemMargins.y = -mSelectedItemMargins.x; + } + else if (i > camOffset) { + if (mType == CarouselType::HORIZONTAL) + selectedItemMargins.x = mSelectedItemMargins.y; + else + selectedItemMargins.y = mSelectedItemMargins.y; + } + + if (std::fabs(distance) < 1.0f) + selectedItemMargins *= std::fabs(distance); + } + glm::mat4 itemTrans {carouselTrans}; if (singleEntry) itemTrans = glm::translate(carouselTrans, glm::vec3 {xOff, yOff, 0.0f}); else - itemTrans = glm::translate(itemTrans, glm::vec3 {(i * itemSpacing.x) + xOff, - (i * itemSpacing.y) + yOff, 0.0f}); + itemTrans = glm::translate( + itemTrans, glm::vec3 {(i * itemSpacing.x) + xOff + selectedItemMargins.x, + (i * itemSpacing.y) + yOff + selectedItemMargins.y, 0.0f}); float opacity {0.0f}; @@ -1140,6 +1163,17 @@ void CarouselComponent::applyTheme(const std::shared_ptr& theme, mItemsAfterCenter = glm::clamp(static_cast(elem->get("itemsAfterCenter")), 0, 20); + if (mType == CarouselType::HORIZONTAL || mType == CarouselType::VERTICAL) { + if (elem->has("selectedItemMargins")) { + const glm::vec2 selectedItemMargins { + glm::clamp(elem->get("selectedItemMargins"), 0.0f, 1.0f)}; + if (mType == CarouselType::HORIZONTAL) + mSelectedItemMargins = selectedItemMargins * Renderer::getScreenWidth(); + else + mSelectedItemMargins = selectedItemMargins * Renderer::getScreenHeight(); + } + } + if (elem->has("itemSize")) { const glm::vec2 itemSize {glm::clamp(elem->get("itemSize"), 0.05f, 1.0f)}; mItemSize =