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); }
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(); } } ); }
// 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(); } }); }
//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); }
//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); }
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; }
public void AddTransition(T from, T to, Action action) { _transitions[from] = new ViewTransition { To = to, Action = action }; }