void SelectMap(int32 newIndex) { Set<MapIndex*> visibleMaps; auto& srcCollection = m_SourceCollection(); auto it = srcCollection.find(newIndex); if(it != srcCollection.end()) { const float initialSpacing = 0.65f * m_style->frameMain->GetSize().y; const float spacing = 0.8f * m_style->frameSub->GetSize().y; const Anchor anchor = Anchor(0.0f, 0.5f, 1.0f, 0.5f); static const int32 numItems = 10; int32 istart; for(istart = 0; istart > -numItems;) { if(it == srcCollection.begin()) break; it--; istart--; } for(int32 i = istart; i <= numItems; i++) { if(it != srcCollection.end()) { visibleMaps.Add(it->second); // Add a new map slot bool newItem = m_guiElements.find(it->second) == m_guiElements.end(); Ref<SongSelectItem> item = m_GetMapGUIElement(it->second); float offset = 0; if(i != 0) { offset = initialSpacing * Math::Sign(i) + spacing * (i - Math::Sign(i)); } Canvas::Slot* slot = Add(item.As<GUIElementBase>()); int32 z = -abs(i); slot->SetZOrder(z); slot->anchor = anchor; slot->autoSizeX = true; slot->autoSizeY = true; slot->alignment = Vector2(0, 0.5f); if(newItem) { // Hard set target position slot->offset.pos = Vector2(0, offset); slot->offset.size.x = z * 50.0f; } else { // Animate towards target position item->AddAnimation(Ref<IGUIAnimation>( new GUIAnimation<Vector2>(&slot->offset.pos, Vector2(0, offset), 0.1f)), true); item->AddAnimation(Ref<IGUIAnimation>( new GUIAnimation<float>(&slot->offset.size.x, z * 50.0f, 0.1f)), true); } item->fade = 1.0f - ((float)abs(i) / (float)numItems); item->innerOffset = item->fade * 100.0f; if(i == 0) { m_OnMapSelected(it->second); } it++; } } } m_currentlySelectedId = newIndex; // Cleanup invisible elements for(auto it = m_guiElements.begin(); it != m_guiElements.end();) { if(!visibleMaps.Contains(it->first)) { Remove(it->second.As<GUIElementBase>()); it = m_guiElements.erase(it); continue; } it++; } }