bool CGUIControl::OnInfo() { CGUIAction action = GetAction(ACTION_SHOW_INFO); if (action.HasAnyActions()) return action.ExecuteActions(GetID(), GetParentID()); return false; }
void CGUIBaseContainer::OnDown() { CGUIAction action = GetNavigateAction(ACTION_MOVE_DOWN); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveDown(wrapAround)) return; // with horizontal lists it doesn't make much sense to have multiselect labels CGUIControl::OnDown(); }
void CGUIPanelContainer::OnDown() { CGUIAction action = GetNavigateAction(ACTION_MOVE_DOWN); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveDown(wrapAround)) return; if (m_orientation == HORIZONTAL && MoveRight(wrapAround)) return; return CGUIControl::OnDown(); }
void CGUIPanelContainer::OnLeft() { CGUIAction action = GetNavigateAction(ACTION_MOVE_LEFT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveLeft(wrapAround)) return; if (m_orientation == HORIZONTAL && MoveUp(wrapAround)) return; CGUIControl::OnLeft(); }
bool CGUIMultiSelectTextControl::MoveRight() { CGUIAction action = GetNavigateAction(ACTION_MOVE_RIGHT); if (GetNumSelectable() && m_selectedItem < GetNumSelectable() - 1) ScrollToItem(m_selectedItem + 1); else if (action.GetNavigation() && action.GetNavigation() == m_controlID) ScrollToItem(0); else return false; return true; }
// movement functions (callable from lists) bool CGUIMultiSelectTextControl::MoveLeft() { CGUIAction action = GetNavigateAction(ACTION_MOVE_LEFT); if (m_selectedItem > 0) ScrollToItem(m_selectedItem - 1); else if (GetNumSelectable() && action.GetNavigation() && action.GetNavigation() == m_controlID) ScrollToItem(GetNumSelectable() - 1); else return false; return true; }
void CGUIPanelContainer::OnUp() { CGUIAction action = GetAction(ACTION_MOVE_UP); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (GetGlobalWrapDisable()) wrapAround = false; if (m_orientation == VERTICAL && MoveUp(wrapAround)) return; if (m_orientation == HORIZONTAL && MoveLeft(wrapAround)) return; CGUIControl::OnUp(); }
void CGUIButtonControl::OnClick() { // Save values, as the click message may deactivate the window int controlID = GetID(); int parentID = GetParentID(); CGUIAction clickActions = m_clickActions; // button selected, send a message CGUIMessage msg(GUI_MSG_CLICKED, controlID, parentID, 0); SendWindowMessage(msg); clickActions.ExecuteActions(controlID, parentID); }
void CGUIBaseContainer::OnRight() { CGUIAction action = GetNavigateAction(ACTION_MOVE_RIGHT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == HORIZONTAL && MoveDown(wrapAround)) return; else if (m_orientation == VERTICAL) { CGUIListItemLayout *focusedLayout = GetFocusedLayout(); if (focusedLayout && focusedLayout->MoveRight()) return; } CGUIControl::OnRight(); }
bool CGUIWindow::OnMove(int fromControl, int moveAction) { const CGUIControl *control = GetFirstFocusableControl(fromControl); if (!control) control = GetControl(fromControl); if (!control) { // no current control?? CLog::Log(LOGERROR, "Unable to find control %i in window %u", fromControl, GetID()); return false; } vector<int> moveHistory; int nextControl = fromControl; while (control) { // grab the next control direction moveHistory.push_back(nextControl); CGUIAction action; if (!control->GetNavigationAction(moveAction, action)) return false; action.ExecuteActions(nextControl, GetParentID()); nextControl = action.GetNavigation(); if (!nextControl) // 0 isn't valid control id return false; // check our history - if the nextControl is in it, we can't focus it for (unsigned int i = 0; i < moveHistory.size(); i++) { if (nextControl == moveHistory[i]) return false; // no control to focus so do nothing } control = GetFirstFocusableControl(nextControl); if (control) break; // found a focusable control control = GetControl(nextControl); // grab the next control and try again } if (!control) return false; // no control to focus // if we get here we have our new control so focus it (and unfocus the current control) SET_CONTROL_FOCUS(nextControl, 0); return true; }
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(); } }