protected internal Task PerformUIClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { // if an activation is already in progress if (IsTransitionning) { var tcs = new TaskCompletionSource <bool>(); tcs.SetResult(true); return(tcs.Task); } // set that an activation is running IsTransitionning = true; // deactivates all inputs and event listeners Workspace.IsHitTestVisible = false; OnBeforeAnimatingClose(nodeToClose, nodeToActivate); ApplyInitialVisibilityBeforeClose(nodeToClose, nodeToActivate); return(AnimateClose(nodeToClose, nodeToActivate) .ContinueWith(r => { ApplyFinalVisibilityAfterClose(nodeToClose, nodeToActivate); OnAfterAnimatingClose(nodeToClose, nodeToActivate); // activates all inputs and event listeners Workspace.IsHitTestVisible = true; // set that an activation no longer runs IsTransitionning = false; }, TaskScheduler.FromCurrentSynchronizationContext())); }
public Task PerformUIClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { var tcs = new TaskCompletionSource <bool>(); tcs.SetResult(true); return(tcs.Task); }
protected override void OnAfterAnimatingActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { // If the node to activate is a modal one // then make its parent visible and disable if (nodeToActivate.Value.IsModal) { var parentView = nodeToActivate.Previous.Value; parentView.ViewHostInstance.Visibility = Visibility.Visible; parentView.ViewHostInstance.IsEnabled = false; } }
/// <summary> /// Default ctor /// </summary> private ViewGroupChildConnector(ViewGroupNode node, IViewGroupNodeControl control, IXmlLayoutDesigner rootDesigner) { this.node = node; this.control = control; this.rootDesigner = rootDesigner; // Add controls for all children now foreach (var childNode in node.Children) { var childControl = childNode.Accept(ControlBuilder.Instance, rootDesigner); control.Add(childControl); } }
/// <summary> /// Plays close animation. /// </summary> /// <param name="nodeToClose"></param> /// <param name="nodeToActivate"></param> /// <returns></returns> private Task AnimateClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { var tcs = new TaskCompletionSource <bool>(); // animates the transition if (TransitionAnimationProvider != null) { var transitionAnimation = TransitionAnimationProvider(); if (transitionAnimation != null) { var viewGroupHostToActivate = nodeToActivate != null ? OnGetViewGroupHostControl(nodeToActivate.List) : null; var viewGroupHostToClose = nodeToClose != null ? OnGetViewGroupHostControl(nodeToClose.List) : null; if (!Equals(viewGroupHostToClose, viewGroupHostToActivate)) { // case 1 : means that we must transition from one view group to another if (transitionAnimation.TransitionViewAnimation != null) { return(transitionAnimation.TransitionViewGroupAnimation.Run(Workspace, viewGroupHostToActivate, viewGroupHostToClose, AnimationType.HideFrontView)); } } else { // case 2 : means that we can transition from one view to another on the same group if (transitionAnimation.TransitionViewAnimation != null) { var viewHostToActivate = nodeToActivate != null ? nodeToActivate.Value.ViewHostInstance : null; var viewHostToClose = nodeToClose != null ? nodeToClose.Value.ViewHostInstance : null; return(transitionAnimation.TransitionViewAnimation.Run(Workspace, viewHostToActivate, viewHostToClose, AnimationType.HideFrontView)); } } } } tcs.SetResult(true); return(tcs.Task); }
/// <summary> /// Applies the correct final visibility states for all the concerned view after they were animated. /// </summary> private void ApplyFinalVisibilityAfterClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { var viewHostToClose = nodeToClose != null ? nodeToClose.Value.ViewHostInstance : null; var viewHostToActivate = nodeToActivate != null ? nodeToActivate.Value.ViewHostInstance : null; var viewGroupHostToClose = nodeToClose != null?OnGetViewGroupHostControl(nodeToClose.List) : null; var viewGroupHostToActivate = nodeToActivate != null?OnGetViewGroupHostControl(nodeToActivate.List) : null; if (Equals(viewGroupHostToClose, viewGroupHostToActivate)) { // if both views are membres of the same view group if (viewHostToClose != null) { viewHostToClose.Visibility = Visibility.Hidden; } if (viewHostToActivate != null) { viewHostToActivate.Visibility = Visibility.Visible; } if (viewGroupHostToClose != null) { viewGroupHostToClose.Visibility = Visibility.Visible; } if (viewGroupHostToActivate != null) { viewGroupHostToActivate.Visibility = Visibility.Visible; } } else { // if views are owned by different view group if (viewHostToClose != null) { viewHostToClose.Visibility = Visibility.Visible; } if (viewHostToActivate != null) { viewHostToActivate.Visibility = Visibility.Visible; } if (viewGroupHostToClose != null) { viewGroupHostToClose.Visibility = Visibility.Hidden; } if (viewGroupHostToActivate != null) { viewGroupHostToActivate.Visibility = Visibility.Visible; } } }
/// <summary> /// Plays activation animation. /// </summary> /// <param name="nodeToDeactivate"></param> /// <param name="nodeToActivate"></param> /// <returns></returns> private Task AnimateActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { var tcs = new TaskCompletionSource <bool>(); // animates the transition if (TransitionAnimationProvider != null) { var transitionAnimation = TransitionAnimationProvider(); if (transitionAnimation != null) { var viewGroupHostToActivate = nodeToActivate != null ? OnGetViewGroupHostControl(nodeToActivate.List) : null; var viewGroupHostToDeactivate = nodeToDeactivate != null ? OnGetViewGroupHostControl(nodeToDeactivate.List) : null; if (!Equals(viewGroupHostToActivate, viewGroupHostToDeactivate)) { // case 1 : if transition from one view group to another if (transitionAnimation.TransitionViewAnimation != null) { return(transitionAnimation.TransitionViewGroupAnimation.Run(Workspace, viewGroupHostToDeactivate, viewGroupHostToActivate, AnimationType.ShowFrontView)); } } else { // case 2 : if transition from one view to another if (transitionAnimation.TransitionViewAnimation != null) { var activatedView = nodeToActivate != null ? nodeToActivate.Value.ViewHostInstance : null; var deactivatedView = nodeToDeactivate != null ? nodeToDeactivate.Value.ViewHostInstance : null; return(transitionAnimation.TransitionViewAnimation.Run(Workspace, deactivatedView, activatedView, AnimationType.ShowFrontView)); } } } } tcs.SetResult(true); return(tcs.Task); }
private void FixZIndex(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { if (nodeToDeactivate != null) { var deactivatedViewGroupHost = GroupMappings[nodeToDeactivate.List]; Panel.SetZIndex(deactivatedViewGroupHost, 0); } if (nodeToActivate != null) { // set the zindex of the node to activate at the hightest zindex var activatedViewGroupHost = GroupMappings[nodeToActivate.List]; Panel.SetZIndex(activatedViewGroupHost, 100); } }
/// <summary> /// Applies the correct final visibility states for all the concerned view after they were animated. /// </summary> private void ApplyFinalVisibilityAfterActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { var viewHostToDeactivate = nodeToDeactivate != null ? nodeToDeactivate.Value.ViewHostInstance : null; var viewHostToActivate = nodeToActivate != null ? nodeToActivate.Value.ViewHostInstance : null; var viewGroupHostToDeactivate = nodeToDeactivate != null?OnGetViewGroupHostControl(nodeToDeactivate.List) : null; var viewGroupHostToActivate = nodeToActivate != null?OnGetViewGroupHostControl(nodeToActivate.List) : null; if (Equals(viewGroupHostToDeactivate, viewGroupHostToActivate)) { // both views are membres of the same view group if (viewHostToDeactivate != null) { viewHostToDeactivate.Visibility = Visibility.Hidden; } if (viewHostToActivate != null) { viewHostToActivate.Visibility = Visibility.Visible; } if (viewGroupHostToDeactivate != null) { viewGroupHostToDeactivate.Visibility = Visibility.Visible; } if (viewGroupHostToActivate != null) { viewGroupHostToActivate.Visibility = Visibility.Visible; } } else { if (viewHostToDeactivate != null) { viewHostToDeactivate.Visibility = Visibility.Visible; } if (viewHostToActivate != null) { viewHostToActivate.Visibility = Visibility.Visible; } if (viewGroupHostToDeactivate != null) { viewGroupHostToDeactivate.Visibility = Visibility.Hidden; } if (viewGroupHostToActivate != null) { viewGroupHostToActivate.Visibility = Visibility.Visible; } } }
protected override void OnAfterAnimatingClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { var viewHostToClose = nodeToClose.Value.ViewHostInstance; var viewGroupToClose = nodeToClose.List; var viewGroupHostToClose = GroupMappings[viewGroupToClose]; viewGroupHostToClose.Views.Remove(viewHostToClose); if (viewGroupHostToClose.Views.Count == 0) { GroupMappings.Remove(viewGroupToClose); Workspace.Children.Remove(viewGroupHostToClose); } if (nodeToClose.Value.IsModal) { // Enable the parent of the modal view nodeToActivate.Value.ViewHostInstance.IsEnabled = true; } }
private void AddViewToActivateIfNotExist(ViewGroupNode nodeToActivate) { var viewGroupHostToActivate = new ViewGroupHostControl(); var viewGroupToActivate = nodeToActivate.List; var viewHostToActivate = nodeToActivate.Value.ViewHostInstance; if (GroupMappings.ContainsKey(viewGroupToActivate)) { viewGroupHostToActivate = GroupMappings[viewGroupToActivate]; } else { Workspace.Children.Add(viewGroupHostToActivate); GroupMappings.Add(viewGroupToActivate, viewGroupHostToActivate); } // adds the view to the group host if (!viewGroupHostToActivate.Views.Contains(viewHostToActivate)) { viewGroupHostToActivate.Views.Add(viewHostToActivate); } }
public virtual TReturn Visit(ViewGroupNode node, TData data) { return(Visit((ViewNode)node, data)); }
Task IWorkspaceAdapter.PerformUIClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { return(PerformUIClose(nodeToClose, nodeToActivate)); }
/// <summary> /// Executed just before the animation that activate a view take place. /// </summary> /// <param name="nodeToDeactivate"> </param> /// <param name="nodeToActivate"> </param> protected abstract void OnBeforeAnimatingActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate);
protected override void OnBeforeAnimatingClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate) { // Do nothing }
protected override void OnBeforeAnimatingActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { AddViewToActivateIfNotExist(nodeToActivate); FixZIndex(nodeToDeactivate, nodeToActivate); }
/// <summary> /// Executed just after the animation that close a view take place. /// </summary> /// <param name="nodeToDeactivate"></param> /// <param name="nodeToActivate"></param> protected abstract void OnAfterAnimatingClose(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate);
Task IWorkspaceAdapter.PerformUIActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate) { return(PerformUIActivation(nodeToDeactivate, nodeToActivate)); }
public static void Connect(ViewGroupNode node, IViewGroupNodeControl control, IXmlLayoutDesigner rootDesigner) { var connector = new ViewGroupChildConnector(node, control, rootDesigner); node.Children.CollectionChanged += connector.OnChildrenChanged; }
public ViewNodeCollection(ViewGroupNode parent) : base("Children") { Parent = parent; }