コード例 #1
0
        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()));
        }
コード例 #2
0
        public Task PerformUIClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate)
        {
            var tcs = new TaskCompletionSource <bool>();

            tcs.SetResult(true);
            return(tcs.Task);
        }
コード例 #3
0
 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;
     }
 }
コード例 #4
0
 /// <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);
     }
 }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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;
                }
            }
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        /// <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;
                }
            }
        }
コード例 #10
0
        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;
            }
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
 public virtual TReturn Visit(ViewGroupNode node, TData data)
 {
     return(Visit((ViewNode)node, data));
 }
コード例 #13
0
 Task IWorkspaceAdapter.PerformUIClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate)
 {
     return(PerformUIClose(nodeToClose, nodeToActivate));
 }
コード例 #14
0
 /// <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);
コード例 #15
0
 protected override void OnBeforeAnimatingClose(ViewGroupNode nodeToClose, ViewGroupNode nodeToActivate)
 {
     // Do nothing
 }
コード例 #16
0
 protected override void OnBeforeAnimatingActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate)
 {
     AddViewToActivateIfNotExist(nodeToActivate);
     FixZIndex(nodeToDeactivate, nodeToActivate);
 }
コード例 #17
0
 /// <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);
コード例 #18
0
 Task IWorkspaceAdapter.PerformUIActivation(ViewGroupNode nodeToDeactivate, ViewGroupNode nodeToActivate)
 {
     return(PerformUIActivation(nodeToDeactivate, nodeToActivate));
 }
コード例 #19
0
        public static void Connect(ViewGroupNode node, IViewGroupNodeControl control, IXmlLayoutDesigner rootDesigner)
        {
            var connector = new ViewGroupChildConnector(node, control, rootDesigner);

            node.Children.CollectionChanged += connector.OnChildrenChanged;
        }
コード例 #20
0
 public ViewNodeCollection(ViewGroupNode parent)
     : base("Children")
 {
     Parent = parent;
 }