/// <summary>
        /// Moves the current selected blueprints.
        /// </summary>
        /// <param name="e">The <see cref="DragEvent"/> defining the movement event.</param>
        /// <returns>Whether a movement was active.</returns>
        private bool moveCurrentSelection(DragEvent e)
        {
            if (movementBlueprint == null)
            {
                return(false);
            }

            Debug.Assert(movementBlueprintOriginalPosition != null);

            HitObject draggedObject = movementBlueprint.HitObject;

            // The final movement position, relative to movementBlueprintOriginalPosition.
            Vector2 movePosition = movementBlueprintOriginalPosition.Value + e.ScreenSpaceMousePosition - e.ScreenSpaceMouseDownPosition;

            // Retrieve a snapped position.
            var result = snapProvider.SnapScreenSpacePositionToValidTime(movePosition);

            // Move the hitobjects.
            if (!selectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprint, result.ScreenSpacePosition)))
            {
                return(true);
            }

            if (result.Time.HasValue)
            {
                // Apply the start time at the newly snapped-to position
                double offset = result.Time.Value - draggedObject.StartTime;
                foreach (HitObject obj in selectionHandler.SelectedHitObjects)
                {
                    obj.StartTime += offset;
                }
            }

            return(true);
        }
Exemple #2
0
        /// <summary>
        /// Moves the current selected blueprints.
        /// </summary>
        /// <param name="e">The <see cref="DragEvent"/> defining the movement event.</param>
        /// <returns>Whether a movement was active.</returns>
        private bool moveCurrentSelection(DragEvent e)
        {
            if (movementBlueprint == null)
            {
                return(false);
            }

            Debug.Assert(movementBlueprintOriginalPosition != null);

            HitObject draggedObject = movementBlueprint.HitObject;

            // The final movement position, relative to screenSpaceMovementStartPosition
            Vector2 movePosition = movementBlueprintOriginalPosition.Value + e.ScreenSpaceMousePosition - e.ScreenSpaceMouseDownPosition;

            (Vector2 snappedPosition, double snappedTime) = snapProvider.GetSnappedPosition(ToLocalSpace(movePosition), draggedObject.StartTime);

            // Move the hitobjects
            if (!selectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprint, ToScreenSpace(snappedPosition))))
            {
                return(true);
            }

            // Apply the start time at the newly snapped-to position
            double offset = snappedTime - draggedObject.StartTime;

            foreach (HitObject obj in selectionHandler.SelectedHitObjects)
            {
                obj.StartTime += offset;
            }

            return(true);
        }
