CGUIAction CGUIControl::GetNavigateAction(int actionID) const { ActionMap::const_iterator i = m_actions.find(actionID); if (i != m_actions.end()) return i->second; return CGUIAction(); }
void Window::doAddControl(Control* pControl, CCriticalSection* gcontext, bool wait) { XBMC_TRACE; if(pControl == NULL) throw WindowException("NULL Control passed to WindowBase::addControl"); if(pControl->iControlId != 0) throw WindowException("Control is already used"); // lock xbmc GUI before accessing data from it pControl->iParentId = iWindowId; { MaybeLock mlock(gcontext); // assign control id, if id is already in use, try next id do pControl->iControlId = ++iCurrentControlId; while (ref(window)->GetControl(pControl->iControlId)); } pControl->Create(); // set default navigation for control pControl->iControlUp = pControl->iControlId; pControl->iControlDown = pControl->iControlId; pControl->iControlLeft = pControl->iControlId; pControl->iControlRight = pControl->iControlId; pControl->pGUIControl->SetAction(ACTION_MOVE_UP, CGUIAction(pControl->iControlUp)); pControl->pGUIControl->SetAction(ACTION_MOVE_DOWN, CGUIAction(pControl->iControlDown)); pControl->pGUIControl->SetAction(ACTION_MOVE_LEFT, CGUIAction(pControl->iControlLeft)); pControl->pGUIControl->SetAction(ACTION_MOVE_RIGHT, CGUIAction(pControl->iControlRight)); // add control to list and allocate resources for the control vecControls.push_back(AddonClass::Ref<Control>(pControl)); pControl->pGUIControl->AllocResources(); // This calls the CGUIWindow parent class to do the final add CGUIMessage msg(GUI_MSG_ADD_CONTROL, 0, 0); msg.SetPointer(pControl->pGUIControl); CApplicationMessenger::GetInstance().SendGUIMessage(msg, iWindowId, wait); }
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 CGUIAction beforeAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_UP : ACTION_MOVE_LEFT); CGUIAction afterAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_DOWN : ACTION_MOVE_RIGHT); 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 (!afterAction.HasActionsMeetingCondition() || afterAction.GetNavigation() == GetID()) // we're wrapping around bottom->top, so we have to update the last item before = m_children[m_children.size() - 1]; if (!beforeAction.HasActionsMeetingCondition() || beforeAction.GetNavigation() == GetID()) // we're wrapping around top->bottom beforeAction = CGUIAction(m_children[m_children.size() - 1]->GetID()); afterAction = CGUIAction(after->GetID()); } else if (position == (int)m_children.size()) { // inserting at the end before = m_children[m_children.size() - 1]; if (!beforeAction.HasActionsMeetingCondition() || beforeAction.GetNavigation() == GetID()) // we're wrapping around top->bottom, so we have to update the first item after = m_children[0]; if (!afterAction.HasActionsMeetingCondition() || afterAction.GetNavigation() == GetID()) // we're wrapping around bottom->top afterAction = CGUIAction(m_children[0]->GetID()); beforeAction = CGUIAction(before->GetID()); } else { // inserting somewhere in the middle before = m_children[position - 1]; after = m_children[position]; beforeAction = CGUIAction(before->GetID()); afterAction = CGUIAction(after->GetID()); } if (m_orientation == VERTICAL) { if (before) // update the DOWN action to point to us before->SetAction(ACTION_MOVE_DOWN, CGUIAction(control->GetID())); if (after) // update the UP action to point to us after->SetAction(ACTION_MOVE_UP, CGUIAction(control->GetID())); } else { if (before) // update the RIGHT action to point to us before->SetAction(ACTION_MOVE_RIGHT, CGUIAction(control->GetID())); if (after) // update the LEFT action to point to us after->SetAction(ACTION_MOVE_LEFT, CGUIAction(control->GetID())); } } // now the control's nav // set navigation path on orientation axis // and try to apply other nav actions from grouplist // don't override them if child have already defined actions if (m_orientation == VERTICAL) { control->SetAction(ACTION_MOVE_UP, beforeAction); control->SetAction(ACTION_MOVE_DOWN, afterAction); control->SetAction(ACTION_MOVE_LEFT, GetAction(ACTION_MOVE_LEFT), false); control->SetAction(ACTION_MOVE_RIGHT, GetAction(ACTION_MOVE_RIGHT), false); } else { control->SetAction(ACTION_MOVE_LEFT, beforeAction); control->SetAction(ACTION_MOVE_RIGHT, afterAction); control->SetAction(ACTION_MOVE_UP, GetAction(ACTION_MOVE_UP), false); control->SetAction(ACTION_MOVE_DOWN, GetAction(ACTION_MOVE_DOWN), false); } control->SetAction(ACTION_NAV_BACK, GetAction(ACTION_NAV_BACK), false); if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control, position); m_totalSize = GetTotalSize(); } }