Updated to use ppy's implementation

This commit is contained in:
MrTheMake
2017-07-14 12:08:56 +02:00
211 changed files with 2744 additions and 1414 deletions

View File

@ -26,6 +26,7 @@ namespace osu.Game.Graphics.Backgrounds
Add(Sprite = new Sprite
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Colour = Color4.DarkGray,

View File

@ -23,6 +23,16 @@ namespace osu.Game.Graphics.Containers
/// </summary>
protected double EarlyActivationMilliseconds;
/// <summary>
/// The time in milliseconds until the next beat.
/// </summary>
public double TimeUntilNextBeat { get; private set; }
/// <summary>
/// The time in milliseconds since the last beat
/// </summary>
public double TimeSinceLastBeat { get; private set; }
protected override void Update()
{
if (Beatmap.Value?.Track == null)
@ -42,12 +52,16 @@ namespace osu.Game.Graphics.Containers
if (currentTrackTime < timingPoint.Time)
beatIndex--;
TimeUntilNextBeat = (timingPoint.Time - currentTrackTime) % timingPoint.BeatLength;
if (TimeUntilNextBeat < 0)
TimeUntilNextBeat += timingPoint.BeatLength;
TimeSinceLastBeat = timingPoint.BeatLength - TimeUntilNextBeat;
if (timingPoint == lastTimingPoint && beatIndex == lastBeat)
return;
double offsetFromBeat = (timingPoint.Time - currentTrackTime) % timingPoint.BeatLength;
using (BeginDelayedSequence(offsetFromBeat, true))
using (BeginDelayedSequence(-TimeSinceLastBeat, true))
OnNewBeat(beatIndex, timingPoint, effectPoint, Beatmap.Value.Track.CurrentAmplitudes);
lastBeat = beatIndex;

View File

@ -0,0 +1,35 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input;
namespace osu.Game.Graphics.Containers
{
public class OsuClickableContainer : ClickableContainer
{
protected SampleChannel SampleClick, SampleHover;
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
SampleHover = audio.Sample.Get(@"UI/generic-hover");
SampleClick = audio.Sample.Get(@"UI/generic-click");
}
protected override bool OnHover(InputState state)
{
SampleHover?.Play();
return base.OnHover(state);
}
protected override bool OnClick(InputState state)
{
SampleClick?.Play();
return base.OnClick(state);
}
}
}

View File

@ -0,0 +1,38 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Graphics.Containers;
namespace osu.Game.Graphics.Containers
{
public class OsuFocusedOverlayContainer : FocusedOverlayContainer
{
private SampleChannel samplePopIn;
private SampleChannel samplePopOut;
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
samplePopIn = audio.Sample.Get(@"UI/melodic-5");
samplePopOut = audio.Sample.Get(@"UI/melodic-4");
StateChanged += OsuFocusedOverlayContainer_StateChanged;
}
private void OsuFocusedOverlayContainer_StateChanged(VisibilityContainer arg1, Visibility arg2)
{
switch (arg2)
{
case Visibility.Visible:
samplePopIn?.Play();
break;
case Visibility.Hidden:
samplePopOut?.Play();
break;
}
}
}
}

View File

@ -0,0 +1,75 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics.Containers;
using osu.Framework.Input;
using OpenTK.Input;
namespace osu.Game.Graphics.Containers
{
internal class OsuScrollContainer : ScrollContainer
{
/// <summary>
/// Allows controlling the scroll bar from any position in the container using the right mouse button.
/// Uses the value of <see cref="DistanceDecayOnRightMouseScrollbar"/> to smoothly scroll to the dragged location.
/// </summary>
public bool RightMouseScrollbar = false;
/// <summary>
/// Controls the rate with which the target position is approached when performing a relative drag. Default is 0.02.
/// </summary>
public double DistanceDecayOnRightMouseScrollbar = 0.02;
private bool shouldPerformRightMouseScroll(InputState state) => RightMouseScrollbar && state.Mouse.IsPressed(MouseButton.Right);
private void scrollToRelative(float value) => ScrollTo(Clamp((value - Scrollbar.DrawSize[ScrollDim] / 2) / Scrollbar.Size[ScrollDim]), true, DistanceDecayOnRightMouseScrollbar);
private bool mouseScrollBarDragging;
protected override bool IsDragging => base.IsDragging || mouseScrollBarDragging;
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
{
if (shouldPerformRightMouseScroll(state))
{
scrollToRelative(state.Mouse.Position[ScrollDim]);
return true;
}
return base.OnMouseDown(state, args);
}
protected override bool OnDrag(InputState state)
{
if (mouseScrollBarDragging)
{
scrollToRelative(state.Mouse.Position[ScrollDim]);
return true;
}
return base.OnDrag(state);
}
protected override bool OnDragStart(InputState state)
{
if (shouldPerformRightMouseScroll(state))
{
mouseScrollBarDragging = true;
return true;
}
return base.OnDragStart(state);
}
protected override bool OnDragEnd(InputState state)
{
if (mouseScrollBarDragging)
{
mouseScrollBarDragging = false;
return true;
}
return base.OnDragEnd(state);
}
}
}

