public void TestMultiSelectFromDrag(bool alreadySelectedBeforeDrag) { HitCircle[] addedObjects = null; AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects = new[] { new HitCircle { StartTime = 100 }, new HitCircle { StartTime = 200, Position = new Vector2(50) }, new HitCircle { StartTime = 300, Position = new Vector2(100) }, new HitCircle { StartTime = 400, Position = new Vector2(150) }, })); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); AddStep("hold control", () => InputManager.PressKey(Key.ControlLeft)); moveMouseToObject(() => addedObjects[1]); if (alreadySelectedBeforeDrag) { AddStep("click second", () => InputManager.Click(MouseButton.Left)); } AddStep("mouse down on second", () => InputManager.PressButton(MouseButton.Left)); AddAssert("2 hitobjects selected", () => EditorBeatmap.SelectedHitObjects.Count == 2 && EditorBeatmap.SelectedHitObjects.Contains(addedObjects[1])); AddStep("drag to centre", () => InputManager.MoveMouseTo(blueprintContainer.ScreenSpaceDrawQuad.Centre)); AddAssert("positions changed", () => addedObjects[0].Position != Vector2.Zero && addedObjects[1].Position != new Vector2(50)); AddStep("release control", () => InputManager.ReleaseKey(Key.ControlLeft)); AddStep("mouse up", () => InputManager.ReleaseButton(MouseButton.Left)); }
public void TestMultiSelect() { var addedObjects = new[] { new HitCircle { StartTime = 500 }, new HitCircle { StartTime = 1000, Position = new Vector2(100) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) }, }; AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects)); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); AddAssert("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObjects[0]); AddStep("hold control", () => InputManager.PressKey(Key.ControlLeft)); moveMouseToObject(() => addedObjects[1]); AddStep("click second", () => InputManager.Click(MouseButton.Left)); AddAssert("2 hitobjects selected", () => EditorBeatmap.SelectedHitObjects.Count == 2 && EditorBeatmap.SelectedHitObjects.Contains(addedObjects[1])); moveMouseToObject(() => addedObjects[2]); AddStep("click third", () => InputManager.Click(MouseButton.Left)); AddAssert("3 hitobjects selected", () => EditorBeatmap.SelectedHitObjects.Count == 3 && EditorBeatmap.SelectedHitObjects.Contains(addedObjects[2])); moveMouseToObject(() => addedObjects[1]); AddStep("click second", () => InputManager.Click(MouseButton.Left)); AddAssert("2 hitobjects selected", () => EditorBeatmap.SelectedHitObjects.Count == 2 && !EditorBeatmap.SelectedHitObjects.Contains(addedObjects[1])); AddStep("release control", () => InputManager.ReleaseKey(Key.ControlLeft)); }
protected override void PerformPaste() { base.PerformPaste(); var objects = clipboard.Value.Deserialize <ClipboardContent>().HitObjects; Debug.Assert(objects.Any()); double timeOffset = clock.CurrentTime - objects.Min(o => o.StartTime); foreach (var h in objects) { h.StartTime += timeOffset; } EditorBeatmap.BeginChange(); EditorBeatmap.SelectedHitObjects.Clear(); EditorBeatmap.AddRange(objects); EditorBeatmap.SelectedHitObjects.AddRange(objects); EditorBeatmap.EndChange(); }
public void TestRangeSelect() { var addedObjects = new[] { new HitCircle { StartTime = 500 }, new HitCircle { StartTime = 1000, Position = new Vector2(100) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) }, new HitCircle { StartTime = 2500, Position = new Vector2(400) }, }; AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects)); moveMouseToObject(() => addedObjects[1]); AddStep("click second", () => InputManager.Click(MouseButton.Left)); AddAssert("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObjects[1]); AddStep("hold shift", () => InputManager.PressKey(Key.ShiftLeft)); moveMouseToObject(() => addedObjects[3]); AddStep("click fourth", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Skip(1).Take(3)); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Take(2)); AddStep("clear selection", () => EditorBeatmap.SelectedHitObjects.Clear()); AddStep("release shift", () => InputManager.ReleaseKey(Key.ShiftLeft)); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Take(1)); AddStep("hold ctrl", () => InputManager.PressKey(Key.ControlLeft)); moveMouseToObject(() => addedObjects[2]); AddStep("click third", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(new[] { addedObjects[0], addedObjects[2] }); AddStep("hold shift", () => InputManager.PressKey(Key.ShiftLeft)); moveMouseToObject(() => addedObjects[4]); AddStep("click fifth", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Except(new[] { addedObjects[1] })); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects); AddStep("clear selection", () => EditorBeatmap.SelectedHitObjects.Clear()); moveMouseToObject(() => addedObjects[0]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Take(1)); moveMouseToObject(() => addedObjects[1]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Take(2)); moveMouseToObject(() => addedObjects[2]); AddStep("click first", () => InputManager.Click(MouseButton.Left)); assertSelectionIs(addedObjects.Take(3)); AddStep("release keys", () => { InputManager.ReleaseKey(Key.ControlLeft); InputManager.ReleaseKey(Key.ShiftLeft); }); }
public void TestCopyDifficulty() { string originalDifficultyName = Guid.NewGuid().ToString(); string copyDifficultyName = $"{originalDifficultyName} (copy)"; AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = originalDifficultyName); AddStep("add timing point", () => EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 1000 })); AddStep("add hitobjects", () => EditorBeatmap.AddRange(new[] { new HitCircle { Position = new Vector2(0), StartTime = 0 }, new HitCircle { Position = OsuPlayfield.BASE_SIZE, StartTime = 1000 } })); AddStep("set approach rate", () => EditorBeatmap.Difficulty.ApproachRate = 4); AddStep("set combo colours", () => { var beatmapSkin = EditorBeatmap.BeatmapSkin.AsNonNull(); beatmapSkin.ComboColours.Clear(); beatmapSkin.ComboColours.AddRange(new[] { new Colour4(255, 0, 0, 255), new Colour4(0, 0, 255, 255) }); }); AddStep("set status & online ID", () => { EditorBeatmap.BeatmapInfo.OnlineID = 123456; EditorBeatmap.BeatmapInfo.Status = BeatmapOnlineStatus.WIP; }); AddStep("save beatmap", () => Editor.Save()); AddAssert("new beatmap persisted", () => { var beatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == originalDifficultyName); var set = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID); return(beatmap != null && beatmap.DifficultyName == originalDifficultyName && set != null && set.PerformRead(s => s.Beatmaps.Single().ID == beatmap.ID)); }); AddAssert("can save again", () => Editor.Save()); AddStep("create new difficulty", () => Editor.CreateNewDifficulty(new OsuRuleset().RulesetInfo)); AddUntilStep("wait for dialog", () => DialogOverlay.CurrentDialog is CreateNewDifficultyDialog); AddStep("confirm creation as a copy", () => DialogOverlay.CurrentDialog.Buttons.ElementAt(1).TriggerClick()); AddUntilStep("wait for created", () => { string difficultyName = Editor.ChildrenOfType <EditorBeatmap>().SingleOrDefault()?.BeatmapInfo.DifficultyName; return(difficultyName != null && difficultyName != originalDifficultyName); }); AddAssert("created difficulty has copy suffix in name", () => EditorBeatmap.BeatmapInfo.DifficultyName == copyDifficultyName); AddAssert("created difficulty has timing point", () => { var timingPoint = EditorBeatmap.ControlPointInfo.TimingPoints.Single(); return(timingPoint.Time == 0 && timingPoint.BeatLength == 1000); }); AddAssert("created difficulty has objects", () => EditorBeatmap.HitObjects.Count == 2); AddAssert("approach rate correctly copied", () => EditorBeatmap.Difficulty.ApproachRate == 4); AddAssert("combo colours correctly copied", () => EditorBeatmap.BeatmapSkin.AsNonNull().ComboColours.Count == 2); AddAssert("status not copied", () => EditorBeatmap.BeatmapInfo.Status == BeatmapOnlineStatus.None); AddAssert("online ID not copied", () => EditorBeatmap.BeatmapInfo.OnlineID == -1); AddStep("save beatmap", () => Editor.Save()); BeatmapInfo refetchedBeatmap = null; Live <BeatmapSetInfo> refetchedBeatmapSet = null; AddStep("refetch from database", () => { refetchedBeatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == copyDifficultyName); refetchedBeatmapSet = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID); }); AddAssert("new beatmap persisted", () => { return(refetchedBeatmap != null && refetchedBeatmap.DifficultyName == copyDifficultyName && refetchedBeatmapSet != null && refetchedBeatmapSet.PerformRead(s => s.Beatmaps.Count == 2 && s.Beatmaps.Any(b => b.DifficultyName == originalDifficultyName) && s.Beatmaps.Any(b => b.DifficultyName == copyDifficultyName))); }); AddAssert("old beatmap file not deleted", () => refetchedBeatmapSet.AsNonNull().PerformRead(s => s.Files.Count == 2)); }
public void TestCreateNewDifficulty([Values] bool sameRuleset) { string firstDifficultyName = Guid.NewGuid().ToString(); string secondDifficultyName = Guid.NewGuid().ToString(); AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = firstDifficultyName); AddStep("add timing point", () => EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 1000 })); AddStep("add hitobjects", () => EditorBeatmap.AddRange(new[] { new HitCircle { Position = new Vector2(0), StartTime = 0 }, new HitCircle { Position = OsuPlayfield.BASE_SIZE, StartTime = 1000 } })); AddStep("save beatmap", () => Editor.Save()); AddAssert("new beatmap persisted", () => { var beatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == firstDifficultyName); var set = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID); return(beatmap != null && beatmap.DifficultyName == firstDifficultyName && set != null && set.PerformRead(s => s.Beatmaps.Single().ID == beatmap.ID)); }); AddAssert("can save again", () => Editor.Save()); AddStep("create new difficulty", () => Editor.CreateNewDifficulty(sameRuleset ? new OsuRuleset().RulesetInfo : new CatchRuleset().RulesetInfo)); if (sameRuleset) { AddUntilStep("wait for dialog", () => DialogOverlay.CurrentDialog is CreateNewDifficultyDialog); AddStep("confirm creation with no objects", () => DialogOverlay.CurrentDialog.PerformOkAction()); } AddUntilStep("wait for created", () => { string difficultyName = Editor.ChildrenOfType <EditorBeatmap>().SingleOrDefault()?.BeatmapInfo.DifficultyName; return(difficultyName != null && difficultyName != firstDifficultyName); }); AddAssert("created difficulty has timing point", () => { var timingPoint = EditorBeatmap.ControlPointInfo.TimingPoints.Single(); return(timingPoint.Time == 0 && timingPoint.BeatLength == 1000); }); AddAssert("created difficulty has no objects", () => EditorBeatmap.HitObjects.Count == 0); AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = secondDifficultyName); AddStep("save beatmap", () => Editor.Save()); AddAssert("new beatmap persisted", () => { var beatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == secondDifficultyName); var set = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID); return(beatmap != null && beatmap.DifficultyName == secondDifficultyName && set != null && set.PerformRead(s => s.Beatmaps.Count == 2 && s.Beatmaps.Any(b => b.DifficultyName == secondDifficultyName))); }); }