示例#1
0
        public void Push(
            string newScreenId,
            Action <GameObject> initView = null,
            ViewTransition transition    = null,
            Action onCompete             = null)
        {
            if (!isInitialized)
            {
                throw new Exception("ViewStack is not yet initialized.");
            }

            if (transitionIsInProgress)
            {
                // TODO: How to handle this?
                // for now just return and prevent starting a new one whilst one is in progress
                return;
            }

            var newView = CreateView(newScreenId);

            if (initView != null)
            {
                initView(newView);
            }

            PerformTransition(
                transition,
                () => viewStack.Add(new ViewStackEntry(newScreenId, newView)),
                onCompete);
        }
示例#2
0
        public void Pop(ViewTransition transition = null, Action onComplete = null)
        {
            if (!isInitialized)
            {
                throw new Exception("ViewStack is not yet initialized. Listen for OnInitialized before you start navigating");
            }

            if (transitionIsInProgress)
            {
                // TODO: How to handle this?
                // for now just return and prevent starting a new one whilst one is in progress
                return;
            }

            var oldTopViewEntry = TopViewEntry;

            PerformTransition(
                transition,
                () => viewStack.Remove(oldTopViewEntry),
                () =>
            {
                DestroyView(oldTopViewEntry);
                if (onComplete != null)
                {
                    onComplete();
                }
            }
                );
        }
示例#3
0
        // TODO: add other operations like replace, pop-replace, reset etc...

        private void PerformTransition(ViewTransition transition, Action manipulateState, Action onComplete = null)
        {
            transition = transition ?? DefaultTransition ?? Transitions.Instant;

            var oldTopViewEntry = TopViewEntry;

            manipulateState();

            if (OnTransitionStarted != null)
            {
                OnTransitionStarted.Invoke(
                    oldTopViewEntry != null ? oldTopViewEntry.ViewID : null,
                    TopViewEntry != null ? TopViewEntry.ViewID : null
                    );
            }

            if (oldTopViewEntry != null)
            {
                // notify old view that transition has started
                oldTopViewEntry.NotifyView <ITransitionStartedHandler>(
                    t => t.HandleTransitionStarted());
            }

            var oldView = oldTopViewEntry != null ? oldTopViewEntry.View : null;

            transitionIsInProgress = true;
            transition(oldView, TopViewEntry != null ? TopViewEntry.View : null, () =>
            {
                // notify the new view that transition has completed
                if (TopViewEntry != null)
                {
                    TopViewEntry.NotifyView <ITransitionCompleteHandler>(
                        t => t.HandleTransitionComplete());
                }

                if (OnTransitionComplete != null)
                {
                    OnTransitionComplete(oldTopViewEntry == null ? null : oldTopViewEntry.ViewID, TopViewEntry.ViewID);
                }

                if (OnViewHidden != null && oldTopViewEntry != null)
                {
                    OnViewHidden(oldTopViewEntry.ViewID, oldTopViewEntry.View);
                }

                if (OnViewShown != null)
                {
                    OnViewShown(TopViewEntry.ViewID, TopViewEntry.View);
                }

                transitionIsInProgress = false;

                if (onComplete != null)
                {
                    onComplete();
                }
            });
        }
示例#4
0
    //assumption: whole screen view
    public void SendViewAway(Transform view)
    {
        var transition = new ViewTransition {
            view          = view,
            startPosition = view.position,
            finalPosition = new Vector3(Screen.width * 1.5f, Screen.height * 0.5f, 0)
        };

        StartCoroutine("MovingView", transition);
    }
示例#5
0
    //assumption: whole screen view
    public void BringInView(Transform view)
    {
        var transition = new ViewTransition {
            view          = view,
            startPosition = new Vector3(Screen.width * 1.5f, Screen.height * 0.5f, 0),
            finalPosition = new Vector3(Screen.width * 0.5f, Screen.height * 0.5f, 0)
        };

        //TODO: setup in hierarchy so it won't be obscured
        StartCoroutine("MovingView", transition);
    }
示例#6
0
    IEnumerator MovingView(ViewTransition details)
    {
        details.view.position = details.startPosition;
        var transitionTime  = 0.21f;
        var transitionTimer = 0f;

        while (transitionTimer < transitionTime)
        {
            transitionTimer += Time.deltaTime;
            var advancement = transitionTimer / transitionTime;
            details.view.position = Vector3.Lerp(details.startPosition, details.finalPosition, advancement);
            yield return(null);
        }
        details.view.position = details.finalPosition;
    }
示例#7
0
 public void AddTransition(T from, T to, Action action)
 {
     _transitions[from] = new ViewTransition {
         To = to, Action = action
     };
 }