void CGUIControlGroupList::AddControl(CGUIControl *control) { // NOTE: We override control navigation here, but we don't override the <onleft> etc. builtins // if specified. if (control) { // set the navigation of items so that they form a list if (m_orientation == VERTICAL) { DWORD upID = GetControlIdUp(); DWORD downID = GetControlIdDown(); if (m_children.size()) { CGUIControl *top = m_children[0]; if (downID == GetID()) downID = top->GetID(); if (upID == GetID()) top->SetNavigation(control->GetID(), top->GetControlIdDown(), GetControlIdLeft(), GetControlIdRight()); CGUIControl *prev = m_children[m_children.size() - 1]; upID = prev->GetID(); prev->SetNavigation(prev->GetControlIdUp(), control->GetID(), GetControlIdLeft(), GetControlIdRight()); } control->SetNavigation(upID, downID, GetControlIdLeft(), GetControlIdRight()); } else { DWORD leftID = GetControlIdLeft(); DWORD rightID = GetControlIdRight(); if (m_children.size()) { CGUIControl *left = m_children[0]; if (rightID == GetID()) rightID = left->GetID(); if (leftID == GetID()) left->SetNavigation(GetControlIdUp(), GetControlIdDown(), control->GetID(), left->GetControlIdRight()); CGUIControl *prev = m_children[m_children.size() - 1]; leftID = prev->GetID(); prev->SetNavigation(GetControlIdUp(), GetControlIdDown(), prev->GetControlIdLeft(), control->GetID()); } control->SetNavigation(GetControlIdUp(), GetControlIdDown(), leftID, rightID); } // old versions of the grouplist used to set the positions of all controls // directly. The new version (with <usecontrolcoords>true</usecontrolcoords>) // allows offsets to be set via the posx, posy coordinates. if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control); } }
void CGUIControlGroupList::AddControl(CGUIControl *control, int position /*= -1*/) { // NOTE: We override control navigation here, but we don't override the <onleft> etc. builtins // if specified. if (position < 0 || position > (int)m_children.size()) // add at the end position = (int)m_children.size(); if (control) { // set the navigation of items so that they form a list int beforeID = (m_orientation == VERTICAL) ? GetControlIdUp() : GetControlIdLeft(); int afterID = (m_orientation == VERTICAL) ? GetControlIdDown() : GetControlIdRight(); if (m_children.size()) { // we're inserting at the given position, so grab the items above and below and alter // their navigation accordingly CGUIControl *before = NULL; CGUIControl *after = NULL; if (position == 0) { // inserting at the beginning after = m_children[0]; if (afterID == GetID()) // we're wrapping around bottom->top, so we have to update the last item before = m_children[m_children.size() - 1]; if (beforeID == GetID()) // we're wrapping around top->bottom beforeID = m_children[m_children.size() - 1]->GetID(); afterID = after->GetID(); } else if (position == (int)m_children.size()) { // inserting at the end before = m_children[m_children.size() - 1]; if (beforeID == GetID()) // we're wrapping around top->bottom, so we have to update the first item after = m_children[0]; if (afterID == GetID()) // we're wrapping around bottom->top afterID = m_children[0]->GetID(); beforeID = before->GetID(); } else { // inserting somewhere in the middle before = m_children[position - 1]; after = m_children[position]; beforeID = before->GetID(); afterID = after->GetID(); } if (m_orientation == VERTICAL) { if (before) // update the DOWN action to point to us before->SetNavigation(before->GetControlIdUp(), control->GetID(), GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); if (after) // update the UP action to point to us after->SetNavigation(control->GetID(), after->GetControlIdDown(), GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); } else { if (before) // update the RIGHT action to point to us before->SetNavigation(GetControlIdUp(), GetControlIdDown(), before->GetControlIdLeft(), control->GetID(), GetControlIdBack()); if (after) // update the LEFT action to point to us after->SetNavigation(GetControlIdUp(), GetControlIdDown(), control->GetID(), after->GetControlIdRight(), GetControlIdBack()); } } // now the control's nav std::vector<CGUIActionDescriptor> empty; if (m_orientation == VERTICAL) { control->SetNavigation(beforeID, afterID, GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); control->SetNavigationActions(empty, empty, m_leftActions, m_rightActions, empty, false); } else { control->SetNavigation(GetControlIdUp(), GetControlIdDown(), beforeID, afterID, GetControlIdBack()); control->SetNavigationActions(m_upActions, m_downActions, empty, empty, empty, false); } if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control, position); } }