mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-03-06 14:27:43 +00:00
Added an itemStacking property to CarouselComponent.
This commit is contained in:
parent
a5b08e3da2
commit
19111a9c24
|
@ -122,6 +122,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
|
|||
{"maxLogoCount", FLOAT}, // For backward compatibility with legacy themes.
|
||||
{"itemsBeforeCenter", UNSIGNED_INTEGER},
|
||||
{"itemsAfterCenter", UNSIGNED_INTEGER},
|
||||
{"itemStacking", STRING},
|
||||
{"itemSize", NORMALIZED_PAIR},
|
||||
{"itemScale", FLOAT},
|
||||
{"itemRotation", FLOAT},
|
||||
|
|
|
@ -46,6 +46,14 @@ public:
|
|||
NO_CAROUSEL
|
||||
};
|
||||
|
||||
enum class ItemStacking {
|
||||
CENTERED,
|
||||
ASCENDING,
|
||||
ASCENDING_RAISED,
|
||||
DESCENDING,
|
||||
DESCENDING_RAISED
|
||||
};
|
||||
|
||||
CarouselComponent();
|
||||
|
||||
void addEntry(Entry& entry, const std::shared_ptr<ThemeData>& theme);
|
||||
|
@ -129,6 +137,7 @@ private:
|
|||
float mMaxItemCount;
|
||||
int mItemsBeforeCenter;
|
||||
int mItemsAfterCenter;
|
||||
ItemStacking mItemStacking;
|
||||
glm::vec2 mItemSize;
|
||||
float mItemScale;
|
||||
float mItemRotation;
|
||||
|
@ -179,6 +188,7 @@ CarouselComponent<T>::CarouselComponent()
|
|||
, mMaxItemCount {3.0f}
|
||||
, mItemsBeforeCenter {8}
|
||||
, mItemsAfterCenter {8}
|
||||
, mItemStacking {ItemStacking::CENTERED}
|
||||
, mItemSize {glm::vec2 {Renderer::getScreenWidth() * 0.25f,
|
||||
Renderer::getScreenHeight() * 0.155f}}
|
||||
, mItemScale {1.2f}
|
||||
|
@ -420,6 +430,7 @@ template <typename T> void CarouselComponent<T>::onDemandTextureLoad()
|
|||
if (mVerticalOffset > 0.0f)
|
||||
centerOffset = -centerOffset;
|
||||
}
|
||||
itemInclusion += 1;
|
||||
}
|
||||
|
||||
for (int i = center - itemInclusion - itemInclusionBefore;
|
||||
|
@ -840,6 +851,33 @@ template <typename T> void CarouselComponent<T>::render(const glm::mat4& parentT
|
|||
if (renderItems.size() == 1) {
|
||||
renderItemsSorted.emplace_back(renderItems.front());
|
||||
}
|
||||
else if (!isWheel && mItemStacking != ItemStacking::CENTERED) {
|
||||
if (mItemStacking == ItemStacking::ASCENDING) {
|
||||
renderItemsSorted.insert(renderItemsSorted.begin(),
|
||||
std::make_move_iterator(renderItems.begin()),
|
||||
std::make_move_iterator(renderItems.end()));
|
||||
}
|
||||
else if (mItemStacking == ItemStacking::ASCENDING_RAISED) {
|
||||
for (size_t i {0}; i < renderItems.size(); ++i) {
|
||||
if (i == static_cast<size_t>(belowCenter))
|
||||
continue;
|
||||
renderItemsSorted.emplace_back(std::move(renderItems[i]));
|
||||
}
|
||||
renderItemsSorted.emplace_back(std::move(renderItems[belowCenter]));
|
||||
}
|
||||
else if (mItemStacking == ItemStacking::DESCENDING) {
|
||||
for (size_t i {renderItems.size()}; i > 0; --i)
|
||||
renderItemsSorted.emplace_back(std::move(renderItems[i - 1]));
|
||||
}
|
||||
else if (mItemStacking == ItemStacking::DESCENDING_RAISED) {
|
||||
for (size_t i {renderItems.size()}; i > 0; --i) {
|
||||
if (i - 1 == static_cast<size_t>(belowCenter))
|
||||
continue;
|
||||
renderItemsSorted.emplace_back(std::move(renderItems[i - 1]));
|
||||
}
|
||||
renderItemsSorted.emplace_back(std::move(renderItems[belowCenter]));
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Make sure that overlapping items are rendered in the correct order.
|
||||
size_t zeroDistanceEntry {0};
|
||||
|
@ -1032,6 +1070,31 @@ void CarouselComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
itemSize * glm::vec2(Renderer::getScreenWidth(), Renderer::getScreenHeight());
|
||||
}
|
||||
|
||||
if (elem->has("itemStacking")) {
|
||||
const std::string& itemStacking {elem->get<std::string>("itemStacking")};
|
||||
if (itemStacking == "ascending") {
|
||||
mItemStacking = ItemStacking::ASCENDING;
|
||||
}
|
||||
else if (itemStacking == "ascendingRaised") {
|
||||
mItemStacking = ItemStacking::ASCENDING_RAISED;
|
||||
}
|
||||
else if (itemStacking == "descending") {
|
||||
mItemStacking = ItemStacking::DESCENDING;
|
||||
}
|
||||
else if (itemStacking == "descendingRaised") {
|
||||
mItemStacking = ItemStacking::DESCENDING_RAISED;
|
||||
}
|
||||
else if (itemStacking == "centered") {
|
||||
mItemStacking = ItemStacking::CENTERED;
|
||||
}
|
||||
else {
|
||||
mItemStacking = ItemStacking::CENTERED;
|
||||
LOG(LogWarning) << "CarouselComponent: Invalid theme configuration, property "
|
||||
"\"itemStacking\" for element \""
|
||||
<< element.substr(9) << "\" defined as \"" << itemStacking << "\"";
|
||||
}
|
||||
}
|
||||
|
||||
if (elem->has("itemScale"))
|
||||
mItemScale = glm::clamp(elem->get<float>("itemScale"), 0.2f, 3.0f);
|
||||
|
||||
|
|
Loading…
Reference in a new issue