/// <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); }
/// <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); }
/// <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)); }
/// <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));