Example #1
0
        private void TouchUp(object sender, TouchEventArgs e)
        {
            if (!Game.Input.IsMouseButtonReleased(MouseButton.Left))
            {
                return;
            }

            isInProgress = false;
            Controller.ChangeCursor(null);
            e.Handled = true;

            // dragging state
            if (isDragging)
            {
                isDragging = false;
                if (dragAdorner != null)
                {
                    // Create a collection with all properties that might have changed
                    var changes = new Dictionary <string, object>
                    {
                        { nameof(UIElement.Margin), dragAdorner.GameSideElement.Margin },
                        { nameof(UIElement.Width), dragAdorner.GameSideElement.Width },
                        { nameof(UIElement.HorizontalAlignment), dragAdorner.GameSideElement.HorizontalAlignment },
                        { nameof(UIElement.Height), dragAdorner.GameSideElement.Height },
                        { nameof(UIElement.VerticalAlignment), dragAdorner.GameSideElement.VerticalAlignment },
                        //{ nameof(UIElement.Depth), dragAdorner.GameSideElement.Depth },
                        //{ nameof(UIElement.DepthAlignment), dragAdorner.GameSideElement.DepthAlignment },
                    };
                    // Propagate the changes to the asset
                    ApplyChanges(dragAdorner.GameSideElement.Id, changes);
                    dragAdorner.OnResizingCompleted();
                }
                dragAdorner = null;
                return;
            }

            // other states
            var editor        = Controller.Editor;
            var worldPosition = e.WorldPosition;

            // Get the id of the game-side element that is under the pointer position
            Guid elementId;

            if (!TryGetElementIdAtPosition(ref worldPosition, out elementId))
            {
                // Nothing, clear the selection
                editor.Dispatcher.InvokeAsync(() => editor.ClearSelection());
                return;
            }

            // Select the corresponding asset-side UIElement, if pointer did not move between down and up events
            var delta = (e.ScreenPosition - originScreenPosition) * new Vector2(Game.GraphicsDevice.Presenter.BackBuffer.Width, Game.GraphicsDevice.Presenter.BackBuffer.Height);

            if (Math.Abs(delta.X) < System.Windows.SystemParameters.MinimumHorizontalDragDistance && Math.Abs(delta.Y) < System.Windows.SystemParameters.MinimumVerticalDragDistance)
            {
                var additiveSelection = Game.Input.IsKeyDown(Keys.LeftCtrl) || Game.Input.IsKeyDown(Keys.RightCtrl);
                editor.Dispatcher.InvokeAsync(() => editor.Select(elementId, additiveSelection)).Forget();
            }
        }
Example #2
0
        private void PreviewTouchDown(object sender, TouchEventArgs e)
        {
            if (!Game.Input.IsMouseButtonDown(MouseButton.Left))
            {
                return;
            }

            // Save the current pointer position
            originWorldPosition  = currentPosition = e.WorldPosition;
            originScreenPosition = e.ScreenPosition;

            // No prior selection (selection is done on TouchUp)
            if (selectedAdorners.Count == 0)
            {
                return;
            }

            // Get the resizing adorners that are under the pointer position
            var resizingAdorners = (
                from hit in GetAdornerVisualsAtPosition(ref originWorldPosition)
                // only on currently selected elements (retrieve associated game-side element id from hit visual)
                join s in selectedAdorners on hit.Element.DependencyProperties.Get(AssociatedElementIdPropertyKey) equals s
                // order by closest to screen (z goes negatively)
                orderby hit.IntersectionPoint.Z
                // retrieve resizing adorners (MoveAdorner or SizingAdorner), if any
                let r = GetAssociatedAdorner(hit.Element) as IResizingAdorner
                        where r != null
                        select r).ToList();

            if (resizingAdorners.Count == 0)
            {
                return;
            }

            if (resizingAdorners.Count == 1 && selectedAdorners.Count == 1)
            {
                // If ALT is pressed, we are starting a drag/drop to the outside of the UI editor
                if (Game.Input.IsKeyDown(Keys.LeftAlt) || Game.Input.IsKeyDown(Keys.RightAlt))
                {
                    e.Handled = true;
                    Controller.DoDragDrop(resizingAdorners[0].GameSideElement.Id);
                    return;
                }
            }

            // start drag
            dragAdorner  = resizingAdorners[0]; // hit results have been order by Z already
            isInProgress = true;
        }