View File

@ -8,9 +8,10 @@ using osu.Framework.Graphics.Containers;
namespace osu.Game.Graphics.Containers
{
public class ReverseDepthFillFlowContainer<T> : FillFlowContainer<T> where T : Drawable
public class ReverseChildIDFillFlowContainer<T> : FillFlowContainer<T> where T : Drawable
{
protected override IComparer<Drawable> DepthComparer => new ReverseCreationOrderDepthComparer();
protected override int Compare(Drawable x, Drawable y) => CompareReverseChildID(x, y);
protected override IEnumerable<Drawable> FlowingChildren => base.FlowingChildren.Reverse();
}
}

View File

@ -93,7 +93,7 @@ namespace osu.Game.Graphics.Containers
sections = value.ToList();
if (sections.Count == 0) return;
sectionsContainer.Add(sections);
sectionsContainer.AddRange(sections);
SelectedSection.Value = sections[0];
lastKnownScroll = float.NaN;
}
@ -114,7 +114,7 @@ namespace osu.Game.Graphics.Containers
public SectionsContainer()
{
Add(ScrollContainer = new ScrollContainer()
Add(ScrollContainer = new OsuScrollContainer
{
RelativeSizeAxes = Axes.Both,
Masking = false,
@ -123,6 +123,8 @@ namespace osu.Game.Graphics.Containers
originalSectionsMargin = sectionsContainer.Margin;
}
public void ScrollTo(Drawable section) => ScrollContainer.ScrollTo(ScrollContainer.GetChildPosInContent(section) - FixedHeader.BoundingBox.Height);
private float lastKnownScroll;
protected override void UpdateAfterChildren()
{

View File

@ -74,7 +74,7 @@ namespace osu.Game.Graphics.Cursor
}
}
public override bool Contains(Vector2 screenSpacePos) => true;
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
[BackgroundDependencyLoader]
private void load(ShaderManager shaders, TextureStore textures)

View File

@ -10,9 +10,5 @@ namespace osu.Game.Graphics.Cursor
public class OsuContextMenuContainer : ContextMenuContainer
{
protected override ContextMenu<ContextMenuItem> CreateContextMenu() => new OsuContextMenu<ContextMenuItem>();
public OsuContextMenuContainer(CursorContainer cursor) : base(cursor)
{
}
}
}

View File

@ -15,7 +15,7 @@ namespace osu.Game.Graphics.Cursor
{
public class OsuTooltipContainer : TooltipContainer
{
protected override Tooltip CreateTooltip() => new OsuTooltip();
protected override ITooltip CreateTooltip() => new OsuTooltip();
public OsuTooltipContainer(CursorContainer cursor) : base(cursor)
{

View File

@ -30,7 +30,7 @@ namespace osu.Game.Graphics
public static void FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
where T : Transformable<Drawable>, IHasAccentColour
{
accentedDrawable.TransformTo(() => accentedDrawable.AccentColour, newColour, duration, easing, new TransformAccent());
accentedDrawable.TransformTo(newColour, duration, easing, new TransformAccent());
}
}
}

View File

@ -13,7 +13,7 @@ namespace osu.Game.Graphics.Transforms
/// <summary>
/// Current value of the transformed colour in linear colour space.
/// </summary>
public override Color4 CurrentValue
public virtual Color4 CurrentValue
{
get
{
@ -25,13 +25,7 @@ namespace osu.Game.Graphics.Transforms
}
}
public override void Apply(Drawable d)
{
base.Apply(d);
var accented = d as IHasAccentColour;
if (accented != null)
accented.AccentColour = CurrentValue;
}
public override void Apply(Drawable d) => ((IHasAccentColour)d).AccentColour = CurrentValue;
public override void ReadIntoStartValue(Drawable d) => StartValue = ((IHasAccentColour)d).AccentColour;
}
}