Exemple #3
0
        /// <summary>
        /// Moves the current selected blueprints.
        /// </summary>
        /// <param name="e">The <see cref="DragEvent"/> defining the movement event.</param>
        /// <returns>Whether a movement was active.</returns>
        private bool moveCurrentSelection(DragEvent e)
        {
            if (movementBlueprints == null)
            {
                return(false);
            }

            if (snapProvider == null)
            {
                return(true);
            }

            Debug.Assert(movementBlueprintOriginalPositions != null);

            Vector2 distanceTravelled = e.ScreenSpaceMousePosition - e.ScreenSpaceMouseDownPosition;

            // check for positional snap for every object in selection (for things like object-object snapping)
            for (var i = 0; i < movementBlueprintOriginalPositions.Length; i++)
            {
                var testPosition = movementBlueprintOriginalPositions[i] + distanceTravelled;

                var positionalResult = snapProvider.SnapScreenSpacePositionToValidPosition(testPosition);

                if (positionalResult.ScreenSpacePosition == testPosition)
                {
                    continue;
                }

                // attempt to move the objects, and abort any time based snapping if we can.
                if (SelectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprints[i], positionalResult.ScreenSpacePosition)))
                {
                    return(true);
                }
            }

            // if no positional snapping could be performed, try unrestricted snapping from the earliest
            // hitobject in the selection.

            // The final movement position, relative to movementBlueprintOriginalPosition.
            Vector2 movePosition = movementBlueprintOriginalPositions.First() + distanceTravelled;

            // Retrieve a snapped position.
            var result = snapProvider.SnapScreenSpacePositionToValidTime(movePosition);

            // Move the hitobjects.
            if (!SelectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprints.First(), result.ScreenSpacePosition)))
            {
                return(true);
            }

            if (result.Time.HasValue)
            {
                // Apply the start time at the newly snapped-to position
                double offset = result.Time.Value - movementBlueprints.First().HitObject.StartTime;

                Beatmap.PerformOnSelection(obj => obj.StartTime += offset);
            }

            return(true);
        }
        /// <summary>
        /// Moves the current selected blueprints.
        /// </summary>
        /// <param name="e">The <see cref="DragEvent"/> defining the movement event.</param>
        /// <returns>Whether a movement was active.</returns>
        private bool moveCurrentSelection(DragEvent e)
        {
            if (movementBlueprints == null)
            {
                return(false);
            }

            Debug.Assert(movementBlueprintOriginalPositions != null);

            Vector2 distanceTravelled = e.ScreenSpaceMousePosition - e.ScreenSpaceMouseDownPosition;

            if (snapProvider != null)
            {
                // check for positional snap for every object in selection (for things like object-object snapping)
                for (int i = 0; i < movementBlueprintOriginalPositions.Length; i++)
                {
                    Vector2 originalPosition = movementBlueprintOriginalPositions[i];
                    var     testPosition     = originalPosition + distanceTravelled;

                    var positionalResult = snapProvider.FindSnappedPositionAndTime(testPosition, SnapType.NearbyObjects);

                    if (positionalResult.ScreenSpacePosition == testPosition)
                    {
                        continue;
                    }

                    var delta = positionalResult.ScreenSpacePosition - movementBlueprints[i].ScreenSpaceSelectionPoint;

                    // attempt to move the objects, and abort any time based snapping if we can.
                    if (SelectionHandler.HandleMovement(new MoveSelectionEvent <T>(movementBlueprints[i], delta)))
                    {
                        return(true);
                    }
                }
            }

            // if no positional snapping could be performed, try unrestricted snapping from the earliest
            // item in the selection.

            // The final movement position, relative to movementBlueprintOriginalPosition.
            Vector2 movePosition = movementBlueprintOriginalPositions.First() + distanceTravelled;

            // Retrieve a snapped position.
            var result = snapProvider?.FindSnappedPositionAndTime(movePosition, ~SnapType.NearbyObjects);

            if (result == null)
            {
                return(SelectionHandler.HandleMovement(new MoveSelectionEvent <T>(movementBlueprints.First(), movePosition - movementBlueprints.First().ScreenSpaceSelectionPoint)));
            }

            return(ApplySnapResult(movementBlueprints, result));
        }
Exemple #5
0
        /// <summary>
        /// Move the current selection spatially by the specified delta, in gamefield coordinates (ie. the same coordinates as the blueprints).
        /// </summary>
        /// <param name="delta"></param>
        private void moveSelection(Vector2 delta)
        {
            var firstBlueprint = SelectionHandler.SelectedBlueprints.FirstOrDefault();

            if (firstBlueprint == null)
            {
                return;
            }

            // convert to game space coordinates
            delta = firstBlueprint.ToScreenSpace(delta) - firstBlueprint.ToScreenSpace(Vector2.Zero);

            SelectionHandler.HandleMovement(new MoveSelectionEvent(firstBlueprint, firstBlueprint.ScreenSpaceSelectionPoint + delta));
        }
 protected virtual bool ApplySnapResult(SelectionBlueprint <T>[] blueprints, SnapResult result) =>
 SelectionHandler.HandleMovement(new MoveSelectionEvent <T>(blueprints.First(), result.ScreenSpacePosition - blueprints.First().ScreenSpaceSelectionPoint));