Skip to content

Commit

Permalink
Initial effort to remove the concept of working skin layer
Browse files Browse the repository at this point in the history
  • Loading branch information
peppy committed May 9, 2024
1 parent 08cd8a3 commit a9b2d31
Showing 1 changed file with 50 additions and 68 deletions.
118 changes: 50 additions & 68 deletions osu.Game/Overlays/SkinEditor/SkinEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
using osu.Game.Localisation;
using osu.Game.Overlays.Dialog;
using osu.Game.Overlays.OSD;
using osu.Game.Overlays.Settings;
using osu.Game.Screens.Edit;
using osu.Game.Screens.Edit.Components;
using osu.Game.Screens.Edit.Components.Menus;
using osu.Game.Screens.Play;
using osu.Game.Skinning;

namespace osu.Game.Overlays.SkinEditor
Expand Down Expand Up @@ -72,8 +72,6 @@ public partial class SkinEditor : VisibilityContainer, ICanAcceptFiles, IKeyBind
[Cached]
private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue);

private readonly Bindable<SkinComponentsContainerLookup?> selectedTarget = new Bindable<SkinComponentsContainerLookup?>();

private bool hasBegunMutating;

private Container? content;
Expand Down Expand Up @@ -265,8 +263,6 @@ protected override void LoadComplete()
}, true);

SelectedComponents.BindCollectionChanged((_, _) => Scheduler.AddOnce(populateSettings), true);

selectedTarget.BindValueChanged(targetChanged, true);
}

public bool OnPressed(KeyBindingPressEvent<PlatformAction> e)
Expand Down Expand Up @@ -318,19 +314,11 @@ public void UpdateTargetScreen(Drawable targetScreen)
if (content?.Child is SkinBlueprintContainer)
content.Clear();

Scheduler.AddOnce(loadBlueprintContainer);
Scheduler.AddOnce(reloadTargets);
Scheduler.AddOnce(populateSettings);

void loadBlueprintContainer()
{
selectedTarget.Default = getFirstTarget()?.Lookup;

if (!availableTargets.Any(t => t.Lookup.Equals(selectedTarget.Value)))
selectedTarget.SetDefault();
}
}

private void targetChanged(ValueChangedEvent<SkinComponentsContainerLookup?> target)
private void reloadTargets()
{
foreach (var toolbox in componentsSidebar.OfType<SkinComponentToolbox>())
toolbox.Expire();
Expand All @@ -340,46 +328,34 @@ private void targetChanged(ValueChangedEvent<SkinComponentsContainerLookup?> tar

Debug.Assert(content != null);

var skinComponentsContainer = getTarget(target.NewValue);
content.Clear();

if (target.NewValue == null || skinComponentsContainer == null)
if (!availableTargets.Any())
{
content.Child = new NonSkinnableScreenPlaceholder();
return;
}

changeHandler = new SkinEditorChangeHandler(skinComponentsContainer);
changeHandler.CanUndo.BindValueChanged(v => undoMenuItem.Action.Disabled = !v.NewValue, true);
changeHandler.CanRedo.BindValueChanged(v => redoMenuItem.Action.Disabled = !v.NewValue, true);

content.Child = new SkinBlueprintContainer(skinComponentsContainer);

componentsSidebar.Children = new[]
foreach (var skinComponentsContainer in availableTargets)
{
new EditorSidebarSection("Current working layer")
{
Children = new Drawable[]
{
new SettingsDropdown<SkinComponentsContainerLookup?>
{
Items = availableTargets.Select(t => t.Lookup).Distinct(),
Current = selectedTarget,
}
}
},
};
changeHandler = new SkinEditorChangeHandler(skinComponentsContainer);
changeHandler.CanUndo.BindValueChanged(v => undoMenuItem.Action.Disabled = !v.NewValue, true);
changeHandler.CanRedo.BindValueChanged(v => redoMenuItem.Action.Disabled = !v.NewValue, true);

content.Add(new SkinBlueprintContainer(skinComponentsContainer));
}

// If the new target has a ruleset, let's show ruleset-specific items at the top, and the rest below.
if (target.NewValue.Ruleset != null)
// If we're at a screen which may want per-ruleset skinnables, show them.
if (targetScreen is Player player)
{
componentsSidebar.Add(new SkinComponentToolbox(skinComponentsContainer, target.NewValue.Ruleset)
componentsSidebar.Add(new SkinComponentToolbox(availableTargets.First(), player.Ruleset.Value)
{
RequestPlacement = requestPlacement
});
}

// Remove the ruleset from the lookup to get base components.
componentsSidebar.Add(new SkinComponentToolbox(skinComponentsContainer, null)
componentsSidebar.Add(new SkinComponentToolbox(availableTargets.First(), null)
{
RequestPlacement = requestPlacement
});
Expand Down Expand Up @@ -416,10 +392,10 @@ private void skinChanged()

skins.EnsureMutableSkin();

var targetContainer = getTarget(selectedTarget.Value);
// TODO: fix
// if (targetContainer != null)
// changeHandler = new SkinEditorChangeHandler(targetContainer);

if (targetContainer != null)
changeHandler = new SkinEditorChangeHandler(targetContainer);
hasBegunMutating = true;
}

Expand All @@ -431,34 +407,34 @@ private void skinChanged()
/// <returns>Whether placement succeeded. Could fail if no target is available, or if the current target has missing dependency requirements for the component.</returns>
private bool placeComponent(ISerialisableDrawable component, bool applyDefaults = true)
{
var targetContainer = getTarget(selectedTarget.Value);

if (targetContainer == null)
return false;
foreach (var targetContainer in availableTargets)
{
var drawableComponent = (Drawable)component;

var drawableComponent = (Drawable)component;
if (applyDefaults)
{
// give newly added components a sane starting location.
drawableComponent.Origin = Anchor.TopCentre;
drawableComponent.Anchor = Anchor.TopCentre;
drawableComponent.Y = targetContainer.DrawSize.Y / 2;
}

if (applyDefaults)
{
// give newly added components a sane starting location.
drawableComponent.Origin = Anchor.TopCentre;
drawableComponent.Anchor = Anchor.TopCentre;
drawableComponent.Y = targetContainer.DrawSize.Y / 2;
}
try
{
targetContainer.Add(component);
}
catch
{
// May fail if dependencies are not available, for instance.
continue;
}

try
{
targetContainer.Add(component);
}
catch
{
// May fail if dependencies are not available, for instance.
return false;
SelectedComponents.Add(component);
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
return true;
}

SelectedComponents.Add(component);
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
return true;
return false;
}

private void populateSettings()
Expand Down Expand Up @@ -595,7 +571,10 @@ public void DeleteItems(ISerialisableDrawable[] items)

public void BringSelectionToFront()
{
if (getTarget(selectedTarget.Value) is not SkinComponentsContainer target)
// TODO: fix for multiple targets in selection
var target = ((Drawable?)SelectedComponents.FirstOrDefault())?.FindClosestParent<SkinComponentsContainer>();

if (target == null)
return;

changeHandler?.BeginChange();
Expand All @@ -619,7 +598,10 @@ public void BringSelectionToFront()

public void SendSelectionToBack()
{
if (getTarget(selectedTarget.Value) is not SkinComponentsContainer target)
// TODO: fix for multiple targets in selection
var target = ((Drawable?)SelectedComponents.FirstOrDefault())?.FindClosestParent<SkinComponentsContainer>();

if (target == null)
return;

changeHandler?.BeginChange();
Expand Down

0 comments on commit a9b2d31

Please sign in to comment.