View File

@ -2,7 +2,6 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Graphics;
namespace osu.Game.Graphics.UserInterface
@ -18,9 +17,8 @@ namespace osu.Game.Graphics.UserInterface
}
[BackgroundDependencyLoader]
private void load(AudioManager audio, OsuColour colours)
private void load(OsuColour colours)
{
ActivationSound = audio.Sample.Get(@"Menu/menuback");
BackgroundColour = colours.Pink;
HoverColour = colours.PinkDark;
}

View File

@ -29,7 +29,7 @@ namespace osu.Game.Graphics.UserInterface
base.Direction = (direction & BarDirection.Horizontal) > 0 ? FillDirection.Vertical : FillDirection.Horizontal;
foreach (var bar in Children)
{
bar.Size = (direction & BarDirection.Horizontal) > 0 ? new Vector2(1, 1.0f / Children.Count()) : new Vector2(1.0f / Children.Count(), 1);
bar.Size = (direction & BarDirection.Horizontal) > 0 ? new Vector2(1, 1.0f / Children.Count) : new Vector2(1.0f / Children.Count, 1);
bar.Direction = direction;
}
}
@ -58,7 +58,7 @@ namespace osu.Game.Graphics.UserInterface
Direction = Direction,
});
//I'm using ToList() here because Where() returns an Enumerable which can change it's elements afterwards
Remove(Children.Where((bar, index) => index >= value.Count()).ToList());
RemoveRange(Children.Where((bar, index) => index >= value.Count()).ToList());
}
}
}

View File

@ -38,7 +38,7 @@ namespace osu.Game.Graphics.UserInterface
public readonly TextAwesome Chevron;
//don't allow clicking between transitions and don't make the chevron clickable
public override bool Contains(Vector2 screenSpacePos) => Alpha == 1f && Text.Contains(screenSpacePos);
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => Alpha == 1f && Text.ReceiveMouseInputAt(screenSpacePos);
public override bool HandleInput => State == Visibility.Visible;
private Visibility state;

View File

@ -8,14 +8,14 @@ using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Containers;
using osu.Framework.Audio.Sample;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Sprites;
using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Graphics.Containers;
namespace osu.Game.Graphics.UserInterface
{
public class DialogButton : ClickableContainer
public class DialogButton : OsuClickableContainer
{
private const float hover_width = 0.9f;
private const float hover_duration = 500;
@ -79,8 +79,6 @@ namespace osu.Game.Graphics.UserInterface
}
}
public SampleChannel SampleClick, SampleHover;
private readonly Container backgroundContainer;
private readonly Container colourContainer;
private readonly Container glowContainer;
@ -93,15 +91,13 @@ namespace osu.Game.Graphics.UserInterface
private bool didClick; // Used for making sure that the OnMouseDown animation can call instead of OnHoverLost's when clicking
public override bool Contains(Vector2 screenSpacePos) => backgroundContainer.Contains(screenSpacePos);
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => backgroundContainer.ReceiveMouseInputAt(screenSpacePos);
protected override bool OnClick(Framework.Input.InputState state)
{
didClick = true;
colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, EasingTypes.In);
flash();
SampleClick?.Play();
Action?.Invoke();
Delay(click_duration);
Schedule(delegate {
@ -110,7 +106,7 @@ namespace osu.Game.Graphics.UserInterface
glowContainer.FadeOut();
});
return true;
return base.OnClick(state);
}
protected override bool OnHover(Framework.Input.InputState state)
@ -119,7 +115,7 @@ namespace osu.Game.Graphics.UserInterface
colourContainer.ResizeTo(new Vector2(hover_width, 1f), hover_duration, EasingTypes.OutElastic);
glowContainer.FadeIn(glow_fade_duration, EasingTypes.Out);
SampleHover?.Play();
base.OnHover(state);
return true;
}

View File

