1
0
mirror of https://github.com/ppy/osu.git synced 2025-03-28 09:37:23 +08:00

Reorder context menu items and tidy up surrounding code

This commit is contained in:
Dean Herbert 2022-08-20 14:03:54 +09:00
parent 91e6f4c4ee
commit 885ea4270b

View File

@ -105,12 +105,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
return true; return true;
} }
// The slider can only be split on control points which connect two different slider segments.
private bool splittable(PathControlPointPiece p) => p.ControlPoint.Type.HasValue && p != Pieces[0] && p != Pieces[^1];
private bool splitSelected() private bool splitSelected()
{ {
List<PathControlPoint> toSplit = Pieces.Where(p => p.IsSelected.Value && splittable(p)).Select(p => p.ControlPoint).ToList(); List<PathControlPoint> toSplit = Pieces.Where(p => p.IsSelected.Value && isSplittable(p)).Select(p => p.ControlPoint).ToList();
// Ensure that there are any points to be split // Ensure that there are any points to be split
if (toSplit.Count == 0) if (toSplit.Count == 0)
@ -127,6 +124,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
return true; return true;
} }
private bool isSplittable(PathControlPointPiece p) =>
// A slider can only be split on control points which connect two different slider segments.
p.ControlPoint.Type.HasValue && p != Pieces.FirstOrDefault() && p != Pieces.LastOrDefault();
private void onControlPointsChanged(object sender, NotifyCollectionChangedEventArgs e) private void onControlPointsChanged(object sender, NotifyCollectionChangedEventArgs e)
{ {
switch (e.Action) switch (e.Action)
@ -345,38 +346,42 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
if (count == 0) if (count == 0)
return null; return null;
var splittablePieces = selectedPieces.Where(splittable).ToList(); var splittablePieces = selectedPieces.Where(isSplittable).ToList();
int splittableCount = splittablePieces.Count; int splittableCount = splittablePieces.Count;
List<MenuItem> items = new List<MenuItem>(); List<MenuItem> curveTypeItems = new List<MenuItem>();
if (!selectedPieces.Contains(Pieces[0])) if (!selectedPieces.Contains(Pieces[0]))
items.Add(createMenuItemForPathType(null)); curveTypeItems.Add(createMenuItemForPathType(null));
// todo: hide/disable items which aren't valid for selected points // todo: hide/disable items which aren't valid for selected points
items.Add(createMenuItemForPathType(PathType.Linear)); curveTypeItems.Add(createMenuItemForPathType(PathType.Linear));
items.Add(createMenuItemForPathType(PathType.PerfectCurve)); curveTypeItems.Add(createMenuItemForPathType(PathType.PerfectCurve));
items.Add(createMenuItemForPathType(PathType.Bezier)); curveTypeItems.Add(createMenuItemForPathType(PathType.Bezier));
items.Add(createMenuItemForPathType(PathType.Catmull)); curveTypeItems.Add(createMenuItemForPathType(PathType.Catmull));
var menuItems = new MenuItem[splittableCount > 0 ? 3 : 2]; var menuItems = new List<MenuItem>
int i = 0; {
new OsuMenuItem("Curve type")
menuItems[i++] = new OsuMenuItem($"Delete {"control point".ToQuantity(count, count > 1 ? ShowQuantityAs.Numeric : ShowQuantityAs.None)}", MenuItemType.Destructive, {
() => DeleteSelected()); Items = curveTypeItems
}
};
if (splittableCount > 0) if (splittableCount > 0)
{ {
menuItems[i++] = new OsuMenuItem($"Split {"control point".ToQuantity(splittableCount, splittableCount > 1 ? ShowQuantityAs.Numeric : ShowQuantityAs.None)}", menuItems.Add(new OsuMenuItem($"Split {"control point".ToQuantity(splittableCount, splittableCount > 1 ? ShowQuantityAs.Numeric : ShowQuantityAs.None)}",
MenuItemType.Destructive, () => splitSelected()); MenuItemType.Destructive,
() => splitSelected()));
} }
menuItems[i] = new OsuMenuItem("Curve type") menuItems.Add(
{ new OsuMenuItem($"Delete {"control point".ToQuantity(count, count > 1 ? ShowQuantityAs.Numeric : ShowQuantityAs.None)}",
Items = items MenuItemType.Destructive,
}; () => DeleteSelected())
);
return menuItems; return menuItems.ToArray();
} }
} }