Skip to content
2 changes: 1 addition & 1 deletion fluXis.Tests/Edit/TestEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ private void load(NotificationManager notifications)
{
var map = GetTestMap(maps);
var loader = map is not null ? new EditorLoader(map, map.GetMapInfo()) : new EditorLoader();
loader.StartTabIndex = 4;
loader.StartTabIndex = EditorTabType.Setup;
screenStack.Push(loader);
});

Expand Down
46 changes: 31 additions & 15 deletions fluXis/Screens/Edit/Editor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
using fluXis.Screens.Edit.Modding;
using fluXis.Screens.Edit.Tabs;
using fluXis.Screens.Edit.Tabs.Charting;
using fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags;
using fluXis.Screens.Edit.Tabs.Storyboarding;
using fluXis.Screens.Edit.Tabs.Verify.Checks;
using fluXis.Screens.Edit.UI;
Expand Down Expand Up @@ -106,14 +107,14 @@ public partial class Editor : FluXisScreen, IKeyBindingHandler<FluXisGlobalKeybi
/// <summary>
/// overwrites the tab the editor opens with
/// </summary>
public int StartTabIndex { get; init; } = -1;
public EditorTabType StartTab { get; init; } = EditorTabType.None;

private ITrackStore trackStore { get; set; }

private EditorLoader loader { get; }

private Container<EditorTab> tabs;
private int currentTab;
public Bindable<EditorTabType> CurrentTab { get; private set; } = new();

