private void ForceStartSlideOut(Button button, bool force)
    {
        MenuItem item = FindItemFrom(button);

        if (item == null)
        {
            Debug.LogError("StartSlideOut fail " + button.name);
            return;
        }

        if (!force && firstCircleItem != item)
        {
            Debug.LogWarning("StartSlideOut not selected " + button.name);
            return;
        }

        AnimSlideOut a = new AnimSlideOut();

        if (a.StartAnim(item))
        {
            lock (animParallel)
            {
                animParallel.Add(a);
            }
        }
    }
    public void StartRotate(Button button)
    {
        // update circle
        MenuItem selected = FindItemFrom(button);

        if (firstCircleItem == selected)
        {
            Debug.LogWarning("StartRotate cancel " + button.name);
            return;
        }
        // if (firstCircleItem != null)
        // {
        //  ForceStartSlideIn(firstCircleItem.button, true);
        // }

        firstCircleItem = selected;

        MenuItem parent      = FindParentFrom(button);
        float    offsetAngle = parent != null ? parent.angle : 0;
        float    localAngle  = Vector3.SignedAngle(button.transform.localPosition, Vector3.right, Vector3.back);
        float    deltaAngle  = 90 - localAngle + offsetAngle;

        List <MenuItem> list = FindSiblingFrom(button);

        foreach (MenuItem child in list)
        {
            localAngle = Vector3.SignedAngle(child.button.transform.localPosition, Vector3.right, Vector3.back);

            child.startAngle = localAngle;
            child.endAngle   = localAngle + deltaAngle;
            child.angle      = child.endAngle - offsetAngle;

            if (child == firstCircleItem)
            {
                LinkedList <Anim> sequence = new LinkedList <Anim>();
                AnimRotate        rotate   = new AnimRotate();
                if (rotate.StartAnim(child))
                {
                    sequence.AddLast(rotate);
                }

                AnimSlideOut slideOut = new AnimSlideOut();
                if (slideOut.StartAnim(child))
                {
                    sequence.AddLast(slideOut);
                }

                lock (animParallelSequence)
                {
                    animParallelSequence.Add(sequence);
                }
            }
            else
            {
                AnimRotate a = new AnimRotate();
                if (a.StartAnim(child))
                {
                    lock (animParallel)
                    {
                        animParallel.Add(a);
                    }
                }

                ForceStartSlideIn(child.button, true);
            }
        }
    }