diff --git a/osu-framework b/osu-framework index 798409058a..288236eaba 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 798409058a421307b5a92aeea4cd60a065f5a0d4 +Subproject commit 288236eaba95dfa15268a55f38c009a97d806f25 diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs index 08bf6d15a7..789fbb6af3 100644 --- a/osu.Desktop/Overlays/VersionManager.cs +++ b/osu.Desktop/Overlays/VersionManager.cs @@ -61,13 +61,13 @@ namespace osu.Desktop.Overlays new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(5), Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, diff --git a/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs b/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs index 95bc0954de..39a7862db6 100644 --- a/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs +++ b/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs @@ -25,7 +25,7 @@ namespace osu.Game.Modes.Osu.Objects.Drawables AutoSizeAxes = Axes.Both; Origin = Anchor.Centre; - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; Spacing = new Vector2(0, 2); Position = (h?.StackedEndPosition ?? Vector2.Zero) + judgement.PositionOffset; diff --git a/osu.Game.Modes.Osu/OsuScoreProcessor.cs b/osu.Game.Modes.Osu/OsuScoreProcessor.cs index 9493259558..e73db8d901 100644 --- a/osu.Game.Modes.Osu/OsuScoreProcessor.cs +++ b/osu.Game.Modes.Osu/OsuScoreProcessor.cs @@ -12,6 +12,7 @@ namespace osu.Game.Modes.Osu : base(hitObjectCount) { Health.Value = 1; + Accuracy.Value = 1; } protected override void UpdateCalculations(JudgementInfo judgement) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 1db339a5b6..f110fc37ac 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -86,7 +86,7 @@ namespace osu.Game.Beatmaps.Drawables new FillFlowContainer { Padding = new MarginPadding(5), - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, AutoSizeAxes = Axes.Both, Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, @@ -95,19 +95,17 @@ namespace osu.Game.Beatmaps.Drawables new DifficultyIcon(beatmap) { Scale = new Vector2(1.8f), - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, }, new FillFlowContainer { Padding = new MarginPadding { Left = 5 }, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, AutoSizeAxes = Axes.Both, Children = new Drawable[] { new FillFlowContainer { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(4, 0), AutoSizeAxes = Axes.Both, Children = new[] diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs index 0a1fc5f331..bbdc22e30d 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs @@ -38,7 +38,7 @@ namespace osu.Game.Beatmaps.Drawables }, new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Padding = new MarginPadding { Top = 5, Left = 18, Right = 10, Bottom = 10 }, AutoSizeAxes = Axes.Both, Children = new[] @@ -111,7 +111,7 @@ namespace osu.Game.Beatmaps.Drawables new FillFlowContainer { Depth = -1, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.Both, // This makes the gradient not be perfectly horizontal, but diagonal at a ~40° angle Shear = new Vector2(0.8f, 0), diff --git a/osu.Game/Beatmaps/Drawables/Panel.cs b/osu.Game/Beatmaps/Drawables/Panel.cs index 891e86164c..7a37f9cd7f 100644 --- a/osu.Game/Beatmaps/Drawables/Panel.cs +++ b/osu.Game/Beatmaps/Drawables/Panel.cs @@ -18,10 +18,6 @@ namespace osu.Game.Beatmaps.Drawables public override bool RemoveWhenNotAlive => false; - public bool IsOnScreen; - - public override bool IsAlive => IsOnScreen && base.IsAlive; - private Container nestedContainer; protected override Container Content => nestedContainer; diff --git a/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs b/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs index d654299279..9b30418c6a 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs @@ -21,7 +21,7 @@ namespace osu.Game.Graphics.UserInterface { new FillFlowContainer { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Children = new Drawable[] diff --git a/osu.Game/Graphics/UserInterface/PercentageCounter.cs b/osu.Game/Graphics/UserInterface/PercentageCounter.cs index ee4066b336..1b29fcc88f 100644 --- a/osu.Game/Graphics/UserInterface/PercentageCounter.cs +++ b/osu.Game/Graphics/UserInterface/PercentageCounter.cs @@ -26,7 +26,7 @@ namespace osu.Game.Graphics.UserInterface public PercentageCounter() { DisplayedCountSpriteText.FixedWidth = true; - Count = 1.0f; + Count = DisplayedCount = 1.0f; } protected override string FormatCount(float count) diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs index 10ffcffa7f..d603493d38 100644 --- a/osu.Game/Graphics/UserInterface/StarCounter.cs +++ b/osu.Game/Graphics/UserInterface/StarCounter.cs @@ -71,7 +71,7 @@ namespace osu.Game.Graphics.UserInterface stars = new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(star_spacing), } }; diff --git a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs b/osu.Game/Online/Chat/Drawables/DrawableChannel.cs index b8eb1e466a..f5fac3d4c5 100644 --- a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs +++ b/osu.Game/Online/Chat/Drawables/DrawableChannel.cs @@ -41,7 +41,7 @@ namespace osu.Game.Online.Chat.Drawables { flow = new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Padding = new MarginPadding { Left = 20, Right = 20 } diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs index e307b44bb1..0e92b4d0af 100644 --- a/osu.Game/Overlays/Dialog/PopupDialog.cs +++ b/osu.Game/Overlays/Dialog/PopupDialog.cs @@ -173,7 +173,7 @@ namespace osu.Game.Overlays.Dialog RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Position = new Vector2(0f, -50f), - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0f, 10f), Children = new Drawable[] { @@ -236,7 +236,7 @@ namespace osu.Game.Overlays.Dialog Origin = Anchor.TopCentre, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, }, }, }, diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs index 811e9606fe..3cec804653 100644 --- a/osu.Game/Overlays/Mods/ModButton.cs +++ b/osu.Game/Overlays/Mods/ModButton.cs @@ -236,7 +236,7 @@ namespace osu.Game.Overlays.Mods public ModButton(Mod m) { - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; Spacing = new Vector2(0f, -5f); Size = new Vector2(100f); diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 0a5d0e49e1..3e212a1390 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -33,7 +33,7 @@ namespace osu.Game.Overlays.Mods private FillFlowContainer modSectionsContainer; - public Bindable SelectedMods = new Bindable(); + public readonly Bindable SelectedMods = new Bindable(); public readonly Bindable PlayMode = new Bindable(); @@ -95,8 +95,6 @@ namespace osu.Game.Overlays.Mods section.ButtonsContainer.MoveToX(100f, APPEAR_DURATION, EasingTypes.InSine); section.ButtonsContainer.FadeOut(APPEAR_DURATION, EasingTypes.InSine); } - - TriggerFocusLost(); } protected override void PopIn() @@ -112,8 +110,6 @@ namespace osu.Game.Overlays.Mods section.ButtonsContainer.MoveToX(0, button_duration, EasingTypes.OutQuint); section.ButtonsContainer.FadeIn(button_duration, EasingTypes.OutQuint); } - - Schedule(TriggerFocusContention); } public void DeselectAll() @@ -244,7 +240,7 @@ namespace osu.Game.Overlays.Mods AutoSizeAxes = Axes.Y, Anchor = Anchor.BottomCentre, Origin = Anchor.BottomCentre, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0f, 10f), Children = new Drawable[] { @@ -268,7 +264,7 @@ namespace osu.Game.Overlays.Mods Anchor = Anchor.TopCentre, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Width = content_width, Padding = new MarginPadding { @@ -336,7 +332,7 @@ namespace osu.Game.Overlays.Mods AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, Width = content_width, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Padding = new MarginPadding { Top = 20, diff --git a/osu.Game/Overlays/NotificationManager.cs b/osu.Game/Overlays/NotificationManager.cs index 5c666da8ae..2c499e1084 100644 --- a/osu.Game/Overlays/NotificationManager.cs +++ b/osu.Game/Overlays/NotificationManager.cs @@ -46,7 +46,7 @@ namespace osu.Game.Overlays { sections = new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, Children = new [] diff --git a/osu.Game/Overlays/Notifications/NotificationSection.cs b/osu.Game/Overlays/Notifications/NotificationSection.cs index 91c89d41be..8366c83527 100644 --- a/osu.Game/Overlays/Notifications/NotificationSection.cs +++ b/osu.Game/Overlays/Notifications/NotificationSection.cs @@ -60,7 +60,7 @@ namespace osu.Game.Overlays.Notifications { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; Padding = new MarginPadding { diff --git a/osu.Game/Overlays/Options/OptionDropDown.cs b/osu.Game/Overlays/Options/OptionDropDown.cs index 7e2cab2a61..41e59e63a6 100644 --- a/osu.Game/Overlays/Options/OptionDropDown.cs +++ b/osu.Game/Overlays/Options/OptionDropDown.cs @@ -89,7 +89,7 @@ namespace osu.Game.Overlays.Options { Items = new KeyValuePair[0]; - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; Children = new Drawable[] diff --git a/osu.Game/Overlays/Options/OptionsSection.cs b/osu.Game/Overlays/Options/OptionsSection.cs index f87e69e307..fc61128a0d 100644 --- a/osu.Game/Overlays/Options/OptionsSection.cs +++ b/osu.Game/Overlays/Options/OptionsSection.cs @@ -61,7 +61,7 @@ namespace osu.Game.Overlays.Options FlowContent = new FillFlowContainer { Margin = new MarginPadding { Top = header_size + header_margin }, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 30), AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, diff --git a/osu.Game/Overlays/Options/OptionsSubsection.cs b/osu.Game/Overlays/Options/OptionsSubsection.cs index ef10e15abf..7d501ad68c 100644 --- a/osu.Game/Overlays/Options/OptionsSubsection.cs +++ b/osu.Game/Overlays/Options/OptionsSubsection.cs @@ -20,7 +20,7 @@ namespace osu.Game.Overlays.Options { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; AddInternal(new Drawable[] { new OsuSpriteText @@ -31,7 +31,7 @@ namespace osu.Game.Overlays.Options }, content = new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 5), RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, diff --git a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs b/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs index db799ccae2..45f7ac3d3e 100644 --- a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs +++ b/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs @@ -100,7 +100,7 @@ namespace osu.Game.Overlays.Options.Sections.General private void load(APIAccess api, OsuConfigManager config) { this.api = api; - Direction = FillDirection.Down; + Direction = FillDirection.Vertical; Spacing = new Vector2(0, 5); AutoSizeAxes = Axes.Y; RelativeSizeAxes = Axes.X; diff --git a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs b/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs index 5393c42843..6aa9b66f5c 100644 --- a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs +++ b/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs @@ -39,12 +39,20 @@ namespace osu.Game.Overlays.Options.Sections RelativeSizeAxes = Axes.X, Text = "Run osu! updater", }, - new OptionLabel + new Container { - Text = "TODO: osu version here", - Anchor = Anchor.TopCentre, - Origin = Anchor.TopCentre, - }, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Children = new[] + { + new OptionLabel + { + Text = "osu!lazer", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + }, + } + } }; } } diff --git a/osu.Game/Overlays/Options/Sidebar.cs b/osu.Game/Overlays/Options/Sidebar.cs index 5a1128749c..b0618ed3a6 100644 --- a/osu.Game/Overlays/Options/Sidebar.cs +++ b/osu.Game/Overlays/Options/Sidebar.cs @@ -40,7 +40,7 @@ namespace osu.Game.Overlays.Options Anchor = Anchor.CentreLeft, AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, } } }, diff --git a/osu.Game/Overlays/OptionsOverlay.cs b/osu.Game/Overlays/OptionsOverlay.cs index 968914c6c0..89a2d029f6 100644 --- a/osu.Game/Overlays/OptionsOverlay.cs +++ b/osu.Game/Overlays/OptionsOverlay.cs @@ -77,7 +77,7 @@ namespace osu.Game.Overlays { AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { @@ -98,7 +98,7 @@ namespace osu.Game.Overlays { AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = sections, } } diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs index 948b9c96fc..59b7383679 100644 --- a/osu.Game/Overlays/Toolbar/Toolbar.cs +++ b/osu.Game/Overlays/Toolbar/Toolbar.cs @@ -43,7 +43,7 @@ namespace osu.Game.Overlays.Toolbar new ToolbarBackground(), new FillFlowContainer { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, Children = new Drawable[] @@ -66,7 +66,7 @@ namespace osu.Game.Overlays.Toolbar { Anchor = Anchor.TopRight, Origin = Anchor.TopRight, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, Children = new Drawable[] diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 0e8165283e..ac80a9f405 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -84,7 +84,7 @@ namespace osu.Game.Overlays.Toolbar }, Flow = new FillFlowContainer { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(5), Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, @@ -107,7 +107,7 @@ namespace osu.Game.Overlays.Toolbar }, tooltipContainer = new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, RelativeSizeAxes = Axes.Both, //stops us being considered in parent's autosize Anchor = (TooltipAnchor & Anchor.x0) > 0 ? Anchor.BottomLeft : Anchor.BottomRight, Origin = TooltipAnchor, diff --git a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs index 31b8500155..b2086b1c2d 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs @@ -36,7 +36,7 @@ namespace osu.Game.Overlays.Toolbar { RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, Padding = new MarginPadding { Left = padding, Right = padding }, diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs index 37a939005b..139cbd4581 100644 --- a/osu.Game/Overlays/WaveOverlayContainer.cs +++ b/osu.Game/Overlays/WaveOverlayContainer.cs @@ -9,6 +9,8 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; using OpenTK; using osu.Framework.Graphics.Transforms; +using osu.Framework.Graphics.Primitives; +using System; namespace osu.Game.Overlays { @@ -86,9 +88,10 @@ namespace osu.Game.Overlays AddInternal(wavesContainer = new Container { - RelativeSizeAxes = Axes.Both, + RelativeSizeAxes = Axes.X, Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, + Masking = true, Children = new[] { firstWave = new Wave @@ -123,19 +126,13 @@ namespace osu.Game.Overlays RelativeSizeAxes = Axes.Both, Anchor = Anchor.BottomCentre, Origin = Anchor.BottomCentre, - Children = new Drawable[] - { - new Box - { - RelativeSizeAxes = Axes.Both, - Colour = Color4.White.Opacity(50), - }, - }, }); } protected override void PopIn() { + base.PopIn(); + foreach (var w in wavesContainer.Children) w.State = Visibility.Visible; @@ -145,6 +142,8 @@ namespace osu.Game.Overlays protected override void PopOut() { + base.PopOut(); + contentContainer.FadeOut(DISAPPEAR_DURATION, EasingTypes.In); contentContainer.MoveToY(DrawHeight * 2f, DISAPPEAR_DURATION, EasingTypes.In); @@ -152,14 +151,23 @@ namespace osu.Game.Overlays w.State = Visibility.Hidden; } + protected override void UpdateAfterChildren() + { + base.UpdateAfterChildren(); + + // This is done as an optimization, such that invisible parts of the waves + // are masked away, and thus do not consume fill rate. + wavesContainer.Height = Math.Max(0, DrawHeight - (contentContainer.DrawHeight - contentContainer.Y)); + } + private class Wave : Container, IStateful { public float FinalPosition; public Wave() { - RelativeSizeAxes = Axes.Both; - Size = new Vector2(1.5f); + RelativeSizeAxes = Axes.X; + Width = 1.5f; Masking = true; EdgeEffect = new EdgeEffect { @@ -177,6 +185,15 @@ namespace osu.Game.Overlays }; } + protected override void Update() + { + base.Update(); + + // We can not use RelativeSizeAxes for Height, because the height + // of our parent diminishes as the content moves up. + Height = Parent.Parent.DrawSize.Y * 1.5f; + } + private Visibility state; public Visibility State { @@ -188,7 +205,7 @@ namespace osu.Game.Overlays switch (value) { case Visibility.Hidden: - MoveToY(DrawHeight / Height, DISAPPEAR_DURATION, easing_hide); + MoveToY(Parent.Parent.DrawSize.Y, DISAPPEAR_DURATION, easing_hide); break; case Visibility.Visible: MoveToY(FinalPosition, APPEAR_DURATION, easing_show); diff --git a/osu.Game/Screens/GameScreenWhiteBox.cs b/osu.Game/Screens/GameScreenWhiteBox.cs index 623b411e35..ec5ae13713 100644 --- a/osu.Game/Screens/GameScreenWhiteBox.cs +++ b/osu.Game/Screens/GameScreenWhiteBox.cs @@ -126,7 +126,7 @@ namespace osu.Game.Screens }, childModeButtons = new FillFlowContainer { - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Anchor = Anchor.TopRight, Origin = Anchor.TopRight, RelativeSizeAxes = Axes.Both, diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs index f26fded19d..b29898c2a4 100644 --- a/osu.Game/Screens/Menu/ButtonSystem.cs +++ b/osu.Game/Screens/Menu/ButtonSystem.cs @@ -78,7 +78,7 @@ namespace osu.Game.Screens.Menu }, buttonFlow = new FlowContainerWithOrigin { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(-WEDGE_WIDTH, 0), Anchor = Anchor.Centre, AutoSizeAxes = Axes.Both, diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs index deb9a4dbf8..493d9d9b09 100644 --- a/osu.Game/Screens/Menu/Disclaimer.cs +++ b/osu.Game/Screens/Menu/Disclaimer.cs @@ -32,7 +32,7 @@ namespace osu.Game.Screens.Menu AutoSizeAxes = Axes.Both, Anchor = Anchor.Centre, Origin = Anchor.Centre, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 2), Children = new Drawable[] { diff --git a/osu.Game/Screens/Play/KeyCounterCollection.cs b/osu.Game/Screens/Play/KeyCounterCollection.cs index 0a93032a20..7e0519d972 100644 --- a/osu.Game/Screens/Play/KeyCounterCollection.cs +++ b/osu.Game/Screens/Play/KeyCounterCollection.cs @@ -12,7 +12,7 @@ namespace osu.Game.Screens.Play { public KeyCounterCollection() { - Direction = FillDirection.Right; + Direction = FillDirection.Horizontal; AutoSizeAxes = Axes.Both; } diff --git a/osu.Game/Screens/Play/PauseOverlay.cs b/osu.Game/Screens/Play/PauseOverlay.cs index 8004f967ad..0561581670 100644 --- a/osu.Game/Screens/Play/PauseOverlay.cs +++ b/osu.Game/Screens/Play/PauseOverlay.cs @@ -105,7 +105,7 @@ namespace osu.Game.Screens.Play { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 50), Origin = Anchor.Centre, Anchor = Anchor.Centre, @@ -113,11 +113,12 @@ namespace osu.Game.Screens.Play { new FillFlowContainer { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Down, - Spacing = new Vector2(0, 20), Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Direction = FillDirection.Vertical, + Spacing = new Vector2(0, 20), Children = new Drawable[] { new OsuSpriteText @@ -144,6 +145,8 @@ namespace osu.Game.Screens.Play }, new FillFlowContainer { + Origin = Anchor.TopCentre, + Anchor = Anchor.TopCentre, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Masking = true, @@ -188,9 +191,9 @@ namespace osu.Game.Screens.Play }, retryCounterContainer = new FillFlowContainer { - AutoSizeAxes = Axes.Both, Origin = Anchor.TopCentre, - Anchor = Anchor.TopCentre + Anchor = Anchor.TopCentre, + AutoSizeAxes = Axes.Both, } } }, diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index bc04dbb2f7..77f2e74c9c 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -136,7 +136,7 @@ namespace osu.Game.Screens.Play AutoSizeAxes = Axes.Both, Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { new OsuSpriteText diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs index 1c8972e4be..5cccfe4aa0 100644 --- a/osu.Game/Screens/Ranking/Results.cs +++ b/osu.Game/Screens/Ranking/Results.cs @@ -68,7 +68,7 @@ namespace osu.Game.Screens.Ranking new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { new OsuSpriteText diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs index a3493971cb..e0374884c9 100644 --- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs +++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs @@ -125,7 +125,7 @@ namespace osu.Game.Screens.Select { Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Margin = new MarginPadding { Top = 10, Left = 25, Right = 10, Bottom = 20 }, AutoSizeAxes = Axes.Both, Children = new Drawable[] @@ -147,7 +147,7 @@ namespace osu.Game.Screens.Select new FillFlowContainer { Margin = new MarginPadding { Top = 10 }, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, AutoSizeAxes = Axes.Both, Children = new [] { diff --git a/osu.Game/Screens/Select/CarouselContainer.cs b/osu.Game/Screens/Select/CarouselContainer.cs index 1930ab2daf..eee51443a7 100644 --- a/osu.Game/Screens/Select/CarouselContainer.cs +++ b/osu.Game/Screens/Select/CarouselContainer.cs @@ -16,6 +16,7 @@ using osu.Framework.Input; using OpenTK.Input; using System.Collections; using osu.Framework.MathUtils; +using System.Diagnostics; namespace osu.Game.Screens.Select { @@ -23,73 +24,33 @@ namespace osu.Game.Screens.Select { private Container scrollableContent; private List groups = new List(); + private List panels = new List(); public BeatmapGroup SelectedGroup { get; private set; } public BeatmapPanel SelectedPanel { get; private set; } private List yPositions = new List(); - private CarouselLifetimeList lifetime; public CarouselContainer() { DistanceDecayJump = 0.01; - Add(scrollableContent = new Container(lifetime = new CarouselLifetimeList(DepthComparer)) + Add(scrollableContent = new Container { RelativeSizeAxes = Axes.X, }); } - internal class CarouselLifetimeList : LifetimeList - { - public CarouselLifetimeList(IComparer comparer) - : base(comparer) - { - } - - public int StartIndex; - public int EndIndex; - - public override bool Update(FrameTimeInfo time) - { - bool anyAliveChanged = false; - - //check existing items to make sure they haven't died. - foreach (var item in AliveItems.ToArray()) - { - item.UpdateTime(time); - if (!item.IsAlive) - { - //todo: make this more efficient - int i = IndexOf(item); - anyAliveChanged |= CheckItem(item, ref i); - } - } - - //handle custom range - for (int i = StartIndex; i < EndIndex; i++) - { - var item = this[i]; - item.UpdateTime(time); - anyAliveChanged |= CheckItem(item, ref i); - } - - return anyAliveChanged; - } - } - public void AddGroup(BeatmapGroup group) { - group.State = BeatmapGroupState.Collapsed; groups.Add(group); - group.Header.Depth = -scrollableContent.Children.Count(); - scrollableContent.Add(group.Header); - + panels.Add(group.Header); + group.Header.UpdateClock(Clock); foreach (BeatmapPanel panel in group.BeatmapPanels) { - panel.Depth = -scrollableContent.Children.Count(); - scrollableContent.Add(panel); + panels.Add(panel); + panel.UpdateClock(Clock); } computeYPositions(); @@ -98,6 +59,9 @@ namespace osu.Game.Screens.Select public void RemoveGroup(BeatmapGroup group) { groups.Remove(group); + foreach (var p in group.BeatmapPanels) + panels.Remove(p); + scrollableContent.Remove(group.Header); scrollableContent.Remove(group.BeatmapPanels); @@ -107,7 +71,7 @@ namespace osu.Game.Screens.Select private void movePanel(Panel panel, bool advance, bool animated, ref float currentY) { yPositions.Add(currentY); - panel.MoveToY(currentY, animated && (panel.IsOnScreen || panel.State != PanelSelectedState.Hidden) ? 750 : 0, EasingTypes.OutExpo); + panel.MoveToY(currentY, animated ? 750 : 0, EasingTypes.OutExpo); if (advance) currentY += panel.DrawHeight + 5; @@ -172,14 +136,16 @@ namespace osu.Game.Screens.Select var panel = group.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(beatmap)); if (panel != null) { - SelectGroup(group, panel, animated); + selectGroup(group, panel, animated); return; } } } - public void SelectGroup(BeatmapGroup group, BeatmapPanel panel, bool animated = true) + private void selectGroup(BeatmapGroup group, BeatmapPanel panel, bool animated = true) { + Trace.Assert(group.BeatmapPanels.Contains(panel), @"Selected panel must be in provided group"); + if (SelectedGroup != null && SelectedGroup != group && SelectedGroup.State != BeatmapGroupState.Hidden) SelectedGroup.State = BeatmapGroupState.Collapsed; @@ -194,19 +160,20 @@ namespace osu.Game.Screens.Select public void Sort(FilterControl.SortMode mode) { + List sortedGroups = new List(groups); switch (mode) { case FilterControl.SortMode.Artist: - groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Artist, y.BeatmapSet.Metadata.Artist)); + sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Artist, y.BeatmapSet.Metadata.Artist)); break; case FilterControl.SortMode.Title: - groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Title, y.BeatmapSet.Metadata.Title)); + sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Title, y.BeatmapSet.Metadata.Title)); break; case FilterControl.SortMode.Author: - groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Author, y.BeatmapSet.Metadata.Author)); + sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Author, y.BeatmapSet.Metadata.Author)); break; case FilterControl.SortMode.Difficulty: - groups.Sort((x, y) => + sortedGroups.Sort((x, y) => { float xAverage = 0, yAverage = 0; int counter = 0; @@ -232,22 +199,23 @@ namespace osu.Game.Screens.Select default: throw new NotImplementedException(); } + scrollableContent.Clear(false); - lifetime.Clear(); - foreach (BeatmapGroup group in groups) - { - group.Header.Depth = -scrollableContent.Children.Count(); - scrollableContent.Add(group.Header); - - foreach (BeatmapPanel panel in group.BeatmapPanels) - { - panel.Depth = -scrollableContent.Children.Count(); - scrollableContent.Add(panel); - } - } + panels.Clear(); + groups.Clear(); + foreach (BeatmapGroup group in sortedGroups) + AddGroup(group); } + /// + /// Computes the x-offset of currently visible panels. Makes the carousel appear round. + /// + /// + /// Vertical distance from the center of the carousel container + /// ranging from -1 to 1. + /// + /// Half the height of the carousel container. private static float offsetX(float dist, float halfHeight) { // The radius of the circle the carousel moves on. @@ -286,34 +254,46 @@ namespace osu.Game.Screens.Select { base.Update(); - // Determine which items stopped being on screen for future removal from the lifetimelist. float drawHeight = DrawHeight; - float halfHeight = drawHeight / 2; - foreach (Panel p in lifetime.AliveItems) + // Remove all panels that should no longer be on-screen + scrollableContent.RemoveAll(delegate (Panel p) { float panelPosY = p.Position.Y; - p.IsOnScreen = panelPosY >= Current - p.DrawHeight && panelPosY <= Current + drawHeight; - updatePanel(p, halfHeight); - } + bool remove = panelPosY < Current - p.DrawHeight || panelPosY > Current + drawHeight || !p.IsPresent; + return remove; + }); + + // Find index range of all panels that should be on-screen + Trace.Assert(panels.Count == yPositions.Count); - // Determine range of indices for items that are now definitely on screen to be added - // to the lifetimelist in the future. int firstIndex = yPositions.BinarySearch(Current - Panel.MAX_HEIGHT); if (firstIndex < 0) firstIndex = ~firstIndex; int lastIndex = yPositions.BinarySearch(Current + drawHeight); if (lastIndex < 0) lastIndex = ~lastIndex; - lifetime.StartIndex = firstIndex; - lifetime.EndIndex = lastIndex; - + // Add those panels within the previously found index range that should be displayed. for (int i = firstIndex; i < lastIndex; ++i) { - Panel p = lifetime[i]; - if (p.State != PanelSelectedState.Hidden) - p.IsOnScreen = true; //we don't want to update the on-screen state of hidden pannels as they have incorrect (stacked) y values. - updatePanel(p, halfHeight); + Panel panel = panels[i]; + if (panel.State == PanelSelectedState.Hidden) + continue; + + // Only add if we're not already part of the content. + if (!scrollableContent.Contains(panel)) + { + // Makes sure headers are always _below_ panels, + // and depth flows downward. + panel.Depth = i + (panel is BeatmapSetHeader ? panels.Count : 0); + scrollableContent.Add(panel); + } } + + // Update externally controlled state of currently visible panels + // (e.g. x-offset and opacity). + float halfHeight = drawHeight / 2; + foreach (Panel p in scrollableContent.Children) + updatePanel(p, halfHeight); } protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) @@ -355,7 +335,7 @@ namespace osu.Game.Screens.Select if (i >= 0 && i < SelectedGroup.BeatmapPanels.Count) { //changing difficulty panel, not set. - SelectGroup(SelectedGroup, SelectedGroup.BeatmapPanels[i]); + selectGroup(SelectedGroup, SelectedGroup.BeatmapPanels[i]); return; } } @@ -381,9 +361,11 @@ namespace osu.Game.Screens.Select return; BeatmapGroup group = visibleGroups[RNG.Next(visibleGroups.Count)]; BeatmapPanel panel = group?.BeatmapPanels.First(); + if (panel == null) return; - SelectGroup(group, panel); + + selectGroup(group, panel); } public IEnumerator GetEnumerator() => groups.GetEnumerator(); diff --git a/osu.Game/Screens/Select/FilterControl.cs b/osu.Game/Screens/Select/FilterControl.cs index fd7992ba16..af47e73788 100644 --- a/osu.Game/Screens/Select/FilterControl.cs +++ b/osu.Game/Screens/Select/FilterControl.cs @@ -55,7 +55,7 @@ namespace osu.Game.Screens.Select Anchor = Anchor.TopRight, Origin = Anchor.TopRight, Width = 0.4f, // TODO: InnerWidth property or something - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { searchTextBox = new SearchTextBox { @@ -188,7 +188,7 @@ namespace osu.Game.Screens.Select new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(10, 0), Children = new Drawable[] { @@ -210,17 +210,16 @@ namespace osu.Game.Screens.Select groupsEllipsis = new TextAwesome { Icon = FontAwesome.fa_ellipsis_h, + Origin = Anchor.TopLeft, TextSize = 14, Margin = new MarginPadding { Top = 5, Bottom = 5 }, - Origin = Anchor.BottomLeft, - Anchor = Anchor.BottomLeft, } } }, new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(10, 0), Origin = Anchor.TopRight, Anchor = Anchor.TopRight, @@ -241,10 +240,9 @@ namespace osu.Game.Screens.Select sortEllipsis = new TextAwesome { Icon = FontAwesome.fa_ellipsis_h, + Origin = Anchor.TopLeft, TextSize = 14, Margin = new MarginPadding { Top = 5, Bottom = 5 }, - Origin = Anchor.BottomLeft, - Anchor = Anchor.BottomLeft, } } }, diff --git a/osu.Game/Screens/Select/Footer.cs b/osu.Game/Screens/Select/Footer.cs index 2b62e8d452..48ce098cd7 100644 --- a/osu.Game/Screens/Select/Footer.cs +++ b/osu.Game/Screens/Select/Footer.cs @@ -98,13 +98,13 @@ namespace osu.Game.Screens.Select Position = new Vector2(BackButton.SIZE_EXTENDED.X + padding, 0), RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(padding, 0), Children = new Drawable[] { buttons = new FillFlowContainer { - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Spacing = new Vector2(0.2f, 0), AutoSizeAxes = Axes.Both, } diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs index 6e68b7917b..36f51ed92d 100644 --- a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs +++ b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs @@ -115,7 +115,7 @@ namespace osu.Game.Screens.Select.Options Origin = Anchor.Centre, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Children = new Drawable[] { iconText = new TextAwesome diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs index 47152dc165..d1a60d2a2b 100644 --- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs +++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs @@ -132,7 +132,7 @@ namespace osu.Game.Screens.Select.Options public ButtonFlow() { - Direction = FillDirection.Right; + Direction = FillDirection.Horizontal; } } } diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 68783f33db..316cc50dae 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -396,6 +396,7 @@ namespace osu.Game.Screens.Select { beatmapGroups.Add(group); + group.State = BeatmapGroupState.Collapsed; carousel.AddGroup(group); filterChanged(false, false); @@ -403,11 +404,7 @@ namespace osu.Game.Screens.Select if (Beatmap == null || select) carousel.SelectBeatmap(beatmapSet.Beatmaps.First()); else - { - var panel = group.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(Beatmap.BeatmapInfo)); - if (panel != null) - carousel.SelectGroup(group, panel); - } + carousel.SelectBeatmap(Beatmap.BeatmapInfo); })); } diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs index 53ebe2606f..f9155bbc2a 100644 --- a/osu.Game/Screens/Tournament/Drawings.cs +++ b/osu.Game/Screens/Tournament/Drawings.cs @@ -77,7 +77,7 @@ namespace osu.Game.Screens.Tournament new FillFlowContainer { RelativeSizeAxes = Axes.Both, - Direction = FillDirection.Right, + Direction = FillDirection.Horizontal, Children = new Drawable[] { @@ -173,7 +173,7 @@ namespace osu.Game.Screens.Tournament Position = new Vector2(0, 35f), - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 5f), Children = new Drawable[] @@ -212,7 +212,7 @@ namespace osu.Game.Screens.Tournament Position = new Vector2(0, -5f), - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 5f), Children = new Drawable[] @@ -294,6 +294,9 @@ namespace osu.Game.Screens.Tournament reloadTeams(); + if (!storage.Exists(results_filename)) + return; + if (loadLastResults) { try diff --git a/osu.Game/Screens/Tournament/Group.cs b/osu.Game/Screens/Tournament/Group.cs index c3a911a791..44af4c8182 100644 --- a/osu.Game/Screens/Tournament/Group.cs +++ b/osu.Game/Screens/Tournament/Group.cs @@ -144,7 +144,7 @@ namespace osu.Game.Screens.Tournament RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Direction = FillDirection.Down, + Direction = FillDirection.Vertical, Spacing = new Vector2(0, 5f), Children = new Drawable[]