public void SetStrongState(bool state) { var hits = SelectedHitObjects.OfType <Hit>(); ChangeHandler.BeginChange(); foreach (var h in hits) { h.IsStrong = state; } ChangeHandler.EndChange(); }
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() }); }
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); }
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(); }
/// <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; } }
/// <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(); }
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; } }
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); } }
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); } }
/// <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); }
/// <summary> /// Selects an individual HitObject /// </summary> /// <param name="h"></param> public void SelectHitObject(DrawableEditorHitObject h) { h.AppearAsSelected(); SelectedHitObjects.Add(h); SetSelectedHitsounds(); }
/// <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]); } }