diff --git a/osu.Game/Rulesets/Edit/HitObjectComposer.cs b/osu.Game/Rulesets/Edit/HitObjectComposer.cs index be73bc5db3..ab8dccb9dd 100644 --- a/osu.Game/Rulesets/Edit/HitObjectComposer.cs +++ b/osu.Game/Rulesets/Edit/HitObjectComposer.cs @@ -9,6 +9,7 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input; +using osu.Framework.Input.Events; using osu.Framework.Logging; using osu.Framework.Threading; using osu.Framework.Timing; @@ -25,6 +26,7 @@ using osu.Game.Screens.Edit.Components.RadioButtons; using osu.Game.Screens.Edit.Compose; using osu.Game.Screens.Edit.Compose.Components; using osuTK; +using Key = osuTK.Input.Key; namespace osu.Game.Rulesets.Edit { @@ -58,6 +60,8 @@ namespace osu.Game.Rulesets.Edit private InputManager inputManager; + private RadioButtonCollection toolboxCollection; + protected HitObjectComposer(Ruleset ruleset) { Ruleset = ruleset; @@ -100,7 +104,6 @@ namespace osu.Game.Rulesets.Edit layerContainers.Add(layerBelowRuleset); layerContainers.Add(layerAboveRuleset); - RadioButtonCollection toolboxCollection; InternalChild = new GridContainer { RelativeSizeAxes = Axes.Both, @@ -142,11 +145,27 @@ namespace osu.Game.Rulesets.Edit .Select(t => new RadioButton(t.Name, () => toolSelected(t))) .ToList(); - toolboxCollection.Items.First().Select(); + setSelectTool(); blueprintContainer.SelectionChanged += selectionChanged; } + protected override bool OnKeyDown(KeyDownEvent e) + { + if (e.Key >= Key.Number1 && e.Key <= Key.Number9) + { + var item = toolboxCollection.Items.Skip(e.Key - Key.Number1).FirstOrDefault(); + + if (item != null) + { + item.Select(); + return true; + } + } + + return base.OnKeyDown(e); + } + protected override void LoadComplete() { base.LoadComplete(); @@ -181,12 +200,19 @@ namespace osu.Game.Rulesets.Edit { var hitObjects = selectedHitObjects.ToArray(); - if (!hitObjects.Any()) - distanceSnapGridContainer.Hide(); - else + if (hitObjects.Any()) + { + // ensure in selection mode if a selection is made. + setSelectTool(); + showGridFor(hitObjects); + } + else + distanceSnapGridContainer.Hide(); } + private void setSelectTool() => toolboxCollection.Items.First().Select(); + private void toolSelected(HitObjectCompositionTool tool) { blueprintContainer.CurrentTool = tool; @@ -194,7 +220,10 @@ namespace osu.Game.Rulesets.Edit if (tool is SelectTool) distanceSnapGridContainer.Hide(); else + { + EditorBeatmap.SelectedHitObjects.Clear(); showGridFor(Enumerable.Empty()); + } } private void showGridFor(IEnumerable selectedHitObjects) diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs index 6b21f56567..675b2b648d 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs @@ -74,12 +74,16 @@ namespace osu.Game.Screens.Edit.Compose.Components { foreach (var o in objects) selectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Select(); + + SelectionChanged?.Invoke(selectedHitObjects); }; selectedHitObjects.ItemsRemoved += objects => { foreach (var o in objects) selectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Deselect(); + + SelectionChanged?.Invoke(selectedHitObjects); }; } @@ -332,8 +336,6 @@ namespace osu.Game.Screens.Edit.Compose.Components selectionHandler.HandleSelected(blueprint); selectionBlueprints.ChangeChildDepth(blueprint, 1); beatmap.SelectedHitObjects.Add(blueprint.HitObject); - - SelectionChanged?.Invoke(selectionHandler.SelectedHitObjects); } private void onBlueprintDeselected(SelectionBlueprint blueprint) @@ -341,8 +343,6 @@ namespace osu.Game.Screens.Edit.Compose.Components selectionHandler.HandleDeselected(blueprint); selectionBlueprints.ChangeChildDepth(blueprint, 0); beatmap.SelectedHitObjects.Remove(blueprint.HitObject); - - SelectionChanged?.Invoke(selectionHandler.SelectedHitObjects); } #endregion