void OnTurnComplete(GTweener tweener)
    {
        bool suc = (bool)tweener.userData;

        _draggingCorner = Corner.INVALID;
        if (suc && _turningTarget != -1)
        {
            _currentPage = _turningTarget;
        }
        if (suc && _coverTurningOp != CoverTurningOp.None)
        {
            if (_coverTurningOp == CoverTurningOp.ShowFront)
            {
                _coverStatus = CoverStatus.ShowingFront;
            }
            else if (_coverTurningOp == CoverTurningOp.ShowBack)
            {
                _coverStatus = CoverStatus.ShowingBack;
            }
            else
            {
                _coverStatus = CoverStatus.Hidden;
            }
        }
        _coverTurningOp = CoverTurningOp.None;
        _turningTarget  = -1;

        RenderPages();

        DispatchEvent("onTurnComplete");
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="pageIndex"></param>
    public void TurnTo(int pageIndex)
    {
        if (pageIndex < 0 || pageIndex > _pageCount - 1)
        {
            throw new Exception("Page index out of bounds: " + pageIndex);
        }

        GTween.Kill(this, true);

        if (_coverStatus == CoverStatus.ShowingFront)
        {
            _coverTurningOp = CoverTurningOp.HideFront;
            _draggingCorner = Corner.BR;
        }
        else if (_coverStatus == CoverStatus.ShowingBack)
        {
            _coverTurningOp = CoverTurningOp.HideBack;
            _draggingCorner = Corner.BL;
        }

        int tt1 = _currentPage;

        if (_currentPage % 2 == 0)
        {
            tt1--;
        }
        int tt2 = pageIndex;

        if (pageIndex % 2 == 0)
        {
            tt2--;
        }
        if (tt1 == tt2)
        {
            _currentPage   = pageIndex;
            _turningTarget = -1;
        }
        else
        {
            _turningTarget = pageIndex;
            if (_turningTarget < _currentPage)
            {
                _draggingCorner = Corner.BL;
            }
            else
            {
                _draggingCorner = Corner.BR;
            }
        }

        if (_draggingCorner == Corner.INVALID)
        {
            return;
        }

        StartTween();
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="cover"></param>
    /// <param name="turnEffect"></param>
    public void ShowCover(CoverType cover, bool turnEffect)
    {
        GTween.Kill(this, true);

        if (_frontCover == null)
        {
            return;
        }

        if (turnEffect)
        {
            if (cover == CoverType.Front)
            {
                if (_coverStatus == CoverStatus.ShowingFront)
                {
                    return;
                }

                _coverTurningOp = CoverTurningOp.ShowFront;
                _draggingCorner = Corner.BL;
                _currentPage    = 0;
            }
            else
            {
                if (_coverStatus == CoverStatus.ShowingBack)
                {
                    return;
                }

                _coverTurningOp = CoverTurningOp.ShowBack;
                _draggingCorner = Corner.BR;
                _currentPage    = _pageCount - 1;
            }

            StartTween();
        }
        else
        {
            if (cover == CoverType.Front)
            {
                _currentPage = 0;
                _coverStatus = CoverStatus.ShowingFront;
            }
            else
            {
                _currentPage = _pageCount - 1;
                _coverStatus = CoverStatus.ShowingBack;
            }
            RenderPages();
        }
    }
    void __touchBegin(EventContext context)
    {
        GTween.Kill(this, true);

        _draggingCorner = (Corner)((GObject)context.sender).data;
        if (_draggingCorner == Corner.TL || _draggingCorner == Corner.BL)
        {
            if (_coverStatus == CoverStatus.ShowingBack)
            {
                _coverTurningOp = CoverTurningOp.HideBack;
            }
            else if (_objectNewIndice[0] == -1)
            {
                if (_frontCover != null && _coverStatus != CoverStatus.ShowingFront)
                {
                    _coverTurningOp = CoverTurningOp.ShowFront;
                }
                else
                {
                    _draggingCorner = Corner.INVALID;
                }
            }
            else
            {
                _turningTarget = _objectNewIndice[0] - 2;
                if (_turningTarget < 0)
                {
                    _turningTarget = 0;
                }
            }
        }
        else
        {
            if (_coverStatus == CoverStatus.ShowingFront)
            {
                _coverTurningOp = CoverTurningOp.HideFront;
            }
            else if (_objectNewIndice[1] == -1)
            {
                if (_backCover != null && _coverStatus != CoverStatus.ShowingBack)
                {
                    _coverTurningOp = CoverTurningOp.ShowBack;
                }
                else
                {
                    _draggingCorner = Corner.INVALID;
                }
            }
            else
            {
                _turningTarget = _objectNewIndice[1] + 1;
            }
        }

        if (_draggingCorner != Corner.INVALID)
        {
            _touchDownTime = Time.unscaledTime;
            UpdateDragPosition(context.inputEvent.position);
            RenderPages();
            PlayTurnEffect();

            context.CaptureTouch();
        }
    }