diff --git a/appveyor_deploy.yml b/appveyor_deploy.yml
index 6d8d95e773..22a4859885 100644
--- a/appveyor_deploy.yml
+++ b/appveyor_deploy.yml
@@ -10,8 +10,8 @@ before_build:
- cmd: nuget restore -verbosity quiet
build_script:
- ps: iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/appveyor/secure-file/master/install.ps1'))
- - appveyor DownloadFile https://puu.sh/A6g5K/4d08705438.enc # signing certificate
- - cmd: appveyor-tools\secure-file -decrypt 4d08705438.enc -secret %decode_secret% -out %HOMEPATH%\deanherbert.pfx
+ - appveyor DownloadFile https://puu.sh/BCrS8/7faccf7876.enc # signing certificate
+ - cmd: appveyor-tools\secure-file -decrypt 7faccf7876.enc -secret %decode_secret% -out %HOMEPATH%\deanherbert.pfx
- appveyor DownloadFile https://puu.sh/A6g75/fdc6f19b04.enc # deploy configuration
- cd osu-deploy
- nuget restore -verbosity quiet
diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs
index 1129969694..96857d6b4f 100644
--- a/osu.Desktop/Overlays/VersionManager.cs
+++ b/osu.Desktop/Overlays/VersionManager.cs
@@ -27,9 +27,6 @@ namespace osu.Desktop.Overlays
private NotificationOverlay notificationOverlay;
private GameHost host;
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
[BackgroundDependencyLoader]
private void load(NotificationOverlay notification, OsuColour colours, TextureStore textures, OsuGameBase game, OsuConfigManager config, GameHost host)
{
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index 803927bc6f..1e8bf05e01 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -27,9 +27,9 @@
-
-
-
+
+
+
diff --git a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
index 51343d9e91..326791f506 100644
--- a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
+++ b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
@@ -2,9 +2,10 @@
-
-
+
+
+
WinExe
diff --git a/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs b/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs
index b90b90f45a..925e7aaac9 100644
--- a/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs
@@ -5,6 +5,7 @@ using System;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
+using osu.Game.Configuration;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.Objects.Drawable;
using osu.Game.Rulesets.Judgements;
@@ -22,6 +23,8 @@ namespace osu.Game.Rulesets.Catch.UI
protected override bool UserScrollSpeedAdjustment => false;
+ protected override SpeedChangeVisualisationMethod VisualisationMethod => SpeedChangeVisualisationMethod.Constant;
+
public CatchPlayfield(BeatmapDifficulty difficulty, Func> getVisualRepresentation)
{
Direction.Value = ScrollingDirection.Down;
@@ -33,7 +36,7 @@ namespace osu.Game.Rulesets.Catch.UI
Size = new Vector2(0.86f); // matches stable's vertical offset for catcher plate
- InternalChild = new PlayfieldLayer
+ InternalChild = new PlayfieldAdjustmentContainer
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
@@ -52,6 +55,8 @@ namespace osu.Game.Rulesets.Catch.UI
HitObjectContainer
}
};
+
+ VisibleTimeRange.Value = BeatmapDifficulty.DifficultyRange(difficulty.ApproachRate, 1800, 1200, 450);
}
public bool CheckIfWeCanCatch(CatchHitObject obj) => catcherArea.AttemptCatch(obj);
diff --git a/osu.Game.Rulesets.Catch/UI/PlayfieldLayer.cs b/osu.Game.Rulesets.Catch/UI/PlayfieldAdjustmentContainer.cs
similarity index 92%
rename from osu.Game.Rulesets.Catch/UI/PlayfieldLayer.cs
rename to osu.Game.Rulesets.Catch/UI/PlayfieldAdjustmentContainer.cs
index d167dc59cc..ad0073ff12 100644
--- a/osu.Game.Rulesets.Catch/UI/PlayfieldLayer.cs
+++ b/osu.Game.Rulesets.Catch/UI/PlayfieldAdjustmentContainer.cs
@@ -7,12 +7,12 @@ using OpenTK;
namespace osu.Game.Rulesets.Catch.UI
{
- public class PlayfieldLayer : Container
+ public class PlayfieldAdjustmentContainer : Container
{
protected override Container Content => content;
private readonly Container content;
- public PlayfieldLayer()
+ public PlayfieldAdjustmentContainer()
{
InternalChild = new Container
{
diff --git a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
index 3165f69a6b..bf75ebbff8 100644
--- a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
+++ b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
@@ -2,9 +2,10 @@
-
-
+
+
+
WinExe
diff --git a/osu.Game.Rulesets.Mania/Configuration/ManiaConfigManager.cs b/osu.Game.Rulesets.Mania/Configuration/ManiaConfigManager.cs
index 3e9c9feba1..1c9e1e4c73 100644
--- a/osu.Game.Rulesets.Mania/Configuration/ManiaConfigManager.cs
+++ b/osu.Game.Rulesets.Mania/Configuration/ManiaConfigManager.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Mania.Configuration
{
base.InitialiseDefaults();
- Set(ManiaSetting.ScrollTime, 1500.0, 50.0, 10000.0, 50.0);
+ Set(ManiaSetting.ScrollTime, 2250.0, 50.0, 10000.0, 50.0);
Set(ManiaSetting.ScrollDirection, ManiaScrollingDirection.Down);
}
diff --git a/osu.Game.Rulesets.Mania/Edit/Layers/Selection/Overlays/HoldNoteMask.cs b/osu.Game.Rulesets.Mania/Edit/Layers/Selection/Overlays/HoldNoteMask.cs
index bfa6bc0a17..03d2ba19cb 100644
--- a/osu.Game.Rulesets.Mania/Edit/Layers/Selection/Overlays/HoldNoteMask.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Layers/Selection/Overlays/HoldNoteMask.cs
@@ -78,7 +78,7 @@ namespace osu.Game.Rulesets.Mania.Edit.Layers.Selection.Overlays
}
// Todo: This is temporary, since the note masks don't do anything special yet. In the future they will handle input.
- public override bool HandleMouseInput => false;
+ public override bool HandlePositionalInput => false;
}
}
}
diff --git a/osu.Game.Rulesets.Mania/UI/DrawableManiaJudgement.cs b/osu.Game.Rulesets.Mania/UI/DrawableManiaJudgement.cs
index dc66249cd9..f78cfefab8 100644
--- a/osu.Game.Rulesets.Mania/UI/DrawableManiaJudgement.cs
+++ b/osu.Game.Rulesets.Mania/UI/DrawableManiaJudgement.cs
@@ -30,10 +30,11 @@ namespace osu.Game.Rulesets.Mania.UI
if (Result.IsHit)
{
- this.ScaleTo(0.8f);
- this.ScaleTo(1, 250, Easing.OutElastic);
+ JudgementBody.ScaleTo(0.8f);
+ JudgementBody.ScaleTo(1, 250, Easing.OutElastic);
- this.Delay(50).FadeOut(200).ScaleTo(0.75f, 250);
+ JudgementBody.Delay(50).ScaleTo(0.75f, 250);
+ this.Delay(50).FadeOut(200);
}
Expire();
diff --git a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
index 247d5e18c1..23c6150b6a 100644
--- a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
+++ b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
@@ -2,9 +2,10 @@
-
-
+
+
+
WinExe
diff --git a/osu.Game.Rulesets.Osu/Beatmaps/OsuBeatmapProcessor.cs b/osu.Game.Rulesets.Osu/Beatmaps/OsuBeatmapProcessor.cs
index cfb1b0f050..db80948c94 100644
--- a/osu.Game.Rulesets.Osu/Beatmaps/OsuBeatmapProcessor.cs
+++ b/osu.Game.Rulesets.Osu/Beatmaps/OsuBeatmapProcessor.cs
@@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
{
public class OsuBeatmapProcessor : BeatmapProcessor
{
+ private const int stack_distance = 3;
+
public OsuBeatmapProcessor(IBeatmap beatmap)
: base(beatmap)
{
@@ -18,17 +20,21 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
public override void PostProcess()
{
base.PostProcess();
- applyStacking((Beatmap)Beatmap);
+
+ var osuBeatmap = (Beatmap)Beatmap;
+
+ // Reset stacking
+ foreach (var h in osuBeatmap.HitObjects)
+ h.StackHeight = 0;
+
+ if (Beatmap.BeatmapInfo.BeatmapVersion >= 6)
+ applyStacking(osuBeatmap);
+ else
+ applyStackingOld(osuBeatmap);
}
private void applyStacking(Beatmap beatmap)
{
- const int stack_distance = 3;
-
- // Reset stacking
- for (int i = 0; i <= beatmap.HitObjects.Count - 1; i++)
- beatmap.HitObjects[i].StackHeight = 0;
-
// Extend the end index to include objects they are stacked on
int extendedEndIndex = beatmap.HitObjects.Count - 1;
for (int i = beatmap.HitObjects.Count - 1; i >= 0; i--)
@@ -167,5 +173,40 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
}
}
}
+
+ private void applyStackingOld(Beatmap beatmap)
+ {
+ for (int i = 0; i < beatmap.HitObjects.Count; i++)
+ {
+ OsuHitObject currHitObject = beatmap.HitObjects[i];
+
+ if (currHitObject.StackHeight != 0 && !(currHitObject is Slider))
+ continue;
+
+ double startTime = (currHitObject as IHasEndTime)?.EndTime ?? currHitObject.StartTime;
+ int sliderStack = 0;
+
+ for (int j = i + 1; j < beatmap.HitObjects.Count; j++)
+ {
+ double stackThreshold = beatmap.HitObjects[i].TimePreempt * beatmap.BeatmapInfo.StackLeniency;
+
+ if (beatmap.HitObjects[j].StartTime - stackThreshold > startTime)
+ break;
+
+ if (Vector2Extensions.Distance(beatmap.HitObjects[j].Position, currHitObject.Position) < stack_distance)
+ {
+ currHitObject.StackHeight++;
+ startTime = (beatmap.HitObjects[j] as IHasEndTime)?.EndTime ?? beatmap.HitObjects[i].StartTime;
+ }
+ else if (Vector2Extensions.Distance(beatmap.HitObjects[j].Position, currHitObject.EndPosition) < stack_distance)
+ {
+ //Case for sliders - bump notes down and right, rather than up and left.
+ sliderStack++;
+ beatmap.HitObjects[j].StackHeight -= sliderStack;
+ startTime = (beatmap.HitObjects[j] as IHasEndTime)?.EndTime ?? beatmap.HitObjects[i].StartTime;
+ }
+ }
+ }
+ }
}
}
diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
index 5e91ed7a97..028e3acc57 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
@@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty
double sectionLength = section_length * timeRate;
// The first object doesn't generate a strain, so we begin with an incremented section end
- double currentSectionEnd = 2 * sectionLength;
+ double currentSectionEnd = Math.Ceiling(beatmap.HitObjects.First().StartTime / sectionLength) * sectionLength;
foreach (OsuDifficultyHitObject h in difficultyBeatmap)
{
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyBeatmap.cs b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyBeatmap.cs
index 4443a0e66b..24d4677981 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyBeatmap.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyBeatmap.cs
@@ -3,6 +3,7 @@
using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using osu.Game.Rulesets.Osu.Objects;
namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
@@ -23,8 +24,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
{
// Sort OsuHitObjects by StartTime - they are not correctly ordered in some cases.
// This should probably happen before the objects reach the difficulty calculator.
- objects.Sort((a, b) => a.StartTime.CompareTo(b.StartTime));
- difficultyObjects = createDifficultyObjectEnumerator(objects, timeRate);
+ difficultyObjects = createDifficultyObjectEnumerator(objects.OrderBy(h => h.StartTime).ToList(), timeRate);
}
///
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs
index 29de23406b..ccfcc1ef25 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs
@@ -21,15 +21,25 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
public OsuHitObject BaseObject { get; }
///
- /// Normalized distance from the of the previous .
+ /// Normalized distance from the end position of the previous to the start position of this .
///
- public double Distance { get; private set; }
+ public double JumpDistance { get; private set; }
+
+ ///
+ /// Normalized distance between the start and end position of the previous .
+ ///
+ public double TravelDistance { get; private set; }
///
/// Milliseconds elapsed since the StartTime of the previous .
///
public double DeltaTime { get; private set; }
+ ///
+ /// Milliseconds elapsed since the start time of the previous , with a minimum of 50ms.
+ ///
+ public double StrainTime { get; private set; }
+
private readonly OsuHitObject lastObject;
private readonly double timeRate;
@@ -51,31 +61,37 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
private void setDistances()
{
// We will scale distances by this factor, so we can assume a uniform CircleSize among beatmaps.
- double scalingFactor = normalized_radius / BaseObject.Radius;
+ float scalingFactor = normalized_radius / (float)BaseObject.Radius;
if (BaseObject.Radius < 30)
{
- double smallCircleBonus = Math.Min(30 - BaseObject.Radius, 5) / 50;
+ float smallCircleBonus = Math.Min(30 - (float)BaseObject.Radius, 5) / 50;
scalingFactor *= 1 + smallCircleBonus;
}
Vector2 lastCursorPosition = lastObject.StackedPosition;
- float lastTravelDistance = 0;
var lastSlider = lastObject as Slider;
if (lastSlider != null)
{
computeSliderCursorPosition(lastSlider);
lastCursorPosition = lastSlider.LazyEndPosition ?? lastCursorPosition;
- lastTravelDistance = lastSlider.LazyTravelDistance;
}
- Distance = (lastTravelDistance + (BaseObject.StackedPosition - lastCursorPosition).Length) * scalingFactor;
+ // Don't need to jump to reach spinners
+ if (!(BaseObject is Spinner))
+ JumpDistance = (BaseObject.StackedPosition * scalingFactor - lastCursorPosition * scalingFactor).Length;
+
+ // Todo: BUG!!! Last slider's travel distance is considered ONLY IF we ourselves are also a slider!
+ if (BaseObject is Slider)
+ TravelDistance = (lastSlider?.LazyTravelDistance ?? 0) * scalingFactor;
}
private void setTimingValues()
{
- // Every timing inverval is hard capped at the equivalent of 375 BPM streaming speed as a safety measure.
- DeltaTime = Math.Max(50, (BaseObject.StartTime - lastObject.StartTime) / timeRate);
+ DeltaTime = (BaseObject.StartTime - lastObject.StartTime) / timeRate;
+
+ // Every strain interval is hard capped at the equivalent of 375 BPM streaming speed as a safety measure
+ StrainTime = Math.Max(50, DeltaTime);
}
private void computeSliderCursorPosition(Slider slider)
@@ -87,8 +103,14 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
float approxFollowCircleRadius = (float)(slider.Radius * 3);
var computeVertex = new Action(t =>
{
+ double progress = ((int)t - (int)slider.StartTime) / (float)(int)slider.SpanDuration;
+ if (progress % 2 > 1)
+ progress = 1 - progress % 1;
+ else
+ progress = progress % 1;
+
// ReSharper disable once PossibleInvalidOperationException (bugged in current r# version)
- var diff = slider.StackedPositionAt(t) - slider.LazyEndPosition.Value;
+ var diff = slider.StackedPosition + slider.Curve.PositionAt(progress) - slider.LazyEndPosition.Value;
float dist = diff.Length;
if (dist > approxFollowCircleRadius)
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
index 0a45c62671..f11b6d66f6 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
@@ -14,6 +14,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
protected override double SkillMultiplier => 26.25;
protected override double StrainDecayBase => 0.15;
- protected override double StrainValueOf(OsuDifficultyHitObject current) => Math.Pow(current.Distance, 0.99) / current.DeltaTime;
+ protected override double StrainValueOf(OsuDifficultyHitObject current)
+ => (Math.Pow(current.TravelDistance, 0.99) + Math.Pow(current.JumpDistance, 0.99)) / current.StrainTime;
}
}
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
index b807f20037..1cde03624b 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
protected override double StrainValueOf(OsuDifficultyHitObject current)
{
- double distance = current.Distance;
+ double distance = current.TravelDistance + current.JumpDistance;
double speedValue;
if (distance > single_spacing_threshold)
@@ -33,7 +33,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
else
speedValue = 0.95;
- return speedValue / current.DeltaTime;
+ return speedValue / current.StrainTime;
}
}
}
diff --git a/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderCircleMask.cs b/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderCircleMask.cs
index adb28289cf..151564a2a8 100644
--- a/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderCircleMask.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderCircleMask.cs
@@ -56,6 +56,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Layers.Selection.Overlays
}
// Todo: This is temporary, since the slider circle masks don't do anything special yet. In the future they will handle input.
- public override bool HandleMouseInput => false;
+ public override bool HandlePositionalInput => false;
}
}
diff --git a/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderMask.cs b/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderMask.cs
index 0f6143a83d..aff42dd233 100644
--- a/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderMask.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Layers/Selection/Overlays/SliderMask.cs
@@ -59,7 +59,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Layers.Selection.Overlays
body.UpdateProgress(0);
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => body.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => body.ReceivePositionalInputAt(screenSpacePos);
public override Vector2 SelectionPoint => ToScreenSpace(OriginPosition);
public override Quad SelectionQuad => body.PathDrawQuad;
diff --git a/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs b/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
index ad92ea15d4..d6972d55d2 100644
--- a/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
+++ b/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
@@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Osu.Edit
new HitObjectCompositionTool()
};
- protected override Container CreateLayerContainer() => new PlayfieldLayer { RelativeSizeAxes = Axes.Both };
+ protected override Container CreateLayerContainer() => new PlayfieldAdjustmentContainer { RelativeSizeAxes = Axes.Both };
public override HitObjectMask CreateMaskFor(DrawableHitObject hitObject)
{
diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModWiggle.cs b/osu.Game.Rulesets.Osu/Mods/OsuModWiggle.cs
index 2e601c9078..e0a93453ce 100644
--- a/osu.Game.Rulesets.Osu/Mods/OsuModWiggle.cs
+++ b/osu.Game.Rulesets.Osu/Mods/OsuModWiggle.cs
@@ -37,6 +37,11 @@ namespace osu.Game.Rulesets.Osu.Mods
var osuObject = (OsuHitObject)drawable.HitObject;
Vector2 origin = drawable.Position;
+ // Wiggle the repeat points with the slider instead of independently.
+ // Also fixes an issue with repeat points being positioned incorrectly.
+ if (osuObject is RepeatPoint)
+ return;
+
Random objRand = new Random((int)osuObject.StartTime);
// Wiggle all objects during TimePreempt
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index 66f491532d..89f380db4e 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -184,6 +184,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
public Drawable ProxiedLayer => HeadCircle.ApproachCircle;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => Body.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Body.ReceivePositionalInputAt(screenSpacePos);
}
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/CirclePiece.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/CirclePiece.cs
index bd7a4ad3f6..6bb6991cc0 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/CirclePiece.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/CirclePiece.cs
@@ -12,6 +12,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
{
public class CirclePiece : Container, IKeyBindingHandler
{
+ // IsHovered is used
+ public override bool HandlePositionalInput => true;
+
public Func Hit;
public CirclePiece()
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
index b79750a1b3..3081ae49fc 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
@@ -5,11 +5,11 @@ using System.Linq;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Rulesets.Objects.Types;
using OpenTK.Graphics;
using osu.Game.Skinning;
+using OpenTK;
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
{
@@ -102,24 +102,24 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
};
}
- private InputState lastState;
+ private Vector2? lastScreenSpaceMousePosition;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- lastState = state;
- return base.OnMouseDown(state, args);
+ lastScreenSpaceMousePosition = e.ScreenSpaceMousePosition;
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- lastState = state;
- return base.OnMouseUp(state, args);
+ lastScreenSpaceMousePosition = e.ScreenSpaceMousePosition;
+ return base.OnMouseUp(e);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
- lastState = state;
- return base.OnMouseMove(state);
+ lastScreenSpaceMousePosition = e.ScreenSpaceMousePosition;
+ return base.OnMouseMove(e);
}
public override void ClearTransformsAfter(double time, bool propagateChildren = false, string targetMember = null)
@@ -153,10 +153,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
if (Time.Current < slider.EndTime)
{
- // Make sure to use the base version of ReceiveMouseInputAt so that we correctly check the position.
+ // Make sure to use the base version of ReceivePositionalInputAt so that we correctly check the position.
Tracking = canCurrentlyTrack
- && lastState != null
- && ReceiveMouseInputAt(lastState.Mouse.NativeState.Position)
+ && lastScreenSpaceMousePosition.HasValue
+ && ReceivePositionalInputAt(lastScreenSpaceMousePosition.Value)
&& (drawableSlider?.OsuActionInputManager?.PressedActions.Any(x => x == OsuAction.LeftButton || x == OsuAction.RightButton) ?? false);
}
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
index 6f0197e711..f4ccf673e9 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
@@ -8,26 +8,23 @@ using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Lines;
-using osu.Framework.Graphics.Textures;
using OpenTK.Graphics.ES30;
using OpenTK.Graphics;
using osu.Framework.Graphics.Primitives;
using osu.Game.Rulesets.Objects.Types;
using OpenTK;
-using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.PixelFormats;
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
{
public class SliderBody : Container, ISliderProgress
{
- private readonly Path path;
+ private readonly SliderPath path;
private readonly BufferedContainer container;
public float PathWidth
{
- get { return path.PathWidth; }
- set { path.PathWidth = value; }
+ get => path.PathWidth;
+ set => path.PathWidth = value;
}
///
@@ -43,48 +40,40 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
public double? SnakedStart { get; private set; }
public double? SnakedEnd { get; private set; }
- private Color4 accentColour = Color4.White;
-
///
/// Used to colour the path.
///
public Color4 AccentColour
{
- get { return accentColour; }
+ get => path.AccentColour;
set
{
- if (accentColour == value)
+ if (path.AccentColour == value)
return;
- accentColour = value;
+ path.AccentColour = value;
- if (LoadState >= LoadState.Ready)
- reloadTexture();
+ container.ForceRedraw();
}
}
- private Color4 borderColour = Color4.White;
-
///
/// Used to colour the path border.
///
public new Color4 BorderColour
{
- get { return borderColour; }
+ get => path.BorderColour;
set
{
- if (borderColour == value)
+ if (path.BorderColour == value)
return;
- borderColour = value;
+ path.BorderColour = value;
- if (LoadState >= LoadState.Ready)
- reloadTexture();
+ container.ForceRedraw();
}
}
public Quad PathDrawQuad => container.ScreenSpaceDrawQuad;
- private int textureWidth => (int)PathWidth * 2;
-
private Vector2 topLeftOffset;
private readonly Slider slider;
@@ -101,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
CacheDrawnFrameBuffer = true,
Children = new Drawable[]
{
- path = new Path
+ path = new SliderPath
{
Blending = BlendingMode.None,
},
@@ -112,7 +101,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
container.Attach(RenderbufferInternalFormat.DepthComponent16);
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => path.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => path.ReceivePositionalInputAt(screenSpacePos);
public void SetRange(double p0, double p1)
{
@@ -134,46 +123,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
[BackgroundDependencyLoader]
private void load()
{
- reloadTexture();
computeSize();
}
- private void reloadTexture()
- {
- var texture = new Texture(textureWidth, 1);
-
- //initialise background
- var raw = new Image(textureWidth, 1);
-
- const float aa_portion = 0.02f;
- const float border_portion = 0.128f;
- const float gradient_portion = 1 - border_portion;
-
- const float opacity_at_centre = 0.3f;
- const float opacity_at_edge = 0.8f;
-
- for (int i = 0; i < textureWidth; i++)
- {
- float progress = (float)i / (textureWidth - 1);
-
- if (progress <= border_portion)
- {
- raw[i, 0] = new Rgba32(BorderColour.R, BorderColour.G, BorderColour.B, Math.Min(progress / aa_portion, 1) * BorderColour.A);
- }
- else
- {
- progress -= border_portion;
- raw[i, 0] = new Rgba32(AccentColour.R, AccentColour.G, AccentColour.B,
- (opacity_at_edge - (opacity_at_edge - opacity_at_centre) * progress / gradient_portion) * AccentColour.A);
- }
- }
-
- texture.SetData(new TextureUpload(raw));
- path.Texture = texture;
-
- container.ForceRedraw();
- }
-
private void computeSize()
{
// Generate the entire curve
@@ -226,5 +178,53 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
SetRange(start, end);
}
+
+ private class SliderPath : SmoothPath
+ {
+ private const float border_portion = 0.128f;
+ private const float gradient_portion = 1 - border_portion;
+
+ private const float opacity_at_centre = 0.3f;
+ private const float opacity_at_edge = 0.8f;
+
+ private Color4 borderColour = Color4.White;
+
+ public Color4 BorderColour
+ {
+ get => borderColour;
+ set
+ {
+ if (borderColour == value)
+ return;
+ borderColour = value;
+
+ InvalidateTexture();
+ }
+ }
+
+ private Color4 accentColour = Color4.White;
+
+ public Color4 AccentColour
+ {
+ get => accentColour;
+ set
+ {
+ if (accentColour == value)
+ return;
+ accentColour = value;
+
+ InvalidateTexture();
+ }
+ }
+
+ protected override Color4 ColourAt(float position)
+ {
+ if (position <= border_portion)
+ return BorderColour;
+
+ position -= border_portion;
+ return new Color4(AccentColour.R, AccentColour.G, AccentColour.B, (opacity_at_edge - (opacity_at_edge - opacity_at_centre) * position / gradient_portion) * AccentColour.A);
+ }
+ }
}
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerBackground.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerBackground.cs
index 1a7455838f..584fd93a70 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerBackground.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerBackground.cs
@@ -11,9 +11,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
{
public class SpinnerBackground : CircularContainer, IHasAccentColour
{
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
protected Box Disc;
public Color4 AccentColour
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index 5aba60ba03..4dd1c5f218 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -4,7 +4,7 @@
using System;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using OpenTK;
using OpenTK.Graphics;
@@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
};
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
private bool tracking;
public bool Tracking
@@ -68,10 +68,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
}
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
- mousePosition = Parent.ToLocalSpace(state.Mouse.NativeState.Position);
- return base.OnMouseMove(state);
+ mousePosition = Parent.ToLocalSpace(e.ScreenSpaceMousePosition);
+ return base.OnMouseMove(e);
}
private Vector2 mousePosition;
diff --git a/osu.Game.Rulesets.Osu/OsuInputManager.cs b/osu.Game.Rulesets.Osu/OsuInputManager.cs
index e7bbe755a0..e2f4c43a23 100644
--- a/osu.Game.Rulesets.Osu/OsuInputManager.cs
+++ b/osu.Game.Rulesets.Osu/OsuInputManager.cs
@@ -4,8 +4,7 @@
using System.Collections.Generic;
using System.ComponentModel;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Rulesets.UI;
namespace osu.Game.Rulesets.Osu
@@ -36,22 +35,20 @@ namespace osu.Game.Rulesets.Osu
{
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) => AllowUserPresses && base.OnKeyDown(state, args);
- protected override bool OnKeyUp(InputState state, KeyUpEventArgs args) => AllowUserPresses && base.OnKeyUp(state, args);
- protected override bool OnJoystickPress(InputState state, JoystickEventArgs args) => AllowUserPresses && base.OnJoystickPress(state, args);
- protected override bool OnJoystickRelease(InputState state, JoystickEventArgs args) => AllowUserPresses && base.OnJoystickRelease(state, args);
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => AllowUserPresses && base.OnMouseDown(state, args);
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args) => AllowUserPresses && base.OnMouseUp(state, args);
- protected override bool OnScroll(InputState state) => AllowUserPresses && base.OnScroll(state);
+ protected override bool Handle(UIEvent e)
+ {
+ if (!AllowUserPresses) return false;
+ return base.Handle(e);
+ }
}
}
public enum OsuAction
{
- [Description("Left Button")]
+ [Description("Left button")]
LeftButton,
- [Description("Right Button")]
+ [Description("Right button")]
RightButton
}
}
diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/CursorTrail.cs b/osu.Game.Rulesets.Osu/UI/Cursor/CursorTrail.cs
index 4a6b12d41a..4b5513ff9c 100644
--- a/osu.Game.Rulesets.Osu/UI/Cursor/CursorTrail.cs
+++ b/osu.Game.Rulesets.Osu/UI/Cursor/CursorTrail.cs
@@ -12,7 +12,7 @@ using osu.Framework.Graphics.Primitives;
using osu.Framework.Graphics.Shaders;
using osu.Framework.Graphics.Textures;
using osu.Framework.Input;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using OpenTK;
using OpenTK.Graphics;
@@ -76,7 +76,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
}
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
[BackgroundDependencyLoader]
private void load(ShaderManager shaders, TextureStore textures)
@@ -117,15 +117,15 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
timeOffset = Time.Current;
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
- Vector2 pos = state.Mouse.NativeState.Position;
+ Vector2 pos = e.ScreenSpaceMousePosition;
if (lastPosition == null)
{
lastPosition = pos;
resampler.AddPosition(lastPosition.Value);
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
foreach (Vector2 pos2 in resampler.AddPosition(pos))
@@ -147,7 +147,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
}
}
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
private void addPosition(Vector2 pos)
diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/GameplayCursor.cs b/osu.Game.Rulesets.Osu/UI/Cursor/GameplayCursor.cs
index 4d6722b61b..4a45d4fb31 100644
--- a/osu.Game.Rulesets.Osu/UI/Cursor/GameplayCursor.cs
+++ b/osu.Game.Rulesets.Osu/UI/Cursor/GameplayCursor.cs
@@ -72,7 +72,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
return false;
}
- public override bool HandleMouseInput => true; // OverlayContainer will set this false when we go hidden, but we always want to receive input.
+ public override bool HandlePositionalInput => true; // OverlayContainer will set this false when we go hidden, but we always want to receive input.
protected override void PopIn()
{
diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
index ae8dc7397d..398680cb8d 100644
--- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
+++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
@@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Osu.UI
Size = new Vector2(0.75f);
- InternalChild = new PlayfieldLayer
+ InternalChild = new PlayfieldAdjustmentContainer
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
@@ -78,7 +78,8 @@ namespace osu.Game.Rulesets.Osu.UI
DrawableOsuJudgement explosion = new DrawableOsuJudgement(result, judgedObject)
{
Origin = Anchor.Centre,
- Position = ((OsuHitObject)judgedObject.HitObject).StackedEndPosition
+ Position = ((OsuHitObject)judgedObject.HitObject).StackedEndPosition,
+ Scale = new Vector2(((OsuHitObject)judgedObject.HitObject).Scale * 1.65f)
};
judgementLayer.Add(explosion);
diff --git a/osu.Game.Rulesets.Osu/UI/PlayfieldLayer.cs b/osu.Game.Rulesets.Osu/UI/PlayfieldAdjustmentContainer.cs
similarity index 92%
rename from osu.Game.Rulesets.Osu/UI/PlayfieldLayer.cs
rename to osu.Game.Rulesets.Osu/UI/PlayfieldAdjustmentContainer.cs
index a4c84e4905..00d5692fda 100644
--- a/osu.Game.Rulesets.Osu/UI/PlayfieldLayer.cs
+++ b/osu.Game.Rulesets.Osu/UI/PlayfieldAdjustmentContainer.cs
@@ -7,12 +7,12 @@ using OpenTK;
namespace osu.Game.Rulesets.Osu.UI
{
- public class PlayfieldLayer : Container
+ public class PlayfieldAdjustmentContainer : Container
{
protected override Container Content => content;
private readonly Container content;
- public PlayfieldLayer()
+ public PlayfieldAdjustmentContainer()
{
InternalChild = new Container
{
diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
index 08a0579561..6ae9a018c5 100644
--- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
+++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
@@ -2,9 +2,10 @@
-
-
+
+
+
WinExe
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index f59dc8c1ee..6f7264e23b 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -24,6 +24,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
private bool validActionPressed;
+ private bool pressHandledThisFrame;
+
protected DrawableHit(Hit hit)
: base(hit)
{
@@ -51,6 +53,9 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
public override bool OnPressed(TaikoAction action)
{
+ if (pressHandledThisFrame)
+ return true;
+
if (Judged)
return false;
@@ -62,6 +67,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
if (IsHit)
HitAction = action;
+ // Regardless of whether we've hit or not, any secondary key presses in the same frame should be discarded
+ // E.g. hitting a non-strong centre as a strong should not fall through and perform a hit on the next note
+ pressHandledThisFrame = true;
+
return result;
}
@@ -76,6 +85,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
{
base.Update();
+ // The input manager processes all input prior to us updating, so this is the perfect time
+ // for us to remove the extra press blocking, before input is handled in the next frame
+ pressHandledThisFrame = false;
+
Size = BaseSize * Parent.RelativeChildSize;
}
diff --git a/osu.Game.Rulesets.Taiko/TaikoInputManager.cs b/osu.Game.Rulesets.Taiko/TaikoInputManager.cs
index dc683ae2f5..3b430e7ad1 100644
--- a/osu.Game.Rulesets.Taiko/TaikoInputManager.cs
+++ b/osu.Game.Rulesets.Taiko/TaikoInputManager.cs
@@ -17,13 +17,13 @@ namespace osu.Game.Rulesets.Taiko
public enum TaikoAction
{
- [Description("Left (Rim)")]
+ [Description("Left (rim)")]
LeftRim,
- [Description("Left (Centre)")]
+ [Description("Left (centre)")]
LeftCentre,
- [Description("Right (Centre)")]
+ [Description("Right (centre)")]
RightCentre,
- [Description("Right (Rim)")]
+ [Description("Right (rim)")]
RightRim
}
}
diff --git a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
index 4d660918b8..c7eba91564 100644
--- a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
+++ b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
@@ -31,10 +31,10 @@ namespace osu.Game.Rulesets.Taiko.UI
switch (Result.Type)
{
case HitResult.Good:
- Colour = colours.GreenLight;
+ JudgementBody.Colour = colours.GreenLight;
break;
case HitResult.Great:
- Colour = colours.BlueLight;
+ JudgementBody.Colour = colours.BlueLight;
break;
}
}
diff --git a/osu.Game.Rulesets.Taiko/UI/PlayfieldLayer.cs b/osu.Game.Rulesets.Taiko/UI/PlayfieldAdjustmentContainer.cs
similarity index 92%
rename from osu.Game.Rulesets.Taiko/UI/PlayfieldLayer.cs
rename to osu.Game.Rulesets.Taiko/UI/PlayfieldAdjustmentContainer.cs
index c4e2f32c92..661a4e135c 100644
--- a/osu.Game.Rulesets.Taiko/UI/PlayfieldLayer.cs
+++ b/osu.Game.Rulesets.Taiko/UI/PlayfieldAdjustmentContainer.cs
@@ -6,7 +6,7 @@ using OpenTK;
namespace osu.Game.Rulesets.Taiko.UI
{
- public class PlayfieldLayer : Container
+ public class PlayfieldAdjustmentContainer : Container
{
private const float default_relative_height = TaikoPlayfield.DEFAULT_HEIGHT / 768;
private const float default_aspect = 16f / 9f;
diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs
index 82ab327993..40ed659bd6 100644
--- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs
+++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs
@@ -1,23 +1,24 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Allocation;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Shapes;
-using osu.Game.Rulesets.Taiko.Objects;
-using OpenTK;
-using OpenTK.Graphics;
-using osu.Game.Rulesets.Taiko.Judgements;
-using osu.Game.Rulesets.Objects.Drawables;
-using osu.Game.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Extensions.Color4Extensions;
using System.Linq;
-using osu.Game.Rulesets.Judgements;
-using osu.Game.Rulesets.Taiko.Objects.Drawables;
+using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
using osu.Game.Beatmaps.ControlPoints;
+using osu.Game.Configuration;
+using osu.Game.Graphics;
+using osu.Game.Rulesets.Objects.Drawables;
+using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.UI;
using osu.Game.Rulesets.UI.Scrolling;
+using osu.Game.Rulesets.Taiko.Objects;
+using osu.Game.Rulesets.Taiko.Objects.Drawables;
+using osu.Game.Rulesets.Taiko.Judgements;
+using OpenTK;
+using OpenTK.Graphics;
namespace osu.Game.Rulesets.Taiko.UI
{
@@ -40,6 +41,8 @@ namespace osu.Game.Rulesets.Taiko.UI
protected override bool UserScrollSpeedAdjustment => false;
+ protected override SpeedChangeVisualisationMethod VisualisationMethod => SpeedChangeVisualisationMethod.Overlapping;
+
private readonly Container hitExplosionContainer;
private readonly Container kiaiExplosionContainer;
private readonly JudgementContainer judgementContainer;
@@ -58,7 +61,7 @@ namespace osu.Game.Rulesets.Taiko.UI
{
Direction.Value = ScrollingDirection.Left;
- InternalChild = new PlayfieldLayer
+ InternalChild = new PlayfieldAdjustmentContainer
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
@@ -198,7 +201,7 @@ namespace osu.Game.Rulesets.Taiko.UI
}
};
- VisibleTimeRange.Value = 6000;
+ VisibleTimeRange.Value = 7000;
}
[BackgroundDependencyLoader]
diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyBeatmapDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyBeatmapDecoderTest.cs
index d3351f86f8..af63a39662 100644
--- a/osu.Game.Tests/Beatmaps/Formats/LegacyBeatmapDecoderTest.cs
+++ b/osu.Game.Tests/Beatmaps/Formats/LegacyBeatmapDecoderTest.cs
@@ -165,7 +165,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
}
[Test]
- public void TestDecodeBeatmapColors()
+ public void TestDecodeBeatmapColours()
{
var decoder = new LegacySkinDecoder();
using (var resStream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
@@ -181,6 +181,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
new Color4(128, 255, 128, 255),
new Color4(255, 187, 255, 255),
new Color4(255, 177, 140, 255),
+ new Color4(100, 100, 100, 100),
};
Assert.AreEqual(expectedColors.Length, comboColors.Count);
for (int i = 0; i < expectedColors.Length; i++)
diff --git a/osu.Game.Tests/Resources/Soleily - Renatus (Gamu) [Insane].osu b/osu.Game.Tests/Resources/Soleily - Renatus (Gamu) [Insane].osu
index 3e44dc0af8..67570ad21b 100644
--- a/osu.Game.Tests/Resources/Soleily - Renatus (Gamu) [Insane].osu
+++ b/osu.Game.Tests/Resources/Soleily - Renatus (Gamu) [Insane].osu
@@ -101,6 +101,7 @@ Combo3 : 128,255,255
Combo4 : 128,255,128
Combo5 : 255,187,255
Combo6 : 255,177,140
+Combo7 : 100,100,100,100
[HitObjects]
192,168,956,6,0,P|184:128|200:80,1,90,4|0,1:2|0:0,0:0:0:0:
diff --git a/osu.Game.Tests/Visual/TestCaseCursors.cs b/osu.Game.Tests/Visual/TestCaseCursors.cs
index 361e255894..1f409f043e 100644
--- a/osu.Game.Tests/Visual/TestCaseCursors.cs
+++ b/osu.Game.Tests/Visual/TestCaseCursors.cs
@@ -7,7 +7,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Graphics.Cursor;
using osu.Game.Graphics.Sprites;
@@ -184,7 +184,7 @@ namespace osu.Game.Tests.Visual
///
/// The cursor to check.
private bool checkAtMouse(CursorContainer cursorContainer)
- => Precision.AlmostEquals(InputManager.CurrentState.Mouse.NativeState.Position, cursorContainer.ToScreenSpace(cursorContainer.ActiveCursor.DrawPosition));
+ => Precision.AlmostEquals(InputManager.CurrentState.Mouse.Position, cursorContainer.ToScreenSpace(cursorContainer.ActiveCursor.DrawPosition));
private class CustomCursorBox : Container, IProvideCursor
{
@@ -193,7 +193,7 @@ namespace osu.Game.Tests.Visual
public CursorContainer Cursor { get; }
public bool ProvidingUserCursor { get; }
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => base.ReceiveMouseInputAt(screenSpacePos) || SmoothTransition && !ProvidingUserCursor;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => base.ReceivePositionalInputAt(screenSpacePos) || SmoothTransition && !ProvidingUserCursor;
private readonly Box background;
@@ -224,16 +224,16 @@ namespace osu.Game.Tests.Visual
};
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
background.FadeTo(0.4f, 250, Easing.OutQuint);
return false;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
background.FadeTo(0.1f, 250);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj
index d638af0c38..520e0b8940 100644
--- a/osu.Game.Tests/osu.Game.Tests.csproj
+++ b/osu.Game.Tests/osu.Game.Tests.csproj
@@ -2,9 +2,11 @@
-
-
+
+
+
+
WinExe
diff --git a/osu.Game/Beatmaps/ControlPoints/TimingControlPoint.cs b/osu.Game/Beatmaps/ControlPoints/TimingControlPoint.cs
index eb60133fed..81eddaa43a 100644
--- a/osu.Game/Beatmaps/ControlPoints/TimingControlPoint.cs
+++ b/osu.Game/Beatmaps/ControlPoints/TimingControlPoint.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Beatmaps.ControlPoints
///
/// The beat length at this control point.
///
- public double BeatLength
+ public virtual double BeatLength
{
get => beatLength;
set => beatLength = MathHelper.Clamp(value, 6, 60000);
diff --git a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
index 181d17932d..5b5bc5d936 100644
--- a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
@@ -318,12 +318,12 @@ namespace osu.Game.Beatmaps.Formats
if (timingChange)
{
- handleTimingControlPoint(new TimingControlPoint
- {
- Time = time,
- BeatLength = beatLength,
- TimeSignature = timeSignature
- });
+ var controlPoint = CreateTimingControlPoint();
+ controlPoint.Time = time;
+ controlPoint.BeatLength = beatLength;
+ controlPoint.TimeSignature = timeSignature;
+
+ handleTimingControlPoint(controlPoint);
}
handleDifficultyControlPoint(new DifficultyControlPoint
@@ -418,6 +418,8 @@ namespace osu.Game.Beatmaps.Formats
private double getOffsetTime(double time) => time + (ApplyOffsets ? offset : 0);
+ protected virtual TimingControlPoint CreateTimingControlPoint() => new TimingControlPoint();
+
[Flags]
internal enum EffectFlags
{
diff --git a/osu.Game/Beatmaps/Formats/LegacyDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyDecoder.cs
index e9f37e583b..a9e1e4c55d 100644
--- a/osu.Game/Beatmaps/Formats/LegacyDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyDecoder.cs
@@ -85,13 +85,19 @@ namespace osu.Game.Beatmaps.Formats
string[] split = pair.Value.Split(',');
- if (split.Length != 3)
- throw new InvalidOperationException($@"Color specified in incorrect format (should be R,G,B): {pair.Value}");
+ if (split.Length != 3 && split.Length != 4)
+ throw new InvalidOperationException($@"Color specified in incorrect format (should be R,G,B or R,G,B,A): {pair.Value}");
- if (!byte.TryParse(split[0], out var r) || !byte.TryParse(split[1], out var g) || !byte.TryParse(split[2], out var b))
+ Color4 colour;
+
+ try
+ {
+ colour = new Color4(byte.Parse(split[0]), byte.Parse(split[1]), byte.Parse(split[2]), split.Length == 4 ? byte.Parse(split[3]) : (byte)255);
+ }
+ catch (Exception e)
+ {
throw new InvalidOperationException(@"Color must be specified with 8-bit integer components");
-
- Color4 colour = new Color4(r, g, b, 255);
+ }
if (isCombo)
{
diff --git a/osu.Game/Beatmaps/Formats/LegacyDifficultyCalculatorBeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyDifficultyCalculatorBeatmapDecoder.cs
new file mode 100644
index 0000000000..13a71aac3d
--- /dev/null
+++ b/osu.Game/Beatmaps/Formats/LegacyDifficultyCalculatorBeatmapDecoder.cs
@@ -0,0 +1,37 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Linq;
+using osu.Game.Beatmaps.ControlPoints;
+
+namespace osu.Game.Beatmaps.Formats
+{
+ ///
+ /// A built for difficulty calculation of legacy s
+ ///
+ /// To use this, the decoder must be registered by the application through .
+ /// Doing so will override any existing decoders.
+ ///
+ ///
+ public class LegacyDifficultyCalculatorBeatmapDecoder : LegacyBeatmapDecoder
+ {
+ public LegacyDifficultyCalculatorBeatmapDecoder(int version = LATEST_VERSION)
+ : base(version)
+ {
+ ApplyOffsets = false;
+ }
+
+ public new static void Register()
+ {
+ AddDecoder(@"osu file format v", m => new LegacyDifficultyCalculatorBeatmapDecoder(int.Parse(m.Split('v').Last())));
+ }
+
+ protected override TimingControlPoint CreateTimingControlPoint()
+ => new LegacyDifficultyCalculatorControlPoint();
+
+ private class LegacyDifficultyCalculatorControlPoint : TimingControlPoint
+ {
+ public override double BeatLength { get; set; } = 1000;
+ }
+ }
+}
diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index f7fe424aa9..9ac2cabe9f 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -83,8 +83,6 @@ namespace osu.Game.Configuration
Set(OsuSetting.ScoreDisplayMode, ScoringMode.Standardised);
- Set(OsuSetting.SpeedChangeVisualisation, SpeedChangeVisualisationMethod.Sequential);
-
Set(OsuSetting.IncreaseFirstObjectVisibility, true);
// Update
@@ -143,7 +141,6 @@ namespace osu.Game.Configuration
ChatDisplayHeight,
Version,
ShowConvertedBeatmaps,
- SpeedChangeVisualisation,
Skin,
ScreenshotFormat,
ScreenshotCaptureMenuCursor,
diff --git a/osu.Game/Configuration/SpeedChangeVisualisationMethod.cs b/osu.Game/Configuration/SpeedChangeVisualisationMethod.cs
index d38b1a89c5..39c6e5649c 100644
--- a/osu.Game/Configuration/SpeedChangeVisualisationMethod.cs
+++ b/osu.Game/Configuration/SpeedChangeVisualisationMethod.cs
@@ -10,6 +10,8 @@ namespace osu.Game.Configuration
[Description("Sequential")]
Sequential,
[Description("Overlapping")]
- Overlapping
+ Overlapping,
+ [Description("Constant")]
+ Constant
}
}
diff --git a/osu.Game/Database/ArchiveModelManager.cs b/osu.Game/Database/ArchiveModelManager.cs
index f4f169f27c..723bb90e7e 100644
--- a/osu.Game/Database/ArchiveModelManager.cs
+++ b/osu.Game/Database/ArchiveModelManager.cs
@@ -96,7 +96,8 @@ namespace osu.Game.Database
private void handleEvent(Action a)
{
if (delayingEvents)
- lock (queuedEvents) queuedEvents.Add(a);
+ lock (queuedEvents)
+ queuedEvents.Add(a);
else
a.Invoke();
}
@@ -281,17 +282,19 @@ namespace osu.Game.Database
/// Is a no-op for already deleted items.
///
/// The item to delete.
- public void Delete(TModel item)
+ /// false if no operation was performed
+ public bool Delete(TModel item)
{
using (ContextFactory.GetForWrite())
{
// re-fetch the model on the import context.
- var foundModel = queryModel().Include(s => s.Files).ThenInclude(f => f.FileInfo).First(s => s.ID == item.ID);
+ var foundModel = queryModel().Include(s => s.Files).ThenInclude(f => f.FileInfo).FirstOrDefault(s => s.ID == item.ID);
- if (foundModel.DeletePending) return;
+ if (foundModel == null || foundModel.DeletePending) return false;
if (ModelStore.Delete(foundModel))
Files.Dereference(foundModel.Files.Select(f => f.FileInfo).ToArray());
+ return true;
}
}
@@ -438,6 +441,13 @@ namespace osu.Game.Database
return Task.CompletedTask;
}
+ if (!stable.ExistsDirectory(ImportFromStablePath))
+ {
+ // This handles situations like when the user does not have a Skins folder
+ Logger.Log($"No {ImportFromStablePath} folder available in osu!stable installation", LoggingTarget.Information, LogLevel.Error);
+ return Task.CompletedTask;
+ }
+
return Task.Factory.StartNew(() => Import(stable.GetDirectories(ImportFromStablePath).Select(f => stable.GetFullPath(f)).ToArray()), TaskCreationOptions.LongRunning);
}
diff --git a/osu.Game/Graphics/Backgrounds/Background.cs b/osu.Game/Graphics/Backgrounds/Background.cs
index 6fc8b0e070..d3d530a540 100644
--- a/osu.Game/Graphics/Backgrounds/Background.cs
+++ b/osu.Game/Graphics/Backgrounds/Background.cs
@@ -6,7 +6,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
-using OpenTK.Graphics;
namespace osu.Game.Graphics.Backgrounds
{
@@ -28,7 +27,6 @@ namespace osu.Game.Graphics.Backgrounds
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Colour = Color4.DarkGray,
FillMode = FillMode.Fill,
});
}
diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs
index 0f382900ce..4a86d0e4f6 100644
--- a/osu.Game/Graphics/Backgrounds/Triangles.cs
+++ b/osu.Game/Graphics/Backgrounds/Triangles.cs
@@ -30,10 +30,6 @@ namespace osu.Game.Graphics.Backgrounds
///
private const float edge_smoothness = 1;
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
-
public Color4 ColourLight = Color4.White;
public Color4 ColourDark = Color4.Black;
diff --git a/osu.Game/Graphics/Containers/LinkFlowContainer.cs b/osu.Game/Graphics/Containers/LinkFlowContainer.cs
index 9c5da71aff..e4e7828d0e 100644
--- a/osu.Game/Graphics/Containers/LinkFlowContainer.cs
+++ b/osu.Game/Graphics/Containers/LinkFlowContainer.cs
@@ -20,8 +20,6 @@ namespace osu.Game.Graphics.Containers
{
}
- public override bool HandleMouseInput => true;
-
private OsuGame game;
private Action showNotImplementedError;
diff --git a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
index d2ab8441eb..2aa3fede2c 100644
--- a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
@@ -8,7 +8,7 @@ using osu.Framework.Graphics.Containers;
using OpenTK;
using osu.Framework.Configuration;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Audio;
using osu.Game.Input.Bindings;
using osu.Game.Overlays;
@@ -22,7 +22,7 @@ namespace osu.Game.Graphics.Containers
protected virtual bool PlaySamplesOnStateChange => true;
- protected override bool BlockPassThroughKeyboard => true;
+ protected override bool BlockNonPositionalInput => true;
private PreviewTrackManager previewTrackManager;
@@ -54,20 +54,20 @@ namespace osu.Game.Graphics.Containers
/// Whether mouse input should be blocked screen-wide while this overlay is visible.
/// Performing mouse actions outside of the valid extents will hide the overlay.
///
- public virtual bool BlockScreenWideMouse => BlockPassThroughMouse;
+ public virtual bool BlockScreenWideMouse => BlockPositionalInput;
// receive input outside our bounds so we can trigger a close event on ourselves.
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => BlockScreenWideMouse || base.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => BlockScreenWideMouse || base.ReceivePositionalInputAt(screenSpacePos);
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
- if (!base.ReceiveMouseInputAt(state.Mouse.NativeState.Position))
+ if (!base.ReceivePositionalInputAt(e.ScreenSpaceMousePosition))
{
State = Visibility.Hidden;
return true;
}
- return base.OnClick(state);
+ return base.OnClick(e);
}
public virtual bool OnPressed(GlobalAction action)
diff --git a/osu.Game/Graphics/Containers/OsuHoverContainer.cs b/osu.Game/Graphics/Containers/OsuHoverContainer.cs
index 12df19e7c0..577d889be3 100644
--- a/osu.Game/Graphics/Containers/OsuHoverContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuHoverContainer.cs
@@ -6,7 +6,7 @@ using OpenTK.Graphics;
using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.Containers
{
@@ -18,16 +18,16 @@ namespace osu.Game.Graphics.Containers
protected virtual IEnumerable EffectTargets => new[] { Content };
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
EffectTargets.ForEach(d => d.FadeColour(HoverColour, 500, Easing.OutQuint));
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
EffectTargets.ForEach(d => d.FadeColour(IdleColour, 500, Easing.OutQuint));
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Graphics/Containers/OsuScrollContainer.cs b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
index 6d42be6fca..4f18eb9e7b 100644
--- a/osu.Game/Graphics/Containers/OsuScrollContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
@@ -2,8 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK.Input;
namespace osu.Game.Graphics.Containers
@@ -21,7 +20,7 @@ namespace osu.Game.Graphics.Containers
///
public double DistanceDecayOnRightMouseScrollbar = 0.02;
- private bool shouldPerformRightMouseScroll(InputState state) => RightMouseScrollbar && state.Mouse.IsPressed(MouseButton.Right);
+ private bool shouldPerformRightMouseScroll(MouseButtonEvent e) => RightMouseScrollbar && e.Button == MouseButton.Right;
private void scrollToRelative(float value) => ScrollTo(Clamp((value - Scrollbar.DrawSize[ScrollDim] / 2) / Scrollbar.Size[ScrollDim]), true, DistanceDecayOnRightMouseScrollbar);
@@ -29,40 +28,40 @@ namespace osu.Game.Graphics.Containers
protected override bool IsDragging => base.IsDragging || mouseScrollBarDragging;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- if (shouldPerformRightMouseScroll(state))
+ if (shouldPerformRightMouseScroll(e))
{
- scrollToRelative(state.Mouse.Position[ScrollDim]);
+ scrollToRelative(e.MousePosition[ScrollDim]);
return true;
}
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
if (mouseScrollBarDragging)
{
- scrollToRelative(state.Mouse.Position[ScrollDim]);
+ scrollToRelative(e.MousePosition[ScrollDim]);
return true;
}
- return base.OnDrag(state);
+ return base.OnDrag(e);
}
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
- if (shouldPerformRightMouseScroll(state))
+ if (shouldPerformRightMouseScroll(e))
{
mouseScrollBarDragging = true;
return true;
}
- return base.OnDragStart(state);
+ return base.OnDragStart(e);
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
if (mouseScrollBarDragging)
{
@@ -70,7 +69,7 @@ namespace osu.Game.Graphics.Containers
return true;
}
- return base.OnDragEnd(state);
+ return base.OnDragEnd(e);
}
}
}
diff --git a/osu.Game/Graphics/Containers/ParallaxContainer.cs b/osu.Game/Graphics/Containers/ParallaxContainer.cs
index 8e1e5d54fa..a6b79a20dc 100644
--- a/osu.Game/Graphics/Containers/ParallaxContainer.cs
+++ b/osu.Game/Graphics/Containers/ParallaxContainer.cs
@@ -67,7 +67,7 @@ namespace osu.Game.Graphics.Containers
if (parallaxEnabled)
{
- Vector2 offset = (input.CurrentState.Mouse == null ? Vector2.Zero : ToLocalSpace(input.CurrentState.Mouse.NativeState.Position) - DrawSize / 2) * ParallaxAmount;
+ Vector2 offset = (input.CurrentState.Mouse == null ? Vector2.Zero : ToLocalSpace(input.CurrentState.Mouse.Position) - DrawSize / 2) * ParallaxAmount;
double elapsed = MathHelper.Clamp(Clock.ElapsedFrameTime, 0, 1000);
diff --git a/osu.Game/Graphics/Cursor/MenuCursor.cs b/osu.Game/Graphics/Cursor/MenuCursor.cs
index b55e1aa5dd..ba858bf52d 100644
--- a/osu.Game/Graphics/Cursor/MenuCursor.cs
+++ b/osu.Game/Graphics/Cursor/MenuCursor.cs
@@ -12,8 +12,7 @@ using osu.Game.Configuration;
using System;
using JetBrains.Annotations;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK.Input;
namespace osu.Game.Graphics.Cursor
@@ -40,11 +39,11 @@ namespace osu.Game.Graphics.Cursor
screenshotCursorVisibility.BindTo(screenshotManager.CursorVisibility);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
if (dragRotationState != DragRotationState.NotDragging)
{
- var position = state.Mouse.Position;
+ var position = e.MousePosition;
var distance = Vector2Extensions.Distance(position, positionMouseDown);
// don't start rotating until we're moved a minimum distance away from the mouse down location,
// else it can have an annoying effect.
@@ -53,7 +52,7 @@ namespace osu.Game.Graphics.Cursor
// don't rotate when distance is zero to avoid NaN
if (dragRotationState == DragRotationState.Rotating && distance > 0)
{
- Vector2 offset = state.Mouse.Position - positionMouseDown;
+ Vector2 offset = e.MousePosition - positionMouseDown;
float degrees = (float)MathHelper.RadiansToDegrees(Math.Atan2(-offset.X, offset.Y)) + 24.3f;
// Always rotate in the direction of least distance
@@ -66,13 +65,13 @@ namespace osu.Game.Graphics.Cursor
}
}
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
// only trigger animation for main mouse buttons
- if (args.Button <= MouseButton.Right)
+ if (e.Button <= MouseButton.Right)
{
activeCursor.Scale = new Vector2(1);
activeCursor.ScaleTo(0.90f, 800, Easing.OutQuint);
@@ -81,29 +80,29 @@ namespace osu.Game.Graphics.Cursor
activeCursor.AdditiveLayer.FadeInFromZero(800, Easing.OutQuint);
}
- if (args.Button == MouseButton.Left && cursorRotate)
+ if (e.Button == MouseButton.Left && cursorRotate)
{
dragRotationState = DragRotationState.DragStarted;
- positionMouseDown = state.Mouse.Position;
+ positionMouseDown = e.MousePosition;
}
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- if (!state.Mouse.HasMainButtonPressed)
+ if (!e.IsPressed(MouseButton.Left) && !e.IsPressed(MouseButton.Right))
{
activeCursor.AdditiveLayer.FadeOutFromOne(500, Easing.OutQuint);
activeCursor.ScaleTo(1, 500, Easing.OutElastic);
}
- if (args.Button == MouseButton.Left)
+ if (e.Button == MouseButton.Left)
{
if (dragRotationState == DragRotationState.Rotating)
activeCursor.RotateTo(0, 600 * (1 + Math.Abs(activeCursor.Rotation / 720)), Easing.OutElasticHalf);
dragRotationState = DragRotationState.NotDragging;
}
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
protected override void PopIn()
diff --git a/osu.Game/Graphics/DrawableDate.cs b/osu.Game/Graphics/DrawableDate.cs
index be794d93a6..28f8bdf82f 100644
--- a/osu.Game/Graphics/DrawableDate.cs
+++ b/osu.Game/Graphics/DrawableDate.cs
@@ -54,8 +54,6 @@ namespace osu.Game.Graphics
Scheduler.AddDelayed(updateTimeWithReschedule, timeUntilNextUpdate);
}
- public override bool HandleMouseInput => true;
-
protected virtual string Format() => Date.Humanize();
private void updateTime() => Text = Format();
diff --git a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
index f5017de639..ebb7b686e4 100644
--- a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
+++ b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
@@ -47,10 +47,10 @@ namespace osu.Game.Graphics.UserInterface
public readonly SpriteIcon Chevron;
//don't allow clicking between transitions and don't make the chevron clickable
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => Alpha == 1f && Text.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Alpha == 1f && Text.ReceivePositionalInputAt(screenSpacePos);
- public override bool HandleKeyboardInput => State == Visibility.Visible;
- public override bool HandleMouseInput => State == Visibility.Visible;
+ public override bool HandleNonPositionalInput => State == Visibility.Visible;
+ public override bool HandlePositionalInput => State == Visibility.Visible;
public override bool IsRemovable => true;
private Visibility state;
diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs
index ee2448ff02..b2220267ff 100644
--- a/osu.Game/Graphics/UserInterface/DialogButton.cs
+++ b/osu.Game/Graphics/UserInterface/DialogButton.cs
@@ -13,7 +13,7 @@ using osu.Game.Graphics.Sprites;
using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Graphics.Containers;
using osu.Framework.Configuration;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -211,9 +211,9 @@ namespace osu.Game.Graphics.UserInterface
}
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => backgroundContainer.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => backgroundContainer.ReceivePositionalInputAt(screenSpacePos);
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, Easing.In);
flash();
@@ -225,20 +225,20 @@ namespace osu.Game.Graphics.UserInterface
glowContainer.FadeOut();
});
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
- base.OnHover(state);
+ base.OnHover(e);
Selected.Value = true;
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
Selected.Value = false;
}
diff --git a/osu.Game/Graphics/UserInterface/ExternalLinkButton.cs b/osu.Game/Graphics/UserInterface/ExternalLinkButton.cs
index fe8995f310..d82448e8a2 100644
--- a/osu.Game/Graphics/UserInterface/ExternalLinkButton.cs
+++ b/osu.Game/Graphics/UserInterface/ExternalLinkButton.cs
@@ -5,7 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Platform;
using OpenTK;
using OpenTK.Graphics;
@@ -37,19 +37,19 @@ namespace osu.Game.Graphics.UserInterface
this.host = host;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
InternalChild.FadeColour(hoverColour, 500, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
InternalChild.FadeColour(Color4.White, 500, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if(Link != null)
host.OpenUrlExternally(Link);
diff --git a/osu.Game/Graphics/UserInterface/FocusedTextBox.cs b/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
index e4fd71e17e..122ac7b627 100644
--- a/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
@@ -3,8 +3,7 @@
using OpenTK.Graphics;
using System;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Input.Bindings;
using OpenTK.Input;
@@ -34,22 +33,22 @@ namespace osu.Game.Graphics.UserInterface
}
// We may not be focused yet, but we need to handle keyboard input to be able to request focus
- public override bool HandleKeyboardInput => HoldFocus || base.HandleKeyboardInput;
+ public override bool HandleNonPositionalInput => HoldFocus || base.HandleNonPositionalInput;
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
- base.OnFocus(state);
+ base.OnFocus(e);
BorderThickness = 0;
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
if (!HasFocus) return false;
- if (args.Key == Key.Escape)
+ if (e.Key == Key.Escape)
return false; // disable the framework-level handling of escape key for confority (we use GlobalAction.Back).
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
public override bool OnPressed(GlobalAction action)
diff --git a/osu.Game/Graphics/UserInterface/HoverClickSounds.cs b/osu.Game/Graphics/UserInterface/HoverClickSounds.cs
index 27a06ba0b7..3641e251bc 100644
--- a/osu.Game/Graphics/UserInterface/HoverClickSounds.cs
+++ b/osu.Game/Graphics/UserInterface/HoverClickSounds.cs
@@ -5,7 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Extensions;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -21,10 +21,10 @@ namespace osu.Game.Graphics.UserInterface
{
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
sampleClick?.Play();
- return base.OnClick(state);
+ return base.OnClick(e);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Graphics/UserInterface/HoverSounds.cs b/osu.Game/Graphics/UserInterface/HoverSounds.cs
index 821305bc92..710948121e 100644
--- a/osu.Game/Graphics/UserInterface/HoverSounds.cs
+++ b/osu.Game/Graphics/UserInterface/HoverSounds.cs
@@ -8,7 +8,7 @@ using osu.Framework.Audio.Sample;
using osu.Framework.Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -28,10 +28,10 @@ namespace osu.Game.Graphics.UserInterface
RelativeSizeAxes = Axes.Both;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
sampleHover?.Play();
- return base.OnHover(state);
+ return base.OnHover(e);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Graphics/UserInterface/IconButton.cs b/osu.Game/Graphics/UserInterface/IconButton.cs
index be60812ba6..f10f03873d 100644
--- a/osu.Game/Graphics/UserInterface/IconButton.cs
+++ b/osu.Game/Graphics/UserInterface/IconButton.cs
@@ -4,7 +4,7 @@
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Graphics;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -84,16 +84,16 @@ namespace osu.Game.Graphics.UserInterface
});
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
icon.FadeColour(IconHoverColour, 500, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
icon.FadeColour(IconColour, 500, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Graphics/UserInterface/LineGraph.cs b/osu.Game/Graphics/UserInterface/LineGraph.cs
index 3cb2446acc..ff2c4cf7cd 100644
--- a/osu.Game/Graphics/UserInterface/LineGraph.cs
+++ b/osu.Game/Graphics/UserInterface/LineGraph.cs
@@ -69,7 +69,7 @@ namespace osu.Game.Graphics.UserInterface
{
Masking = true,
RelativeSizeAxes = Axes.Both,
- Child = path = new Path { RelativeSizeAxes = Axes.Both, PathWidth = 1 }
+ Child = path = new SmoothPath { RelativeSizeAxes = Axes.Both, PathWidth = 1 }
});
}
diff --git a/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs b/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
index 4428a058db..4516d7ce76 100644
--- a/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
+++ b/osu.Game/Graphics/UserInterface/OsuAnimatedButton.cs
@@ -6,8 +6,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
using OpenTK.Graphics;
@@ -77,34 +76,34 @@ namespace osu.Game.Graphics.UserInterface
Enabled.BindValueChanged(enabled => this.FadeColour(enabled ? Color4.White : colours.Gray9, 200, Easing.OutQuint), true);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
hover.FadeIn(500, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
hover.FadeOut(500, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
hover.FlashColour(FlashColour, 800, Easing.OutQuint);
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
Content.ScaleTo(0.75f, 2000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
Content.ScaleTo(1, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
}
}
diff --git a/osu.Game/Graphics/UserInterface/OsuButton.cs b/osu.Game/Graphics/UserInterface/OsuButton.cs
index bb6a032a12..ab880cd473 100644
--- a/osu.Game/Graphics/UserInterface/OsuButton.cs
+++ b/osu.Game/Graphics/UserInterface/OsuButton.cs
@@ -7,8 +7,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Sprites;
using OpenTK.Graphics;
@@ -56,28 +55,28 @@ namespace osu.Game.Graphics.UserInterface
this.FadeColour(enabled ? Color4.White : Color4.Gray, 200, Easing.OutQuint);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
hover.FadeIn(200);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
hover.FadeOut(200);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
Content.ScaleTo(0.9f, 4000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
Content.ScaleTo(1, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
protected override SpriteText CreateText() => new OsuSpriteText
diff --git a/osu.Game/Graphics/UserInterface/OsuCheckbox.cs b/osu.Game/Graphics/UserInterface/OsuCheckbox.cs
index 68f59bd8cd..e267a7f848 100644
--- a/osu.Game/Graphics/UserInterface/OsuCheckbox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuCheckbox.cs
@@ -8,7 +8,7 @@ using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Sprites;
using OpenTK.Graphics;
@@ -95,18 +95,18 @@ namespace osu.Game.Graphics.UserInterface
};
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Nub.Glowing = true;
Nub.Expanded = true;
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
Nub.Glowing = false;
Nub.Expanded = false;
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs
index 830bde9dac..04a7cb64d3 100644
--- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs
+++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs
@@ -51,6 +51,8 @@ namespace osu.Game.Graphics.UserInterface
#region OsuDropdownMenu
protected class OsuDropdownMenu : DropdownMenu, IHasAccentColour
{
+ public override bool HandleNonPositionalInput => State == MenuState.Open;
+
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
public OsuDropdownMenu()
{
@@ -97,6 +99,9 @@ namespace osu.Game.Graphics.UserInterface
#region DrawableOsuDropdownMenuItem
public class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem, IHasAccentColour
{
+ // IsHovered is used
+ public override bool HandlePositionalInput => true;
+
private Color4? accentColour;
public Color4 AccentColour
{
diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs
index abb077e94f..fe3e866a70 100644
--- a/osu.Game/Graphics/UserInterface/OsuMenu.cs
+++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Sprites;
using OpenTK;
@@ -97,25 +97,25 @@ namespace osu.Game.Graphics.UserInterface
}
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
sampleHover.Play();
text.BoldText.FadeIn(transition_length, Easing.OutQuint);
text.NormalText.FadeOut(transition_length, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
text.BoldText.FadeOut(transition_length, Easing.OutQuint);
text.NormalText.FadeIn(transition_length, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
sampleClick.Play();
- return base.OnClick(state);
+ return base.OnClick(e);
}
protected sealed override Drawable CreateContent() => text = CreateTextContainer();
diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
index 75655ddb36..f4ec67db23 100644
--- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
@@ -9,8 +9,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Platform;
namespace osu.Game.Graphics.UserInterface
@@ -43,23 +42,23 @@ namespace osu.Game.Graphics.UserInterface
this.host = host;
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Key == Key.CapsLock)
+ if (e.Key == Key.CapsLock)
updateCapsWarning(host.CapsLockEnabled);
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
updateCapsWarning(host.CapsLockEnabled);
- base.OnFocus(state);
+ base.OnFocus(e);
}
- protected override void OnFocusLost(InputState state)
+ protected override void OnFocusLost(FocusLostEvent e)
{
updateCapsWarning(false);
- base.OnFocusLost(state);
+ base.OnFocusLost(e);
}
private void updateCapsWarning(bool visible) => warning.FadeTo(visible ? 1 : 0, 250, Easing.OutQuint);
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index b7b5319e06..eecc10469e 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -13,8 +13,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -125,16 +124,16 @@ namespace osu.Game.Graphics.UserInterface
AccentColour = colours.Pink;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Nub.Glowing = true;
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
Nub.Glowing = false;
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
protected override void OnUserChange()
@@ -164,16 +163,16 @@ namespace osu.Game.Graphics.UserInterface
sample.Play();
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
Nub.Current.Value = true;
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
Nub.Current.Value = false;
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
protected override void UpdateAfterChildren()
diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
index e2a0b88b2a..24183e07a0 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
@@ -14,7 +14,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Graphics.Sprites;
@@ -126,14 +126,14 @@ namespace osu.Game.Graphics.UserInterface
Text.FadeColour(AccentColour, transition_length, Easing.OutQuint);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (!Active)
fadeActive();
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (!Active)
fadeInactive();
@@ -265,16 +265,16 @@ namespace osu.Game.Graphics.UserInterface
Padding = new MarginPadding { Left = 5, Right = 5 };
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Foreground.Colour = BackgroundColour;
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
Foreground.Colour = BackgroundColourHover;
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
index 04ba111153..1355ffdb8e 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics.Shapes;
using osu.Game.Graphics.Sprites;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -59,18 +59,18 @@ namespace osu.Game.Graphics.UserInterface
text.FadeColour(AccentColour, transition_length, Easing.OutQuint);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
fadeIn();
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (!Current)
fadeOut();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Graphics/UserInterface/OsuTextBox.cs b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
index 7a45ffdd4b..37464faa73 100644
--- a/osu.Game/Graphics/UserInterface/OsuTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
@@ -9,7 +9,7 @@ using osu.Game.Graphics.Sprites;
using OpenTK.Graphics;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Input.Bindings;
namespace osu.Game.Graphics.UserInterface
@@ -44,17 +44,17 @@ namespace osu.Game.Graphics.UserInterface
BorderColour = colour.Yellow;
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
BorderThickness = 3;
- base.OnFocus(state);
+ base.OnFocus(e);
}
- protected override void OnFocusLost(InputState state)
+ protected override void OnFocusLost(FocusLostEvent e)
{
BorderThickness = 0;
- base.OnFocusLost(state);
+ base.OnFocusLost(e);
}
protected override Drawable GetDrawableCharacter(char c) => new OsuSpriteText { Text = c.ToString(), TextSize = CalculatedTextSize };
diff --git a/osu.Game/Graphics/UserInterface/PageTabControl.cs b/osu.Game/Graphics/UserInterface/PageTabControl.cs
index d203532f9c..fb7b4c5676 100644
--- a/osu.Game/Graphics/UserInterface/PageTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/PageTabControl.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Sprites;
namespace osu.Game.Graphics.UserInterface
@@ -67,14 +67,14 @@ namespace osu.Game.Graphics.UserInterface
box.Colour = colours.Yellow;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (!Active)
slideActive();
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (!Active)
slideInactive();
diff --git a/osu.Game/Graphics/UserInterface/SearchTextBox.cs b/osu.Game/Graphics/UserInterface/SearchTextBox.cs
index 6067481979..08e93fad18 100644
--- a/osu.Game/Graphics/UserInterface/SearchTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/SearchTextBox.cs
@@ -2,8 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK;
using OpenTK.Input;
@@ -33,11 +32,11 @@ namespace osu.Game.Graphics.UserInterface
PlaceholderText = "type to search";
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (!state.Keyboard.ControlPressed && !state.Keyboard.ShiftPressed)
+ if (!e.ControlPressed && !e.ShiftPressed)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.Left:
case Key.Right:
@@ -49,7 +48,7 @@ namespace osu.Game.Graphics.UserInterface
if (!AllowCommit)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.KeypadEnter:
case Key.Enter:
@@ -57,16 +56,16 @@ namespace osu.Game.Graphics.UserInterface
}
}
- if (state.Keyboard.ShiftPressed)
+ if (e.ShiftPressed)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.Delete:
return false;
}
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
}
}
diff --git a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
index 4e6361d1ae..2000eb47e4 100644
--- a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
+++ b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
@@ -13,8 +13,7 @@ using osu.Game.Beatmaps.ControlPoints;
using osu.Framework.Audio.Track;
using System;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Graphics.UserInterface
{
@@ -170,9 +169,9 @@ namespace osu.Game.Graphics.UserInterface
}
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => IconLayer.ReceiveMouseInputAt(screenSpacePos) || TextLayer.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => IconLayer.ReceivePositionalInputAt(screenSpacePos) || TextLayer.ReceivePositionalInputAt(screenSpacePos);
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
this.ResizeTo(SIZE_EXTENDED, transform_time, Easing.OutElastic);
IconLayer.FadeColour(HoverColour, transform_time, Easing.OutElastic);
@@ -182,7 +181,7 @@ namespace osu.Game.Graphics.UserInterface
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
this.ResizeTo(SIZE_RETRACTED, transform_time, Easing.OutElastic);
IconLayer.FadeColour(TextLayer.Colour, transform_time, Easing.OutElastic);
@@ -190,12 +189,12 @@ namespace osu.Game.Graphics.UserInterface
bouncingIcon.ScaleTo(1, transform_time, Easing.OutElastic);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
return true;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
var flash = new Box
{
@@ -209,7 +208,7 @@ namespace osu.Game.Graphics.UserInterface
flash.FadeOut(500, Easing.OutQuint);
flash.Expire();
- return base.OnClick(state);
+ return base.OnClick(e);
}
private class BouncingIcon : BeatSyncedContainer
diff --git a/osu.Game/IPC/ArchiveImportIPCChannel.cs b/osu.Game/IPC/ArchiveImportIPCChannel.cs
index 6783b9712c..fa8168c1de 100644
--- a/osu.Game/IPC/ArchiveImportIPCChannel.cs
+++ b/osu.Game/IPC/ArchiveImportIPCChannel.cs
@@ -37,7 +37,7 @@ namespace osu.Game.IPC
return;
}
- if (importer.HandledExtensions.Contains(Path.GetExtension(path)))
+ if (importer.HandledExtensions.Contains(Path.GetExtension(path)?.ToLowerInvariant()))
importer.Import(path);
}
}
diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs
index b21deff509..2f5f1aea3f 100644
--- a/osu.Game/Input/Bindings/GlobalActionContainer.cs
+++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs
@@ -71,17 +71,17 @@ namespace osu.Game.Input.Bindings
ToggleSettings,
[Description("Toggle osu!direct")]
ToggleDirect,
- [Description("Increase Volume")]
+ [Description("Increase volume")]
IncreaseVolume,
- [Description("Decrease Volume")]
+ [Description("Decrease volume")]
DecreaseVolume,
[Description("Toggle mute")]
ToggleMute,
// In-Game Keybindings
- [Description("Skip Cutscene")]
+ [Description("Skip cutscene")]
SkipCutscene,
- [Description("Quick Retry (Hold)")]
+ [Description("Quick retry (hold)")]
QuickRetry,
[Description("Take screenshot")]
diff --git a/osu.Game/Online/API/OAuth.cs b/osu.Game/Online/API/OAuth.cs
index 67b908e894..7892df9aab 100644
--- a/osu.Game/Online/API/OAuth.cs
+++ b/osu.Game/Online/API/OAuth.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Diagnostics;
+using System.Net.Http;
using osu.Framework.Configuration;
using osu.Framework.IO.Network;
@@ -40,7 +41,7 @@ namespace osu.Game.Online.API
using (var req = new AccessTokenRequestPassword(username, password)
{
Url = $@"{endpoint}/oauth/token",
- Method = HttpMethod.POST,
+ Method = HttpMethod.Post,
ClientId = clientId,
ClientSecret = clientSecret
})
@@ -66,7 +67,7 @@ namespace osu.Game.Online.API
using (var req = new AccessTokenRequestRefresh(refresh)
{
Url = $@"{endpoint}/oauth/token",
- Method = HttpMethod.POST,
+ Method = HttpMethod.Post,
ClientId = clientId,
ClientSecret = clientSecret
})
diff --git a/osu.Game/Online/API/Requests/GetMessagesRequest.cs b/osu.Game/Online/API/Requests/GetMessagesRequest.cs
index 68de194bae..94f5a114ad 100644
--- a/osu.Game/Online/API/Requests/GetMessagesRequest.cs
+++ b/osu.Game/Online/API/Requests/GetMessagesRequest.cs
@@ -2,34 +2,19 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Collections.Generic;
-using System.Linq;
-using osu.Framework.IO.Network;
using osu.Game.Online.Chat;
namespace osu.Game.Online.API.Requests
{
public class GetMessagesRequest : APIRequest>
{
- private readonly List channels;
- private readonly long? since;
+ private readonly Channel channel;
- public GetMessagesRequest(List channels, long? sinceId)
+ public GetMessagesRequest(Channel channel)
{
- this.channels = channels;
- since = sinceId;
+ this.channel = channel;
}
- protected override WebRequest CreateWebRequest()
- {
- string channelString = string.Join(",", channels.Select(x => x.Id));
-
- var req = base.CreateWebRequest();
- req.AddParameter(@"channels", channelString);
- if (since.HasValue) req.AddParameter(@"since", since.Value.ToString());
-
- return req;
- }
-
- protected override string Target => @"chat/messages";
+ protected override string Target => $@"chat/channels/{channel.Id}/messages";
}
}
diff --git a/osu.Game/Online/API/Requests/GetUpdatesRequest.cs b/osu.Game/Online/API/Requests/GetUpdatesRequest.cs
new file mode 100644
index 0000000000..950ad93396
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetUpdatesRequest.cs
@@ -0,0 +1,32 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using JetBrains.Annotations;
+using osu.Framework.IO.Network;
+using osu.Game.Online.Chat;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetUpdatesRequest : APIRequest
+ {
+ private readonly long since;
+ private readonly Channel channel;
+
+ public GetUpdatesRequest(long sinceId, [CanBeNull] Channel channel = null)
+ {
+ this.channel = channel;
+ since = sinceId;
+ }
+
+ protected override WebRequest CreateWebRequest()
+ {
+ var req = base.CreateWebRequest();
+ if (channel != null) req.AddParameter(@"channel", channel.Id.ToString());
+ req.AddParameter(@"since", since.ToString());
+
+ return req;
+ }
+
+ protected override string Target => @"chat/updates";
+ }
+}
diff --git a/osu.Game/Online/API/Requests/GetUpdatesResponse.cs b/osu.Game/Online/API/Requests/GetUpdatesResponse.cs
new file mode 100644
index 0000000000..474d8e1501
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetUpdatesResponse.cs
@@ -0,0 +1,18 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Collections.Generic;
+using Newtonsoft.Json;
+using osu.Game.Online.Chat;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetUpdatesResponse
+ {
+ [JsonProperty]
+ public List Presence;
+
+ [JsonProperty]
+ public List Messages;
+ }
+}
diff --git a/osu.Game/Online/API/Requests/JoinChannelRequest.cs b/osu.Game/Online/API/Requests/JoinChannelRequest.cs
new file mode 100644
index 0000000000..a0a4667e98
--- /dev/null
+++ b/osu.Game/Online/API/Requests/JoinChannelRequest.cs
@@ -0,0 +1,31 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Net.Http;
+using osu.Framework.IO.Network;
+using osu.Game.Online.Chat;
+using osu.Game.Users;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class JoinChannelRequest : APIRequest
+ {
+ private readonly Channel channel;
+ private readonly User user;
+
+ public JoinChannelRequest(Channel channel, User user)
+ {
+ this.channel = channel;
+ this.user = user;
+ }
+
+ protected override WebRequest CreateWebRequest()
+ {
+ var req = base.CreateWebRequest();
+ req.Method = HttpMethod.Put;
+ return req;
+ }
+
+ protected override string Target => $@"chat/channels/{channel.Id}/users/{user.Id}";
+ }
+}
diff --git a/osu.Game/Online/API/Requests/LeaveChannelRequest.cs b/osu.Game/Online/API/Requests/LeaveChannelRequest.cs
new file mode 100644
index 0000000000..89bfa303c6
--- /dev/null
+++ b/osu.Game/Online/API/Requests/LeaveChannelRequest.cs
@@ -0,0 +1,31 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Net.Http;
+using osu.Framework.IO.Network;
+using osu.Game.Online.Chat;
+using osu.Game.Users;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class LeaveChannelRequest : APIRequest
+ {
+ private readonly Channel channel;
+ private readonly User user;
+
+ public LeaveChannelRequest(Channel channel, User user)
+ {
+ this.channel = channel;
+ this.user = user;
+ }
+
+ protected override WebRequest CreateWebRequest()
+ {
+ var req = base.CreateWebRequest();
+ req.Method = HttpMethod.Delete;
+ return req;
+ }
+
+ protected override string Target => $@"chat/channels/{channel.Id}/users/{user.Id}";
+ }
+}
diff --git a/osu.Game/Online/API/Requests/PostMessageRequest.cs b/osu.Game/Online/API/Requests/PostMessageRequest.cs
index e0a9fb83b2..8d9ba5dd5d 100644
--- a/osu.Game/Online/API/Requests/PostMessageRequest.cs
+++ b/osu.Game/Online/API/Requests/PostMessageRequest.cs
@@ -1,7 +1,7 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Extensions;
+using System.Net.Http;
using osu.Framework.IO.Network;
using osu.Game.Online.Chat;
@@ -20,15 +20,13 @@ namespace osu.Game.Online.API.Requests
{
var req = base.CreateWebRequest();
- req.Method = HttpMethod.POST;
- req.AddParameter(@"target_type", message.TargetType.GetDescription());
- req.AddParameter(@"target_id", message.TargetId.ToString());
+ req.Method = HttpMethod.Post;
req.AddParameter(@"is_action", message.IsAction.ToString().ToLowerInvariant());
req.AddParameter(@"message", message.Content);
return req;
}
- protected override string Target => @"chat/messages";
+ protected override string Target => $@"chat/channels/{message.ChannelId}/messages";
}
}
diff --git a/osu.Game/Online/Chat/Channel.cs b/osu.Game/Online/Chat/Channel.cs
index e7aabad780..bbe74fcac0 100644
--- a/osu.Game/Online/Chat/Channel.cs
+++ b/osu.Game/Online/Chat/Channel.cs
@@ -19,11 +19,14 @@ namespace osu.Game.Online.Chat
public string Topic;
[JsonProperty(@"type")]
- public string Type;
+ public ChannelType Type;
[JsonProperty(@"channel_id")]
public int Id;
+ [JsonProperty(@"last_message_id")]
+ public long? LastMessageId;
+
public readonly SortedList Messages = new SortedList(Comparer.Default);
private readonly List pendingMessages = new List();
@@ -51,11 +54,20 @@ namespace osu.Game.Online.Chat
NewMessagesArrived?.Invoke(new[] { message });
}
+ public bool MessagesLoaded { get; private set; }
+
public void AddNewMessages(params Message[] messages)
{
messages = messages.Except(Messages).ToArray();
+ if (messages.Length == 0) return;
+
Messages.AddRange(messages);
+ MessagesLoaded = true;
+
+ var maxMessageId = messages.Max(m => m.Id);
+ if (maxMessageId > LastMessageId)
+ LastMessageId = maxMessageId;
purgeOldMessages();
diff --git a/osu.Game/Online/Chat/ChannelType.cs b/osu.Game/Online/Chat/ChannelType.cs
new file mode 100644
index 0000000000..4ac0a99fc6
--- /dev/null
+++ b/osu.Game/Online/Chat/ChannelType.cs
@@ -0,0 +1,11 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+namespace osu.Game.Online.Chat
+{
+ public enum ChannelType
+ {
+ PM,
+ Public
+ }
+}
diff --git a/osu.Game/Online/Chat/DrawableLinkCompiler.cs b/osu.Game/Online/Chat/DrawableLinkCompiler.cs
index 475363bd51..0148d1d2c3 100644
--- a/osu.Game/Online/Chat/DrawableLinkCompiler.cs
+++ b/osu.Game/Online/Chat/DrawableLinkCompiler.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Online.Chat
///
public List Parts;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => Parts.Any(d => d.ReceiveMouseInputAt(screenSpacePos));
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Parts.Any(d => d.ReceivePositionalInputAt(screenSpacePos));
protected override HoverClickSounds CreateHoverClickSounds(HoverSampleSet sampleSet) => new LinkHoverSounds(sampleSet, Parts);
@@ -53,7 +53,7 @@ namespace osu.Game.Online.Chat
this.parts = parts;
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => parts.Any(d => d.ReceiveMouseInputAt(screenSpacePos));
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => parts.Any(d => d.ReceivePositionalInputAt(screenSpacePos));
}
}
}
diff --git a/osu.Game/Online/Chat/Message.cs b/osu.Game/Online/Chat/Message.cs
index 535035e4fc..65e0415cd3 100644
--- a/osu.Game/Online/Chat/Message.cs
+++ b/osu.Game/Online/Chat/Message.cs
@@ -18,11 +18,8 @@ namespace osu.Game.Online.Chat
[JsonProperty(@"sender_id")]
public int UserId;
- [JsonProperty(@"target_type")]
- public TargetType TargetType;
-
- [JsonProperty(@"target_id")]
- public int TargetId;
+ [JsonProperty(@"channel_id")]
+ public int ChannelId;
[JsonProperty(@"is_action")]
public bool IsAction;
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 8610a8d74d..b75a37e9df 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -65,7 +65,8 @@ namespace osu.Game
private BeatmapSetOverlay beatmapSetOverlay;
- private ScreenshotManager screenshotManager;
+ [Cached]
+ private readonly ScreenshotManager screenshotManager = new ScreenshotManager();
protected RavenLogger RavenLogger;
@@ -289,9 +290,6 @@ namespace osu.Game
protected override void LoadComplete()
{
- // this needs to be cached before base.LoadComplete as it is used by MenuCursorContainer.
- dependencies.Cache(screenshotManager = new ScreenshotManager());
-
base.LoadComplete();
// The next time this is updated is in UpdateAfterChildren, which occurs too late and results
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index 9a5dac35b9..73c970ce5d 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -154,7 +154,7 @@ namespace osu.Game
dependencies.Cache(RulesetStore = new RulesetStore(contextFactory));
dependencies.Cache(FileStore = new FileStore(contextFactory, Host.Storage));
dependencies.Cache(BeatmapManager = new BeatmapManager(Host.Storage, contextFactory, RulesetStore, api, Audio, Host));
- dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, contextFactory, Host, BeatmapManager, RulesetStore));
+ dependencies.Cache(ScoreStore = new ScoreStore(contextFactory, Host, BeatmapManager, RulesetStore));
dependencies.Cache(KeyBindingStore = new KeyBindingStore(contextFactory, RulesetStore));
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
dependencies.Cache(RulesetConfigCache = new RulesetConfigCache(SettingsStore));
@@ -243,7 +243,7 @@ namespace osu.Game
public void Import(params string[] paths)
{
- var extension = Path.GetExtension(paths.First());
+ var extension = Path.GetExtension(paths.First())?.ToLowerInvariant();
foreach (var importer in fileImporters)
if (importer.HandledExtensions.Contains(extension)) importer.Import(paths);
diff --git a/osu.Game/Overlays/BeatmapSet/BeatmapPicker.cs b/osu.Game/Overlays/BeatmapSet/BeatmapPicker.cs
index 8186bf8685..bd9d65ccd8 100644
--- a/osu.Game/Overlays/BeatmapSet/BeatmapPicker.cs
+++ b/osu.Game/Overlays/BeatmapSet/BeatmapPicker.cs
@@ -10,7 +10,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
@@ -174,9 +174,9 @@ namespace osu.Game.Overlays.BeatmapSet
{
public Action OnLostHover;
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
OnLostHover?.Invoke();
}
}
@@ -241,24 +241,24 @@ namespace osu.Game.Overlays.BeatmapSet
};
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
fadeIn();
OnHovered?.Invoke(Beatmap);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (State == DifficultySelectorState.NotSelected)
fadeOut();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
OnClicked?.Invoke(Beatmap);
- return base.OnClick(state);
+ return base.OnClick(e);
}
private void fadeIn()
diff --git a/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs b/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
index b3072a02d9..1988b7d222 100644
--- a/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
+++ b/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
@@ -7,7 +7,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
@@ -89,16 +89,16 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
progress.Width = 0;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
bg.FadeColour(Color4.Black.Opacity(0.5f), 100);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
bg.FadeColour(Color4.Black.Opacity(0.25f), 100);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ClickableUsername.cs b/osu.Game/Overlays/BeatmapSet/Scores/ClickableUsername.cs
index dc350d2c4c..0be83db39e 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ClickableUsername.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ClickableUsername.cs
@@ -3,7 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Users;
@@ -53,7 +53,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
this.profile = profile;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
profile?.ShowUser(user);
return true;
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs
index d9af81c19a..309d75f60a 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs
@@ -6,7 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Online.API.Requests.Responses;
@@ -125,18 +125,18 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
background.Colour = colours.Gray4;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
background.FadeIn(fade_duration, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
background.FadeOut(fade_duration, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
index a1ebab09b1..d954b48b86 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
@@ -8,7 +8,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Online.API.Requests.Responses;
@@ -184,16 +184,16 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
BorderColour = rankText.Colour = colours.Yellow;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
background.FadeIn(fade_duration, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
background.FadeOut(fade_duration, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private class InfoColumn : FillFlowContainer
diff --git a/osu.Game/Overlays/BeatmapSetOverlay.cs b/osu.Game/Overlays/BeatmapSetOverlay.cs
index 02cc89e57e..23c8ec3aab 100644
--- a/osu.Game/Overlays/BeatmapSetOverlay.cs
+++ b/osu.Game/Overlays/BeatmapSetOverlay.cs
@@ -7,7 +7,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
@@ -51,7 +51,7 @@ namespace osu.Game.Overlays
}
// receive input outside our bounds so we can trigger a close event on ourselves.
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
public BeatmapSetOverlay()
{
@@ -127,7 +127,7 @@ namespace osu.Game.Overlays
FadeEdgeEffectTo(0, WaveContainer.DISAPPEAR_DURATION, Easing.Out).OnComplete(_ => BeatmapSet = null);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
State = Visibility.Hidden;
return true;
diff --git a/osu.Game/Overlays/Chat/ChannelListItem.cs b/osu.Game/Overlays/Chat/ChannelListItem.cs
index 7a60bf9f47..8df29c89f2 100644
--- a/osu.Game/Overlays/Chat/ChannelListItem.cs
+++ b/osu.Game/Overlays/Chat/ChannelListItem.cs
@@ -9,7 +9,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Online.Chat;
@@ -155,15 +155,15 @@ namespace osu.Game.Overlays.Chat
FinishTransforms(true);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (!channel.Joined.Value)
name.FadeColour(hoverColour, 50, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (!channel.Joined.Value)
name.FadeColour(Color4.White, transition_duration);
diff --git a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
index 4e4fe4f10a..a86465b77b 100644
--- a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
+++ b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
@@ -10,7 +10,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Sprites;
@@ -150,10 +150,10 @@ namespace osu.Game.Overlays.Chat
headerBg.Colour = colours.Gray2.Opacity(0.75f);
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
GetContainingInputManager().ChangeFocus(search);
- base.OnFocus(state);
+ base.OnFocus(e);
}
protected override void PopIn()
diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs
index d9327e73e8..ec4fd85901 100644
--- a/osu.Game/Overlays/Chat/ChatTabControl.cs
+++ b/osu.Game/Overlays/Chat/ChatTabControl.cs
@@ -17,8 +17,7 @@ using OpenTK.Input;
using OpenTK.Graphics;
using osu.Framework.Configuration;
using System;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
namespace osu.Game.Overlays.Chat
@@ -144,9 +143,9 @@ namespace osu.Game.Overlays.Chat
textBold.FadeOut(transition_length, Easing.OutQuint);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- if (args.Button == MouseButton.Middle)
+ if (e.Button == MouseButton.Middle)
{
closeButton.Action();
return true;
@@ -155,7 +154,7 @@ namespace osu.Game.Overlays.Chat
return false;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (IsRemovable)
closeButton.FadeIn(200, Easing.OutQuint);
@@ -165,7 +164,7 @@ namespace osu.Game.Overlays.Chat
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
closeButton.FadeOut(200, Easing.OutQuint);
updateState();
@@ -291,28 +290,28 @@ namespace osu.Game.Overlays.Chat
};
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
icon.ScaleTo(0.5f, 1000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
icon.ScaleTo(0.75f, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
icon.FadeColour(Color4.Red, 200, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
icon.FadeColour(Color4.White, 200, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 8e20d76914..ff2ff9af14 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
using OpenTK;
using OpenTK.Graphics;
@@ -13,7 +12,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Threading;
using osu.Game.Configuration;
using osu.Game.Graphics;
@@ -47,12 +46,12 @@ namespace osu.Game.Overlays
public const float TAB_AREA_HEIGHT = 50;
- private GetMessagesRequest fetchReq;
+ private GetUpdatesRequest fetchReq;
private readonly ChatTabControl channelTabs;
private readonly Container chatContainer;
- private readonly Container tabsArea;
+ private readonly TabsArea tabsArea;
private readonly Box chatBackground;
private readonly Box tabBackground;
@@ -62,7 +61,7 @@ namespace osu.Game.Overlays
private readonly Container channelSelectionContainer;
private readonly ChannelSelectionOverlay channelSelection;
- public override bool Contains(Vector2 screenSpacePos) => chatContainer.ReceiveMouseInputAt(screenSpacePos) || channelSelection.State == Visibility.Visible && channelSelection.ReceiveMouseInputAt(screenSpacePos);
+ public override bool Contains(Vector2 screenSpacePos) => chatContainer.ReceivePositionalInputAt(screenSpacePos) || channelSelection.State == Visibility.Visible && channelSelection.ReceivePositionalInputAt(screenSpacePos);
public ChatOverlay()
{
@@ -146,11 +145,8 @@ namespace osu.Game.Overlays
loading = new LoadingAnimation(),
}
},
- tabsArea = new Container
+ tabsArea = new TabsArea
{
- Name = @"tabs area",
- RelativeSizeAxes = Axes.X,
- Height = TAB_AREA_HEIGHT,
Children = new Drawable[]
{
tabBackground = new Box
@@ -191,25 +187,22 @@ namespace osu.Game.Overlays
public void OpenChannel(Channel channel) => addChannel(channel);
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
isDragging = tabsArea.IsHovered;
if (!isDragging)
- return base.OnDragStart(state);
+ return base.OnDragStart(e);
startDragChatHeight = ChatHeight.Value;
return true;
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
if (isDragging)
{
- Trace.Assert(state.Mouse.PositionMouseDown != null);
-
- // ReSharper disable once PossibleInvalidOperationException
- double targetChatHeight = startDragChatHeight - (state.Mouse.Position.Y - state.Mouse.PositionMouseDown.Value.Y) / Parent.DrawSize.Y;
+ double targetChatHeight = startDragChatHeight - (e.MousePosition.Y - e.MouseDownPosition.Y) / Parent.DrawSize.Y;
// If the channel selection screen is shown, mind its minimum height
if (channelSelection.State == Visibility.Visible && targetChatHeight > 1f - channel_selection_min_height)
@@ -221,10 +214,10 @@ namespace osu.Game.Overlays
return true;
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
isDragging = false;
- return base.OnDragEnd(state);
+ return base.OnDragEnd(e);
}
public void APIStateChanged(APIAccess api, APIState state)
@@ -242,11 +235,11 @@ namespace osu.Game.Overlays
public override bool AcceptsFocus => true;
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
//this is necessary as textbox is masked away and therefore can't get focus :(
GetContainingInputManager().ChangeFocus(textbox);
- base.OnFocus(state);
+ base.OnFocus(e);
}
protected override void PopIn()
@@ -285,7 +278,7 @@ namespace osu.Game.Overlays
chatBackground.Colour = colours.ChatBlue;
}
- private long? lastMessageId;
+ private long lastMessageId;
private readonly List careChannels = new List();
@@ -298,15 +291,15 @@ namespace osu.Game.Overlays
messageRequest?.Cancel();
ListChannelsRequest req = new ListChannelsRequest();
- req.Success += delegate (List channels)
+ req.Success += delegate(List channels)
{
AvailableChannels = channels;
Scheduler.Add(delegate
{
+ //todo: decide how to handle default channels for a user now that they are saved server-side.
addChannel(channels.Find(c => c.Name == @"#lazer"));
addChannel(channels.Find(c => c.Name == @"#osu"));
- addChannel(channels.Find(c => c.Name == @"#lobby"));
channelSelection.OnRequestJoin = addChannel;
channelSelection.OnRequestLeave = removeChannel;
@@ -320,7 +313,7 @@ namespace osu.Game.Overlays
};
});
- messageRequest = Scheduler.AddDelayed(fetchNewMessages, 1000, true);
+ messageRequest = Scheduler.AddDelayed(fetchUpdates, 1000, true);
};
api.Queue(req);
@@ -330,10 +323,7 @@ namespace osu.Game.Overlays
protected Channel CurrentChannel
{
- get
- {
- return currentChannel;
- }
+ get { return currentChannel; }
set
{
@@ -362,7 +352,7 @@ namespace osu.Game.Overlays
loadedChannels.Add(loaded);
LoadComponentAsync(loaded, l =>
{
- if (currentChannel.Messages.Any())
+ if (currentChannel.MessagesLoaded)
loading.Hide();
currentChannelContainer.Clear(false);
@@ -394,6 +384,15 @@ namespace osu.Game.Overlays
{
careChannels.Add(channel);
channelTabs.AddItem(channel);
+
+ if (channel.Type == ChannelType.Public && !channel.Joined)
+ {
+ var req = new JoinChannelRequest(channel, api.LocalUser);
+ req.Success += () => addChannel(channel);
+ req.Failure += ex => removeChannel(channel);
+ api.Queue(req);
+ return;
+ }
}
// let's fetch a small number of messages to bring us up-to-date with the backlog.
@@ -415,49 +414,46 @@ namespace osu.Game.Overlays
loadedChannels.Remove(loadedChannels.Find(c => c.Channel == channel));
channelTabs.RemoveItem(channel);
+ api.Queue(new LeaveChannelRequest(channel, api.LocalUser));
channel.Joined.Value = false;
}
private void fetchInitialMessages(Channel channel)
{
- var req = new GetMessagesRequest(new List { channel }, null);
-
- req.Success += delegate (List messages)
+ var req = new GetMessagesRequest(channel);
+ req.Success += messages =>
{
- loading.Hide();
channel.AddNewMessages(messages.ToArray());
- Debug.Write("success!");
- };
- req.Failure += delegate
- {
- Debug.Write("failure!");
+ if (channel == currentChannel)
+ loading.Hide();
};
api.Queue(req);
}
- private void fetchNewMessages()
+ private void fetchUpdates()
{
if (fetchReq != null) return;
- fetchReq = new GetMessagesRequest(careChannels, lastMessageId);
+ fetchReq = new GetUpdatesRequest(lastMessageId);
- fetchReq.Success += delegate (List messages)
+ fetchReq.Success += updates =>
{
- foreach (var group in messages.Where(m => m.TargetType == TargetType.Channel).GroupBy(m => m.TargetId))
- careChannels.Find(c => c.Id == group.Key)?.AddNewMessages(group.ToArray());
+ if (updates?.Presence != null)
+ {
+ foreach (var channel in updates.Presence)
+ addChannel(AvailableChannels.Find(c => c.Id == channel.Id));
- lastMessageId = messages.LastOrDefault()?.Id ?? lastMessageId;
+ foreach (var group in updates.Messages.GroupBy(m => m.ChannelId))
+ careChannels.Find(c => c.Id == group.Key)?.AddNewMessages(group.ToArray());
+
+ lastMessageId = updates.Messages.LastOrDefault()?.Id ?? lastMessageId;
+ }
- Debug.Write("success!");
fetchReq = null;
};
- fetchReq.Failure += delegate
- {
- Debug.Write("failure!");
- fetchReq = null;
- };
+ fetchReq.Failure += delegate { fetchReq = null; };
api.Queue(fetchReq);
}
@@ -517,8 +513,7 @@ namespace osu.Game.Overlays
{
Sender = api.LocalUser.Value,
Timestamp = DateTimeOffset.Now,
- TargetType = TargetType.Channel, //TODO: read this from channel
- TargetId = target.Id,
+ ChannelId = target.Id,
IsAction = isAction,
Content = postText
};
@@ -531,5 +526,18 @@ namespace osu.Game.Overlays
api.Queue(req);
}
+
+ private class TabsArea : Container
+ {
+ // IsHovered is used
+ public override bool HandlePositionalInput => true;
+
+ public TabsArea()
+ {
+ Name = @"tabs area";
+ RelativeSizeAxes = Axes.X;
+ Height = TAB_AREA_HEIGHT;
+ }
+ }
}
}
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index 3f79fa98e5..f421d2202c 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -8,8 +8,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Containers;
@@ -26,7 +25,7 @@ namespace osu.Game.Overlays.Dialog
public static readonly float ENTER_DURATION = 500;
public static readonly float EXIT_DURATION = 200;
- protected override bool BlockPassThroughMouse => false;
+ protected override bool BlockPositionalInput => false;
private readonly Vector2 ringSize = new Vector2(100f);
private readonly Vector2 ringMinifiedSize = new Vector2(20f);
@@ -206,12 +205,12 @@ namespace osu.Game.Overlays.Dialog
return base.OnPressed(action);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat) return false;
+ if (e.Repeat) return false;
// press button at number if 1-9 on number row or keypad are pressed
- var k = args.Key;
+ var k = e.Key;
if (k >= Key.Number1 && k <= Key.Number9)
{
pressButtonAtIndex(k - Key.Number1);
@@ -224,7 +223,7 @@ namespace osu.Game.Overlays.Dialog
return true;
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
protected override void PopIn()
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index c40f517023..dae502dbd9 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -43,7 +43,7 @@ namespace osu.Game.Overlays
protected override bool PlaySamplesOnStateChange => false;
- protected override bool BlockPassThroughKeyboard => true;
+ protected override bool BlockNonPositionalInput => true;
private void onDialogOnStateChanged(VisibilityContainer dialog, Visibility v)
{
diff --git a/osu.Game/Overlays/Direct/DirectGridPanel.cs b/osu.Game/Overlays/Direct/DirectGridPanel.cs
index 44b6a75d3c..1c462e3a73 100644
--- a/osu.Game/Overlays/Direct/DirectGridPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectGridPanel.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Localisation;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
@@ -227,15 +227,15 @@ namespace osu.Game.Overlays.Direct
PreviewPlaying.ValueChanged += _ => updateStatusContainer();
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
updateStatusContainer();
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
updateStatusContainer();
}
diff --git a/osu.Game/Overlays/Direct/DirectPanel.cs b/osu.Game/Overlays/Direct/DirectPanel.cs
index 2ee1857ca2..5c7c34a0ed 100644
--- a/osu.Game/Overlays/Direct/DirectPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectPanel.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
@@ -121,27 +121,27 @@ namespace osu.Game.Overlays.Direct
}
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
content.TweenEdgeEffectTo(edgeEffectHovered, hover_transition_time, Easing.OutQuint);
content.MoveToY(-4, hover_transition_time, Easing.OutQuint);
if (FadePlayButton)
PlayButton.FadeIn(120, Easing.InOutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
content.TweenEdgeEffectTo(edgeEffectNormal, hover_transition_time, Easing.OutQuint);
content.MoveToY(0, hover_transition_time, Easing.OutQuint);
if (FadePlayButton && !PreviewPlaying)
PlayButton.FadeOut(120, Easing.InOutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
ShowInformation();
return true;
diff --git a/osu.Game/Overlays/Direct/FilterControl.cs b/osu.Game/Overlays/Direct/FilterControl.cs
index df98cc3c32..c4825f72fe 100644
--- a/osu.Game/Overlays/Direct/FilterControl.cs
+++ b/osu.Game/Overlays/Direct/FilterControl.cs
@@ -73,8 +73,8 @@ namespace osu.Game.Overlays.Direct
iconContainer.FadeTo(Ruleset.ID == obj?.ID ? 1f : 0.5f, 100);
}
- public override bool HandleKeyboardInput => !bindable.Disabled && base.HandleKeyboardInput;
- public override bool HandleMouseInput => !bindable.Disabled && base.HandleMouseInput;
+ public override bool HandleNonPositionalInput => !bindable.Disabled && base.HandleNonPositionalInput;
+ public override bool HandlePositionalInput => !bindable.Disabled && base.HandlePositionalInput;
public RulesetToggleButton(Bindable bindable, RulesetInfo ruleset)
{
diff --git a/osu.Game/Overlays/Direct/PlayButton.cs b/osu.Game/Overlays/Direct/PlayButton.cs
index 092c9ddbea..ac7a26fca3 100644
--- a/osu.Game/Overlays/Direct/PlayButton.cs
+++ b/osu.Game/Overlays/Direct/PlayButton.cs
@@ -5,7 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
@@ -93,23 +93,23 @@ namespace osu.Game.Overlays.Direct
hoverColour = colour.Yellow;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
Playing.Toggle();
return true;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
icon.FadeColour(hoverColour, 120, Easing.InOutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (!Playing.Value)
icon.FadeColour(Color4.White, 120, Easing.InOutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private void playingStateChanged(bool playing)
diff --git a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
index d480bedc5e..63ddc25fde 100644
--- a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
+++ b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
@@ -10,15 +10,13 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Input;
using OpenTK.Graphics;
using OpenTK.Input;
-using JoystickEventArgs = osu.Framework.Input.EventArgs.JoystickEventArgs;
namespace osu.Game.Overlays.KeyBinding
{
@@ -125,18 +123,18 @@ namespace osu.Game.Overlays.KeyBinding
}
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
FadeEdgeEffectTo(1, transition_time, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
FadeEdgeEffectTo(0, transition_time, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
public override bool AcceptsFocus => bindTarget == null;
@@ -149,16 +147,16 @@ namespace osu.Game.Overlays.KeyBinding
private bool isModifier(Key k) => k < Key.F1;
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
if (!HasFocus || !bindTarget.IsHovered)
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
if (!AllowMainMouseButtons)
{
- switch (args.Button)
+ switch (e.Button)
{
case MouseButton.Left:
case MouseButton.Right:
@@ -166,15 +164,15 @@ namespace osu.Game.Overlays.KeyBinding
}
}
- bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(state));
+ bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState));
return true;
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
// don't do anything until the last button is released.
- if (!HasFocus || state.Mouse.Buttons.Any())
- return base.OnMouseUp(state, args);
+ if (!HasFocus || e.HasAnyButtonPressed)
+ return base.OnMouseUp(e);
if (bindTarget.IsHovered)
finalise();
@@ -183,31 +181,31 @@ namespace osu.Game.Overlays.KeyBinding
return true;
}
- protected override bool OnScroll(InputState state)
+ protected override bool OnScroll(ScrollEvent e)
{
if (HasFocus)
{
if (bindTarget.IsHovered)
{
- bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(state, state.Mouse.ScrollDelta));
+ bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState, e.ScrollDelta));
finalise();
return true;
}
}
- return base.OnScroll(state);
+ return base.OnScroll(e);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
if (!HasFocus)
return false;
- switch (args.Key)
+ switch (e.Key)
{
case Key.Delete:
{
- if (state.Keyboard.ShiftPressed)
+ if (e.ShiftPressed)
{
bindTarget.UpdateKeyCombination(InputKey.None);
finalise();
@@ -218,35 +216,35 @@ namespace osu.Game.Overlays.KeyBinding
}
}
- bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(state));
- if (!isModifier(args.Key)) finalise();
+ bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState));
+ if (!isModifier(e.Key)) finalise();
return true;
}
- protected override bool OnKeyUp(InputState state, KeyUpEventArgs args)
+ protected override bool OnKeyUp(KeyUpEvent e)
{
- if (!HasFocus) return base.OnKeyUp(state, args);
+ if (!HasFocus) return base.OnKeyUp(e);
finalise();
return true;
}
- protected override bool OnJoystickPress(InputState state, JoystickEventArgs args)
+ protected override bool OnJoystickPress(JoystickPressEvent e)
{
if (!HasFocus)
return false;
- bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(state));
+ bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState));
finalise();
return true;
}
- protected override bool OnJoystickRelease(InputState state, JoystickEventArgs args)
+ protected override bool OnJoystickRelease(JoystickReleaseEvent e)
{
if (!HasFocus)
- return base.OnJoystickRelease(state, args);
+ return base.OnJoystickRelease(e);
finalise();
return true;
@@ -273,7 +271,7 @@ namespace osu.Game.Overlays.KeyBinding
pressAKey.BypassAutoSizeAxes |= Axes.Y;
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
AutoSizeDuration = 500;
AutoSizeEasing = Easing.OutQuint;
@@ -282,13 +280,13 @@ namespace osu.Game.Overlays.KeyBinding
pressAKey.BypassAutoSizeAxes &= ~Axes.Y;
updateBindTarget();
- base.OnFocus(state);
+ base.OnFocus(e);
}
- protected override void OnFocusLost(InputState state)
+ protected override void OnFocusLost(FocusLostEvent e)
{
finalise();
- base.OnFocusLost(state);
+ base.OnFocusLost(e);
}
private void updateBindTarget()
@@ -367,16 +365,16 @@ namespace osu.Game.Overlays.KeyBinding
hoverColour = colours.YellowDark;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
updateHoverState();
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
updateHoverState();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private void updateHoverState()
diff --git a/osu.Game/Overlays/MainSettings.cs b/osu.Game/Overlays/MainSettings.cs
index b22904e724..736843ee4d 100644
--- a/osu.Game/Overlays/MainSettings.cs
+++ b/osu.Game/Overlays/MainSettings.cs
@@ -6,8 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
@@ -138,16 +137,16 @@ namespace osu.Game.Overlays
};
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
aspect.ScaleTo(0.75f, 2000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
aspect.ScaleTo(1, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
public bool OnPressed(GlobalAction action)
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index bd67a718a7..dcd325490a 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -19,8 +19,7 @@ using osu.Framework.Graphics.Textures;
using OpenTK.Input;
using osu.Framework.Graphics.Shapes;
using System;
-using System.Linq;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
namespace osu.Game.Overlays
@@ -176,15 +175,15 @@ namespace osu.Game.Overlays
particleContainer.Add(new MedalParticle(RNG.Next(0, 359)));
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
dismiss();
return true;
}
- protected override void OnFocusLost(InputState state)
+ protected override void OnFocusLost(FocusLostEvent e)
{
- if (state.Keyboard.Keys.Contains(Key.Escape)) dismiss();
+ if (e.CurrentState.Keyboard.Keys.IsPressed(Key.Escape)) dismiss();
}
private const double initial_duration = 400;
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index 8024f9a732..ecb65f6df2 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -13,8 +13,7 @@ using osu.Game.Rulesets.UI;
using System;
using System.Linq;
using osu.Framework.Graphics.Cursor;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.Mods
@@ -149,20 +148,20 @@ namespace osu.Game.Overlays.Mods
public virtual Mod SelectedMod => Mods.ElementAtOrDefault(selectedIndex);
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
scaleContainer.ScaleTo(0.9f, 800, Easing.Out);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
scaleContainer.ScaleTo(1, 500, Easing.OutElastic);
// only trigger the event if we are inside the area of the button
- if (Contains(ToScreenSpace(state.Mouse.Position - Position)))
+ if (Contains(e.ScreenSpaceMousePosition))
{
- switch (args.Button)
+ switch (e.Button)
{
case MouseButton.Left:
SelectNext(1);
diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs
index 37bffaaf12..c0d2d889c6 100644
--- a/osu.Game/Overlays/Mods/ModSection.cs
+++ b/osu.Game/Overlays/Mods/ModSection.cs
@@ -10,8 +10,7 @@ using osu.Game.Rulesets.Mods;
using System;
using System.Linq;
using System.Collections.Generic;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Overlays.Mods
{
@@ -55,16 +54,16 @@ namespace osu.Game.Overlays.Mods
private ModButton[] buttons = { };
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
if (ToggleKeys != null)
{
- var index = Array.IndexOf(ToggleKeys, args.Key);
+ var index = Array.IndexOf(ToggleKeys, e.Key);
if (index > -1 && index < buttons.Length)
- buttons[index].SelectNext(state.Keyboard.ShiftPressed ? -1 : 1);
+ buttons[index].SelectNext(e.ShiftPressed ? -1 : 1);
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
public void DeselectAll() => DeselectTypes(buttons.Select(b => b.SelectedMod?.GetType()).Where(t => t != null));
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index e83dedaf35..55d5d797e7 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -40,7 +40,7 @@ namespace osu.Game.Overlays.Mods
protected readonly OsuSpriteText MultiplierLabel, UnrankedLabel;
private readonly FillFlowContainer footerContainer;
- protected override bool BlockPassThroughKeyboard => false;
+ protected override bool BlockNonPositionalInput => false;
protected readonly FillFlowContainer ModSectionsContainer;
diff --git a/osu.Game/Overlays/Music/PlaylistItem.cs b/osu.Game/Overlays/Music/PlaylistItem.cs
index ee3f22290b..c0a59df767 100644
--- a/osu.Game/Overlays/Music/PlaylistItem.cs
+++ b/osu.Game/Overlays/Music/PlaylistItem.cs
@@ -8,8 +8,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Localisation;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
@@ -37,16 +36,16 @@ namespace osu.Game.Overlays.Music
public bool IsDraggable { get; private set; }
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
IsDraggable = handle.IsHovered;
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
IsDraggable = false;
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
private bool selected;
@@ -123,19 +122,19 @@ namespace osu.Game.Overlays.Music
});
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
handle.FadeIn(fade_duration);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
handle.FadeOut(fade_duration);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
OnSelect?.Invoke(BeatmapSetInfo);
return true;
diff --git a/osu.Game/Overlays/Music/PlaylistList.cs b/osu.Game/Overlays/Music/PlaylistList.cs
index 32674f0a84..17c8d2f154 100644
--- a/osu.Game/Overlays/Music/PlaylistList.cs
+++ b/osu.Game/Overlays/Music/PlaylistList.cs
@@ -8,7 +8,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Containers;
using OpenTK;
@@ -115,25 +115,25 @@ namespace osu.Game.Overlays.Music
private Vector2 nativeDragPosition;
private PlaylistItem draggedItem;
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
- nativeDragPosition = state.Mouse.NativeState.Position;
+ nativeDragPosition = e.ScreenSpaceMousePosition;
draggedItem = items.FirstOrDefault(d => d.IsDraggable);
- return draggedItem != null || base.OnDragStart(state);
+ return draggedItem != null || base.OnDragStart(e);
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
- nativeDragPosition = state.Mouse.NativeState.Position;
+ nativeDragPosition = e.ScreenSpaceMousePosition;
if (draggedItem == null)
- return base.OnDrag(state);
+ return base.OnDrag(e);
return true;
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
- nativeDragPosition = state.Mouse.NativeState.Position;
- var handled = draggedItem != null || base.OnDragEnd(state);
+ nativeDragPosition = e.ScreenSpaceMousePosition;
+ var handled = draggedItem != null || base.OnDragEnd(e);
draggedItem = null;
return handled;
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 5cccb2b0aa..b32fd265cb 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -13,7 +13,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Localisation;
using osu.Framework.Threading;
using osu.Game.Beatmaps;
@@ -196,10 +196,16 @@ namespace osu.Game.Overlays
playlist.StateChanged += s => playlistButton.FadeColour(s == Visibility.Visible ? colours.Yellow : Color4.White, 200, Easing.OutQuint);
}
+ private ScheduledDelegate seekDelegate;
+
private void attemptSeek(double progress)
{
- if (!beatmap.Disabled)
- current?.Track.Seek(progress);
+ seekDelegate?.Cancel();
+ seekDelegate = Schedule(() =>
+ {
+ if (!beatmap.Disabled)
+ current?.Track.Seek(progress);
+ });
}
private void playlistOrderChanged(BeatmapSetInfo beatmapSetInfo, int index)
@@ -457,20 +463,14 @@ namespace osu.Game.Overlays
private class DragContainer : Container
{
- private Vector2 dragStart;
-
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
- base.OnDragStart(state);
- dragStart = state.Mouse.Position;
return true;
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
- if (base.OnDrag(state)) return true;
-
- Vector2 change = state.Mouse.Position - dragStart;
+ Vector2 change = e.MousePosition - e.MouseDownPosition;
// Diminish the drag distance as we go further to simulate "rubber band" feeling.
change *= change.Length <= 0 ? 0 : (float)Math.Pow(change.Length, 0.7f) / change.Length;
@@ -479,10 +479,10 @@ namespace osu.Game.Overlays
return true;
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
this.MoveTo(Vector2.Zero, 800, Easing.OutElastic);
- return base.OnDragEnd(state);
+ return base.OnDragEnd(e);
}
}
}
diff --git a/osu.Game/Overlays/Notifications/Notification.cs b/osu.Game/Overlays/Notifications/Notification.cs
index 6798ae2bb2..aa2b248bc4 100644
--- a/osu.Game/Overlays/Notifications/Notification.cs
+++ b/osu.Game/Overlays/Notifications/Notification.cs
@@ -11,7 +11,7 @@ using osu.Game.Graphics;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
namespace osu.Game.Overlays.Notifications
@@ -118,19 +118,19 @@ namespace osu.Game.Overlays.Notifications
});
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
closeButton.FadeIn(75);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
closeButton.FadeOut(75);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (Activated?.Invoke() ?? true)
Close();
@@ -185,16 +185,16 @@ namespace osu.Game.Overlays.Notifications
hoverColour = colours.Yellow;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
this.FadeColour(hoverColour, 200);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
this.FadeColour(OsuColour.Gray(0.2f), 200);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index 041ceab365..97c6554908 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -25,9 +25,6 @@ namespace osu.Game.Overlays
{
private readonly Container box;
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
private readonly SpriteText textLine1;
private readonly SpriteText textLine2;
private readonly SpriteText textLine3;
diff --git a/osu.Game/Overlays/Profile/Header/BadgeContainer.cs b/osu.Game/Overlays/Profile/Header/BadgeContainer.cs
index 33baaf1fff..6a87db4211 100644
--- a/osu.Game/Overlays/Profile/Header/BadgeContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/BadgeContainer.cs
@@ -9,7 +9,7 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Users;
@@ -153,13 +153,13 @@ namespace osu.Game.Overlays.Profile.Header
this.hoverLostAction = hoverLostAction;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
hoverAction();
return true;
}
- protected override void OnHoverLost(InputState state) => hoverLostAction();
+ protected override void OnHoverLost(HoverLostEvent e) => hoverLostAction();
}
private class DrawableBadge : Container, IHasTooltip
diff --git a/osu.Game/Overlays/Profile/Header/RankGraph.cs b/osu.Game/Overlays/Profile/Header/RankGraph.cs
index a059792796..fc80370cf9 100644
--- a/osu.Game/Overlays/Profile/Header/RankGraph.cs
+++ b/osu.Game/Overlays/Profile/Header/RankGraph.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
@@ -137,25 +137,25 @@ namespace osu.Game.Overlays.Profile.Header
relativeText.Text = dayIndex + 1 == ranks.Length ? "Now" : $"{ranked_days - ranks[dayIndex].Key} days ago";
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (ranks?.Length > 1)
{
- graph.UpdateBallPosition(state.Mouse.Position.X);
+ graph.UpdateBallPosition(e.MousePosition.X);
graph.ShowBall();
}
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
if (ranks?.Length > 1)
- graph.UpdateBallPosition(state.Mouse.Position.X);
+ graph.UpdateBallPosition(e.MousePosition.X);
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (ranks?.Length > 1)
{
@@ -163,7 +163,7 @@ namespace osu.Game.Overlays.Profile.Header
updateRankTexts();
}
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private class RankChartLineGraph : LineGraph
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index 9d09836d25..4839348e0e 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -386,10 +386,13 @@ namespace osu.Game.Overlays.Profile
infoTextLeft.AddText(new DrawableJoinDate(user.JoinDate), boldItalic);
}
- infoTextLeft.NewLine();
- infoTextLeft.AddText("Last seen ", lightText);
- infoTextLeft.AddText(new DrawableDate(user.LastVisit), boldItalic);
- infoTextLeft.NewParagraph();
+ if (user.LastVisit.HasValue)
+ {
+ infoTextLeft.NewLine();
+ infoTextLeft.AddText("Last seen ", lightText);
+ infoTextLeft.AddText(new DrawableDate(user.LastVisit.Value), boldItalic);
+ infoTextLeft.NewParagraph();
+ }
if (user.PlayStyle?.Length > 0)
{
diff --git a/osu.Game/Overlays/Profile/Sections/DrawableProfileRow.cs b/osu.Game/Overlays/Profile/Sections/DrawableProfileRow.cs
index 3a4bfc6804..165299e8c0 100644
--- a/osu.Game/Overlays/Profile/Sections/DrawableProfileRow.cs
+++ b/osu.Game/Overlays/Profile/Sections/DrawableProfileRow.cs
@@ -6,7 +6,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using OpenTK;
using OpenTK.Graphics;
@@ -105,20 +105,20 @@ namespace osu.Game.Overlays.Profile.Sections
coloredBackground.Colour = underscoreLine.Colour = colour.Gray4;
}
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
background.FadeIn(fade_duration, Easing.OutQuint);
underscoreLine.FadeOut(fade_duration, Easing.OutQuint);
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
background.FadeOut(fade_duration, Easing.OutQuint);
underscoreLine.FadeIn(fade_duration, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Overlays/Profile/Sections/Kudosu/KudosuInfo.cs b/osu.Game/Overlays/Profile/Sections/Kudosu/KudosuInfo.cs
index 38bc419838..788041205b 100644
--- a/osu.Game/Overlays/Profile/Sections/Kudosu/KudosuInfo.cs
+++ b/osu.Game/Overlays/Profile/Sections/Kudosu/KudosuInfo.cs
@@ -8,7 +8,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
@@ -70,7 +70,7 @@ namespace osu.Game.Overlays.Profile.Sections.Kudosu
};
}
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
private class CountSection : Container
{
diff --git a/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs b/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs
index f9e4a983bb..df249b0b88 100644
--- a/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs
+++ b/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs
@@ -5,7 +5,7 @@ using OpenTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Containers;
@@ -101,7 +101,7 @@ namespace osu.Game.Overlays.SearchableList
scrollContainer.Padding = new MarginPadding { Top = Header.Height + Filter.Height };
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
GetContainingInputManager().ChangeFocus(Filter.Search);
}
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
index 0fe41327db..da96c6ef30 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
{
new SettingsSlider
{
- LabelText = "Audio Offset",
+ LabelText = "Audio offset",
Bindable = config.GetBindable(OsuSetting.AudioOffset),
KeyboardStep = 1f
},
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
index 369c751448..fa4a714ba3 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
Children = new Drawable[]
{
new SettingsSlider { LabelText = "Master", Bindable = audio.Volume, KeyboardStep = 0.01f },
- new SettingsSlider { LabelText = "Master (Window Inactive)", Bindable = config.GetBindable(OsuSetting.VolumeInactive), KeyboardStep = 0.01f },
+ new SettingsSlider { LabelText = "Master (window inactive)", Bindable = config.GetBindable(OsuSetting.VolumeInactive), KeyboardStep = 0.01f },
new SettingsSlider { LabelText = "Effect", Bindable = audio.VolumeSample, KeyboardStep = 0.01f },
new SettingsSlider { LabelText = "Music", Bindable = audio.VolumeTrack, KeyboardStep = 0.01f },
};
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/ScrollingSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/ScrollingSettings.cs
deleted file mode 100644
index 0e661aeba6..0000000000
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/ScrollingSettings.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2007-2018 ppy Pty Ltd .
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using osu.Framework.Allocation;
-using osu.Game.Configuration;
-
-namespace osu.Game.Overlays.Settings.Sections.Gameplay
-{
- public class ScrollingSettings : SettingsSubsection
- {
- protected override string Header => "Scrolling";
-
- [BackgroundDependencyLoader]
- private void load(OsuConfigManager config)
- {
- Children = new[]
- {
- new SettingsEnumDropdown
- {
- LabelText = "Visualise speed changes as",
- Bindable = config.GetBindable(OsuSetting.SpeedChangeVisualisation),
- }
- };
- }
- }
-}
diff --git a/osu.Game/Overlays/Settings/Sections/GameplaySection.cs b/osu.Game/Overlays/Settings/Sections/GameplaySection.cs
index 8add0b01ec..f565ff8556 100644
--- a/osu.Game/Overlays/Settings/Sections/GameplaySection.cs
+++ b/osu.Game/Overlays/Settings/Sections/GameplaySection.cs
@@ -21,7 +21,6 @@ namespace osu.Game.Overlays.Settings.Sections
{
new GeneralSettings(),
new SongSelectSettings(),
- new ScrollingSettings(),
new ModsSettings(),
};
}
@@ -29,7 +28,7 @@ namespace osu.Game.Overlays.Settings.Sections
[BackgroundDependencyLoader]
private void load(RulesetStore rulesets)
{
- foreach(Ruleset ruleset in rulesets.AvailableRulesets.Select(info => info.CreateInstance()))
+ foreach (Ruleset ruleset in rulesets.AvailableRulesets.Select(info => info.CreateInstance()))
{
SettingsSubsection section = ruleset.CreateSettings();
if (section != null)
diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
index c7f98f4107..11a3d36779 100644
--- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
@@ -16,7 +16,7 @@ using System.ComponentModel;
using osu.Game.Graphics;
using OpenTK.Graphics;
using osu.Framework.Extensions.Color4Extensions;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using RectangleF = osu.Framework.Graphics.Primitives.RectangleF;
using Container = osu.Framework.Graphics.Containers.Container;
@@ -175,12 +175,12 @@ namespace osu.Game.Overlays.Settings.Sections.General
public override bool AcceptsFocus => true;
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
if (form != null) GetContainingInputManager().ChangeFocus(form);
- base.OnFocus(state);
+ base.OnFocus(e);
}
private class LoginForm : FillFlowContainer
@@ -244,9 +244,9 @@ namespace osu.Game.Overlays.Settings.Sections.General
public override bool AcceptsFocus => true;
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
Schedule(() => { GetContainingInputManager().ChangeFocus(string.IsNullOrEmpty(username.Text) ? username : password); });
}
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index df9370d0d8..254de6c6f7 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -102,7 +102,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
}
else
resolutionDropdown.Hide();
- });
+ }, true);
}
letterboxing.BindValueChanged(isVisible =>
diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs
index 456d1c9a2f..51b0296ca4 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs
@@ -15,7 +15,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
new SettingsButton
{
- Text = "Key Configuration",
+ Text = "Key configuration",
Action = keyConfig.ToggleVisibility
},
};
diff --git a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
index 71ab4d3782..7b9b7bf57f 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
@@ -5,7 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Input;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Configuration;
using osu.Game.Graphics.UserInterface;
@@ -26,12 +26,12 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
new SettingsCheckbox
{
- LabelText = "Raw Input",
+ LabelText = "Raw input",
Bindable = rawInputToggle
},
sensitivity = new SensitivitySetting
{
- LabelText = "Cursor Sensitivity",
+ LabelText = "Cursor sensitivity",
Bindable = config.GetBindable(FrameworkSetting.CursorSensitivity)
},
new SettingsCheckbox
@@ -124,18 +124,18 @@ namespace osu.Game.Overlays.Settings.Sections.Input
private bool isDragging;
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
isDragging = true;
- return base.OnDragStart(state);
+ return base.OnDragStart(e);
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
isDragging = false;
Current.TriggerChange();
- return base.OnDragEnd(state);
+ return base.OnDragEnd(e);
}
public override string TooltipText => Current.Disabled ? "Enable raw input to adjust sensitivity" : Current.Value.ToString(@"0.##x");
diff --git a/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs
index 57e9a528d2..835ec808bc 100644
--- a/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs
@@ -13,57 +13,59 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance
{
public class GeneralSettings : SettingsSubsection
{
- private TriangleButton importButton;
- private TriangleButton deleteButton;
+ protected override string Header => "General";
+
+ private TriangleButton importBeatmapsButton;
+ private TriangleButton importSkinsButton;
+ private TriangleButton deleteSkinsButton;
+ private TriangleButton deleteBeatmapsButton;
private TriangleButton restoreButton;
private TriangleButton undeleteButton;
- protected override string Header => "General";
-
[BackgroundDependencyLoader]
private void load(BeatmapManager beatmaps, SkinManager skins, DialogOverlay dialogOverlay)
{
Children = new Drawable[]
{
- importButton = new SettingsButton
+ importBeatmapsButton = new SettingsButton
{
Text = "Import beatmaps from stable",
Action = () =>
{
- importButton.Enabled.Value = false;
- beatmaps.ImportFromStableAsync().ContinueWith(t => Schedule(() => importButton.Enabled.Value = true));
+ importBeatmapsButton.Enabled.Value = false;
+ beatmaps.ImportFromStableAsync().ContinueWith(t => Schedule(() => importBeatmapsButton.Enabled.Value = true));
}
},
- deleteButton = new DangerousSettingsButton
+ deleteBeatmapsButton = new DangerousSettingsButton
{
Text = "Delete ALL beatmaps",
Action = () =>
{
dialogOverlay?.Push(new DeleteAllBeatmapsDialog(() =>
{
- deleteButton.Enabled.Value = false;
- Task.Run(() => beatmaps.Delete(beatmaps.GetAllUsableBeatmapSets())).ContinueWith(t => Schedule(() => deleteButton.Enabled.Value = true));
+ deleteBeatmapsButton.Enabled.Value = false;
+ Task.Run(() => beatmaps.Delete(beatmaps.GetAllUsableBeatmapSets())).ContinueWith(t => Schedule(() => deleteBeatmapsButton.Enabled.Value = true));
}));
}
},
- importButton = new SettingsButton
+ importSkinsButton = new SettingsButton
{
Text = "Import skins from stable",
Action = () =>
{
- importButton.Enabled.Value = false;
- skins.ImportFromStableAsync().ContinueWith(t => Schedule(() => importButton.Enabled.Value = true));
+ importSkinsButton.Enabled.Value = false;
+ skins.ImportFromStableAsync().ContinueWith(t => Schedule(() => importSkinsButton.Enabled.Value = true));
}
},
- deleteButton = new DangerousSettingsButton
+ deleteSkinsButton = new DangerousSettingsButton
{
Text = "Delete ALL skins",
Action = () =>
{
dialogOverlay?.Push(new DeleteAllBeatmapsDialog(() =>
{
- deleteButton.Enabled.Value = false;
- Task.Run(() => skins.Delete(skins.GetAllUserSkins())).ContinueWith(t => Schedule(() => deleteButton.Enabled.Value = true));
+ deleteSkinsButton.Enabled.Value = false;
+ Task.Run(() => skins.Delete(skins.GetAllUserSkins())).ContinueWith(t => Schedule(() => deleteSkinsButton.Enabled.Value = true));
}));
}
},
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index 0f8d3aa2ac..4f947cd812 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -12,8 +12,7 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using OpenTK;
@@ -168,25 +167,25 @@ namespace osu.Game.Overlays.Settings
public string TooltipText => "Revert to default";
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args) => true;
+ protected override bool OnMouseUp(MouseUpEvent e) => true;
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (bindable != null && !bindable.Disabled)
bindable.SetDefault();
return true;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
hovering = true;
UpdateState();
return false;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
hovering = false;
UpdateState();
diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs
index fdda5b870e..862011b6e2 100644
--- a/osu.Game/Overlays/Settings/Sidebar.cs
+++ b/osu.Game/Overlays/Settings/Sidebar.cs
@@ -9,7 +9,7 @@ using OpenTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Threading;
using osu.Game.Overlays.Toolbar;
@@ -55,25 +55,25 @@ namespace osu.Game.Overlays.Settings
private ScheduledDelegate expandEvent;
private ExpandedState state;
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
queueExpandIfHovering();
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
expandEvent?.Cancel();
lastHoveredButton = null;
State = ExpandedState.Contracted;
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
queueExpandIfHovering();
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
private class SidebarScrollContainer : ScrollContainer
diff --git a/osu.Game/Overlays/Settings/SidebarButton.cs b/osu.Game/Overlays/Settings/SidebarButton.cs
index 28e2b773ec..b6d1cf609e 100644
--- a/osu.Game/Overlays/Settings/SidebarButton.cs
+++ b/osu.Game/Overlays/Settings/SidebarButton.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
@@ -109,22 +109,22 @@ namespace osu.Game.Overlays.Settings
selectionIndicator.Colour = colours.Yellow;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
Action?.Invoke(section);
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Background.FadeTo(0.4f, 200);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
Background.FadeTo(0, 200);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs
index 83e121e998..c971ab5005 100644
--- a/osu.Game/Overlays/SettingsOverlay.cs
+++ b/osu.Game/Overlays/SettingsOverlay.cs
@@ -11,7 +11,7 @@ using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Overlays.Settings;
@@ -177,10 +177,10 @@ namespace osu.Game.Overlays
public override bool AcceptsFocus => true;
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
GetContainingInputManager().ChangeFocus(searchTextBox);
- base.OnFocus(state);
+ base.OnFocus(e);
}
protected override void UpdateAfterChildren()
diff --git a/osu.Game/Overlays/Social/SocialPanel.cs b/osu.Game/Overlays/Social/SocialPanel.cs
index b0455f7edd..cfee639d53 100644
--- a/osu.Game/Overlays/Social/SocialPanel.cs
+++ b/osu.Game/Overlays/Social/SocialPanel.cs
@@ -6,7 +6,7 @@ using OpenTK.Graphics;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Users;
namespace osu.Game.Overlays.Social
@@ -35,20 +35,20 @@ namespace osu.Game.Overlays.Social
Colour = Color4.Black.Opacity(0.3f),
};
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Content.TweenEdgeEffectTo(edgeEffectHovered, hover_transition_time, Easing.OutQuint);
Content.MoveToY(-4, hover_transition_time, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
Content.TweenEdgeEffectTo(edgeEffectNormal, hover_transition_time, Easing.OutQuint);
Content.MoveToY(0, hover_transition_time, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
protected override void LoadComplete()
diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index cdc3bc2b51..611b42383e 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -11,7 +11,7 @@ using OpenTK;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Allocation;
using osu.Framework.Configuration;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Overlays.Toolbar
{
@@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Toolbar
private readonly ToolbarUserArea userArea;
- protected override bool BlockPassThroughMouse => false;
+ protected override bool BlockPositionalInput => false;
private const double transition_time = 500;
@@ -121,14 +121,14 @@ namespace osu.Game.Overlays.Toolbar
};
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
solidBackground.FadeTo(alpha_hovering, transition_time, Easing.OutQuint);
gradientBackground.FadeIn(transition_time, Easing.OutQuint);
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
solidBackground.FadeTo(alpha_normal, transition_time, Easing.OutQuint);
gradientBackground.FadeOut(transition_time, Easing.OutQuint);
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 74af5d7e9c..5cb26974e6 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -11,8 +11,7 @@ using osu.Game.Graphics.Sprites;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
@@ -145,22 +144,22 @@ namespace osu.Game.Overlays.Toolbar
};
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
HoverBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint);
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
HoverBackground.FadeIn(200);
tooltipContainer.FadeIn(100);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
HoverBackground.FadeOut(200);
tooltipContainer.FadeOut(100);
diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
index f2744ae83f..fa35e53531 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
@@ -11,8 +11,7 @@ using OpenTK.Input;
using OpenTK.Graphics;
using osu.Framework.Configuration;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Rulesets;
namespace osu.Game.Overlays.Toolbar
@@ -86,13 +85,13 @@ namespace osu.Game.Overlays.Toolbar
ruleset.BindTo(parentRuleset);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- base.OnKeyDown(state, args);
+ base.OnKeyDown(e);
- if (state.Keyboard.ControlPressed && !args.Repeat && args.Key >= Key.Number1 && args.Key <= Key.Number9)
+ if (e.ControlPressed && !e.Repeat && e.Key >= Key.Number1 && e.Key <= Key.Number9)
{
- int requested = args.Key - Key.Number1;
+ int requested = e.Key - Key.Number1;
RulesetInfo found = rulesets.AvailableRulesets.Skip(requested).FirstOrDefault();
if (found != null)
@@ -103,8 +102,10 @@ namespace osu.Game.Overlays.Toolbar
return false;
}
- public override bool HandleKeyboardInput => !ruleset.Disabled && base.HandleKeyboardInput;
- public override bool HandleMouseInput => !ruleset.Disabled && base.HandleMouseInput;
+ public override bool HandleNonPositionalInput => !ruleset.Disabled && base.HandleNonPositionalInput;
+ public override bool HandlePositionalInput => !ruleset.Disabled && base.HandlePositionalInput;
+
+ public override bool PropagatePositionalInputSubTree => !ruleset.Disabled && base.PropagatePositionalInputSubTree;
private void disabledChanged(bool isDisabled) => this.FadeColour(isDisabled ? Color4.Gray : Color4.White, 300);
diff --git a/osu.Game/Overlays/Volume/MuteButton.cs b/osu.Game/Overlays/Volume/MuteButton.cs
index 47169d7a7b..a099a10096 100644
--- a/osu.Game/Overlays/Volume/MuteButton.cs
+++ b/osu.Game/Overlays/Volume/MuteButton.cs
@@ -9,7 +9,7 @@ using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using OpenTK;
using OpenTK.Graphics;
@@ -63,18 +63,18 @@ namespace osu.Game.Overlays.Volume
Current.TriggerChange();
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
this.TransformTo("BorderColour", hoveredColour, 500, Easing.OutQuint);
return false;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
this.TransformTo("BorderColour", unhoveredColour, 500, Easing.OutQuint);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
Current.Value = !Current.Value;
return true;
diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs
index a6c98aa97e..86be652c8c 100644
--- a/osu.Game/Overlays/Volume/VolumeMeter.cs
+++ b/osu.Game/Overlays/Volume/VolumeMeter.cs
@@ -11,7 +11,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
@@ -239,21 +239,21 @@ namespace osu.Game.Overlays.Volume
adjustAccumulator = 0;
}
- protected override bool OnScroll(InputState state)
+ protected override bool OnScroll(ScrollEvent e)
{
- adjust(state.Mouse.ScrollDelta.Y, state.Mouse.HasPreciseScroll);
+ adjust(e.ScrollDelta.Y, e.IsPrecise);
return true;
}
private const float transition_length = 500;
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
this.ScaleTo(1.04f, transition_length, Easing.OutExpo);
return false;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
this.ScaleTo(1f, transition_length, Easing.OutExpo);
}
diff --git a/osu.Game/Overlays/VolumeOverlay.cs b/osu.Game/Overlays/VolumeOverlay.cs
index 4dcdd23768..d45d097a09 100644
--- a/osu.Game/Overlays/VolumeOverlay.cs
+++ b/osu.Game/Overlays/VolumeOverlay.cs
@@ -9,7 +9,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Threading;
using osu.Game.Graphics;
using osu.Game.Input.Bindings;
@@ -28,7 +28,7 @@ namespace osu.Game.Overlays
private VolumeMeter volumeMeterMusic;
private MuteButton muteButton;
- protected override bool BlockPassThroughMouse => false;
+ protected override bool BlockPositionalInput => false;
private readonly BindableDouble muteAdjustment = new BindableDouble();
@@ -143,23 +143,23 @@ namespace osu.Game.Overlays
this.FadeOut(100);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
// keep the scheduled event correctly timed as long as we have movement.
schedulePopOut();
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
schedulePopOut();
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
schedulePopOut();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private void schedulePopOut()
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index 97f52d88f7..c5a4953c5e 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -11,7 +11,7 @@ namespace osu.Game.Overlays
{
protected readonly WaveContainer Waves;
- protected override bool BlockPassThroughKeyboard => true;
+ protected override bool BlockNonPositionalInput => true;
protected override Container Content => Waves;
protected WaveOverlayContainer()
diff --git a/osu.Game/Rulesets/Edit/HitObjectMask.cs b/osu.Game/Rulesets/Edit/HitObjectMask.cs
index ada026b32f..636ea418f3 100644
--- a/osu.Game/Rulesets/Edit/HitObjectMask.cs
+++ b/osu.Game/Rulesets/Edit/HitObjectMask.cs
@@ -5,7 +5,7 @@ using System;
using osu.Framework;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Primitives;
-using osu.Framework.Input.EventArgs;
+using osu.Framework.Input.Events;
using osu.Framework.Input.States;
using osu.Game.Graphics.UserInterface;
using osu.Game.Rulesets.Objects.Drawables;
@@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Edit
///
/// Invoked when this has requested drag.
///
- public event Action DragRequested;
+ public event Action DragRequested;
///
/// The which this applies to.
@@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Edit
public readonly DrawableHitObject HitObject;
protected override bool ShouldBeAlive => HitObject.IsAlive && HitObject.IsPresent || State == SelectionState.Selected;
- public override bool HandleMouseInput => ShouldBeAlive;
+ public override bool HandlePositionalInput => ShouldBeAlive;
public override bool RemoveWhenNotAlive => false;
public HitObjectMask(DrawableHitObject hitObject)
@@ -96,36 +96,36 @@ namespace osu.Game.Rulesets.Edit
private bool selectionRequested;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
selectionRequested = false;
if (State == SelectionState.NotSelected)
{
- SelectionRequested?.Invoke(this, state);
+ SelectionRequested?.Invoke(this, e.CurrentState);
selectionRequested = true;
}
return IsSelected;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (State == SelectionState.Selected && !selectionRequested)
{
selectionRequested = true;
- SelectionRequested?.Invoke(this, state);
+ SelectionRequested?.Invoke(this, e.CurrentState);
return true;
}
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnDragStart(InputState state) => true;
+ protected override bool OnDragStart(DragStartEvent e) => true;
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
- DragRequested?.Invoke(this, state);
+ DragRequested?.Invoke(this, e.Delta, e.CurrentState);
return true;
}
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index 65b2ef75c4..e8e775a20d 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Judgements
///
/// A drawable object which visualises the hit result of a .
///
- public class DrawableJudgement : Container
+ public class DrawableJudgement : CompositeDrawable
{
private const float judgement_size = 80;
@@ -29,6 +29,7 @@ namespace osu.Game.Rulesets.Judgements
public readonly DrawableHitObject JudgedObject;
+ protected Container JudgementBody;
protected SpriteText JudgementText;
///
@@ -49,14 +50,20 @@ namespace osu.Game.Rulesets.Judgements
{
this.colours = colours;
- Child = new SkinnableDrawable($"Play/{Result.Type}", _ => JudgementText = new OsuSpriteText
+ InternalChild = JudgementBody = new Container
{
- Text = Result.Type.GetDescription().ToUpperInvariant(),
- Font = @"Venera",
- Colour = judgementColour(Result.Type),
- Scale = new Vector2(0.85f, 1),
- TextSize = 12
- }, restrictSize: false);
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Both,
+ Child = new SkinnableDrawable($"Play/{Result.Type}", _ => JudgementText = new OsuSpriteText
+ {
+ Text = Result.Type.GetDescription().ToUpperInvariant(),
+ Font = @"Venera",
+ Colour = judgementColour(Result.Type),
+ Scale = new Vector2(0.85f, 1),
+ TextSize = 12
+ }, restrictSize: false)
+ };
}
protected override void LoadComplete()
@@ -70,17 +77,17 @@ namespace osu.Game.Rulesets.Judgements
case HitResult.None:
break;
case HitResult.Miss:
- this.ScaleTo(1.6f);
- this.ScaleTo(1, 100, Easing.In);
+ JudgementBody.ScaleTo(1.6f);
+ JudgementBody.ScaleTo(1, 100, Easing.In);
- this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint);
- this.RotateTo(40, 800, Easing.InQuint);
+ JudgementBody.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint);
+ JudgementBody.RotateTo(40, 800, Easing.InQuint);
this.Delay(600).FadeOut(200);
break;
default:
- this.ScaleTo(0.9f);
- this.ScaleTo(1, 500, Easing.OutElastic);
+ JudgementBody.ScaleTo(0.9f);
+ JudgementBody.ScaleTo(1, 500, Easing.OutElastic);
this.Delay(100).FadeOut(400);
break;
@@ -103,9 +110,9 @@ namespace osu.Game.Rulesets.Judgements
return colours.Yellow;
case HitResult.Miss:
return colours.Red;
+ default:
+ return Color4.White;
}
-
- return Color4.White;
}
}
}
diff --git a/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs
index d871cdd322..fca04ca513 100644
--- a/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs
+++ b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs
@@ -13,6 +13,7 @@ namespace osu.Game.Rulesets.Mods
{
///
/// Applies this to a list of s.
+ /// This will only be invoked with top-level s. Access if adjusting nested objects is necessary.
///
/// The list of s to apply to.
void ApplyToDrawableHitObjects(IEnumerable drawables);
diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index a274d9b12f..bcf84b375f 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -78,8 +78,8 @@ namespace osu.Game.Rulesets.Objects.Drawables
private bool judgementOccurred;
public bool Interactive = true;
- public override bool HandleKeyboardInput => Interactive;
- public override bool HandleMouseInput => Interactive;
+ public override bool HandleNonPositionalInput => Interactive;
+ public override bool HandlePositionalInput => Interactive;
public override bool RemoveWhenNotAlive => false;
public override bool RemoveCompletedTransforms => false;
@@ -145,7 +145,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
public event Action ApplyCustomUpdateState;
///
- /// Plays all the hitsounds for this .
+ /// Plays all the hit sounds for this .
///
public void PlaySamples() => Samples?.Play();
diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs
index beb9620f78..f5613e927f 100644
--- a/osu.Game/Rulesets/Objects/HitObject.cs
+++ b/osu.Game/Rulesets/Objects/HitObject.cs
@@ -1,10 +1,8 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using System;
using System.Collections.Generic;
using Newtonsoft.Json;
-using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Lists;
using osu.Game.Audio;
using osu.Game.Beatmaps;
@@ -58,10 +56,10 @@ namespace osu.Game.Rulesets.Objects
///
public HitWindows HitWindows { get; set; }
- private readonly Lazy> nestedHitObjects = new Lazy>(() => new SortedList((h1, h2) => h1.StartTime.CompareTo(h2.StartTime)));
+ private readonly SortedList nestedHitObjects = new SortedList(compareObjects);
[JsonIgnore]
- public IReadOnlyList NestedHitObjects => nestedHitObjects.Value;
+ public IReadOnlyList NestedHitObjects => nestedHitObjects;
///
/// Applies default values to this HitObject.
@@ -72,18 +70,14 @@ namespace osu.Game.Rulesets.Objects
{
ApplyDefaultsToSelf(controlPointInfo, difficulty);
- if (nestedHitObjects.IsValueCreated)
- nestedHitObjects.Value.Clear();
+ nestedHitObjects.Clear();
CreateNestedHitObjects();
- if (nestedHitObjects.IsValueCreated)
+ foreach (var h in nestedHitObjects)
{
- nestedHitObjects.Value.ForEach(h =>
- {
- h.HitWindows = HitWindows;
- h.ApplyDefaults(controlPointInfo, difficulty);
- });
+ h.HitWindows = HitWindows;
+ h.ApplyDefaults(controlPointInfo, difficulty);
}
}
@@ -104,7 +98,7 @@ namespace osu.Game.Rulesets.Objects
{
}
- protected void AddNested(HitObject hitObject) => nestedHitObjects.Value.Add(hitObject);
+ protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject);
///
/// Creates the that represents the scoring information for this .
@@ -120,5 +114,7 @@ namespace osu.Game.Rulesets.Objects
///
///
protected virtual HitWindows CreateHitWindows() => new HitWindows();
+
+ private static int compareObjects(HitObject first, HitObject second) => first.StartTime.CompareTo(second.StartTime);
}
}
diff --git a/osu.Game/Rulesets/Scoring/Score.cs b/osu.Game/Rulesets/Scoring/Score.cs
index dfe7ff0195..02f528791a 100644
--- a/osu.Game/Rulesets/Scoring/Score.cs
+++ b/osu.Game/Rulesets/Scoring/Score.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Newtonsoft.Json;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mods;
using osu.Game.Users;
@@ -32,6 +33,7 @@ namespace osu.Game.Rulesets.Scoring
public User User;
+ [JsonIgnore]
public Replay Replay;
public BeatmapInfo Beatmap;
diff --git a/osu.Game/Rulesets/Scoring/ScoreStore.cs b/osu.Game/Rulesets/Scoring/ScoreStore.cs
index 69d25fcb67..091cb29a71 100644
--- a/osu.Game/Rulesets/Scoring/ScoreStore.cs
+++ b/osu.Game/Rulesets/Scoring/ScoreStore.cs
@@ -3,6 +3,7 @@
using System;
using System.IO;
+using osu.Framework.Logging;
using osu.Framework.Platform;
using osu.Game.Beatmaps;
using osu.Game.Database;
@@ -13,8 +14,6 @@ namespace osu.Game.Rulesets.Scoring
{
public class ScoreStore : DatabaseBackedStore, ICanAcceptFiles
{
- private readonly Storage storage;
-
private readonly BeatmapManager beatmaps;
private readonly RulesetStore rulesets;
@@ -25,9 +24,8 @@ namespace osu.Game.Rulesets.Scoring
// ReSharper disable once NotAccessedField.Local (we should keep a reference to this so it is not finalised)
private ScoreIPCChannel ipc;
- public ScoreStore(Storage storage, DatabaseContextFactory factory, IIpcHost importHost = null, BeatmapManager beatmaps = null, RulesetStore rulesets = null) : base(factory)
+ public ScoreStore(DatabaseContextFactory factory, IIpcHost importHost = null, BeatmapManager beatmaps = null, RulesetStore rulesets = null) : base(factory)
{
- this.storage = storage;
this.beatmaps = beatmaps;
this.rulesets = rulesets;
@@ -49,8 +47,14 @@ namespace osu.Game.Rulesets.Scoring
public Score ReadReplayFile(string replayFilename)
{
- using (Stream s = storage.GetStream(Path.Combine(replay_folder, replayFilename)))
- return new DatabasedLegacyScoreParser(rulesets, beatmaps).Parse(s);
+ if (File.Exists(replayFilename))
+ {
+ using (var stream = File.OpenRead(replayFilename))
+ return new DatabasedLegacyScoreParser(rulesets, beatmaps).Parse(stream);
+ }
+
+ Logger.Log($"Replay file {replayFilename} cannot be found", LoggingTarget.Information, LogLevel.Error);
+ return null;
}
}
}
diff --git a/osu.Game/Rulesets/Timing/MultiplierControlPoint.cs b/osu.Game/Rulesets/Timing/MultiplierControlPoint.cs
index a5bd6bfde7..4988bac5ce 100644
--- a/osu.Game/Rulesets/Timing/MultiplierControlPoint.cs
+++ b/osu.Game/Rulesets/Timing/MultiplierControlPoint.cs
@@ -18,9 +18,14 @@ namespace osu.Game.Rulesets.Timing
public double StartTime;
///
- /// The multiplier which this provides.
+ /// The aggregate multiplier which this provides.
///
- public double Multiplier => 1000 / TimingPoint.BeatLength * DifficultyPoint.SpeedMultiplier;
+ public double Multiplier => Velocity * DifficultyPoint.SpeedMultiplier * 1000 / TimingPoint.BeatLength;
+
+ ///
+ /// The velocity multiplier.
+ ///
+ public double Velocity = 1;
///
/// The that provides the timing information for this .
@@ -48,18 +53,6 @@ namespace osu.Game.Rulesets.Timing
StartTime = startTime;
}
- ///
- /// Creates a by copying another .
- ///
- /// The start time of this .
- /// The to copy.
- public MultiplierControlPoint(double startTime, MultiplierControlPoint other)
- : this(startTime)
- {
- TimingPoint = other.TimingPoint;
- DifficultyPoint = other.DifficultyPoint;
- }
-
// ReSharper disable once ImpureMethodCallOnReadonlyValueField
public int CompareTo(MultiplierControlPoint other) => StartTime.CompareTo(other?.StartTime);
}
diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs
index f5db0cd3ce..886eb3ac0e 100644
--- a/osu.Game/Rulesets/UI/Playfield.cs
+++ b/osu.Game/Rulesets/UI/Playfield.cs
@@ -93,6 +93,15 @@ namespace osu.Game.Rulesets.UI
nestedPlayfields.Value.Add(otherPlayfield);
}
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+
+ // in the case a consumer forgets to add the HitObjectContainer, we will add it here.
+ if (HitObjectContainer.Parent == null)
+ AddInternal(HitObjectContainer);
+ }
+
protected override void Update()
{
base.Update();
diff --git a/osu.Game/Rulesets/UI/RulesetInputManager.cs b/osu.Game/Rulesets/UI/RulesetInputManager.cs
index af1dc98fec..340833c090 100644
--- a/osu.Game/Rulesets/UI/RulesetInputManager.cs
+++ b/osu.Game/Rulesets/UI/RulesetInputManager.cs
@@ -8,7 +8,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
+using osu.Framework.Input.Events;
using osu.Framework.Input.StateChanges.Events;
using osu.Framework.Input.States;
using osu.Framework.Timing;
@@ -18,6 +18,9 @@ using osu.Game.Input.Handlers;
using osu.Game.Screens.Play;
using OpenTK.Input;
using static osu.Game.Input.Handlers.ReplayInputHandler;
+using JoystickState = osu.Framework.Input.States.JoystickState;
+using KeyboardState = osu.Framework.Input.States.KeyboardState;
+using MouseState = osu.Framework.Input.States.MouseState;
namespace osu.Game.Rulesets.UI
{
@@ -35,13 +38,7 @@ namespace osu.Game.Rulesets.UI
protected override InputState CreateInitialState()
{
var state = base.CreateInitialState();
- return new RulesetInputManagerInputState
- {
- Mouse = state.Mouse,
- Keyboard = state.Keyboard,
- Joystick = state.Joystick,
- LastReplayState = null
- };
+ return new RulesetInputManagerInputState(state.Mouse, state.Keyboard, state.Joystick);
}
protected readonly KeyBindingContainer KeyBindingContainer;
@@ -76,12 +73,10 @@ namespace osu.Game.Rulesets.UI
#region IHasReplayHandler
private ReplayInputHandler replayInputHandler;
+
public ReplayInputHandler ReplayInputHandler
{
- get
- {
- return replayInputHandler;
- }
+ get => replayInputHandler;
set
{
if (replayInputHandler != null) RemoveHandler(replayInputHandler);
@@ -211,16 +206,20 @@ namespace osu.Game.Rulesets.UI
mouseDisabled = config.GetBindable(OsuSetting.MouseDisableButtons);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool Handle(UIEvent e)
{
- if (mouseDisabled.Value && (args.Button == MouseButton.Left || args.Button == MouseButton.Right)) return false;
- return base.OnMouseDown(state, args);
- }
-
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
- {
- if (!CurrentState.Mouse.IsPressed(args.Button)) return false;
- return base.OnMouseUp(state, args);
+ switch (e)
+ {
+ case MouseDownEvent mouseDown when mouseDown.Button == MouseButton.Left || mouseDown.Button == MouseButton.Right:
+ if (mouseDisabled.Value)
+ return false;
+ break;
+ case MouseUpEvent mouseUp:
+ if (!CurrentState.Mouse.IsPressed(mouseUp.Button))
+ return false;
+ break;
+ }
+ return base.Handle(e);
}
#endregion
@@ -272,8 +271,13 @@ namespace osu.Game.Rulesets.UI
}
public class RulesetInputManagerInputState : InputState
- where T : struct
+ where T : struct
{
public ReplayState LastReplayState;
+
+ public RulesetInputManagerInputState(MouseState mouse = null, KeyboardState keyboard = null, JoystickState joystick = null)
+ : base(mouse, keyboard, joystick)
+ {
+ }
}
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingDirection.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingDirection.cs
index 4fe727cb84..d0db8f8835 100644
--- a/osu.Game/Rulesets/UI/Scrolling/ScrollingDirection.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingDirection.cs
@@ -6,19 +6,19 @@ namespace osu.Game.Rulesets.UI.Scrolling
public enum ScrollingDirection
{
///
- /// Hitobjects will scroll vertically from the bottom of the hitobject container.
+ /// Hit objects will scroll vertically from the bottom of the hitobject container.
///
Up,
///
- /// Hitobjects will scroll vertically from the top of the hitobject container.
+ /// Hit objects will scroll vertically from the top of the hitobject container.
///
Down,
///
- /// Hitobjects will scroll horizontally from the right of the hitobject container.
+ /// Hit objects will scroll horizontally from the right of the hitobject container.
///
Left,
///
- /// Hitobjects will scroll horizontally from the left of the hitobject container.
+ /// Hit objects will scroll horizontally from the left of the hitobject container.
///
Right
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs
index c64fca6eff..7307fc0ead 100644
--- a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs
@@ -1,7 +1,6 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Allocation;
using osu.Framework.Caching;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
@@ -33,20 +32,16 @@ namespace osu.Game.Rulesets.UI.Scrolling
private Cached initialStateCache = new Cached();
- public ScrollingHitObjectContainer()
+ private readonly ISpeedChangeVisualiser speedChangeVisualiser;
+
+ public ScrollingHitObjectContainer(SpeedChangeVisualisationMethod visualisationMethod)
{
RelativeSizeAxes = Axes.Both;
TimeRange.ValueChanged += _ => initialStateCache.Invalidate();
Direction.ValueChanged += _ => initialStateCache.Invalidate();
- }
- private ISpeedChangeVisualiser speedChangeVisualiser;
-
- [BackgroundDependencyLoader]
- private void load(OsuConfigManager config)
- {
- switch (config.Get(OsuSetting.SpeedChangeVisualisation))
+ switch (visualisationMethod)
{
case SpeedChangeVisualisationMethod.Sequential:
speedChangeVisualiser = new SequentialSpeedChangeVisualiser(ControlPoints);
@@ -54,6 +49,9 @@ namespace osu.Game.Rulesets.UI.Scrolling
case SpeedChangeVisualisationMethod.Overlapping:
speedChangeVisualiser = new OverlappingSpeedChangeVisualiser(ControlPoints);
break;
+ case SpeedChangeVisualisationMethod.Constant:
+ speedChangeVisualiser = new ConstantSpeedChangeVisualiser();
+ break;
}
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
index b555b6616a..a1fc13ce4d 100644
--- a/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
@@ -5,6 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Input.Bindings;
+using osu.Game.Configuration;
using osu.Game.Input.Bindings;
using osu.Game.Rulesets.Objects.Drawables;
@@ -62,6 +63,8 @@ namespace osu.Game.Rulesets.UI.Scrolling
///
protected readonly Bindable Direction = new Bindable();
+ protected virtual SpeedChangeVisualisationMethod VisualisationMethod => SpeedChangeVisualisationMethod.Sequential;
+
[BackgroundDependencyLoader]
private void load()
{
@@ -90,7 +93,7 @@ namespace osu.Game.Rulesets.UI.Scrolling
protected sealed override HitObjectContainer CreateHitObjectContainer()
{
- var container = new ScrollingHitObjectContainer();
+ var container = new ScrollingHitObjectContainer(VisualisationMethod);
container.Direction.BindTo(Direction);
return container;
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingRulesetContainer.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingRulesetContainer.cs
index 3fc67e4e34..41cdd6c06f 100644
--- a/osu.Game/Rulesets/UI/Scrolling/ScrollingRulesetContainer.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingRulesetContainer.cs
@@ -60,6 +60,7 @@ namespace osu.Game.Rulesets.UI.Scrolling
return new MultiplierControlPoint(c.Time)
{
+ Velocity = Beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier,
TimingPoint = lastTimingPoint,
DifficultyPoint = lastDifficultyPoint
};
@@ -78,7 +79,7 @@ namespace osu.Game.Rulesets.UI.Scrolling
// If we have no control points, add a default one
if (DefaultControlPoints.Count == 0)
- DefaultControlPoints.Add(new MultiplierControlPoint());
+ DefaultControlPoints.Add(new MultiplierControlPoint { Velocity = Beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier });
DefaultControlPoints.ForEach(c => applySpeedAdjustment(c, Playfield));
}
@@ -88,22 +89,5 @@ namespace osu.Game.Rulesets.UI.Scrolling
playfield.HitObjects.AddControlPoint(controlPoint);
playfield.NestedPlayfields?.OfType().ForEach(p => applySpeedAdjustment(controlPoint, p));
}
-
- ///
- /// Generates a with the default timing change/difficulty change from the beatmap at a time.
- ///
- /// The time to create the control point at.
- /// The default at .
- public MultiplierControlPoint CreateControlPointAt(double time)
- {
- if (DefaultControlPoints.Count == 0)
- return new MultiplierControlPoint(time);
-
- int index = DefaultControlPoints.BinarySearch(new MultiplierControlPoint(time));
- if (index < 0)
- return new MultiplierControlPoint(time);
-
- return new MultiplierControlPoint(time, DefaultControlPoints[index]);
- }
}
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/Visualisers/ConstantSpeedChangeVisualiser.cs b/osu.Game/Rulesets/UI/Scrolling/Visualisers/ConstantSpeedChangeVisualiser.cs
new file mode 100644
index 0000000000..9e910d6b11
--- /dev/null
+++ b/osu.Game/Rulesets/UI/Scrolling/Visualisers/ConstantSpeedChangeVisualiser.cs
@@ -0,0 +1,67 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Collections.Generic;
+using osu.Game.Rulesets.Objects.Drawables;
+using osu.Game.Rulesets.Objects.Types;
+using OpenTK;
+
+namespace osu.Game.Rulesets.UI.Scrolling.Visualisers
+{
+ public class ConstantSpeedChangeVisualiser : ISpeedChangeVisualiser
+ {
+ public void ComputeInitialStates(IEnumerable hitObjects, ScrollingDirection direction, double timeRange, Vector2 length)
+ {
+ foreach (var obj in hitObjects)
+ {
+ obj.LifetimeStart = obj.HitObject.StartTime - timeRange;
+
+ if (obj.HitObject is IHasEndTime endTime)
+ {
+ var hitObjectLength = (endTime.EndTime - obj.HitObject.StartTime) / timeRange;
+
+ switch (direction)
+ {
+ case ScrollingDirection.Up:
+ case ScrollingDirection.Down:
+ obj.Height = (float)(hitObjectLength * length.Y);
+ break;
+ case ScrollingDirection.Left:
+ case ScrollingDirection.Right:
+ obj.Width = (float)(hitObjectLength * length.X);
+ break;
+ }
+ }
+
+ ComputeInitialStates(obj.NestedHitObjects, direction, timeRange, length);
+
+ // Nested hitobjects don't need to scroll, but they do need accurate positions
+ UpdatePositions(obj.NestedHitObjects, direction, obj.HitObject.StartTime, timeRange, length);
+ }
+ }
+
+ public void UpdatePositions(IEnumerable hitObjects, ScrollingDirection direction, double currentTime, double timeRange, Vector2 length)
+ {
+ foreach (var obj in hitObjects)
+ {
+ var position = (obj.HitObject.StartTime - currentTime) / timeRange;
+
+ switch (direction)
+ {
+ case ScrollingDirection.Up:
+ obj.Y = (float)(position * length.Y);
+ break;
+ case ScrollingDirection.Down:
+ obj.Y = (float)(-position * length.Y);
+ break;
+ case ScrollingDirection.Left:
+ obj.X = (float)(position * length.X);
+ break;
+ case ScrollingDirection.Right:
+ obj.X = (float)(-position * length.X);
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/osu.Game/Screens/BackgroundScreen.cs b/osu.Game/Screens/BackgroundScreen.cs
index 46d1260410..7787b4ddc2 100644
--- a/osu.Game/Screens/BackgroundScreen.cs
+++ b/osu.Game/Screens/BackgroundScreen.cs
@@ -5,8 +5,7 @@ using System;
using System.Threading;
using osu.Framework.Screens;
using osu.Framework.Graphics;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK;
namespace osu.Game.Screens
@@ -21,7 +20,7 @@ namespace osu.Game.Screens
private const float transition_length = 500;
private const float x_movement_amount = 50;
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
//we don't want to handle escape key.
return false;
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
index 78561cecbf..e326cdb0ca 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
@@ -4,19 +4,14 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Transforms;
-using OpenTK;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Backgrounds;
namespace osu.Game.Screens.Backgrounds
{
- public class BackgroundScreenBeatmap : BackgroundScreen
+ public class BackgroundScreenBeatmap : BlurrableBackgroundScreen
{
- private Background background;
-
private WorkingBeatmap beatmap;
- private Vector2 blurTarget;
public WorkingBeatmap Beatmap
{
@@ -30,21 +25,21 @@ namespace osu.Game.Screens.Backgrounds
Schedule(() =>
{
- LoadComponentAsync(new BeatmapBackground(beatmap), b =>
+ LoadComponentAsync(new BeatmapBackground(beatmap), b => Schedule(() =>
{
float newDepth = 0;
- if (background != null)
+ if (Background != null)
{
- newDepth = background.Depth + 1;
- background.FinishTransforms();
- background.FadeOut(250);
- background.Expire();
+ newDepth = Background.Depth + 1;
+ Background.FinishTransforms();
+ Background.FadeOut(250);
+ Background.Expire();
}
b.Depth = newDepth;
- Add(background = b);
- background.BlurSigma = blurTarget;
- });
+ Add(Background = b);
+ Background.BlurSigma = BlurTarget;
+ }));
});
}
}
@@ -54,9 +49,6 @@ namespace osu.Game.Screens.Backgrounds
Beatmap = beatmap;
}
- public TransformSequence BlurTo(Vector2 sigma, double duration, Easing easing = Easing.None)
- => background?.BlurTo(blurTarget = sigma, duration, easing);
-
public override bool Equals(BackgroundScreen other)
{
var otherBeatmapBackground = other as BackgroundScreenBeatmap;
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
index 38df9b13ef..989883c8b3 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
@@ -3,32 +3,32 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
+using osu.Framework.MathUtils;
using osu.Framework.Threading;
using osu.Game.Graphics.Backgrounds;
namespace osu.Game.Screens.Backgrounds
{
- public class BackgroundScreenDefault : BackgroundScreen
+ public class BackgroundScreenDefault : BlurrableBackgroundScreen
{
private int currentDisplay;
private const int background_count = 5;
private string backgroundName => $@"Menu/menu-background-{currentDisplay % background_count + 1}";
- private Background current;
-
[BackgroundDependencyLoader]
private void load()
{
+ currentDisplay = RNG.Next(0, background_count);
display(new Background(backgroundName));
}
private void display(Background newBackground)
{
- current?.FadeOut(800, Easing.InOutSine);
- current?.Expire();
+ Background?.FadeOut(800, Easing.InOutSine);
+ Background?.Expire();
- Add(current = newBackground);
+ Add(Background = newBackground);
currentDisplay++;
}
diff --git a/osu.Game/Screens/BlurrableBackgroundScreen.cs b/osu.Game/Screens/BlurrableBackgroundScreen.cs
new file mode 100644
index 0000000000..92d32badc4
--- /dev/null
+++ b/osu.Game/Screens/BlurrableBackgroundScreen.cs
@@ -0,0 +1,20 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Transforms;
+using osu.Game.Graphics.Backgrounds;
+using OpenTK;
+
+namespace osu.Game.Screens
+{
+ public abstract class BlurrableBackgroundScreen : BackgroundScreen
+ {
+ protected Background Background;
+
+ protected Vector2 BlurTarget;
+
+ public TransformSequence BlurTo(Vector2 sigma, double duration, Easing easing = Easing.None)
+ => Background?.BlurTo(BlurTarget = sigma, duration, easing);
+ }
+}
diff --git a/osu.Game/Screens/Edit/Components/PlaybackControl.cs b/osu.Game/Screens/Edit/Components/PlaybackControl.cs
index 6cd7fd52d4..3c8288f04a 100644
--- a/osu.Game/Screens/Edit/Components/PlaybackControl.cs
+++ b/osu.Game/Screens/Edit/Components/PlaybackControl.cs
@@ -8,7 +8,7 @@ using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
@@ -44,7 +44,7 @@ namespace osu.Game.Screens.Edit.Components
new OsuSpriteText
{
Origin = Anchor.BottomLeft,
- Text = "Playback Speed",
+ Text = "Playback speed",
RelativePositionAxes = Axes.Y,
Y = 0.5f,
Padding = new MarginPadding { Left = 45 }
@@ -138,13 +138,13 @@ namespace osu.Game.Screens.Edit.Components
textBold.Colour = hoveredColour = colours.Yellow;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
updateState();
return true;
}
- protected override void OnHoverLost(InputState state) => updateState();
+ protected override void OnHoverLost(HoverLostEvent e) => updateState();
protected override void OnActivated() => updateState();
protected override void OnDeactivated() => updateState();
diff --git a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
index 7ff3849361..4b57e1e92d 100644
--- a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
+++ b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
@@ -6,8 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
@@ -30,17 +29,17 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
Add(marker = new MarkerVisualisation());
}
- protected override bool OnDragStart(InputState state) => true;
- protected override bool OnDragEnd(InputState state) => true;
- protected override bool OnDrag(InputState state)
+ protected override bool OnDragStart(DragStartEvent e) => true;
+ protected override bool OnDragEnd(DragEndEvent e) => true;
+ protected override bool OnDrag(DragEvent e)
{
- seekToPosition(state.Mouse.NativeState.Position);
+ seekToPosition(e.ScreenSpaceMousePosition);
return true;
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- seekToPosition(state.Mouse.NativeState.Position);
+ seekToPosition(e.ScreenSpaceMousePosition);
return true;
}
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index 7159cd919c..62cf76ef69 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -12,7 +12,7 @@ using osu.Game.Screens.Edit.Menus;
using osu.Game.Screens.Edit.Components.Timelines.Summary;
using osu.Framework.Allocation;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Platform;
using osu.Framework.Timing;
using osu.Game.Graphics.UserInterface;
@@ -182,9 +182,9 @@ namespace osu.Game.Screens.Edit
LoadComponentAsync(currentScreen, screenContainer.Add);
}
- protected override bool OnScroll(InputState state)
+ protected override bool OnScroll(ScrollEvent e)
{
- if (state.Mouse.ScrollDelta.X + state.Mouse.ScrollDelta.Y > 0)
+ if (e.ScrollDelta.X + e.ScrollDelta.Y > 0)
clock.SeekBackward(!clock.IsRunning);
else
clock.SeekForward(!clock.IsRunning);
diff --git a/osu.Game/Screens/Edit/Menus/EditorMenuBar.cs b/osu.Game/Screens/Edit/Menus/EditorMenuBar.cs
index c6351c8520..af0a7b6694 100644
--- a/osu.Game/Screens/Edit/Menus/EditorMenuBar.cs
+++ b/osu.Game/Screens/Edit/Menus/EditorMenuBar.cs
@@ -11,7 +11,7 @@ using osu.Game.Graphics.UserInterface;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Configuration;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Screens.Edit.Screens;
namespace osu.Game.Screens.Edit.Menus
@@ -171,18 +171,18 @@ namespace osu.Game.Screens.Edit.Menus
{
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (Item is EditorMenuItemSpacer)
return true;
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (Item is EditorMenuItemSpacer)
return true;
- return base.OnClick(state);
+ return base.OnClick(e);
}
}
}
diff --git a/osu.Game/Screens/Edit/Screens/Compose/BeatDivisorControl.cs b/osu.Game/Screens/Edit/Screens/Compose/BeatDivisorControl.cs
index 63df143ca8..e46be9f7c1 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/BeatDivisorControl.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/BeatDivisorControl.cs
@@ -12,8 +12,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using OpenTK;
@@ -231,11 +230,11 @@ namespace osu.Game.Screens.Edit.Screens.Compose
{
}
- public override bool HandleKeyboardInput => IsHovered && !CurrentNumber.Disabled;
+ public override bool HandleNonPositionalInput => IsHovered && !CurrentNumber.Disabled;
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.Right:
beatDivisor.Next();
@@ -250,34 +249,34 @@ namespace osu.Game.Screens.Edit.Screens.Compose
}
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
marker.Active = true;
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
marker.Active = false;
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
- handleMouseInput(state);
+ handleMouseInput(e.ScreenSpaceMousePosition);
return true;
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
- handleMouseInput(state);
+ handleMouseInput(e.ScreenSpaceMousePosition);
return true;
}
- private void handleMouseInput(InputState state)
+ private void handleMouseInput(Vector2 screenSpaceMousePosition)
{
// copied from SliderBar so we can do custom spacing logic.
- var xPosition = (ToLocalSpace(state?.Mouse.NativeState.Position ?? Vector2.Zero).X - RangePadding) / UsableWidth;
+ var xPosition = (ToLocalSpace(screenSpaceMousePosition).X - RangePadding) / UsableWidth;
CurrentNumber.Value = availableDivisors.OrderBy(d => Math.Abs(getMappedPosition(d) - xPosition)).First();
OnUserChange();
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/DragLayer.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/DragLayer.cs
index c4392bbc60..981ddd989c 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Layers/DragLayer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/DragLayer.cs
@@ -7,7 +7,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Primitives;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Rulesets.Edit;
using OpenTK.Graphics;
@@ -56,16 +56,16 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
};
}
- protected override bool OnDragStart(InputState state)
+ protected override bool OnDragStart(DragStartEvent e)
{
this.FadeIn(250, Easing.OutQuint);
return true;
}
- protected override bool OnDrag(InputState state)
+ protected override bool OnDrag(DragEvent e)
{
- var dragPosition = state.Mouse.NativeState.Position;
- var dragStartPosition = state.Mouse.NativeState.PositionMouseDown ?? dragPosition;
+ var dragPosition = e.ScreenSpaceMousePosition;
+ var dragStartPosition = e.ScreenSpaceMouseDownPosition;
var dragQuad = new Quad(dragStartPosition.X, dragStartPosition.Y, dragPosition.X - dragStartPosition.X, dragPosition.Y - dragStartPosition.Y);
@@ -82,7 +82,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
return true;
}
- protected override bool OnDragEnd(InputState state)
+ protected override bool OnDragEnd(DragEndEvent e)
{
this.FadeOut(250, Easing.OutQuint);
DragEnd?.Invoke();
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs
index d212bbe7dd..65f31dd56d 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs
@@ -4,8 +4,7 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Objects.Drawables;
@@ -52,7 +51,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
addMask(obj);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
maskContainer.DeselectAll();
return true;
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskContainer.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskContainer.cs
index 5ee31769a3..19258d669e 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskContainer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskContainer.cs
@@ -8,6 +8,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input.States;
using osu.Game.Rulesets.Edit;
+using OpenTK;
using RectangleF = osu.Framework.Graphics.Primitives.RectangleF;
namespace osu.Game.Screens.Edit.Screens.Compose.Layers
@@ -32,7 +33,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
///
/// Invoked when any requests drag.
///
- public event Action MaskDragRequested;
+ public event Action MaskDragRequested;
private IEnumerable aliveMasks => AliveInternalChildren.Cast();
@@ -103,7 +104,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
}
private void onSelectionRequested(HitObjectMask mask, InputState state) => MaskSelectionRequested?.Invoke(mask, state);
- private void onDragRequested(HitObjectMask mask, InputState state) => MaskDragRequested?.Invoke(mask, state);
+ private void onDragRequested(HitObjectMask mask, Vector2 delta, InputState state) => MaskDragRequested?.Invoke(mask, delta, state);
protected override int Compare(Drawable x, Drawable y)
{
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskSelection.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskSelection.cs
index 927e7a2342..635edf82da 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskSelection.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/MaskSelection.cs
@@ -54,7 +54,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
#region User Input Handling
- public void HandleDrag(HitObjectMask m, InputState state)
+ public void HandleDrag(HitObjectMask m, Vector2 delta, InputState state)
{
// Todo: Various forms of snapping
@@ -63,7 +63,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
switch (mask.HitObject.HitObject)
{
case IHasEditablePosition editablePosition:
- editablePosition.OffsetPosition(state.Mouse.Delta);
+ editablePosition.OffsetPosition(delta);
break;
}
}
diff --git a/osu.Game/Screens/Edit/Screens/Compose/RadioButtons/DrawableRadioButton.cs b/osu.Game/Screens/Edit/Screens/Compose/RadioButtons/DrawableRadioButton.cs
index 803a1275d7..2c7e2043fc 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/RadioButtons/DrawableRadioButton.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/RadioButtons/DrawableRadioButton.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
@@ -99,7 +99,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.RadioButtons
bubble.Colour = button.Selected ? selectedBubbleColour : defaultBubbleColour;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (button.Selected)
return true;
@@ -109,7 +109,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.RadioButtons
button.Selected.Value = true;
- return base.OnClick(state);
+ return base.OnClick(e);
}
protected override SpriteText CreateText() => new OsuSpriteText
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Timeline/Timeline.cs b/osu.Game/Screens/Edit/Screens/Compose/Timeline/Timeline.cs
index 30205c5aa1..da95564975 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Timeline/Timeline.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Timeline/Timeline.cs
@@ -7,8 +7,7 @@ using osu.Framework.Configuration;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Audio;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
@@ -133,9 +132,9 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
ScrollTo((float)(adjustableClock.CurrentTime / track.Length) * Content.DrawWidth, false);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- if (base.OnMouseDown(state, args))
+ if (base.OnMouseDown(e))
{
beginUserDrag();
return true;
@@ -144,10 +143,10 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
return false;
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
endUserDrag();
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
private void beginUserDrag()
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Timeline/TimelineArea.cs b/osu.Game/Screens/Edit/Screens/Compose/Timeline/TimelineArea.cs
index 006317e57e..ecf760be8e 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Timeline/TimelineArea.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Timeline/TimelineArea.cs
@@ -59,8 +59,8 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
Spacing = new Vector2(0, 4),
Children = new[]
{
- hitObjectsCheckbox = new OsuCheckbox { LabelText = "Hitobjects" },
- hitSoundsCheckbox = new OsuCheckbox { LabelText = "Hitsounds" },
+ hitObjectsCheckbox = new OsuCheckbox { LabelText = "Hit objects" },
+ hitSoundsCheckbox = new OsuCheckbox { LabelText = "Hit sounds" },
waveformCheckbox = new OsuCheckbox { LabelText = "Waveform" }
}
}
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ZoomableScrollContainer.cs b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ZoomableScrollContainer.cs
index d30aaacc6a..bbba439ca7 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ZoomableScrollContainer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ZoomableScrollContainer.cs
@@ -5,7 +5,7 @@ using System;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Transforms;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using OpenTK;
@@ -97,13 +97,13 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
zoomedContent.Width = DrawWidth * currentZoom;
}
- protected override bool OnScroll(InputState state)
+ protected override bool OnScroll(ScrollEvent e)
{
- if (state.Mouse.HasPreciseScroll)
+ if (e.IsPrecise)
// for now, we don't support zoom when using a precision scroll device. this needs gesture support.
- return base.OnScroll(state);
+ return base.OnScroll(e);
- setZoomTarget(zoomTarget + state.Mouse.ScrollDelta.Y, zoomedContent.ToLocalSpace(state.Mouse.NativeState.Position).X);
+ setZoomTarget(zoomTarget + e.ScrollDelta.Y, zoomedContent.ToLocalSpace(e.ScreenSpaceMousePosition).X);
return true;
}
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index e53905a102..2b85ee6158 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -17,8 +17,7 @@ using OpenTK.Input;
using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Graphics.Containers;
using osu.Framework.Audio.Track;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps.ControlPoints;
namespace osu.Game.Screens.Menu
@@ -47,7 +46,7 @@ namespace osu.Game.Screens.Menu
private SampleChannel sampleClick;
private SampleChannel sampleHover;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => box.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => box.ReceivePositionalInputAt(screenSpacePos);
public Button(string text, string sampleName, FontAwesome symbol, Color4 colour, Action clickAction = null, float extraWidth = 0, Key triggerKey = Key.Unknown)
{
@@ -151,7 +150,7 @@ namespace osu.Game.Screens.Menu
rightward = !rightward;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
if (State != ButtonState.Expanded) return true;
@@ -167,7 +166,7 @@ namespace osu.Game.Screens.Menu
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
icon.ClearTransforms();
icon.RotateTo(0, 500, Easing.Out);
@@ -186,30 +185,30 @@ namespace osu.Game.Screens.Menu
sampleClick = audio.Sample.Get($@"Menu/{sampleName}");
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
boxHoverLayer.FadeTo(0.1f, 1000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
boxHoverLayer.FadeTo(0, 1000, Easing.OutQuint);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
trigger();
return true;
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat || state.Keyboard.ControlPressed || state.Keyboard.ShiftPressed || state.Keyboard.AltPressed)
+ if (e.Repeat || e.ControlPressed || e.ShiftPressed || e.AltPressed)
return false;
- if (triggerKey == args.Key && triggerKey != Key.Unknown)
+ if (triggerKey == e.Key && triggerKey != Key.Unknown)
{
trigger();
return true;
@@ -229,8 +228,8 @@ namespace osu.Game.Screens.Menu
boxHoverLayer.FadeOut(800, Easing.OutExpo);
}
- public override bool HandleKeyboardInput => state == ButtonState.Expanded;
- public override bool HandleMouseInput => state != ButtonState.Exploded && box.Scale.X >= 0.8f;
+ public override bool HandleNonPositionalInput => state == ButtonState.Expanded;
+ public override bool HandlePositionalInput => state != ButtonState.Exploded && box.Scale.X >= 0.8f;
protected override void Update()
{
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index dba0a3ac50..5c17317fc1 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -160,8 +160,8 @@ namespace osu.Game.Screens.Menu
private ButtonSystemState state = ButtonSystemState.Initial;
- public override bool HandleKeyboardInput => state != ButtonSystemState.Exit;
- public override bool HandleMouseInput => state != ButtonSystemState.Exit;
+ public override bool HandleNonPositionalInput => state != ButtonSystemState.Exit;
+ public override bool HandlePositionalInput => state != ButtonSystemState.Exit;
public ButtonSystemState State
{
diff --git a/osu.Game/Screens/Menu/LogoVisualisation.cs b/osu.Game/Screens/Menu/LogoVisualisation.cs
index a3cb2f13d0..34fb0b196b 100644
--- a/osu.Game/Screens/Menu/LogoVisualisation.cs
+++ b/osu.Game/Screens/Menu/LogoVisualisation.cs
@@ -64,9 +64,6 @@ namespace osu.Game.Screens.Menu
private readonly float[] frequencyAmplitudes = new float[256];
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
private Shader shader;
private readonly Texture texture;
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index 7e97859be6..2374d6a2fe 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -6,10 +6,10 @@ using OpenTK.Graphics;
using OpenTK.Input;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Screens;
using osu.Game.Beatmaps;
+using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Screens.Backgrounds;
using osu.Game.Screens.Charts;
@@ -64,6 +64,20 @@ namespace osu.Game.Screens.Menu
},
sideFlashes = new MenuSideFlashes(),
};
+
+ buttons.StateChanged += state =>
+ {
+ switch (state)
+ {
+ case ButtonSystemState.Initial:
+ case ButtonSystemState.Exit:
+ background.FadeColour(Color4.White, 500, Easing.OutSine);
+ break;
+ default:
+ background.FadeColour(OsuColour.Gray(0.8f), 500, Easing.OutSine);
+ break;
+ }
+ };
}
[BackgroundDependencyLoader(true)]
@@ -185,15 +199,15 @@ namespace osu.Game.Screens.Menu
return base.OnExiting(next);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (!args.Repeat && state.Keyboard.ControlPressed && state.Keyboard.ShiftPressed && args.Key == Key.D)
+ if (!e.Repeat && e.ControlPressed && e.ShiftPressed && e.Key == Key.D)
{
Push(new Drawings());
return true;
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
}
}
diff --git a/osu.Game/Screens/Menu/MenuSideFlashes.cs b/osu.Game/Screens/Menu/MenuSideFlashes.cs
index 7d46aad089..3de68fe914 100644
--- a/osu.Game/Screens/Menu/MenuSideFlashes.cs
+++ b/osu.Game/Screens/Menu/MenuSideFlashes.cs
@@ -19,9 +19,6 @@ namespace osu.Game.Screens.Menu
{
public class MenuSideFlashes : BeatSyncedContainer
{
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
private readonly IBindable beatmap = new Bindable();
private Box leftBox;
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index 5ad6427fd8..4e6a107f91 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -11,8 +11,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Graphics;
@@ -68,7 +67,7 @@ namespace osu.Game.Screens.Menu
public bool BeatMatching = true;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => logoContainer.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => logoContainer.ReceivePositionalInputAt(screenSpacePos);
public bool Ripple
{
@@ -342,25 +341,25 @@ namespace osu.Game.Screens.Menu
}
}
- public override bool HandleMouseInput => base.HandleMouseInput && Action != null && Alpha > 0.2f;
+ public override bool HandlePositionalInput => base.HandlePositionalInput && Action != null && Alpha > 0.2f;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- if (args.Button != MouseButton.Left) return false;
+ if (e.Button != MouseButton.Left) return false;
logoBounceContainer.ScaleTo(0.9f, 1000, Easing.Out);
return true;
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- if (args.Button != MouseButton.Left) return false;
+ if (e.Button != MouseButton.Left) return false;
logoBounceContainer.ScaleTo(1f, 500, Easing.OutElastic);
return true;
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (Action?.Invoke() ?? true)
sampleClick.Play();
@@ -371,13 +370,13 @@ namespace osu.Game.Screens.Menu
return true;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
logoHoverContainer.ScaleTo(1.1f, 500, Easing.OutElastic);
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
logoHoverContainer.ScaleTo(1, 500, Easing.OutElastic);
}
diff --git a/osu.Game/Screens/Multi/Components/DrawableRoom.cs b/osu.Game/Screens/Multi/Components/DrawableRoom.cs
index 739346fabe..67db23263b 100644
--- a/osu.Game/Screens/Multi/Components/DrawableRoom.cs
+++ b/osu.Game/Screens/Multi/Components/DrawableRoom.cs
@@ -10,7 +10,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
@@ -246,7 +246,7 @@ namespace osu.Game.Screens.Multi.Components
this.FadeInFromZero(transition_duration);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (Enabled.Value)
{
diff --git a/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs b/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
index 1a47829ad7..3b3f789628 100644
--- a/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
+++ b/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
@@ -6,7 +6,7 @@ using System.Linq;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Screens;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer;
@@ -112,7 +112,7 @@ namespace osu.Game.Screens.Multi.Screens.Lounge
};
}
- protected override void OnFocus(InputState state)
+ protected override void OnFocus(FocusEvent e)
{
GetContainingInputManager().ChangeFocus(Filter.Search);
}
diff --git a/osu.Game/Screens/Multi/Screens/Match/Header.cs b/osu.Game/Screens/Multi/Screens/Match/Header.cs
index cc31f10fd2..d469815d59 100644
--- a/osu.Game/Screens/Multi/Screens/Match/Header.cs
+++ b/osu.Game/Screens/Multi/Screens/Match/Header.cs
@@ -8,8 +8,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
@@ -151,28 +150,28 @@ namespace osu.Game.Screens.Multi.Screens.Match
border.BorderColour = colours.Yellow;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
border.FadeIn(transition_duration);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
border.FadeOut(transition_duration);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
bg.FadeTo(0.75f, 1000, Easing.Out);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
bg.FadeTo(bg_opacity, transition_duration);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
}
}
diff --git a/osu.Game/Screens/Play/GameplayMenuOverlay.cs b/osu.Game/Screens/Play/GameplayMenuOverlay.cs
index f50b3e9661..2c984e6135 100644
--- a/osu.Game/Screens/Play/GameplayMenuOverlay.cs
+++ b/osu.Game/Screens/Play/GameplayMenuOverlay.cs
@@ -16,8 +16,7 @@ using OpenTK.Input;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Input.Bindings;
namespace osu.Game.Screens.Play
@@ -28,9 +27,9 @@ namespace osu.Game.Screens.Play
private const int button_height = 70;
private const float background_alpha = 0.75f;
- protected override bool BlockPassThroughKeyboard => true;
+ protected override bool BlockNonPositionalInput => true;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
public Action OnRetry;
public Action OnQuit;
@@ -155,11 +154,11 @@ namespace osu.Game.Screens.Play
protected override void PopOut() => this.FadeOut(transition_duration, Easing.In);
// Don't let mouse down events through the overlay or people can click circles while paused.
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args) => true;
+ protected override bool OnMouseUp(MouseUpEvent e) => true;
- protected override bool OnMouseMove(InputState state) => true;
+ protected override bool OnMouseMove(MouseMoveEvent e) => true;
protected void AddButton(string text, Color4 colour, Action action)
{
@@ -204,11 +203,11 @@ namespace osu.Game.Screens.Play
}
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (!args.Repeat)
+ if (!e.Repeat)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.Up:
if (selectionIndex == -1 || selectionIndex == 0)
@@ -225,7 +224,7 @@ namespace osu.Game.Screens.Play
}
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
public bool OnPressed(GlobalAction action)
@@ -283,20 +282,20 @@ namespace osu.Game.Screens.Play
private class Button : DialogButton
{
- protected override bool OnHover(InputState state) => true;
+ protected override bool OnHover(HoverEvent e) => true;
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
Selected.Value = true;
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat || args.Key != Key.Enter || !Selected)
+ if (e.Repeat || e.Key != Key.Enter || !Selected)
return false;
- OnClick(state);
+ Click();
return true;
}
}
diff --git a/osu.Game/Screens/Play/HUD/ModDisplay.cs b/osu.Game/Screens/Play/HUD/ModDisplay.cs
index 1a164b473d..04f086282e 100644
--- a/osu.Game/Screens/Play/HUD/ModDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/ModDisplay.cs
@@ -12,7 +12,7 @@ using osu.Game.Rulesets.UI;
using OpenTK;
using osu.Game.Graphics.Containers;
using System.Linq;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
namespace osu.Game.Screens.Play.HUD
{
@@ -93,16 +93,16 @@ namespace osu.Game.Screens.Play.HUD
private void contract() => iconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, Easing.OutQuint);
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
expand();
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
contract();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
}
}
diff --git a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs
index e5e2ed7ee0..debce8c680 100644
--- a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs
+++ b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs
@@ -3,8 +3,7 @@
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK;
using osu.Game.Screens.Play.PlayerSettings;
using OpenTK.Input;
@@ -51,22 +50,22 @@ namespace osu.Game.Screens.Play.HUD
protected override void PopOut() => this.FadeOut(fade_duration);
//We want to handle keyboard inputs all the time in order to trigger ToggleVisibility() when not visible
- public override bool HandleKeyboardInput => true;
+ public override bool HandleNonPositionalInput => true;
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat) return false;
+ if (e.Repeat) return false;
- if (state.Keyboard.ControlPressed)
+ if (e.ControlPressed)
{
- if (args.Key == Key.H && ReplayLoaded)
+ if (e.Key == Key.H && ReplayLoaded)
{
ToggleVisibility();
return true;
}
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
}
}
diff --git a/osu.Game/Screens/Play/HUD/QuitButton.cs b/osu.Game/Screens/Play/HUD/QuitButton.cs
index 2a4b1f408d..88547e0169 100644
--- a/osu.Game/Screens/Play/HUD/QuitButton.cs
+++ b/osu.Game/Screens/Play/HUD/QuitButton.cs
@@ -8,8 +8,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
@@ -20,7 +19,7 @@ namespace osu.Game.Screens.Play.HUD
{
public class QuitButton : FillFlowContainer
{
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
private readonly Button button;
@@ -62,10 +61,10 @@ namespace osu.Game.Screens.Play.HUD
private float positionalAdjust;
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
- positionalAdjust = Vector2.Distance(state.Mouse.NativeState.Position, button.ScreenSpaceDrawQuad.Centre) / 200;
- return base.OnMouseMove(state);
+ positionalAdjust = Vector2.Distance(e.ScreenSpaceMousePosition, button.ScreenSpaceDrawQuad.Centre) / 200;
+ return base.OnMouseMove(e);
}
protected override void Update()
@@ -170,28 +169,28 @@ namespace osu.Game.Screens.Play.HUD
});
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
HoverGained?.Invoke();
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
HoverLost?.Invoke();
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- if (!pendingAnimation && state.Mouse.Buttons.Count() == 1)
+ if (!pendingAnimation && e.CurrentState.Mouse.Buttons.Count() == 1)
BeginConfirm();
return true;
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- if (!state.Mouse.Buttons.Any())
+ if (!e.HasAnyButtonPressed)
AbortConfirm();
return true;
}
diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs
index eb137f5447..db0d7b6ccc 100644
--- a/osu.Game/Screens/Play/HUDOverlay.cs
+++ b/osu.Game/Screens/Play/HUDOverlay.cs
@@ -5,8 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
@@ -152,13 +151,13 @@ namespace osu.Game.Screens.Play
Progress.BindRulestContainer(rulesetContainer);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat) return false;
+ if (e.Repeat) return false;
- if (state.Keyboard.ShiftPressed)
+ if (e.ShiftPressed)
{
- switch (args.Key)
+ switch (e.Key)
{
case Key.Tab:
showHud.Value = !showHud.Value;
@@ -166,7 +165,7 @@ namespace osu.Game.Screens.Play
}
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
protected virtual RollingCounter CreateAccuracyCounter() => new PercentageCounter
diff --git a/osu.Game/Screens/Play/KeyCounterCollection.cs b/osu.Game/Screens/Play/KeyCounterCollection.cs
index 76c102c840..925f96f33b 100644
--- a/osu.Game/Screens/Play/KeyCounterCollection.cs
+++ b/osu.Game/Screens/Play/KeyCounterCollection.cs
@@ -118,8 +118,8 @@ namespace osu.Game.Screens.Play
private void updateVisibility() => this.FadeTo(Visible.Value || configVisibility.Value ? 1 : 0, duration);
- public override bool HandleKeyboardInput => receptor == null;
- public override bool HandleMouseInput => receptor == null;
+ public override bool HandleNonPositionalInput => receptor == null;
+ public override bool HandlePositionalInput => receptor == null;
public IFrameBasedClock AudioClock { get; set; }
@@ -149,7 +149,7 @@ namespace osu.Game.Screens.Play
Target = target;
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
protected override bool Handle(UIEvent e)
{
diff --git a/osu.Game/Screens/Play/KeyCounterKeyboard.cs b/osu.Game/Screens/Play/KeyCounterKeyboard.cs
index 1c2f2c0ac4..725eae0367 100644
--- a/osu.Game/Screens/Play/KeyCounterKeyboard.cs
+++ b/osu.Game/Screens/Play/KeyCounterKeyboard.cs
@@ -1,8 +1,7 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK.Input;
namespace osu.Game.Screens.Play
@@ -15,16 +14,16 @@ namespace osu.Game.Screens.Play
Key = key;
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Key == Key) IsLit = true;
- return base.OnKeyDown(state, args);
+ if (e.Key == Key) IsLit = true;
+ return base.OnKeyDown(e);
}
- protected override bool OnKeyUp(InputState state, KeyUpEventArgs args)
+ protected override bool OnKeyUp(KeyUpEvent e)
{
- if (args.Key == Key) IsLit = false;
- return base.OnKeyUp(state, args);
+ if (e.Key == Key) IsLit = false;
+ return base.OnKeyUp(e);
}
}
}
diff --git a/osu.Game/Screens/Play/KeyCounterMouse.cs b/osu.Game/Screens/Play/KeyCounterMouse.cs
index 20cc53caee..c1ed5f84f4 100644
--- a/osu.Game/Screens/Play/KeyCounterMouse.cs
+++ b/osu.Game/Screens/Play/KeyCounterMouse.cs
@@ -1,8 +1,7 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using OpenTK.Input;
using OpenTK;
@@ -17,7 +16,7 @@ namespace osu.Game.Screens.Play
Button = button;
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
private static string getStringRepresentation(MouseButton button)
{
@@ -32,16 +31,16 @@ namespace osu.Game.Screens.Play
}
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- if (args.Button == Button) IsLit = true;
- return base.OnMouseDown(state, args);
+ if (e.Button == Button) IsLit = true;
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
- if (args.Button == Button) IsLit = false;
- return base.OnMouseUp(state, args);
+ if (e.Button == Button) IsLit = false;
+ return base.OnMouseUp(e);
}
}
}
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 5ad0130fd7..b3cbeb3850 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -12,7 +12,7 @@ using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Logging;
using osu.Framework.Screens;
using osu.Framework.Threading;
@@ -370,7 +370,7 @@ namespace osu.Game.Screens.Play
Content.FadeOut(fadeOutDuration);
}
- protected override bool OnScroll(InputState state) => mouseWheelDisabled.Value && !pauseContainer.IsPaused;
+ protected override bool OnScroll(ScrollEvent e) => mouseWheelDisabled.Value && !pauseContainer.IsPaused;
private void initializeStoryboard(bool asyncLoad)
{
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index 05a43b32f0..d87fb1db86 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -7,7 +7,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Localisation;
using osu.Framework.Screens;
using osu.Framework.Threading;
@@ -136,21 +136,21 @@ namespace osu.Game.Screens.Play
private bool readyForPush => player.LoadState == LoadState.Ready && IsHovered && GetContainingInputManager()?.DraggedDrawable == null;
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
// restore our screen defaults
InitializeBackgroundElements();
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
if (GetContainingInputManager().HoveredDrawables.Contains(visualSettings))
{
// show user setting preview
UpdateBackgroundElements();
}
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
protected override void InitializeBackgroundElements()
diff --git a/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs b/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
index 64c49099f2..6e317ccfc9 100644
--- a/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
@@ -5,8 +5,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
@@ -137,16 +136,16 @@ namespace osu.Game.Screens.Play.PlayerSettings
this.Delay(600).FadeTo(inactive_alpha, fade_duration, Easing.OutQuint);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
this.FadeIn(fade_duration, Easing.OutQuint);
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
this.FadeTo(inactive_alpha, fade_duration, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
[BackgroundDependencyLoader]
@@ -161,6 +160,6 @@ namespace osu.Game.Screens.Play.PlayerSettings
protected override Container Content => content;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
}
}
diff --git a/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs b/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
index 439e344020..f762597e81 100644
--- a/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
@@ -38,7 +38,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
},
showStoryboardToggle = new PlayerCheckbox { LabelText = "Storyboards" },
beatmapSkinsToggle = new PlayerCheckbox { LabelText = "Beatmap skins" },
- beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = "Beatmap hitsounds" }
+ beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = "Beatmap hit sounds" }
};
}
diff --git a/osu.Game/Screens/Play/SkipOverlay.cs b/osu.Game/Screens/Play/SkipOverlay.cs
index 046a00d79b..cd34623951 100644
--- a/osu.Game/Screens/Play/SkipOverlay.cs
+++ b/osu.Game/Screens/Play/SkipOverlay.cs
@@ -18,8 +18,7 @@ using OpenTK.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Game.Graphics.Containers;
using osu.Framework.Input.Bindings;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Input.Bindings;
namespace osu.Game.Screens.Play
@@ -37,8 +36,8 @@ namespace osu.Game.Screens.Play
private FadeContainer fadeContainer;
private double displayTime;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
- protected override bool BlockPassThroughMouse => false;
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
+ protected override bool BlockPositionalInput => false;
public SkipOverlay(double startTime)
{
@@ -129,11 +128,11 @@ namespace osu.Game.Screens.Play
remainingTimeBox.ResizeWidthTo((float)Math.Max(0, 1 - (Time.Current - displayTime) / (beginFadeTime - displayTime)), 120, Easing.OutQuint);
}
- protected override bool OnMouseMove(InputState state)
+ protected override bool OnMouseMove(MouseMoveEvent e)
{
- if (!state.Mouse.HasAnyButtonPressed)
+ if (!e.HasAnyButtonPressed)
fadeContainer.State = Visibility.Visible;
- return base.OnMouseMove(state);
+ return base.OnMouseMove(e);
}
public bool OnPressed(GlobalAction action)
@@ -194,16 +193,16 @@ namespace osu.Game.Screens.Play
State = Visibility.Visible;
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
scheduledHide?.Cancel();
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
State = Visibility.Visible;
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
}
@@ -284,7 +283,7 @@ namespace osu.Game.Screens.Play
};
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
flow.TransformSpacingTo(new Vector2(5), 500, Easing.OutQuint);
box.FadeColour(colourHover, 500, Easing.OutQuint);
@@ -292,27 +291,27 @@ namespace osu.Game.Screens.Play
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
flow.TransformSpacingTo(new Vector2(0), 500, Easing.OutQuint);
box.FadeColour(colourNormal, 500, Easing.OutQuint);
background.FadeTo(0.2f, 500, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
aspect.ScaleTo(0.75f, 2000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
aspect.ScaleTo(1, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (!Enabled)
return false;
@@ -322,7 +321,7 @@ namespace osu.Game.Screens.Play
box.FlashColour(Color4.White, 500, Easing.OutQuint);
aspect.ScaleTo(1.2f, 2000, Easing.OutQuint);
- bool result = base.OnClick(state);
+ bool result = base.OnClick(e);
// for now, let's disable the skip button after the first press.
// this will likely need to be contextual in the future (bound from external components).
diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs
index 2ca471c5c1..2e2c77c1c8 100644
--- a/osu.Game/Screens/Play/SongProgress.cs
+++ b/osu.Game/Screens/Play/SongProgress.cs
@@ -31,8 +31,8 @@ namespace osu.Game.Screens.Play
public Action OnSeek;
- public override bool HandleKeyboardInput => AllowSeeking;
- public override bool HandleMouseInput => AllowSeeking;
+ public override bool HandleNonPositionalInput => AllowSeeking;
+ public override bool HandlePositionalInput => AllowSeeking;
private IClock audioClock;
public IClock AudioClock { set { audioClock = info.AudioClock = value; } }
diff --git a/osu.Game/Screens/Play/SquareGraph.cs b/osu.Game/Screens/Play/SquareGraph.cs
index 8ffd04b35c..bc4c87e191 100644
--- a/osu.Game/Screens/Play/SquareGraph.cs
+++ b/osu.Game/Screens/Play/SquareGraph.cs
@@ -21,9 +21,6 @@ namespace osu.Game.Screens.Play
public int ColumnCount => columns.Length;
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
-
private int progress;
public int Progress
{
diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index b6cbaf45e9..7c9053d2f0 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -17,8 +17,7 @@ using osu.Framework.Caching;
using osu.Framework.Threading;
using osu.Framework.Configuration;
using osu.Framework.Extensions.IEnumerableExtensions;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Cursor;
@@ -52,8 +51,8 @@ namespace osu.Game.Screens.Select
///
public Action SelectionChanged;
- public override bool HandleKeyboardInput => AllowSelection;
- public override bool HandleMouseInput => AllowSelection;
+ public override bool HandleNonPositionalInput => AllowSelection;
+ public override bool HandlePositionalInput => AllowSelection;
///
/// Used to avoid firing null selections before the initial beatmaps have been loaded via .
@@ -381,12 +380,12 @@ namespace osu.Game.Screens.Select
public void ScrollToSelected() => scrollPositionCache.Invalidate();
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
int direction = 0;
bool skipDifficulties = false;
- switch (args.Key)
+ switch (e.Key)
{
case Key.Up:
direction = -1;
@@ -405,7 +404,7 @@ namespace osu.Game.Screens.Select
}
if (direction == 0)
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
SelectNext(direction, skipDifficulties);
return true;
diff --git a/osu.Game/Screens/Select/BeatmapDetails.cs b/osu.Game/Screens/Select/BeatmapDetails.cs
index f1bd2b945f..f7b955941d 100644
--- a/osu.Game/Screens/Select/BeatmapDetails.cs
+++ b/osu.Game/Screens/Select/BeatmapDetails.cs
@@ -327,11 +327,6 @@ namespace osu.Game.Screens.Select
TextSize = 14,
},
},
- textFlow = new OsuTextFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- },
},
};
}
@@ -350,6 +345,8 @@ namespace osu.Game.Screens.Select
}
}
+ public override bool IsPresent => base.IsPresent || textFlow == null; // Visibility is updated in the LoadComponentAsync callback
+
private void setTextAsync(string text)
{
LoadComponentAsync(new OsuTextFlowContainer(s => s.TextSize = 14)
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 4129a9596f..81455833e9 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -59,7 +59,7 @@ namespace osu.Game.Screens.Select
ruleset.ValueChanged += _ => updateDisplay();
}
- protected override bool BlockPassThroughMouse => false;
+ protected override bool BlockPositionalInput => false;
protected override void PopIn()
{
@@ -89,6 +89,8 @@ namespace osu.Game.Screens.Select
}
}
+ public override bool IsPresent => base.IsPresent || Info == null; // Visibility is updated in the LoadComponentAsync callback
+
private BufferedWedgeInfo loadingInfo;
private void updateDisplay()
@@ -154,7 +156,7 @@ namespace osu.Game.Screens.Select
RelativeSizeAxes = Axes.Both;
titleBinding = localisation.GetLocalisedString(new LocalisedString((metadata.TitleUnicode, metadata.Title)));
- artistBinding = localisation.GetLocalisedString(new LocalisedString((metadata.ArtistUnicode, metadata.Artist)));
+ artistBinding = localisation.GetLocalisedString(new LocalisedString((metadata.ArtistUnicode, metadata.Artist)));
Children = new Drawable[]
{
diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
index 6071e163cf..109ac25cd1 100644
--- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
+++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
@@ -155,12 +155,12 @@ namespace osu.Game.Screens.Select.Carousel
triangles.Colour = OsuColour.Gray(0.5f);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
if (Item.State == CarouselItemState.Selected)
startRequested?.Invoke(beatmap);
- return base.OnClick(state);
+ return base.OnClick(e);
}
protected override void ApplyState()
diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselItem.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselItem.cs
index 8a0052559e..e11b342efe 100644
--- a/osu.Game/Screens/Select/Carousel/DrawableCarouselItem.cs
+++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselItem.cs
@@ -8,7 +8,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.MathUtils;
using osu.Game.Graphics;
using OpenTK;
@@ -72,18 +72,18 @@ namespace osu.Game.Screens.Select.Carousel
hoverLayer.Colour = colours.Blue.Opacity(0.1f);
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
sampleHover?.Play();
hoverLayer.FadeIn(100, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
hoverLayer.FadeOut(1000, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
public void SetMultiplicativeAlpha(float alpha) => borderContainer.Alpha = alpha;
@@ -145,7 +145,7 @@ namespace osu.Game.Screens.Select.Carousel
};
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
Item.State.Value = CarouselItemState.Selected;
return true;
diff --git a/osu.Game/Screens/Select/Filter/GroupMode.cs b/osu.Game/Screens/Select/Filter/GroupMode.cs
index 6e57843dfc..b3bd73ee59 100644
--- a/osu.Game/Screens/Select/Filter/GroupMode.cs
+++ b/osu.Game/Screens/Select/Filter/GroupMode.cs
@@ -21,8 +21,8 @@ namespace osu.Game.Screens.Select.Filter
DateAdded,
[Description("Difficulty")]
Difficulty,
- [Description("Favorites")]
- Favorites,
+ [Description("Favourites")]
+ Favourites,
[Description("Length")]
Length,
[Description("My Maps")]
diff --git a/osu.Game/Screens/Select/FilterControl.cs b/osu.Game/Screens/Select/FilterControl.cs
index 9ba8b085f3..fce7af1400 100644
--- a/osu.Game/Screens/Select/FilterControl.cs
+++ b/osu.Game/Screens/Select/FilterControl.cs
@@ -14,8 +14,7 @@ using osu.Game.Graphics.UserInterface;
using osu.Game.Screens.Select.Filter;
using Container = osu.Framework.Graphics.Containers.Container;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Configuration;
using osu.Game.Rulesets;
@@ -72,8 +71,8 @@ namespace osu.Game.Screens.Select
private readonly SearchTextBox searchTextBox;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) =>
- base.ReceiveMouseInputAt(screenSpacePos) || groupTabs.ReceiveMouseInputAt(screenSpacePos) || sortTabs.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) =>
+ base.ReceivePositionalInputAt(screenSpacePos) || groupTabs.ReceivePositionalInputAt(screenSpacePos) || sortTabs.ReceivePositionalInputAt(screenSpacePos);
public FilterControl()
{
@@ -187,10 +186,10 @@ namespace osu.Game.Screens.Select
private void updateCriteria() => FilterChanged?.Invoke(CreateCriteria());
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
- protected override bool OnMouseMove(InputState state) => true;
+ protected override bool OnMouseMove(MouseMoveEvent e) => true;
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
}
}
diff --git a/osu.Game/Screens/Select/Footer.cs b/osu.Game/Screens/Select/Footer.cs
index bc4d216f00..5fe1aa31ac 100644
--- a/osu.Game/Screens/Select/Footer.cs
+++ b/osu.Game/Screens/Select/Footer.cs
@@ -11,8 +11,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Screens.Select
@@ -139,8 +138,8 @@ namespace osu.Game.Screens.Select
updateModeLight();
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
+ protected override bool OnMouseDown(MouseDownEvent e) => true;
- protected override bool OnClick(InputState state) => true;
+ protected override bool OnClick(ClickEvent e) => true;
}
}
diff --git a/osu.Game/Screens/Select/FooterButton.cs b/osu.Game/Screens/Select/FooterButton.cs
index 1b0e3a1620..4f12082e08 100644
--- a/osu.Game/Screens/Select/FooterButton.cs
+++ b/osu.Game/Screens/Select/FooterButton.cs
@@ -8,8 +8,7 @@ using OpenTK.Input;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.Containers;
@@ -56,7 +55,7 @@ namespace osu.Game.Screens.Select
private readonly Box box;
private readonly Box light;
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => box.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => box.ReceivePositionalInputAt(screenSpacePos);
public FooterButton()
{
@@ -89,7 +88,7 @@ namespace osu.Game.Screens.Select
public Action HoverLost;
public Key? Hotkey;
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
Hovered?.Invoke();
light.ScaleTo(new Vector2(1, 2), Footer.TRANSITION_LENGTH, Easing.OutQuint);
@@ -97,42 +96,42 @@ namespace osu.Game.Screens.Select
return true;
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
HoverLost?.Invoke();
light.ScaleTo(new Vector2(1, 1), Footer.TRANSITION_LENGTH, Easing.OutQuint);
light.FadeColour(DeselectedColour, Footer.TRANSITION_LENGTH, Easing.OutQuint);
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
box.FadeTo(0.3f, Footer.TRANSITION_LENGTH * 2, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
box.FadeOut(Footer.TRANSITION_LENGTH, Easing.OutQuint);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
box.ClearTransforms();
box.Alpha = 1;
box.FadeOut(Footer.TRANSITION_LENGTH * 3, Easing.OutQuint);
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (!args.Repeat && args.Key == Hotkey)
+ if (!e.Repeat && e.Key == Hotkey)
{
- OnClick(state);
+ Click();
return true;
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
}
}
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index 95e9dde68e..241f6da3d1 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -10,7 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
@@ -251,16 +251,16 @@ namespace osu.Game.Screens.Select.Leaderboards
}
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
background.FadeTo(0.5f, 300, Easing.OutQuint);
- return base.OnHover(state);
+ return base.OnHover(e);
}
- protected override void OnHoverLost(InputState state)
+ protected override void OnHoverLost(HoverLostEvent e)
{
background.FadeTo(background_alpha, 200, Easing.OutQuint);
- base.OnHoverLost(state);
+ base.OnHoverLost(e);
}
private class GlowingSpriteText : Container
diff --git a/osu.Game/Screens/Select/Leaderboards/Placeholder.cs b/osu.Game/Screens/Select/Leaderboards/Placeholder.cs
index 307986a299..468b43e54f 100644
--- a/osu.Game/Screens/Select/Leaderboards/Placeholder.cs
+++ b/osu.Game/Screens/Select/Leaderboards/Placeholder.cs
@@ -11,8 +11,6 @@ namespace osu.Game.Screens.Select.Leaderboards
{
protected const float TEXT_SIZE = 22;
- public override bool HandleMouseInput => true;
-
protected Placeholder()
: base(cp => cp.TextSize = TEXT_SIZE)
{
diff --git a/osu.Game/Screens/Select/Leaderboards/RetrievalFailurePlaceholder.cs b/osu.Game/Screens/Select/Leaderboards/RetrievalFailurePlaceholder.cs
index 19cba72f1f..6601c9df8b 100644
--- a/osu.Game/Screens/Select/Leaderboards/RetrievalFailurePlaceholder.cs
+++ b/osu.Game/Screens/Select/Leaderboards/RetrievalFailurePlaceholder.cs
@@ -3,8 +3,7 @@
using System;
using osu.Framework.Graphics;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using OpenTK;
@@ -49,16 +48,16 @@ namespace osu.Game.Screens.Select.Leaderboards
};
}
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
icon.ScaleTo(0.8f, 4000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
icon.ScaleTo(1, 1000, Easing.OutElastic);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
}
}
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
index d4cd882433..cd775419be 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
@@ -5,8 +5,7 @@ using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using OpenTK;
@@ -53,39 +52,39 @@ namespace osu.Game.Screens.Select.Options
public Key? HotKey;
- protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
+ protected override bool OnMouseDown(MouseDownEvent e)
{
flash.FadeTo(0.1f, 1000, Easing.OutQuint);
- return base.OnMouseDown(state, args);
+ return base.OnMouseDown(e);
}
- protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
+ protected override bool OnMouseUp(MouseUpEvent e)
{
flash.FadeTo(0, 1000, Easing.OutQuint);
- return base.OnMouseUp(state, args);
+ return base.OnMouseUp(e);
}
- protected override bool OnClick(InputState state)
+ protected override bool OnClick(ClickEvent e)
{
flash.ClearTransforms();
flash.Alpha = 0.9f;
flash.FadeOut(800, Easing.OutExpo);
- return base.OnClick(state);
+ return base.OnClick(e);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (!args.Repeat && args.Key == HotKey)
+ if (!e.Repeat && e.Key == HotKey)
{
- OnClick(state);
+ Click();
return true;
}
return false;
}
- public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => box.ReceiveMouseInputAt(screenSpacePos);
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => box.ReceivePositionalInputAt(screenSpacePos);
public BeatmapOptionsButton()
{
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 2c43b333aa..917a08d172 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -65,7 +65,7 @@ namespace osu.Game.Screens.Select
BeatmapOptions.AddButton(@"Remove", @"from unplayed", FontAwesome.fa_times_circle_o, colours.Purple, null, Key.Number1);
BeatmapOptions.AddButton(@"Clear", @"local scores", FontAwesome.fa_eraser, colours.Purple, null, Key.Number2);
- BeatmapOptions.AddButton(@"Edit", @"Beatmap", FontAwesome.fa_pencil, colours.Yellow, () =>
+ BeatmapOptions.AddButton(@"Edit", @"beatmap", FontAwesome.fa_pencil, colours.Yellow, () =>
{
ValidForResume = false;
Push(new Editor());
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index efdf55e477..b4f552ce93 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -13,8 +13,7 @@ using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Logging;
-using osu.Framework.Input.EventArgs;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Screens;
using osu.Framework.Threading;
using osu.Game.Beatmaps;
@@ -205,7 +204,7 @@ namespace osu.Game.Screens.Select
Footer.AddButton(@"random", colours.Green, triggerRandom, Key.F2);
Footer.AddButton(@"options", colours.Blue, BeatmapOptions, Key.F3);
- BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, () => delete(Beatmap.Value.BeatmapSetInfo), Key.Number4, float.MaxValue);
+ BeatmapOptions.AddButton(@"Delete", @"all difficulties", FontAwesome.fa_trash, colours.Pink, () => delete(Beatmap.Value.BeatmapSetInfo), Key.Number4, float.MaxValue);
}
if (this.beatmaps == null)
@@ -536,7 +535,7 @@ namespace osu.Game.Screens.Select
private void delete(BeatmapSetInfo beatmap)
{
- if (beatmap == null) return;
+ if (beatmap == null || beatmap.ID <= 0) return;
dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap));
}
@@ -554,14 +553,14 @@ namespace osu.Game.Screens.Select
return base.OnPressed(action);
}
- protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
+ protected override bool OnKeyDown(KeyDownEvent e)
{
- if (args.Repeat) return false;
+ if (e.Repeat) return false;
- switch (args.Key)
+ switch (e.Key)
{
case Key.Delete:
- if (state.Keyboard.ShiftPressed)
+ if (e.ShiftPressed)
{
if (!Beatmap.IsDefault)
delete(Beatmap.Value.BeatmapSetInfo);
@@ -571,7 +570,7 @@ namespace osu.Game.Screens.Select
break;
}
- return base.OnKeyDown(state, args);
+ return base.OnKeyDown(e);
}
private class ResetScrollContainer : Container
@@ -583,10 +582,10 @@ namespace osu.Game.Screens.Select
this.onHoverAction = onHoverAction;
}
- protected override bool OnHover(InputState state)
+ protected override bool OnHover(HoverEvent e)
{
onHoverAction?.Invoke();
- return base.OnHover(state);
+ return base.OnHover(e);
}
}
}
diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboard.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboard.cs
index 37c198f370..ef03539998 100644
--- a/osu.Game/Storyboards/Drawables/DrawableStoryboard.cs
+++ b/osu.Game/Storyboards/Drawables/DrawableStoryboard.cs
@@ -18,8 +18,6 @@ namespace osu.Game.Storyboards.Drawables
protected override Container Content => content;
protected override Vector2 DrawScale => new Vector2(Parent.DrawHeight / 480);
- public override bool HandleKeyboardInput => false;
- public override bool HandleMouseInput => false;
private bool passing = true;
public bool Passing
diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs
index cdec8c042f..4f469ae593 100644
--- a/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs
+++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Storyboards.Drawables
{
base.Update();
- // TODO: this logic will need to be consolidated with other game samples like hitsounds.
+ // TODO: this logic will need to be consolidated with other game samples like hit sounds.
if (Time.Current < sample.Time)
{
// We've rewound before the start time of the sample
diff --git a/osu.Game/Tests/Visual/EditorClockTestCase.cs b/osu.Game/Tests/Visual/EditorClockTestCase.cs
index 0ca7ff011f..ebede74171 100644
--- a/osu.Game/Tests/Visual/EditorClockTestCase.cs
+++ b/osu.Game/Tests/Visual/EditorClockTestCase.cs
@@ -2,7 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Allocation;
-using osu.Framework.Input.States;
+using osu.Framework.Input.Events;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
@@ -56,9 +56,9 @@ namespace osu.Game.Tests.Visual
Clock.ProcessFrame();
}
- protected override bool OnScroll(InputState state)
+ protected override bool OnScroll(ScrollEvent e)
{
- if (state.Mouse.ScrollDelta.Y > 0)
+ if (e.ScrollDelta.Y > 0)
Clock.SeekBackward(true);
else
Clock.SeekForward(true);
diff --git a/osu.Game/Users/User.cs b/osu.Game/Users/User.cs
index 6c3d2bfa63..a5d8c03a67 100644
--- a/osu.Game/Users/User.cs
+++ b/osu.Game/Users/User.cs
@@ -83,8 +83,8 @@ namespace osu.Game.Users
[JsonProperty(@"location")]
public string Location;
- [JsonProperty(@"lastvisit")]
- public DateTimeOffset LastVisit;
+ [JsonProperty(@"last_visit")]
+ public DateTimeOffset? LastVisit;
[JsonProperty(@"twitter")]
public string Twitter;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 5ce04b813b..cc21f4f6a4 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -14,13 +14,13 @@
-
-
-
+
+
+
-
+
-
+
diff --git a/osu.TestProject.props b/osu.TestProject.props
index 506d634555..456ecfd468 100644
--- a/osu.TestProject.props
+++ b/osu.TestProject.props
@@ -10,10 +10,6 @@
-
-
-
-
VisualTestRunner.cs
diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings
index 1f1b6a79b1..345400305c 100644
--- a/osu.sln.DotSettings
+++ b/osu.sln.DotSettings
@@ -218,6 +218,7 @@
GMT
QAT
BNG
+ UI
HINT
<?xml version="1.0" encoding="utf-16"?>
<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
@@ -665,6 +666,7 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
True
True
True
+ True
True
True
True