示例#1
0
        public void SetStrongState(bool state)
        {
            var hits = SelectedHitObjects.OfType <Hit>();

            ChangeHandler.BeginChange();

            foreach (var h in hits)
            {
                h.IsStrong = state;
            }

            ChangeHandler.EndChange();
        }
示例#2
0
        private MenuItem createFontMenuItem()
        {
            var fontDictionary = source.GetConfig <KaraokeIndexLookup, IDictionary <int, string> >(KaraokeIndexLookup.Style)?.Value;

            return(new OsuMenuItem("Font")
            {
                Items = fontDictionary.Select(x => new TernaryStateMenuItem(x.Value, MenuItemType.Standard, state =>
                {
                    if (state == TernaryState.True)
                    {
                        SelectedHitObjects.Cast <LyricLine>().ForEach(l => l.FontIndex = x.Key);
                    }
                })).ToArray()
            });
        }
示例#3
0
        public override void HandleDrag(SelectionBlueprint blueprint, DragEvent dragEvent)
        {
            foreach (var h in SelectedHitObjects.OfType <OsuHitObject>())
            {
                if (h is Spinner)
                {
                    // Spinners don't support position adjustments
                    continue;
                }

                h.Position += dragEvent.Delta;
            }

            base.HandleDrag(blueprint, dragEvent);
        }
        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);
        }
示例#5
0
        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 void SetStrongState(bool state)
        {
            var hits = SelectedHitObjects.OfType <Hit>();

            ChangeHandler.BeginChange();

            foreach (var h in hits)
            {
                if (h.IsStrong != state)
                {
                    h.IsStrong = state;
                    EditorBeatmap.UpdateHitObject(h);
                }
            }

            ChangeHandler.EndChange();
        }
示例#7
0
        /// <summary>
        /// Returns a gamefield-space quad surrounding the provided points.
        /// </summary>
        /// <param name="points">The points to calculate a quad for.</param>
        private Quad getSurroundingQuad(IEnumerable <Vector2> points)
        {
            if (!SelectedHitObjects.Any())
            {
                return(new Quad());
            }

            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 p in points)
            {
                minPosition = Vector2.ComponentMin(minPosition, p);
                maxPosition = Vector2.ComponentMax(maxPosition, p);
            }

            Vector2 size = maxPosition - minPosition;

            return(new Quad(minPosition.X, minPosition.Y, size.X, size.Y));
        }
        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 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 SelectedHitObjects.OfType <ManiaHitObject>())
            {
                obj.Column += columnDelta;
            }
        }
示例#9
0
        /// <summary>
        ///     Deselects an individual HitObject
        /// </summary>
        /// <param name="h"></param>
        public void DeselectHitObject(DrawableEditorHitObject h)
        {
            var layer = View.LayerCompositor.ScrollContainer.AvailableItems[h.Info.EditorLayer];

            if (PendingLongNoteReleases.Contains(h.Info))
            {
                var ln = h as DrawableEditorHitObjectLong;
                ln?.AppearAsInactive();
            }

            if (layer.Hidden)
            {
                h.AppearAsHiddenInLayer();
            }
            else
            {
                h.AppearAsActive();
            }

            SelectedHitObjects.Remove(h);
            SetSelectedHitsounds();
        }
示例#10
0
        private void performColumnMovement(DragEvent dragEvent)
        {
            var lastColumn    = composer.ColumnAt(dragEvent.ScreenSpaceLastMousePosition);
            var currentColumn = composer.ColumnAt(dragEvent.ScreenSpaceMousePosition);

            if (lastColumn == null || currentColumn == null)
            {
                return;
            }

            int columnDelta = currentColumn.Index - lastColumn.Index;

            if (columnDelta == 0)
            {
                return;
            }

            int minColumn = int.MaxValue;
            int maxColumn = int.MinValue;

            foreach (var obj in SelectedHitObjects.OfType <CrossHitObject>())
            {
                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 <CrossHitObject>())
            {
                obj.Column += columnDelta;
            }
        }
示例#11
0
        private MenuItem createHitSampleMenuItem(string name, string sampleName)
        {
            return(new TernaryStateMenuItem(name, MenuItemType.Standard, setHitSampleState)
            {
                State = { Value = getHitSampleState() }
            });

            void setHitSampleState(TernaryState state)
            {
                switch (state)
                {
                case TernaryState.False:
                    RemoveHitSample(sampleName);
                    break;

                case TernaryState.True:
                    AddHitSample(sampleName);
                    break;
                }
            }

            TernaryState getHitSampleState()
            {
                int countExisting = SelectedHitObjects.Count(h => h.Samples.Any(s => s.Name == sampleName));

                if (countExisting == 0)
                {
                    return(TernaryState.False);
                }

                if (countExisting < SelectedHitObjects.Count())
                {
                    return(TernaryState.Indeterminate);
                }

                return(TernaryState.True);
            }
        }
