public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { var blueprint = moveEvent.Blueprint; Vector2 originalPosition = HitObjectContainer.ToLocalSpace(blueprint.ScreenSpaceSelectionPoint); Vector2 targetPosition = HitObjectContainer.ToLocalSpace(blueprint.ScreenSpaceSelectionPoint + moveEvent.ScreenSpaceDelta); float deltaX = targetPosition.X - originalPosition.X; deltaX = limitMovement(deltaX, SelectedItems); if (deltaX == 0) { // Even if there is no positional change, there may be a time change. return(true); } EditorBeatmap.PerformOnSelection(h => { if (!(h is CatchHitObject catchObject)) { return; } catchObject.OriginalX += deltaX; // Move the nested hit objects to give an instant result before nested objects are recreated. foreach (var nested in catchObject.NestedHitObjects.OfType <CatchHitObject>()) { nested.OriginalX += deltaX; } }); return(true); }
public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { var blueprint = moveEvent.Blueprint; Vector2 originalPosition = HitObjectContainer.ToLocalSpace(blueprint.ScreenSpaceSelectionPoint); Vector2 targetPosition = HitObjectContainer.ToLocalSpace(blueprint.ScreenSpaceSelectionPoint + moveEvent.ScreenSpaceDelta); float deltaX = targetPosition.X - originalPosition.X; EditorBeatmap.PerformOnSelection(h => { if (!(h is CatchHitObject hitObject)) { return; } if (hitObject is BananaShower) { return; } // TODO: confine in bounds hitObject.OriginalXBindable.Value += deltaX; // Move the nested hit objects to give an instant result before nested objects are recreated. foreach (var nested in hitObject.NestedHitObjects.OfType <CatchHitObject>()) { nested.OriginalXBindable.Value += deltaX; } }); return(true); }
private void performDragMovement(MoveSelectionEvent moveEvent) { foreach (var b in SelectedBlueprints) { var hitObject = b.HitObject; var objectParent = (HitObjectContainer)hitObject.Parent; // Using the hitobject position is required since AdjustPosition can be invoked multiple times per frame // without the position having been updated by the parenting ScrollingHitObjectContainer hitObject.Y += moveEvent.InstantDelta.Y; float targetPosition; // If we're scrolling downwards, a position of 0 is actually further away from the hit target // so we need to flip the vertical coordinate in the hitobject container's space if (scrollingInfo.Direction.Value == ScrollingDirection.Down) { targetPosition = -hitObject.Position.Y; } else { targetPosition = hitObject.Position.Y; } objectParent.Remove(hitObject); hitObject.HitObject.StartTime = scrollingInfo.Algorithm.TimeAt(targetPosition, editorClock.CurrentTime, scrollingInfo.TimeRange.Value, objectParent.DrawHeight); objectParent.Add(hitObject); } }
public void OnMoveSelection(InputAction.CallbackContext context) { if (context.phase == InputActionPhase.Performed) { MoveSelectionEvent.Invoke(); } }
public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { var hitObjectBlueprint = (HitObjectSelectionBlueprint)moveEvent.Blueprint; int lastColumn = ((ManiaHitObject)hitObjectBlueprint.Item).Column; performColumnMovement(lastColumn, moveEvent); return(true); }
public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { var maniaBlueprint = (ManiaSelectionBlueprint)moveEvent.Blueprint; int lastColumn = maniaBlueprint.DrawableObject.HitObject.Column; performColumnMovement(lastColumn, moveEvent); return(true); }
public override bool HandleMovement(MoveSelectionEvent <ISkinnableDrawable> moveEvent) { foreach (var c in SelectedBlueprints) { Drawable drawable = (Drawable)c.Item; drawable.Position += drawable.ScreenSpaceDeltaToParentSpace(moveEvent.ScreenSpaceDelta); } return(true); }
public override void HandleMovement(MoveSelectionEvent moveEvent) { var maniaBlueprint = (ManiaSelectionBlueprint)moveEvent.Blueprint; int lastColumn = maniaBlueprint.DrawableObject.HitObject.Column; adjustOrigins(maniaBlueprint); performDragMovement(moveEvent); performColumnMovement(lastColumn, moveEvent); base.HandleMovement(moveEvent); }
private void performColumnMovement(Tone lastTone, MoveSelectionEvent moveEvent) { if (!(moveEvent.Blueprint is NoteSelectionBlueprint)) { return; } var karaokePlayfield = ((KaraokeHitObjectComposer)composer).Playfield; // top position var dragHeight = karaokePlayfield.NotePlayfield.ToLocalSpace(moveEvent.ScreenSpacePosition).Y; var lastHeight = convertToneToHeight(lastTone); var moveHeight = dragHeight - lastHeight; var deltaTone = new Tone(); const float trigger_height = NotePlayfield.COLUMN_SPACING + DefaultColumnBackground.COLUMN_HEIGHT; if (moveHeight > trigger_height) { deltaTone = -new Tone { Half = true } } ; else if (moveHeight < 0) { deltaTone = new Tone { Half = true } } ; if (deltaTone == 0) { return; } foreach (var note in SelectedHitObjects.OfType <Note>()) { if (note.Tone >= calculator.MaxTone() && deltaTone > 0) { continue; } if (note.Tone <= calculator.MinTone() && deltaTone < 0) { continue; } note.Tone += deltaTone; //Change all note to visible note.Display = true; } }
public override bool HandleMovement(MoveSelectionEvent moveEvent) { if (!(moveEvent.Blueprint is NoteSelectionBlueprint noteSelectionBlueprint)) { return(true); } var lastTone = noteSelectionBlueprint.DrawableObject.HitObject.Tone; performColumnMovement(lastTone, moveEvent); return(true); }
public override bool HandleMovement(MoveSelectionEvent moveEvent) { var hitObjects = selectedMovableObjects; // this will potentially move the selection out of bounds... foreach (var h in hitObjects) { h.Position += moveEvent.InstantDelta; } // but this will be corrected. moveSelectionInBounds(); return(true); }
public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { var hitObjects = selectedMovableObjects; // this will potentially move the selection out of bounds... foreach (var h in hitObjects) { h.Position += this.ScreenSpaceDeltaToParentSpace(moveEvent.ScreenSpaceDelta); } // but this will be corrected. moveSelectionInBounds(); return(true); }
public override void HandleMovement(MoveSelectionEvent moveEvent) { foreach (var h in SelectedHitObjects.OfType <OsuHitObject>()) { if (h is Spinner) { // Spinners don't support position adjustments continue; } h.Position += moveEvent.InstantDelta; } base.HandleMovement(moveEvent); }
public override bool HandleMovement(MoveSelectionEvent moveEvent) { foreach (var h in SelectedHitObjects.OfType <TauHitObject>()) { if (h is HardBeat) { continue; } h.Angle = ScreenSpaceDrawQuad.Centre.GetDegreesFromPosition(moveEvent.ScreenSpacePosition); EditorBeatmap?.UpdateHitObject(h); } return(true); }
public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent) { foreach (var h in EditorBeatmap.SelectedHitObjects.OfType <TauHitObject>()) { if (h is HardBeat) { continue; } var currentMousePos = moveEvent.Blueprint.ScreenSpaceSelectionPoint + moveEvent.ScreenSpaceDelta; h.Angle = ScreenSpaceDrawQuad.Centre.GetDegreesFromPosition(currentMousePos); EditorBeatmap?.Update(h); } return(true); }
private void performColumnMovement(int lastColumn, MoveSelectionEvent <HitObject> moveEvent) { var maniaPlayfield = ((ManiaHitObjectComposer)composer).Playfield; var currentColumn = maniaPlayfield.GetColumnByPosition(moveEvent.Blueprint.ScreenSpaceSelectionPoint + moveEvent.ScreenSpaceDelta); if (currentColumn == null) { return; } int columnDelta = currentColumn.Index - lastColumn; if (columnDelta == 0) { return; } int minColumn = int.MaxValue; int maxColumn = int.MinValue; // find min/max in an initial pass before actually performing the movement. foreach (var obj in EditorBeatmap.SelectedHitObjects.OfType <ManiaHitObject>()) { if (obj.Column < minColumn) { minColumn = obj.Column; } if (obj.Column > maxColumn) { maxColumn = obj.Column; } } columnDelta = Math.Clamp(columnDelta, -minColumn, maniaPlayfield.TotalColumns - 1 - maxColumn); EditorBeatmap.PerformOnSelection(h => { if (h is ManiaHitObject maniaObj) { maniaObj.Column += columnDelta; } }); }
public override bool HandleMovement(MoveSelectionEvent <ISkinnableDrawable> moveEvent) { foreach (var c in SelectedBlueprints) { var item = c.Item; Drawable drawable = (Drawable)item; drawable.Position += drawable.ScreenSpaceDeltaToParentSpace(moveEvent.ScreenSpaceDelta); if (item.UsesFixedAnchor) { continue; } applyClosestAnchor(drawable); } return(true); }
private void performColumnMovement(int lastColumn, MoveSelectionEvent moveEvent) { var maniaPlayfield = ((ManiaHitObjectComposer)composer).Playfield; var currentColumn = maniaPlayfield.GetColumnByPosition(moveEvent.ScreenSpacePosition); if (currentColumn == null) { return; } int columnDelta = currentColumn.Index - lastColumn; if (columnDelta == 0) { return; } int minColumn = int.MaxValue; int maxColumn = int.MinValue; foreach (var obj in EditorBeatmap.SelectedHitObjects.OfType <ManiaHitObject>()) { if (obj.Column < minColumn) { minColumn = obj.Column; } if (obj.Column > maxColumn) { maxColumn = obj.Column; } } columnDelta = Math.Clamp(columnDelta, -minColumn, maniaPlayfield.TotalColumns - 1 - maxColumn); foreach (var obj in EditorBeatmap.SelectedHitObjects.OfType <ManiaHitObject>()) { obj.Column += columnDelta; } }
private void performDragMovement(MoveSelectionEvent moveEvent) { float delta = moveEvent.InstantDelta.Y; // When scrolling downwards the anchor position is at the bottom of the screen, however the movement event assumes the anchor is at the top of the screen. // This causes the delta to assume a positive hitobject position, and which can be corrected for by subtracting the parent height. if (scrollingInfo.Direction.Value == ScrollingDirection.Down) { delta -= moveEvent.Blueprint.Parent.DrawHeight; // todo: probably wrong } foreach (var selectionBlueprint in SelectedBlueprints) { var b = (OverlaySelectionBlueprint)selectionBlueprint; var hitObject = b.DrawableObject; var objectParent = (HitObjectContainer)hitObject.Parent; // StartTime could be used to adjust the position if only one movement event was received per frame. // However this is not the case and ScrollingHitObjectContainer performs movement in UpdateAfterChildren() so the position must also be updated to be valid for further movement events hitObject.Y += delta; float targetPosition = hitObject.Position.Y; // The scrolling algorithm always assumes an anchor at the top of the screen, so the position must be flipped when scrolling downwards to reflect a top anchor if (scrollingInfo.Direction.Value == ScrollingDirection.Down) { targetPosition = -targetPosition; } objectParent.Remove(hitObject); hitObject.HitObject.StartTime = scrollingInfo.Algorithm.TimeAt(targetPosition, editorClock.CurrentTime, scrollingInfo.TimeRange.Value, objectParent.DrawHeight); objectParent.Add(hitObject); } }
private void performColumnMovement(int lastColumn, MoveSelectionEvent moveEvent) { var currentColumn = composer.ColumnAt(moveEvent.ScreenSpacePosition); if (currentColumn == null) { return; } int columnDelta = currentColumn.Index - lastColumn; if (columnDelta == 0) { return; } int minColumn = int.MaxValue; int maxColumn = int.MinValue; foreach (var obj in SelectedHitObjects.OfType <ManiaHitObject>()) { if (obj.Column < minColumn) { minColumn = obj.Column; } if (obj.Column > maxColumn) { maxColumn = obj.Column; } } columnDelta = MathHelper.Clamp(columnDelta, -minColumn, composer.TotalColumns - 1 - maxColumn); foreach (var obj in SelectedHitObjects.OfType <ManiaHitObject>()) { obj.Column += columnDelta; } }
public override bool HandleMovement(MoveSelectionEvent moveEvent) { Vector2 minPosition = new Vector2(float.MaxValue, float.MaxValue); Vector2 maxPosition = new Vector2(float.MinValue, float.MinValue); // Go through all hitobjects to make sure they would remain in the bounds of the editor after movement, before any movement is attempted foreach (var h in SelectedHitObjects.OfType <OsuHitObject>()) { if (h is Spinner) { // Spinners don't support position adjustments continue; } // Stacking is not considered minPosition = Vector2.ComponentMin(minPosition, Vector2.ComponentMin(h.EndPosition + moveEvent.InstantDelta, h.Position + moveEvent.InstantDelta)); maxPosition = Vector2.ComponentMax(maxPosition, Vector2.ComponentMax(h.EndPosition + moveEvent.InstantDelta, h.Position + moveEvent.InstantDelta)); } if (minPosition.X < 0 || minPosition.Y < 0 || maxPosition.X > DrawWidth || maxPosition.Y > DrawHeight) { return(false); } foreach (var h in SelectedHitObjects.OfType <OsuHitObject>()) { if (h is Spinner) { // Spinners don't support position adjustments continue; } h.Position += moveEvent.InstantDelta; } return(true); }
public override bool HandleMovement(MoveSelectionEvent <Lyric> moveEvent) => false;
// for now we always allow movement. snapping is provided by the Timeline's "distance" snap implementation public override bool HandleMovement(MoveSelectionEvent moveEvent) => true;
public override bool HandleMovement(MoveSelectionEvent moveEvent) => moveSelection(moveEvent.InstantDelta);