@ -9,10 +9,11 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input;
using osu.Game.Graphics.Containers;
namespace osu.Game.Graphics.UserInterface
{
public class IconButton : ClickableContainer
public class IconButton : OsuClickableContainer
{
private readonly TextAwesome icon;
private readonly Box hover;

View File

@ -34,9 +34,8 @@ namespace osu.Game.Graphics.UserInterface
{
base.LoadComplete();
spinner.RotateTo(360, 2000);
using (spinner.BeginDelayedSequence(2000))
spinner.Loop();
using (spinner.BeginLoopedSequence())
spinner.RotateTo(360, 2000);
}
private const float transition_duration = 500;

View File

@ -3,6 +3,8 @@
using OpenTK.Graphics;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
@ -18,6 +20,9 @@ namespace osu.Game.Graphics.UserInterface
{
private Box hover;
private SampleChannel sampleClick;
private SampleChannel sampleHover;
public OsuButton()
{
Height = 40;
@ -34,7 +39,7 @@ namespace osu.Game.Graphics.UserInterface
public override bool HandleInput => Action != null;
[BackgroundDependencyLoader]
private void load(OsuColour colours)
private void load(OsuColour colours, AudioManager audio)
{
if (Action == null)
Colour = OsuColour.Gray(0.5f);
@ -44,7 +49,7 @@ namespace osu.Game.Graphics.UserInterface
Content.Masking = true;
Content.CornerRadius = 5;
Add(new Drawable[]
AddRange(new Drawable[]
{
new Triangles
{
@ -60,10 +65,20 @@ namespace osu.Game.Graphics.UserInterface
Alpha = 0,
},
});
sampleClick = audio.Sample.Get(@"UI/generic-click");
sampleHover = audio.Sample.Get(@"UI/generic-hover");
}
protected override bool OnClick(InputState state)
{
sampleClick?.Play();
return base.OnClick(state);
}
protected override bool OnHover(InputState state)
{
sampleHover?.Play();
hover.FadeIn(200);
return base.OnHover(state);
}

View File

@ -106,8 +106,8 @@ namespace osu.Game.Graphics.UserInterface
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
sampleChecked = audio.Sample.Get(@"Checkbox/check-on");
sampleUnchecked = audio.Sample.Get(@"Checkbox/check-off");
sampleChecked = audio.Sample.Get(@"UI/check-on");
sampleUnchecked = audio.Sample.Get(@"UI/check-off");
}
}
}

View File

@ -65,8 +65,8 @@ namespace osu.Game.Graphics.UserInterface
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
sampleHover = audio.Sample.Get(@"Menu/menuclick");
sampleClick = audio.Sample.Get(@"Menu/menuback");
sampleHover = audio.Sample.Get(@"UI/generic-hover");
sampleClick = audio.Sample.Get(@"UI/generic-click");
BackgroundColour = Color4.Transparent;
BackgroundColourHover = OsuColour.FromHex(@"172023");

View File

@ -100,7 +100,7 @@ namespace osu.Game.Graphics.UserInterface
[BackgroundDependencyLoader]
private void load(AudioManager audio, OsuColour colours)
{
sample = audio.Sample.Get(@"Sliderbar/sliderbar");
sample = audio.Sample.Get(@"UI/sliderbar-notch");
AccentColour = colours.Pink;
}

View File

@ -23,8 +23,6 @@ namespace osu.Game.Graphics.UserInterface
protected override TabItem<T> CreateTabItem(T value) => new OsuTabItem(value);
public override bool Contains(Vector2 screenSpacePos) => base.Contains(screenSpacePos) || Dropdown.Contains(screenSpacePos);
private bool isEnumType => typeof(T).IsEnum;
public OsuTabControl()

View File

@ -47,7 +47,7 @@ namespace osu.Game.Graphics.UserInterface
protected class TransformAccuracy : Transform<double, Drawable>
{
public override double CurrentValue
public virtual double CurrentValue
{
get
{
@ -59,11 +59,8 @@ namespace osu.Game.Graphics.UserInterface
}
}
public override void Apply(Drawable d)
{
base.Apply(d);
((PercentageCounter)d).DisplayedCount = CurrentValue;
}
public override void Apply(Drawable d) => ((PercentageCounter)d).DisplayedCount = CurrentValue;
public override void ReadIntoStartValue(Drawable d) => StartValue = ((PercentageCounter)d).DisplayedCount;
}
}
}

View File

@ -210,7 +210,6 @@ namespace osu.Game.Graphics.UserInterface
transform.StartTime = TransformStartTime;
transform.EndTime = TransformStartTime + rollingTotalDuration;
transform.StartValue = currentValue;
transform.EndValue = newValue;
transform.Easing = RollingEasing;

View File

