public virtual MyGuiControlBase GetNextFocusControl(MyGuiControlBase currentFocusControl, bool forwardMovement) { int currentIdx = Elements.IndexOf(currentFocusControl); if (currentIdx == -1 && !forwardMovement) { currentIdx = Elements.Count; } int i = (forwardMovement) ? (currentIdx + 1) : (currentIdx - 1); int step = (forwardMovement) ? +1 : -1; while ((forwardMovement && i < Elements.Count) || (!forwardMovement && i >= 0)) { if (MyGuiScreenBase.CanHaveFocusRightNow(Elements[i])) { return(Elements[i]); } i += step; } return(Owner.GetNextFocusControl(this, forwardMovement)); }
public override MyGuiControlBase GetNextFocusControl(MyGuiControlBase currentFocusControl, bool forwardMovement) { Debug.Assert(currentFocusControl != null); var visibleControls = Controls.GetVisibleControls(); // Pretend that both Controls and Elements are in single array. int totalCount = visibleControls.Count + Elements.Count; int idxCurrent = visibleControls.IndexOf(currentFocusControl); if (idxCurrent == -1) { idxCurrent = Elements.IndexOf(currentFocusControl); if (idxCurrent != -1) { idxCurrent += visibleControls.Count; } } if (!forwardMovement && idxCurrent == -1) { idxCurrent = totalCount; } // Single loop for both forward and backward movement, but terminating condition would be pain to write in for loop. int i = (forwardMovement) ? (idxCurrent + 1) : (idxCurrent - 1); int step = (forwardMovement) ? +1 : -1; while ((forwardMovement && i < totalCount) || (!forwardMovement && i >= 0)) { int idx = i; if (idx < visibleControls.Count) { var visibleControl = visibleControls[idx]; if (MyGuiScreenBase.CanHaveFocusRightNow(visibleControl)) { if (visibleControl is MyGuiControlParent || !visibleControl.IsActiveControl) { return(visibleControl.GetFocusControl(forwardMovement)); } else { return(visibleControl); } } } else { idx -= visibleControls.Count; if (MyGuiScreenBase.CanHaveFocusRightNow(Elements[idx])) { return(Elements[idx]); } } i += step; } return(Owner.GetNextFocusControl(this, forwardMovement)); }