示例#12
0
        private MenuItem createNewComboMenuItem()
        {
            return(new TernaryStateMenuItem("New combo", MenuItemType.Standard, setNewComboState)
            {
                State = { Value = getHitSampleState() }
            });

            void setNewComboState(TernaryState state)
            {
                switch (state)
                {
                case TernaryState.False:
                    SetNewCombo(false);
                    break;

                case TernaryState.True:
                    SetNewCombo(true);
                    break;
                }
            }

            TernaryState getHitSampleState()
            {
                int countExisting = selectedBlueprints.Select(b => (IHasComboInformation)b.HitObject).Count(h => h.NewCombo);

                if (countExisting == 0)
                {
                    return(TernaryState.False);
                }

                if (countExisting < SelectedHitObjects.Count())
                {
                    return(TernaryState.Indeterminate);
                }

                return(TernaryState.True);
            }
        }
示例#13
0
        /// <summary>
        ///     Copies the selected hitobjects to the clipboard
        /// </summary>
        public void CopySelectedHitObjects()
        {
            if (SelectedHitObjects.Count == 0)
            {
                return;
            }

            var copyString = "";

            Clipboard.Clear();

            foreach (var h in SelectedHitObjects.OrderBy(x => x.Info.StartTime))
            {
                copyString += $"{h.Info.StartTime}|{h.Info.Lane},";
                Clipboard.Add(h.Info);
            }

            copyString = copyString.TrimEnd(',');

            var clipboard = new WindowsClipboard();

            clipboard.SetText(copyString);
        }
        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);
        }
示例#15
0
 /// <summary>
 ///     Selects an individual HitObject
 /// </summary>
 /// <param name="h"></param>
 public void SelectHitObject(DrawableEditorHitObject h)
 {
     h.AppearAsSelected();
     SelectedHitObjects.Add(h);
     SetSelectedHitsounds();
 }
示例#16
0
        /// <summary>
        ///     Handles the selecting of hitobjects
        /// </summary>
        private void HandleHitObjectSelection()
        {
            if (MouseManager.PreviousState.LeftButton == ButtonState.Released &&
                MouseManager.CurrentState.LeftButton == ButtonState.Pressed)
            {
                MouseInitialClickPosition = MouseManager.CurrentState.Position;
            }

            if (!MouseManager.IsUniqueClick(MouseButton.Left) || View.MenuBar.IsActive)
            {
                return;
            }

            if (CompositionTool.Value == EditorCompositionTool.Select)
            {
                var hoveredObject = ScrollContainer.GetHoveredHitObject();

                // Compare the y positions of the mouse when the user clicked the object initially, vs when they released.
                var relativeY  = ScrollContainer.HitPositionY - (int)ScrollContainer.GetTimeFromY(MouseInitialClickPosition.Y);
                var relativeY2 = ScrollContainer.HitPositionY - (int)ScrollContainer.GetTimeFromY(MouseManager.CurrentState.Y);

                // Give a little bit of leniency for the mouse to move.
                if (Math.Abs(relativeY2 - relativeY) > 2)
                {
                    return;
                }

                // User has clicked on a new object and wants to select it.
                if (hoveredObject != null)
                {
                    // Object isn't hovered, so we need to add it
                    if (!SelectedHitObjects.Contains(hoveredObject))
                    {
                        SelectHitObject(hoveredObject);
                    }

                    if (KeyboardManager.CurrentState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.LeftControl) ||
                        KeyboardManager.CurrentState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.RightControl))
                    {
                        return;
                    }

                    // In the event that the user isn't pressing control, deselect all other hitobjects
                    for (var i = SelectedHitObjects.Count - 1; i >= 0; i--)
                    {
                        if (SelectedHitObjects[i] != hoveredObject)
                        {
                            DeselectHitObject(SelectedHitObjects[i]);
                        }
                    }

                    return;
                }
            }

            // Don't deselect if the user is in the hitsound panel.
            if (GraphicsHelper.RectangleContains(View.HitsoundEditor.ScreenRectangle, MouseManager.CurrentState.Position))
            {
                return;
            }

            for (var i = SelectedHitObjects.Count - 1; i >= 0; i--)
            {
                DeselectHitObject(SelectedHitObjects[i]);
            }
        }