コード例 #1
0
ファイル: CatchSelectionHandler.cs プロジェクト: zi-jing/osu
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: ManiaSelectionHandler.cs プロジェクト: yeahx4/osu
        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);
            }
        }
コード例 #4
0
 public void OnMoveSelection(InputAction.CallbackContext context)
 {
     if (context.phase == InputActionPhase.Performed)
     {
         MoveSelectionEvent.Invoke();
     }
 }
コード例 #5
0
        public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent)
        {
            var hitObjectBlueprint = (HitObjectSelectionBlueprint)moveEvent.Blueprint;
            int lastColumn         = ((ManiaHitObject)hitObjectBlueprint.Item).Column;

            performColumnMovement(lastColumn, moveEvent);

            return(true);
        }
コード例 #6
0
ファイル: ManiaSelectionHandler.cs プロジェクト: shadiwolf/e
        public override bool HandleMovement(MoveSelectionEvent <HitObject> moveEvent)
        {
            var maniaBlueprint = (ManiaSelectionBlueprint)moveEvent.Blueprint;
            int lastColumn     = maniaBlueprint.DrawableObject.HitObject.Column;

            performColumnMovement(lastColumn, moveEvent);

            return(true);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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;
            }
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
ファイル: TauSelectionHandler.cs プロジェクト: nyalter/tau
        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);
        }
コード例 #15
0
ファイル: TauSelectionHandler.cs プロジェクト: Altenhh/tau
        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);
        }
コード例 #16
0
ファイル: ManiaSelectionHandler.cs プロジェクト: shadiwolf/e
        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;
                }
            });
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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;
            }
        }
コード例 #19
0
        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);
            }
        }
コード例 #20
0
        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;
            }
        }
コード例 #21
0
        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);
        }
コード例 #22
0
 public override bool HandleMovement(MoveSelectionEvent <Lyric> moveEvent) => false;
コード例 #23
0
 // for now we always allow movement. snapping is provided by the Timeline's "distance" snap implementation
 public override bool HandleMovement(MoveSelectionEvent moveEvent) => true;
コード例 #24
0
ファイル: OsuSelectionHandler.cs プロジェクト: codernaut/osu
 public override bool HandleMovement(MoveSelectionEvent moveEvent) =>
 moveSelection(moveEvent.InstantDelta);