public Bindable<Waveform> Waveform { get; private set; }
private EditorMap editorMap { get; }
Expand Down Expand Up @@ -230,6 +231,8 @@ private void load(AudioManager audioManager, GameHost host, FluXisConfig config,
if (!Directory.Exists(MapSetPath))
Directory.CreateDirectory(MapSetPath);

dependencies.CacheAs(new EditorTagDependencies(CurrentTab, changeTab));

var scripts = new ScriptStorage(MapSetPath);
editorMap.ScriptChanged += _ =>
{
Expand Down Expand Up @@ -382,7 +385,7 @@ private void load(AudioManager audioManager, GameHost host, FluXisConfig config,
},
new EditorTabSwitcher
{
ChildrenEnumerable = tabs.Select(x => new EditorTabSwitcherButton(x.Icon, x.TabName, () => changeTab(tabs.IndexOf(x))))
ChildrenEnumerable = tabs.Select(x => new EditorTabSwitcherButton(x.Icon, x.TabName, () => changeTab(x.Type)))
},
new EditorBottomBar()
}
Expand Down Expand Up @@ -475,12 +478,27 @@ protected override void LoadComplete()
{
openTime = lastSaveTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();

var idx = isNewMap ? 0 : 1;
var tabType = isNewMap ? EditorTabType.Setup : EditorTabType.Charting;

if (StartTabIndex != -1)
idx = StartTabIndex;
if (StartTab != EditorTabType.None)
tabType = StartTab;

changeTab(idx);
ScheduleAfterChildren(() =>
{
foreach (var tab in tabs.Children)
{
if (tab.TabName.Equals("Design", StringComparison.OrdinalIgnoreCase))
{
tab.AlwaysPresent = true; // have design tab already loaded once
tab.OnFullyLoaded = () =>
{
tab.AlwaysPresent = false;

changeTab(tabType);
};
}
}
});

if (!canSave)
{
Expand Down Expand Up @@ -520,20 +538,18 @@ protected override void Dispose(bool isDisposing)
private void updateDim(ValueChangedEvent<float> e) => backgrounds.SetDim(e.NewValue);
private void updateBlur(ValueChangedEvent<float> e) => backgrounds.SetBlur(e.NewValue);

private void changeTab(int to)
private void changeTab(EditorTabType to)
{
currentTab = to;
CurrentTab.Value = to;

if (currentTab < 0)
currentTab = 0;
if (currentTab >= tabs.Count)
currentTab = tabs.Count - 1;
if (tabs.Children.All(x => x.Type != to))
CurrentTab.Value = tabs[0].Type;

for (var i = 0; i < tabs.Children.Count; i++)
{
var tab = tabs.Children[i];

if (i == currentTab)
if (tab.Type == CurrentTab.Value)
tab.Show();
else
tab.Hide();
Expand Down Expand Up @@ -562,7 +578,7 @@ protected override bool OnKeyDown(KeyDownEvent e)
int index = e.Key - Key.Number1;

if (index < tabs.Count)
changeTab(index);
changeTab(tabs[index].Type);

return true;
}
Expand Down
6 changes: 3 additions & 3 deletions fluXis/Screens/Edit/EditorLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ public partial class EditorLoader : FluXisScreen
private MapInfo mapInfo { get; set; }

/// <summary>
/// see <see cref="Editor.StartTabIndex"/>
/// see <see cref="Editor.StartTab"/>
/// </summary>
public int StartTabIndex { get; set; } = -1;
public EditorTabType StartTabIndex { get; set; } = EditorTabType.None;

public const float DURATION = 900;
private const float circle_size = 2500;
Expand Down Expand Up @@ -114,7 +114,7 @@ private void pushEditor() => Task.Run(() =>
if (editorMap != null && sb != null)
editorMap.Storyboard = sb;

Schedule(() => LoadComponentAsync(new Editor(this, map, editorMap) { StartTabIndex = StartTabIndex }, s => this.Delay(DURATION).FadeIn().OnComplete(_ => this.Push(s))));
Schedule(() => LoadComponentAsync(new Editor(this, map, editorMap) { StartTab = StartTabIndex }, s => this.Delay(DURATION).FadeIn().OnComplete(_ => this.Push(s))));
switching = false;
});

Expand Down
16 changes: 16 additions & 0 deletions fluXis/Screens/Edit/EditorTab.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
Expand All @@ -8,11 +9,26 @@ public abstract partial class EditorTab : Container
{
public abstract IconUsage Icon { get; }
public abstract string TabName { get; }
public abstract EditorTabType Type { get; }

public Action OnFullyLoaded;

protected EditorTab()
{
Alpha = 0;
RelativeSizeAxes = Axes.Both;
RelativePositionAxes = Axes.Both;
}

protected void InvokeFullyLoaded() => OnFullyLoaded?.Invoke();
}

public enum EditorTabType {
None,
Wip,
Setup,
Charting,
Design,
Storyboard,
Verify
}
10 changes: 10 additions & 0 deletions fluXis/Screens/Edit/Tabs/Charting/ChartingContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using fluXis.Screens.Edit.Tabs.Charting.Blueprints;
using fluXis.Screens.Edit.Tabs.Charting.Modding;
using fluXis.Screens.Edit.Tabs.Charting.Playfield;
using fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags;
using fluXis.Screens.Edit.Tabs.Charting.Points;
using fluXis.Screens.Edit.Tabs.Charting.Toolbox;
using fluXis.Screens.Edit.Tabs.Charting.Tools;
Expand Down Expand Up @@ -68,6 +69,9 @@ public partial class ChartingContainer : EditorTabContainer, IKeyBindingHandler<
[Resolved]
private NotificationManager notifications { get; set; }

[Resolved]
private EditorTagDependencies tagDeps { get; set; }

public Bindable<string> CurrentHitSound { get; } = new($"{Hitsounding.DEFAULT_PREFIX}normal");

private DependencyContainer dependencies;
Expand Down Expand Up @@ -99,6 +103,12 @@ protected override void BeforeLoad()
dependencies.CacheAs(sidebar = new ChartingSidebar());
}

[BackgroundDependencyLoader]
private void load()
{
tagDeps.ChartingPointsSidebar = (ChartingSidebar)sidebar;
}

protected override void LoadComplete()
{
base.LoadComplete();
Expand Down
21 changes: 21 additions & 0 deletions fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
using osuTK;

namespace fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags;
Expand All @@ -26,6 +27,10 @@ public partial class EditorTag : Container
protected FluXisSpriteText Text { get; private set; }
public bool RightSide { get; set; }

protected new bool IsHovered;
protected MarginPadding OriginalPadding;
protected MarginPadding ExpandedPadding;

protected Container Container { get; private set; }

public EditorTag(EditorTagContainer parent, ITimedObject timedObject)
Expand Down Expand Up @@ -104,6 +109,8 @@ protected override void LoadComplete()
{
base.LoadComplete();

OriginalPadding = Padding;
ExpandedPadding = OriginalPadding with { Left = OriginalPadding.Left + 6, Right = OriginalPadding.Right + 6 };
scrollDirection.BindValueChanged(_ => updateScale(), true);
}

Expand All @@ -113,4 +120,18 @@ protected override void Update()

Y = parent.ToLocalSpace(playfield.HitObjectContainer.ScreenSpacePositionAtTime(TimedObject.Time, 0)).Y;
}

protected override bool OnHover(HoverEvent e)
{
IsHovered = true;
this.TransformTo(nameof(Padding), ExpandedPadding, 200, Easing.OutQuart);
return base.OnHover(e);
}

protected override void OnHoverLost(HoverLostEvent e)
{
IsHovered = false;
this.TransformTo(nameof(Padding), OriginalPadding, 200, Easing.OutQuart);
base.OnHoverLost(e);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using fluXis.Map.Structures.Bases;
using fluXis.Screens.Edit.Tabs.Charting.Points;
using fluXis.Screens.Edit.Tabs.Design.Points;
using fluXis.Screens.Edit.Tabs.Shared.Points;
using osu.Framework.Bindables;

namespace fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags;

public partial class EditorTagDependencies
{
private Action<EditorTabType> changeTabAction;

public ChartingSidebar ChartingPointsSidebar;
public DesignSidebar DesignPointsSidebar;

public Bindable<EditorTabType> CurrentTab { get; }

public EditorTagDependencies(Bindable<EditorTabType> currentTab, Action<EditorTabType> changeTab)
{
CurrentTab = currentTab;
changeTabAction = changeTab;
}

public void ChangeTab(EditorTabType tab)
{
changeTabAction?.Invoke(tab);
}

public void ShowPointFrom(PointsSidebar sidebar, ITimedObject obj)
{
switch (sidebar)
{
case ChartingSidebar:
if (CurrentTab.Value is EditorTabType.Charting)
ChartingPointsSidebar.ShowPoint(obj);
else
DesignPointsSidebar.ShowPoint(obj, sidebar);
break;

case DesignSidebar:
if (CurrentTab.Value is EditorTabType.Design)
DesignPointsSidebar.ShowPoint(obj);
else
ChartingPointsSidebar.ShowPoint(obj, sidebar);
break;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
using fluXis.Map.Structures.Events;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Input.Events;

namespace fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags.EffectTags;

public partial class NoteEventTag : EditorTag
{
public override Colour4 TagColour => Colour4.FromHex("#235284");

[Resolved]
private EditorTagDependencies deps { get; set; }

private NoteEvent note => (NoteEvent)TimedObject;

public NoteEventTag(EditorTagContainer parent, NoteEvent timedObject)
Expand All @@ -19,4 +24,10 @@ protected override void Update()
base.Update();
Text.Text = $"{note.Content}";
}

protected override bool OnClick(ClickEvent e)
{
deps.ShowPointFrom(deps.ChartingPointsSidebar, note);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using fluXis.Graphics.UserInterface.Color;
using fluXis.Map.Structures.Events.Scrolling;
using fluXis.Screens.Edit.Tabs.Shared.Points;
using fluXis.Utils;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
Expand All @@ -14,14 +13,10 @@ public partial class ScrollMultiplierTag : EditorTag
public override Colour4 TagColour => Theme.ScrollMultiply;

[Resolved]
private PointsSidebar points { get; set; }
private EditorTagDependencies deps { get; set; }

public ScrollMultiplierEvent ScrollMultiplier => (ScrollMultiplierEvent)TimedObject;

private bool isHovered;
private MarginPadding originalPadding;
private MarginPadding expandedPadding;

public ScrollMultiplierTag(EditorTagContainer parent, ScrollMultiplierEvent sm)
: base(parent, sm)
{
Expand All @@ -30,37 +25,22 @@ public ScrollMultiplierTag(EditorTagContainer parent, ScrollMultiplierEvent sm)
protected override void LoadComplete()
{
base.LoadComplete();
originalPadding = Padding;
expandedPadding = originalPadding with { Left = originalPadding.Left + 4, Right = originalPadding.Right + 4 };
ExpandedPadding = OriginalPadding with { Left = OriginalPadding.Left + 4, Right = OriginalPadding.Right + 4 };
}

protected override void Update()
{
base.Update();

if (isHovered)
if (IsHovered)
Text.Text = $"{ScrollMultiplier.Multiplier.ToStringInvariant("0.####")}x {Math.Floor(ScrollMultiplier.Duration)}ms | {ScrollMultiplier.Easing}";
else
Text.Text = $"{ScrollMultiplier.Multiplier.ToStringInvariant("0.####")}x {Math.Floor(ScrollMultiplier.Duration)}ms";
}

protected override bool OnHover(HoverEvent e)
{
isHovered = true;
this.TransformTo(nameof(Padding), expandedPadding, 200, Easing.OutQuart);
return base.OnHover(e);
}

protected override void OnHoverLost(HoverLostEvent e)
{
isHovered = false;
this.TransformTo(nameof(Padding), originalPadding, 200, Easing.OutQuart);
base.OnHoverLost(e);
}

protected override bool OnClick(ClickEvent e)
{
points.ShowPoint(ScrollMultiplier);
deps.ShowPointFrom(deps.DesignPointsSidebar, ScrollMultiplier);
return true;
}
}
Loading