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));
        }
Example #2
0
        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));
        }