void UIWidget::insertChild(int index, const UIWidgetPtr& child) { if(!child) { logWarning("attempt to insert a null child into a UIWidget"); return; } if(hasChild(child)) { logWarning("attempt to insert a child again into a UIWidget"); return; } index = index <= 0 ? (m_children.size() + index) : index-1; if(!(index >= 0 && (uint)index <= m_children.size())) { logTraceError("attemp to insert a child in an invalid index"); return; } // retrieve child by index auto it = m_children.begin() + index; m_children.insert(it, child); child->setParent(asUIWidget()); // create default layout if needed if(!m_layout) m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(asUIWidget())); // add to layout and updates it m_layout->addWidget(child); // update new child states child->updateStates(); updateChildrenIndexStates(); g_ui.onWidgetAppear(child); }
void UIWidget::moveChildToIndex(const UIWidgetPtr& child, int index) { if(m_destroyed) return; if(!child) return; if((uint)index - 1 > m_children.size()) { g_logger.traceError(stdext::format("moving %s to index %d on %s", child->getId(), index, m_id)); return; } // remove and push child again auto it = std::find(m_children.begin(), m_children.end(), child); if(it == m_children.end()) { g_logger.traceError("cannot find child"); return; } m_children.erase(it); m_children.insert(m_children.begin() + index - 1, child); updateChildrenIndexStates(); updateLayout(); }