@ -58,7 +58,7 @@ namespace osu.Game.Graphics.UserInterface
protected class TransformScore : Transform<double, Drawable>
{
public override double CurrentValue
public virtual double CurrentValue
{
get
{
@ -70,11 +70,8 @@ namespace osu.Game.Graphics.UserInterface
}
}
public override void Apply(Drawable d)
{
base.Apply(d);
((ScoreCounter)d).DisplayedCount = CurrentValue;
}
public override void Apply(Drawable d) => ((ScoreCounter)d).DisplayedCount = CurrentValue;
public override void ReadIntoStartValue(Drawable d) => StartValue = ((ScoreCounter)d).DisplayedCount;
}
}
}

View File

@ -17,7 +17,7 @@ namespace osu.Game.Graphics.UserInterface
public SearchTextBox()
{
Height = 35;
Add(new Drawable[]
AddRange(new Drawable[]
{
new TextAwesome
{

View File

@ -39,7 +39,7 @@ namespace osu.Game.Graphics.UserInterface
private class TransformCounterCount : Transform<int, Drawable>
{
public override int CurrentValue
public int CurrentValue
{
get
{
@ -51,11 +51,8 @@ namespace osu.Game.Graphics.UserInterface
}
}
public override void Apply(Drawable d)
{
base.Apply(d);
((SimpleComboCounter)d).DisplayedCount = CurrentValue;
}
public override void Apply(Drawable d) => ((SimpleComboCounter)d).DisplayedCount = CurrentValue;
public override void ReadIntoStartValue(Drawable d) => StartValue = ((SimpleComboCounter)d).DisplayedCount;
}
}
}

View File

@ -33,25 +33,25 @@ namespace osu.Game.Graphics.UserInterface
private const float star_size = 20;
private const float star_spacing = 4;
private float count;
private float countStars;
/// <summary>
/// Amount of stars represented.
/// </summary>
public float Count
public float CountStars
{
get
{
return count;
return countStars;
}
set
{
if (count == value) return;
if (countStars == value) return;
if (IsLoaded)
transformCount(value);
count = value;
countStars = value;
}
}
@ -94,15 +94,15 @@ namespace osu.Game.Graphics.UserInterface
public void ResetCount()
{
count = 0;
countStars = 0;
StopAnimation();
}
public void ReplayAnimation()
{
var t = count;
var t = countStars;
ResetCount();
Count = t;
CountStars = t;
}
public void StopAnimation()
@ -111,8 +111,8 @@ namespace osu.Game.Graphics.UserInterface
foreach (var star in stars.Children)
{
star.ClearTransforms(true);
star.FadeTo(i < count ? 1.0f : minStarAlpha);
star.Icon.ScaleTo(getStarScale(i, count));
star.FadeTo(i < countStars ? 1.0f : minStarAlpha);
star.Icon.ScaleTo(getStarScale(i, countStars));
i++;
}
}
@ -132,7 +132,7 @@ namespace osu.Game.Graphics.UserInterface
{
star.ClearTransforms(true);
var delay = (count <= newValue ? Math.Max(i - count, 0) : Math.Max(count - 1 - i, 0)) * animationDelay;
var delay = (countStars <= newValue ? Math.Max(i - countStars, 0) : Math.Max(countStars - 1 - i, 0)) * animationDelay;
using (BeginDelayedSequence(delay, true))
{

View File

@ -1,7 +1,6 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Audio.Sample;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
@ -18,7 +17,7 @@ using osu.Framework.Graphics.Shapes;
namespace osu.Game.Graphics.UserInterface
{
public class TwoLayerButton : ClickableContainer
public class TwoLayerButton : OsuClickableContainer
{
private readonly BouncingIcon bouncingIcon;
@ -32,7 +31,6 @@ namespace osu.Game.Graphics.UserInterface
public static readonly Vector2 SIZE_EXTENDED = new Vector2(140, 50);
public static readonly Vector2 SIZE_RETRACTED = new Vector2(100, 50);
public SampleChannel ActivationSound;
private readonly SpriteText text;
public Color4 HoverColour;
@ -171,7 +169,7 @@ namespace osu.Game.Graphics.UserInterface
}
}
public override bool Contains(Vector2 screenSpacePos) => IconLayer.Contains(screenSpacePos) || TextLayer.Contains(screenSpacePos);
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => IconLayer.ReceiveMouseInputAt(screenSpacePos) || TextLayer.ReceiveMouseInputAt(screenSpacePos);
protected override bool OnHover(InputState state)
{
@ -210,8 +208,6 @@ namespace osu.Game.Graphics.UserInterface
flash.FadeOut(500, EasingTypes.OutQuint);
flash.Expire();
ActivationSound.Play();
return base.OnClick(state);
}