diff --git a/fluXis.Tests/Edit/TestEditor.cs b/fluXis.Tests/Edit/TestEditor.cs index 5370c2498..2460e9769 100644 --- a/fluXis.Tests/Edit/TestEditor.cs +++ b/fluXis.Tests/Edit/TestEditor.cs @@ -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); }); diff --git a/fluXis/Screens/Edit/Editor.cs b/fluXis/Screens/Edit/Editor.cs index 177c0d60c..138bfa67d 100644 --- a/fluXis/Screens/Edit/Editor.cs +++ b/fluXis/Screens/Edit/Editor.cs @@ -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; @@ -106,14 +107,14 @@ public partial class Editor : FluXisScreen, IKeyBindingHandler /// overwrites the tab the editor opens with /// - public int StartTabIndex { get; init; } = -1; + public EditorTabType StartTab { get; init; } = EditorTabType.None; private ITrackStore trackStore { get; set; } private EditorLoader loader { get; } private Container tabs; - private int currentTab; + public Bindable CurrentTab { get; private set; } = new(); public Bindable Waveform { get; private set; } private EditorMap editorMap { get; } @@ -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 += _ => { @@ -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() } @@ -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) { @@ -520,20 +538,18 @@ protected override void Dispose(bool isDisposing) private void updateDim(ValueChangedEvent e) => backgrounds.SetDim(e.NewValue); private void updateBlur(ValueChangedEvent 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(); @@ -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; } diff --git a/fluXis/Screens/Edit/EditorLoader.cs b/fluXis/Screens/Edit/EditorLoader.cs index a9c67ea77..17b3490ac 100644 --- a/fluXis/Screens/Edit/EditorLoader.cs +++ b/fluXis/Screens/Edit/EditorLoader.cs @@ -31,9 +31,9 @@ public partial class EditorLoader : FluXisScreen private MapInfo mapInfo { get; set; } /// - /// see + /// see /// - public int StartTabIndex { get; set; } = -1; + public EditorTabType StartTabIndex { get; set; } = EditorTabType.None; public const float DURATION = 900; private const float circle_size = 2500; @@ -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; }); diff --git a/fluXis/Screens/Edit/EditorTab.cs b/fluXis/Screens/Edit/EditorTab.cs index fd4a8dde1..10eab53da 100644 --- a/fluXis/Screens/Edit/EditorTab.cs +++ b/fluXis/Screens/Edit/EditorTab.cs @@ -1,3 +1,4 @@ +using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; @@ -8,6 +9,9 @@ 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() { @@ -15,4 +19,16 @@ protected EditorTab() RelativeSizeAxes = Axes.Both; RelativePositionAxes = Axes.Both; } + + protected void InvokeFullyLoaded() => OnFullyLoaded?.Invoke(); +} + +public enum EditorTabType { + None, + Wip, + Setup, + Charting, + Design, + Storyboard, + Verify } diff --git a/fluXis/Screens/Edit/Tabs/Charting/ChartingContainer.cs b/fluXis/Screens/Edit/Tabs/Charting/ChartingContainer.cs index 4d553b3a7..00dffa885 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/ChartingContainer.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/ChartingContainer.cs @@ -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; @@ -68,6 +69,9 @@ public partial class ChartingContainer : EditorTabContainer, IKeyBindingHandler< [Resolved] private NotificationManager notifications { get; set; } + [Resolved] + private EditorTagDependencies tagDeps { get; set; } + public Bindable CurrentHitSound { get; } = new($"{Hitsounding.DEFAULT_PREFIX}normal"); private DependencyContainer dependencies; @@ -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(); diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTag.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTag.cs index 4a91e19b4..e2d215103 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTag.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTag.cs @@ -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; @@ -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) @@ -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); } @@ -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); + } } diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTagDependencies.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTagDependencies.cs new file mode 100644 index 000000000..485f3ec2e --- /dev/null +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EditorTagDependencies.cs @@ -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 changeTabAction; + + public ChartingSidebar ChartingPointsSidebar; + public DesignSidebar DesignPointsSidebar; + + public Bindable CurrentTab { get; } + + public EditorTagDependencies(Bindable currentTab, Action 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; + } + } +} diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EffectTags/NoteEventTag.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EffectTags/NoteEventTag.cs index 930f92ae9..07a8c99fa 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EffectTags/NoteEventTag.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/EffectTags/NoteEventTag.cs @@ -1,5 +1,7 @@ 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; @@ -7,6 +9,9 @@ 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) @@ -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; + } } diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollMultiplierTag.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollMultiplierTag.cs index bfa86d792..14d677cc7 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollMultiplierTag.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollMultiplierTag.cs @@ -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; @@ -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) { @@ -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; } } \ No newline at end of file diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollVelocityTag.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollVelocityTag.cs index 0bf720534..1efbb5141 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollVelocityTag.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/ScrollVelocityTag.cs @@ -1,6 +1,5 @@ using fluXis.Graphics.UserInterface.Color; using fluXis.Map.Structures; -using fluXis.Screens.Edit.Tabs.Shared.Points; using fluXis.Utils; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -13,7 +12,7 @@ public partial class ScrollVelocityTag : EditorTag public override Colour4 TagColour => Theme.ScrollVelocity; [Resolved] - private PointsSidebar points { get; set; } + private EditorTagDependencies deps { get; set; } public ScrollVelocity ScrollVelocity => (ScrollVelocity)TimedObject; @@ -30,7 +29,7 @@ protected override void Update() protected override bool OnClick(ClickEvent e) { - points.ShowPoint(ScrollVelocity); + deps.ShowPointFrom(deps.DesignPointsSidebar, ScrollVelocity); return true; } } diff --git a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/TimingPointTag.cs b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/TimingPointTag.cs index e791dfdd0..3fd6cce06 100644 --- a/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/TimingPointTag.cs +++ b/fluXis/Screens/Edit/Tabs/Charting/Playfield/Tags/TimingTags/TimingPointTag.cs @@ -1,6 +1,5 @@ using fluXis.Graphics.UserInterface.Color; using fluXis.Map.Structures; -using fluXis.Screens.Edit.Tabs.Shared.Points; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Input.Events; @@ -12,7 +11,7 @@ public partial class TimingPointTag : EditorTag public override Colour4 TagColour => Theme.TimingPoint; [Resolved] - private PointsSidebar points { get; set; } + private EditorTagDependencies deps { get; set; } public TimingPoint TimingPoint => (TimingPoint)TimedObject; @@ -29,7 +28,7 @@ protected override void Update() protected override bool OnClick(ClickEvent e) { - points.ShowPoint(TimingPoint); + deps.ShowPointFrom(deps.ChartingPointsSidebar, TimingPoint); return true; } } diff --git a/fluXis/Screens/Edit/Tabs/ChartingTab.cs b/fluXis/Screens/Edit/Tabs/ChartingTab.cs index 7d81ed1bc..071d4b5d4 100644 --- a/fluXis/Screens/Edit/Tabs/ChartingTab.cs +++ b/fluXis/Screens/Edit/Tabs/ChartingTab.cs @@ -12,6 +12,7 @@ public partial class ChartingTab : EditorTab { public override IconUsage Icon => FontAwesome6.Solid.PenRuler; public override string TabName => "Charting"; + public override EditorTabType Type => EditorTabType.Charting; private LoadingIcon loadingIcon; @@ -35,7 +36,7 @@ protected override void LoadComplete() loadingIcon.FadeOut(200); AddInternal(container); - container.FadeInFromZero(200); + container.FadeInFromZero(200).OnComplete( _ => InvokeFullyLoaded() ); }); } } diff --git a/fluXis/Screens/Edit/Tabs/Design/DesignContainer.cs b/fluXis/Screens/Edit/Tabs/Design/DesignContainer.cs index 58696c80b..c2ec2b40c 100644 --- a/fluXis/Screens/Edit/Tabs/Design/DesignContainer.cs +++ b/fluXis/Screens/Edit/Tabs/Design/DesignContainer.cs @@ -24,6 +24,7 @@ using fluXis.Map.Structures.Events.Camera; using fluXis.Mods; using fluXis.Replays; +using fluXis.Screens.Edit.Tabs.Charting.Playfield.Tags; using fluXis.Screens.Edit.Tabs.Design.Effects; using fluXis.Screens.Edit.Tabs.Design.Points; using fluXis.Screens.Edit.Tabs.Shared; @@ -53,6 +54,9 @@ public partial class DesignContainer : EditorTabContainer [Resolved] private ScriptStorage scripts { get; set; } + [Resolved] + private EditorTagDependencies tagDeps { get; set; } + private static Type[] ignoredForRebuild { get; } = { typeof(PulseEvent), @@ -66,6 +70,8 @@ public partial class DesignContainer : EditorTabContainer private DesignShaderHandler handler; private CameraContainer camera; + private PointsSidebar sidebar; + private SpriteStack backgroundStack; private Box backgroundDim; private Container rulesetWrapper; @@ -81,10 +87,13 @@ public partial class DesignContainer : EditorTabContainer private BackgroundVideo backgroundVideo; + protected override void BeforeLoad() => sidebar = new DesignSidebar(); + [BackgroundDependencyLoader] private void load(FluXisConfig config) { userScrollSpeed = config.GetBindable(FluXisSetting.ScrollSpeed); + tagDeps.DesignPointsSidebar = (DesignSidebar)sidebar; } protected override IEnumerable CreateContent() @@ -288,5 +297,5 @@ protected override bool OnKeyDown(KeyDownEvent e) protected override Container CreateContentContainer() => new AspectRatioContainer(Settings.ForceAspectRatio); protected override Drawable CreateLeftSide() => Empty(); - protected override PointsSidebar CreatePointsSidebar() => new DesignSidebar(); + protected override PointsSidebar CreatePointsSidebar() => sidebar; } diff --git a/fluXis/Screens/Edit/Tabs/DesignTab.cs b/fluXis/Screens/Edit/Tabs/DesignTab.cs index 0eaf4da72..bc90f774d 100644 --- a/fluXis/Screens/Edit/Tabs/DesignTab.cs +++ b/fluXis/Screens/Edit/Tabs/DesignTab.cs @@ -12,6 +12,7 @@ public partial class DesignTab : EditorTab { public override IconUsage Icon => FontAwesome6.Solid.Palette; public override string TabName => "Design"; + public override EditorTabType Type => EditorTabType.Design; private LoadingIcon loadingIcon; @@ -35,7 +36,7 @@ protected override void LoadComplete() loadingIcon.FadeOut(200); AddInternal(container); - container.FadeInFromZero(200); + container.FadeInFromZero(200).OnComplete( _ => InvokeFullyLoaded() ); }); } } diff --git a/fluXis/Screens/Edit/Tabs/SetupTab.cs b/fluXis/Screens/Edit/Tabs/SetupTab.cs index 6f185c02c..5b6304b12 100644 --- a/fluXis/Screens/Edit/Tabs/SetupTab.cs +++ b/fluXis/Screens/Edit/Tabs/SetupTab.cs @@ -18,6 +18,7 @@ public partial class SetupTab : EditorTab { public override IconUsage Icon => FontAwesome6.Solid.ScrewdriverWrench; public override string TabName => "Setup"; + public override EditorTabType Type => EditorTabType.Setup; private SetupSection metadata; @@ -275,4 +276,6 @@ private void load(EditorMap map) // tabbing support metadata.OfType().ForEach(textBox => textBox.TabbableContentContainer = metadata); } + + protected override void LoadComplete() => InvokeFullyLoaded(); } diff --git a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs index f2239b12b..9b42b43ea 100644 --- a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs +++ b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs @@ -31,6 +31,7 @@ namespace fluXis.Screens.Edit.Tabs.Shared.Points.List; public abstract partial class PointListEntry : Container, IHasContextMenu { protected abstract string Text { get; } + public string Yestext => Text; protected abstract Colour4 Color { get; } public MenuItem[] ContextMenuItems => new MenuItem[] @@ -203,6 +204,8 @@ public void OpenSettings() ShowSettings?.Invoke(CreateSettings()); } + public IEnumerable GetSettings() => CreateSettings(); + public abstract ITimedObject CreateClone(); protected abstract Drawable[] CreateValueContent(); diff --git a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs index 605825573..2cf39abba 100644 --- a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs +++ b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs @@ -387,6 +387,8 @@ public void ShowPoint(ITimedObject obj) entry?.OpenSettings(); } + public PointListEntry GetPoint(ITimedObject obj) => flow.FirstOrDefault(e => e.Object == obj); + protected void UpdatePoint(ITimedObject obj) { var entry = flow.FirstOrDefault(e => e.Object == obj); diff --git a/fluXis/Screens/Edit/Tabs/Shared/Points/PointsSidebar.cs b/fluXis/Screens/Edit/Tabs/Shared/Points/PointsSidebar.cs index 7de83796d..e1f687d65 100644 --- a/fluXis/Screens/Edit/Tabs/Shared/Points/PointsSidebar.cs +++ b/fluXis/Screens/Edit/Tabs/Shared/Points/PointsSidebar.cs @@ -139,12 +139,28 @@ private void compactChanged(ValueChangedEvent v) protected abstract PointsList CreatePointsList(); protected virtual Drawable CreateClosedContent() => Empty(); + public PointListEntry GetPoint(ITimedObject obj) => pointsList.GetPoint(obj); + public void ShowPoint(ITimedObject obj) { Expanded.Value = true; pointsList.ShowPoint(obj); } + public void ShowPoint(ITimedObject obj, PointsList list) + { + Expanded.Value = true; + var entry = list.GetPoint(obj); + showPointSettings(entry.GetSettings()); + } + + public void ShowPoint(ITimedObject obj, PointsSidebar sidebar) + { + Expanded.Value = true; + var entry = sidebar.GetPoint(obj); + showPointSettings(entry.GetSettings()); + } + private void showPointSettings(IEnumerable drawables) { if (showingSettings) return; diff --git a/fluXis/Screens/Edit/Tabs/Storyboarding/StoryboardTab.cs b/fluXis/Screens/Edit/Tabs/Storyboarding/StoryboardTab.cs index 3505da8bc..006e8cf47 100644 --- a/fluXis/Screens/Edit/Tabs/Storyboarding/StoryboardTab.cs +++ b/fluXis/Screens/Edit/Tabs/Storyboarding/StoryboardTab.cs @@ -26,6 +26,7 @@ public partial class StoryboardTab : EditorTab { public override IconUsage Icon => FontAwesome6.Solid.PaintBrush; public override string TabName => "Storyboard"; + public override EditorTabType Type => EditorTabType.Storyboard; [Resolved] private EditorClock clock { get; set; } @@ -141,6 +142,7 @@ private void load() protected override void LoadComplete() { base.LoadComplete(); + InvokeFullyLoaded(); map.Storyboard.ElementAdded += queueRebuild; map.Storyboard.ElementRemoved += queueRebuild; diff --git a/fluXis/Screens/Edit/Tabs/VerifyTab.cs b/fluXis/Screens/Edit/Tabs/VerifyTab.cs index 4be0899cb..dfabf7466 100644 --- a/fluXis/Screens/Edit/Tabs/VerifyTab.cs +++ b/fluXis/Screens/Edit/Tabs/VerifyTab.cs @@ -20,6 +20,7 @@ public partial class VerifyTab : EditorTab { public override IconUsage Icon => FontAwesome.Solid.CheckDouble; public override string TabName => "Verify"; + public override EditorTabType Type => EditorTabType.Verify; public static readonly List<(string, float)> COLUMNS = new() { @@ -173,6 +174,7 @@ private void load() protected override void LoadComplete() { base.LoadComplete(); + InvokeFullyLoaded(); RefreshIssues(); } diff --git a/fluXis/Screens/Edit/Tabs/WipEditorTab.cs b/fluXis/Screens/Edit/Tabs/WipEditorTab.cs index 4cb22cf41..3bbd15eeb 100644 --- a/fluXis/Screens/Edit/Tabs/WipEditorTab.cs +++ b/fluXis/Screens/Edit/Tabs/WipEditorTab.cs @@ -14,6 +14,7 @@ public partial class WipEditorTab : EditorTab { public override IconUsage Icon { get; } public override string TabName { get; } + public override EditorTabType Type => EditorTabType.Wip; private string description { get; } private Container content;