diff --git a/osu.Game/Rulesets/Scoring/HitEvent.cs b/osu.Game/Rulesets/Scoring/HitEvent.cs
index a2770ec580..ea2975a6c4 100644
--- a/osu.Game/Rulesets/Scoring/HitEvent.cs
+++ b/osu.Game/Rulesets/Scoring/HitEvent.cs
@@ -7,6 +7,9 @@ using osuTK;
namespace osu.Game.Rulesets.Scoring
{
+ ///
+ /// A generated by the containing extra statistics around a .
+ ///
public readonly struct HitEvent
{
///
@@ -31,11 +34,19 @@ namespace osu.Game.Rulesets.Scoring
public readonly HitObject LastHitObject;
///
- /// The player's position offset, if available, at the time of the event.
+ /// A position offset, if available, at the time of the event.
///
[CanBeNull]
public readonly Vector2? PositionOffset;
+ ///
+ /// Creates a new .
+ ///
+ /// The time offset from the end of at which the event occurs.
+ /// The .
+ /// The that triggered the event.
+ /// The previous .
+ /// A positional offset.
public HitEvent(double timeOffset, HitResult result, HitObject hitObject, [CanBeNull] HitObject lastHitObject, [CanBeNull] Vector2? positionOffset)
{
TimeOffset = timeOffset;
@@ -45,6 +56,11 @@ namespace osu.Game.Rulesets.Scoring
PositionOffset = positionOffset;
}
+ ///
+ /// Creates a new with an optional positional offset.
+ ///
+ /// The positional offset.
+ /// The new .
public HitEvent With(Vector2? positionOffset) => new HitEvent(TimeOffset, Result, HitObject, LastHitObject, positionOffset);
}
}
diff --git a/osu.Game/Rulesets/Scoring/HitWindows.cs b/osu.Game/Rulesets/Scoring/HitWindows.cs
index 77acbd4137..018b50bd3d 100644
--- a/osu.Game/Rulesets/Scoring/HitWindows.cs
+++ b/osu.Game/Rulesets/Scoring/HitWindows.cs
@@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.Scoring
/// Retrieves the with the largest hit window that produces a successful hit.
///
/// The lowest allowed successful .
- public HitResult LowestSuccessfulHitResult()
+ protected HitResult LowestSuccessfulHitResult()
{
for (var result = HitResult.Meh; result <= HitResult.Perfect; ++result)
{
diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
index b9f51dfad3..22ec023f58 100644
--- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
+++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
@@ -136,12 +136,6 @@ namespace osu.Game.Rulesets.Scoring
lastHitObject = result.HitObject;
updateScore();
-
- OnResultApplied(result);
- }
-
- protected virtual void OnResultApplied(JudgementResult result)
- {
}
protected virtual HitEvent CreateHitEvent(JudgementResult result)
@@ -174,12 +168,6 @@ namespace osu.Game.Rulesets.Scoring
hitEvents.RemoveAt(hitEvents.Count - 1);
updateScore();
-
- OnResultReverted(result);
- }
-
- protected virtual void OnResultReverted(JudgementResult result)
- {
}
private void updateScore()
diff --git a/osu.Game/Screens/Ranking/ScorePanel.cs b/osu.Game/Screens/Ranking/ScorePanel.cs
index 257279bdc9..9633f5c533 100644
--- a/osu.Game/Screens/Ranking/ScorePanel.cs
+++ b/osu.Game/Screens/Ranking/ScorePanel.cs
@@ -76,12 +76,11 @@ namespace osu.Game.Screens.Ranking
private static readonly Color4 contracted_middle_layer_colour = Color4Extensions.FromHex("#353535");
public event Action StateChanged;
- public Action PostExpandAction;
///
- /// Whether this can enter into an state.
+ /// An action to be invoked if this is clicked while in an expanded state.
///
- public bool CanExpand = true;
+ public Action PostExpandAction;
public readonly ScoreInfo Score;
@@ -250,6 +249,7 @@ namespace osu.Game.Screens.Ranking
{
base.Size = value;
+ // Auto-size isn't used to avoid 1-frame issues and because the score panel is removed/re-added to the container.
if (trackingContainer != null)
trackingContainer.Size = value;
}
@@ -259,8 +259,7 @@ namespace osu.Game.Screens.Ranking
{
if (State == PanelState.Contracted)
{
- if (CanExpand)
- State = PanelState.Expanded;
+ State = PanelState.Expanded;
return true;
}
@@ -276,6 +275,15 @@ namespace osu.Game.Screens.Ranking
private ScorePanelTrackingContainer trackingContainer;
+ ///
+ /// Creates a which this can reside inside.
+ /// The will track the size of this .
+ ///
+ ///
+ /// This is immediately added as a child of the .
+ ///
+ /// The .
+ /// If a already exists.
public ScorePanelTrackingContainer CreateTrackingContainer()
{
if (trackingContainer != null)
diff --git a/osu.Game/Screens/Ranking/ScorePanelList.cs b/osu.Game/Screens/Ranking/ScorePanelList.cs
index 8f9064c2d1..9ebd7822c0 100644
--- a/osu.Game/Screens/Ranking/ScorePanelList.cs
+++ b/osu.Game/Screens/Ranking/ScorePanelList.cs
@@ -26,12 +26,13 @@ namespace osu.Game.Screens.Ranking
///
private const float expanded_panel_spacing = 15;
+ ///
+ /// An action to be invoked if a is clicked while in an expanded state.
+ ///
public Action PostExpandAction;
public readonly Bindable SelectedScore = new Bindable();
- public float CurrentScrollPosition => scroll.Current;
-
private readonly Flow flow;
private readonly Scroll scroll;
private ScorePanel expandedPanel;
@@ -47,16 +48,13 @@ namespace osu.Game.Screens.Ranking
{
RelativeSizeAxes = Axes.Both,
HandleScroll = () => expandedPanel?.IsHovered != true, // handle horizontal scroll only when not hovering the expanded panel.
- Children = new Drawable[]
+ Child = flow = new Flow
{
- flow = new Flow
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(panel_spacing, 0),
- AutoSizeAxes = Axes.Both,
- },
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(panel_spacing, 0),
+ AutoSizeAxes = Axes.Both,
}
};
}
@@ -166,6 +164,10 @@ namespace osu.Game.Screens.Ranking
private bool handleInput = true;
+ ///
+ /// Whether this or any of the s contained should handle scroll or click input.
+ /// Setting to false will also hide the scrollbar.
+ ///
public bool HandleInput
{
get => handleInput;
@@ -180,10 +182,24 @@ namespace osu.Game.Screens.Ranking
public override bool PropagateNonPositionalInputSubTree => HandleInput && base.PropagateNonPositionalInputSubTree;
+ ///
+ /// Enumerates all s contained in this .
+ ///
+ ///
public IEnumerable GetScorePanels() => flow.Select(t => t.Panel);
+ ///
+ /// Finds the corresponding to a .
+ ///
+ /// The to find the corresponding for.
+ /// The .
public ScorePanel GetPanelForScore(ScoreInfo score) => flow.Single(t => t.Panel.Score == score).Panel;
+ ///
+ /// Detaches a from its , allowing the panel to be moved elsewhere in the hierarchy.
+ ///
+ /// The to detach.
+ /// If is not a part of this .
public void Detach(ScorePanel panel)
{
var container = flow.FirstOrDefault(t => t.Panel == panel);
@@ -193,6 +209,11 @@ namespace osu.Game.Screens.Ranking
container.Detach();
}
+ ///
+ /// Attaches a to its in this .
+ ///
+ /// The to attach.
+ /// If is not a part of this .
public void Attach(ScorePanel panel)
{
var container = flow.FirstOrDefault(t => t.Panel == panel);
diff --git a/osu.Game/Screens/Ranking/ScorePanelTrackingContainer.cs b/osu.Game/Screens/Ranking/ScorePanelTrackingContainer.cs
index f6f26d0f8a..c8010d1c32 100644
--- a/osu.Game/Screens/Ranking/ScorePanelTrackingContainer.cs
+++ b/osu.Game/Screens/Ranking/ScorePanelTrackingContainer.cs
@@ -6,16 +6,27 @@ using osu.Framework.Graphics.Containers;
namespace osu.Game.Screens.Ranking
{
+ ///
+ /// A which tracks the size of a , to which the can be added or removed.
+ ///
public class ScorePanelTrackingContainer : CompositeDrawable
{
+ ///
+ /// The that created this .
+ ///
public readonly ScorePanel Panel;
- public ScorePanelTrackingContainer(ScorePanel panel)
+ internal ScorePanelTrackingContainer(ScorePanel panel)
{
Panel = panel;
Attach();
}
+ ///
+ /// Detaches the from this , removing it as a child.
+ /// This will continue tracking any size changes.
+ ///
+ /// If the is already detached.
public void Detach()
{
if (InternalChildren.Count == 0)
@@ -24,6 +35,10 @@ namespace osu.Game.Screens.Ranking
RemoveInternal(Panel);
}
+ ///
+ /// Attaches the to this , adding it as a child.
+ ///
+ /// If the is already attached.
public void Attach()
{
if (InternalChildren.Count > 0)
diff --git a/osu.Game/Screens/Ranking/Statistics/StatisticContainer.cs b/osu.Game/Screens/Ranking/Statistics/StatisticContainer.cs
index d9e5e1294a..ed98698411 100644
--- a/osu.Game/Screens/Ranking/Statistics/StatisticContainer.cs
+++ b/osu.Game/Screens/Ranking/Statistics/StatisticContainer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Diagnostics.CodeAnalysis;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -11,13 +12,16 @@ using osuTK;
namespace osu.Game.Screens.Ranking.Statistics
{
- internal class StatisticContainer : Container
+ ///
+ /// Wraps a to add a header and suitable layout for use in .
+ ///
+ internal class StatisticContainer : CompositeDrawable
{
- protected override Container Content => content;
-
- private readonly Container content;
-
- public StatisticContainer(string name)
+ ///
+ /// Creates a new .
+ ///
+ /// The to display.
+ public StatisticContainer([NotNull] StatisticItem item)
{
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
@@ -50,7 +54,7 @@ namespace osu.Game.Screens.Ranking.Statistics
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
- Text = name,
+ Text = item.Name,
Font = OsuFont.GetFont(size: 14, weight: FontWeight.SemiBold),
}
}
@@ -58,11 +62,12 @@ namespace osu.Game.Screens.Ranking.Statistics
},
new Drawable[]
{
- content = new Container
+ new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Margin = new MarginPadding { Top = 15 }
+ Margin = new MarginPadding { Top = 15 },
+ Child = item.Content
}
},
},
diff --git a/osu.Game/Screens/Ranking/Statistics/StatisticItem.cs b/osu.Game/Screens/Ranking/Statistics/StatisticItem.cs
index a3ef5bf99e..e959ed24fc 100644
--- a/osu.Game/Screens/Ranking/Statistics/StatisticItem.cs
+++ b/osu.Game/Screens/Ranking/Statistics/StatisticItem.cs
@@ -30,9 +30,9 @@ namespace osu.Game.Screens.Ranking.Statistics
///
/// Creates a new , to be displayed inside a in the results screen.
///
- /// The name of this item.
+ /// The name of the item.
/// The content to be displayed.
- /// The of this row. This can be thought of as the column dimension of an encompassing .
+ /// The of this item. This can be thought of as the column dimension of an encompassing .
public StatisticItem([NotNull] string name, [NotNull] Drawable content, [CanBeNull] Dimension dimension = null)
{
Name = name;
diff --git a/osu.Game/Screens/Ranking/Statistics/StatisticsPanel.cs b/osu.Game/Screens/Ranking/Statistics/StatisticsPanel.cs
index 328b6933a0..c560cc9852 100644
--- a/osu.Game/Screens/Ranking/Statistics/StatisticsPanel.cs
+++ b/osu.Game/Screens/Ranking/Statistics/StatisticsPanel.cs
@@ -83,10 +83,7 @@ namespace osu.Game.Screens.Ranking.Statistics
AutoSizeAxes = Axes.Y,
Content = new[]
{
- row.Columns?.Select(c => new StatisticContainer(c.Name)
- {
- Child = c.Content
- }).Cast().ToArray()
+ row.Columns?.Select(c => new StatisticContainer(c)).Cast().ToArray()
},
ColumnDimensions = Enumerable.Range(0, row.Columns?.Length ?? 0)
.Select(i => row.Columns[i].Dimension ?? new Dimension()).ToArray(),
@@ -105,8 +102,8 @@ namespace osu.Game.Screens.Ranking.Statistics
}
}
- protected override void PopIn() => this.FadeIn();
+ protected override void PopIn() => this.FadeIn(150, Easing.OutQuint);
- protected override void PopOut() => this.FadeOut();
+ protected override void PopOut() => this.FadeOut(150, Easing.OutQuint);
}
}