diff --git a/osu-framework b/osu-framework index 682f078b2e..3111d1aa4f 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 682f078b2efc82fa19342f499f14c4a8458843d5 +Subproject commit 3111d1aa4f0d3aa1c0df03f8003b6c5c726b10d2 diff --git a/osu-resources b/osu-resources index b90c4ed490..ffccbeb98d 160000 --- a/osu-resources +++ b/osu-resources @@ -1 +1 @@ -Subproject commit b90c4ed490f76f2995662b3a8af3a32b8756a012 +Subproject commit ffccbeb98dc9e8f0965520270b5885e63f244c83 diff --git a/osu.Desktop.VisualTests/Tests/TestCaseBeatmapDetails.cs b/osu.Desktop.VisualTests/Tests/TestCaseBeatmapDetails.cs index 4a59ad9534..58cbad936a 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseBeatmapDetails.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseBeatmapDetails.cs @@ -2,7 +2,6 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Testing; using osu.Game.Database; using osu.Game.Screens.Select; diff --git a/osu.Desktop.VisualTests/Tests/TestCaseScoreCounter.cs b/osu.Desktop.VisualTests/Tests/TestCaseScoreCounter.cs index cfa66f12ed..f86fa4dab5 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseScoreCounter.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseScoreCounter.cs @@ -3,7 +3,6 @@ using OpenTK; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.MathUtils; using osu.Framework.Testing; diff --git a/osu.Desktop.VisualTests/Tests/TestCaseOptions.cs b/osu.Desktop.VisualTests/Tests/TestCaseSettings.cs similarity index 54% rename from osu.Desktop.VisualTests/Tests/TestCaseOptions.cs rename to osu.Desktop.VisualTests/Tests/TestCaseSettings.cs index ff6bdc8a5a..660085e558 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseOptions.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseSettings.cs @@ -6,18 +6,18 @@ using osu.Game.Overlays; namespace osu.Desktop.VisualTests.Tests { - internal class TestCaseOptions : TestCase + internal class TestCaseSettings : TestCase { - public override string Description => @"Tests the options overlay"; + public override string Description => @"Tests the settings overlay"; - private OptionsOverlay options; + private SettingsOverlay settings; public override void Reset() { base.Reset(); - Children = new[] { options = new OptionsOverlay() }; - options.ToggleVisibility(); + Children = new[] { settings = new SettingsOverlay() }; + settings.ToggleVisibility(); } } } diff --git a/osu.Desktop.VisualTests/Tests/TestCaseSongProgress.cs b/osu.Desktop.VisualTests/Tests/TestCaseSongProgress.cs index 6d8aac1d09..e3c343f5f8 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseSongProgress.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseSongProgress.cs @@ -18,10 +18,14 @@ namespace osu.Desktop.VisualTests.Tests private SongProgress progress; private SongProgressGraph graph; + private StopwatchClock clock; + public override void Reset() { base.Reset(); + clock = new StopwatchClock(true); + Add(progress = new SongProgress { RelativeSizeAxes = Axes.X, @@ -55,6 +59,9 @@ namespace osu.Desktop.VisualTests.Tests progress.Objects = objects; graph.Objects = objects; + + progress.AudioClock = clock; + progress.OnSeek = pos => clock.Seek(pos); } } } diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTabControl.cs b/osu.Desktop.VisualTests/Tests/TestCaseTabControl.cs index b72abd1992..96933a15e7 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseTabControl.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseTabControl.cs @@ -1,8 +1,8 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using osu.Framework.Graphics; using OpenTK; -using osu.Framework.Graphics.Primitives; using osu.Framework.Testing; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; diff --git a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj index 66cad48964..9b07ebf90b 100644 --- a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj +++ b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj @@ -211,7 +211,7 @@ - + diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index 8709e039ec..22c190e07b 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -10,7 +10,6 @@ using OpenTK.Graphics; using osu.Game.Rulesets.Mania.Judgements; using osu.Framework.Graphics.Containers; using System; -using osu.Framework.Graphics.Primitives; using osu.Game.Graphics; using osu.Framework.Allocation; using OpenTK.Input; diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index ff277dea1f..cc06946d38 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -92,7 +92,7 @@ namespace osu.Game.Rulesets.Osu.Mods public class OsuModAutoplay : ModAutoplay { - public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAutopilot) }).ToArray(); + public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAutopilot), typeof(OsuModSpunOut) }).ToArray(); protected override Score CreateReplayScore(Beatmap beatmap) => new Score { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 90a6d432c4..a8ff231cc7 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -108,11 +108,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private Vector2 scaleToCircle => circle.Scale * circle.DrawWidth / DrawWidth * 0.95f; - private const float spins_per_minute_needed = 100 + 5 * 15; //TODO: read per-map OD and place it on the 5 - - private float rotationsNeeded => (float)(spins_per_minute_needed * (spinner.EndTime - spinner.StartTime) / 60000f); - - public float Progress => MathHelper.Clamp(disc.RotationAbsolute / 360 / rotationsNeeded, 0, 1); + public float Progress => MathHelper.Clamp(disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); protected override void UpdatePreemptState() { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs index b23fdde4e8..8b9441ea65 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs @@ -97,8 +97,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces [BackgroundDependencyLoader] private void load(OsuConfigManager config) { - snakingIn = config.GetBindable(OsuConfig.SnakingInSliders); - snakingOut = config.GetBindable(OsuConfig.SnakingOutSliders); + snakingIn = config.GetBindable(OsuSetting.SnakingInSliders); + snakingOut = config.GetBindable(OsuSetting.SnakingOutSliders); reloadTexture(); } diff --git a/osu.Game.Rulesets.Osu/Objects/Spinner.cs b/osu.Game.Rulesets.Osu/Objects/Spinner.cs index 0a2c05833a..3761b62b65 100644 --- a/osu.Game.Rulesets.Osu/Objects/Spinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Spinner.cs @@ -2,6 +2,8 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Game.Rulesets.Objects.Types; +using osu.Game.Beatmaps.Timing; +using osu.Game.Database; namespace osu.Game.Rulesets.Osu.Objects { @@ -10,6 +12,18 @@ namespace osu.Game.Rulesets.Osu.Objects public double EndTime { get; set; } public double Duration => EndTime - StartTime; + /// + /// Number of spins required to finish the spinner without miss. + /// + public int SpinsRequired { get; protected set; } = 1; + public override bool NewCombo => true; + + public override void ApplyDefaults(TimingInfo timing, BeatmapDifficulty difficulty) + { + base.ApplyDefaults(timing, difficulty); + + SpinsRequired = (int)(Duration / 1000 * BeatmapDifficulty.DifficultyRange(difficulty.OverallDifficulty, 3, 5, 7.5)); + } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/ElongatedCirclePiece.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/ElongatedCirclePiece.cs index bed54d358e..f607e2040f 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/ElongatedCirclePiece.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/ElongatedCirclePiece.cs @@ -2,7 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; -using osu.Framework.Graphics.Primitives; +using osu.Framework.Graphics; namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces { diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index 23c7606a15..2278158506 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -13,7 +13,6 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Extensions.Color4Extensions; -using osu.Framework.Graphics.Primitives; using System.Linq; using osu.Game.Rulesets.Taiko.Objects.Drawables; using System; diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 34e4ebf8ac..cb929dcca5 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -5,7 +5,6 @@ using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Database; using osu.Game.Graphics; diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs index 8431e5f812..2ab5487082 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs @@ -9,7 +9,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; using osu.Game.Graphics.Sprites; diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 3907496ca2..8f177d6b56 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -3,73 +3,75 @@ using osu.Framework.Configuration; using osu.Framework.Platform; +using osu.Game.Overlays; using osu.Game.Screens.Select; namespace osu.Game.Configuration { - public class OsuConfigManager : ConfigManager + public class OsuConfigManager : ConfigManager { protected override void InitialiseDefaults() { // UI/selection defaults - Set(OsuConfig.Ruleset, 0, 0, int.MaxValue); - Set(OsuConfig.BeatmapDetailTab, BeatmapDetailTab.Details); + Set(OsuSetting.Ruleset, 0, 0, int.MaxValue); + Set(OsuSetting.BeatmapDetailTab, BeatmapDetailTab.Details); - Set(OsuConfig.DisplayStarsMinimum, 0.0, 0, 10); - Set(OsuConfig.DisplayStarsMaximum, 10.0, 0, 10); + Set(OsuSetting.DisplayStarsMinimum, 0.0, 0, 10); + Set(OsuSetting.DisplayStarsMaximum, 10.0, 0, 10); + + Set(OsuSetting.ChatDisplayHeight, ChatOverlay.DEFAULT_HEIGHT, 0.2, 1); // Online settings - Set(OsuConfig.Username, string.Empty); - Set(OsuConfig.Token, string.Empty); + Set(OsuSetting.Username, string.Empty); + Set(OsuSetting.Token, string.Empty); - Set(OsuConfig.SavePassword, false).ValueChanged += val => + Set(OsuSetting.SavePassword, false).ValueChanged += val => { - if (val) Set(OsuConfig.SaveUsername, true); + if (val) Set(OsuSetting.SaveUsername, true); }; - Set(OsuConfig.SaveUsername, true).ValueChanged += val => + Set(OsuSetting.SaveUsername, true).ValueChanged += val => { - if (!val) Set(OsuConfig.SavePassword, false); + if (!val) Set(OsuSetting.SavePassword, false); }; // Audio - Set(OsuConfig.AudioDevice, string.Empty); + Set(OsuSetting.MenuVoice, true); + Set(OsuSetting.MenuMusic, true); - Set(OsuConfig.MenuVoice, true); - Set(OsuConfig.MenuMusic, true); - - Set(OsuConfig.AudioOffset, 0, -500.0, 500.0); + Set(OsuSetting.AudioOffset, 0, -500.0, 500.0); // Input - Set(OsuConfig.MenuCursorSize, 1.0, 0.5f, 2); - Set(OsuConfig.GameplayCursorSize, 1.0, 0.5f, 2); + Set(OsuSetting.MenuCursorSize, 1.0, 0.5f, 2); + Set(OsuSetting.GameplayCursorSize, 1.0, 0.5f, 2); + Set(OsuSetting.AutoCursorSize, false); - Set(OsuConfig.MouseDisableButtons, false); - Set(OsuConfig.MouseDisableWheel, false); + Set(OsuSetting.MouseDisableButtons, false); + Set(OsuSetting.MouseDisableWheel, false); // Graphics - Set(OsuConfig.ShowFpsDisplay, false); + Set(OsuSetting.ShowFpsDisplay, false); - Set(OsuConfig.MenuParallax, true); + Set(OsuSetting.MenuParallax, true); - Set(OsuConfig.SnakingInSliders, true); - Set(OsuConfig.SnakingOutSliders, true); + Set(OsuSetting.SnakingInSliders, true); + Set(OsuSetting.SnakingOutSliders, true); // Gameplay - Set(OsuConfig.DimLevel, 0.3, 0, 1); + Set(OsuSetting.DimLevel, 0.3, 0, 1); - Set(OsuConfig.ShowInterface, true); - Set(OsuConfig.KeyOverlay, false); + Set(OsuSetting.ShowInterface, true); + Set(OsuSetting.KeyOverlay, false); // Update - Set(OsuConfig.ReleaseStream, ReleaseStream.Lazer); + Set(OsuSetting.ReleaseStream, ReleaseStream.Lazer); } public OsuConfigManager(Storage storage) : base(storage) @@ -77,12 +79,13 @@ namespace osu.Game.Configuration } } - public enum OsuConfig + public enum OsuSetting { Ruleset, Token, MenuCursorSize, GameplayCursorSize, + AutoCursorSize, DimLevel, KeyOverlay, ShowInterface, @@ -94,7 +97,6 @@ namespace osu.Game.Configuration MenuParallax, BeatmapDetailTab, Username, - AudioDevice, ReleaseStream, SavePassword, SaveUsername, @@ -102,6 +104,7 @@ namespace osu.Game.Configuration DisplayStarsMaximum, SnakingInSliders, SnakingOutSliders, - ShowFpsDisplay + ShowFpsDisplay, + ChatDisplayHeight } } diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs index de570d3e7e..bd25ebe8a9 100644 --- a/osu.Game/Database/BeatmapDatabase.cs +++ b/osu.Game/Database/BeatmapDatabase.cs @@ -267,7 +267,7 @@ namespace osu.Game.Database public WorkingBeatmap GetWorkingBeatmap(BeatmapInfo beatmapInfo, WorkingBeatmap previous = null, bool withStoryboard = false) { - if (beatmapInfo.BeatmapSet == null) + if (beatmapInfo.BeatmapSet == null || beatmapInfo.Ruleset == null) beatmapInfo = GetChildren(beatmapInfo, true); if (beatmapInfo.BeatmapSet == null) diff --git a/osu.Game/Database/BeatmapDifficulty.cs b/osu.Game/Database/BeatmapDifficulty.cs index 7c9f47e7b6..cf1305f705 100644 --- a/osu.Game/Database/BeatmapDifficulty.cs +++ b/osu.Game/Database/BeatmapDifficulty.cs @@ -7,12 +7,17 @@ namespace osu.Game.Database { public class BeatmapDifficulty { + /// + /// The default value used for all difficulty settings except and . + /// + public const float DEFAULT_DIFFICULTY = 5; + [PrimaryKey, AutoIncrement] public int ID { get; set; } - public float DrainRate { get; set; } = 5; - public float CircleSize { get; set; } = 5; - public float OverallDifficulty { get; set; } = 5; - public float ApproachRate { get; set; } = 5; + public float DrainRate { get; set; } = DEFAULT_DIFFICULTY; + public float CircleSize { get; set; } = DEFAULT_DIFFICULTY; + public float OverallDifficulty { get; set; } = DEFAULT_DIFFICULTY; + public float ApproachRate { get; set; } = DEFAULT_DIFFICULTY; public float SliderMultiplier { get; set; } = 1; public float SliderTickRate { get; set; } = 1; diff --git a/osu.Game/Graphics/Containers/ParallaxContainer.cs b/osu.Game/Graphics/Containers/ParallaxContainer.cs index 8352656f8e..2d5952a3ce 100644 --- a/osu.Game/Graphics/Containers/ParallaxContainer.cs +++ b/osu.Game/Graphics/Containers/ParallaxContainer.cs @@ -39,7 +39,7 @@ namespace osu.Game.Graphics.Containers private void load(UserInputManager input, OsuConfigManager config) { this.input = input; - parallaxEnabled = config.GetBindable(OsuConfig.MenuParallax); + parallaxEnabled = config.GetBindable(OsuSetting.MenuParallax); parallaxEnabled.ValueChanged += delegate { if (!parallaxEnabled) diff --git a/osu.Game/Graphics/Cursor/GameplayCursor.cs b/osu.Game/Graphics/Cursor/GameplayCursor.cs index 3f699219a4..801fe1d011 100644 --- a/osu.Game/Graphics/Cursor/GameplayCursor.cs +++ b/osu.Game/Graphics/Cursor/GameplayCursor.cs @@ -11,7 +11,9 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; +using osu.Game.Beatmaps; using osu.Game.Configuration; +using osu.Game.Database; namespace osu.Game.Graphics.Cursor { @@ -41,7 +43,10 @@ namespace osu.Game.Graphics.Cursor public class OsuCursor : Container { private Container cursorContainer; + private Bindable cursorScale; + private Bindable autoCursorScale; + private Bindable beatmap; public OsuCursor() { @@ -50,7 +55,7 @@ namespace osu.Game.Graphics.Cursor } [BackgroundDependencyLoader] - private void load(OsuConfigManager config) + private void load(OsuConfigManager config, OsuGameBase game) { Children = new Drawable[] { @@ -114,9 +119,29 @@ namespace osu.Game.Graphics.Cursor }, }; - cursorScale = config.GetBindable(OsuConfig.GameplayCursorSize); - cursorScale.ValueChanged += newScale => cursorContainer.Scale = new Vector2((float)cursorScale); - cursorScale.TriggerChange(); + beatmap = game.Beatmap.GetBoundCopy(); + beatmap.ValueChanged += v => calculateScale(); + + cursorScale = config.GetBindable(OsuSetting.GameplayCursorSize); + cursorScale.ValueChanged += v => calculateScale(); + + autoCursorScale = config.GetBindable(OsuSetting.AutoCursorSize); + autoCursorScale.ValueChanged += v => calculateScale(); + + calculateScale(); + } + + private void calculateScale() + { + float scale = (float)cursorScale.Value; + + if (autoCursorScale && beatmap.Value != null) + { + // if we have a beatmap available, let's get its circle size to figure out an automatic cursor scale modifier. + scale *= (float)(1 - 0.7 * (1 + beatmap.Value.BeatmapInfo.Difficulty.CircleSize - BeatmapDifficulty.DEFAULT_DIFFICULTY) / BeatmapDifficulty.DEFAULT_DIFFICULTY); + } + + cursorContainer.Scale = new Vector2(scale); } } } diff --git a/osu.Game/Graphics/Cursor/MenuCursor.cs b/osu.Game/Graphics/Cursor/MenuCursor.cs index 8d5f95aad5..b48ab879a6 100644 --- a/osu.Game/Graphics/Cursor/MenuCursor.cs +++ b/osu.Game/Graphics/Cursor/MenuCursor.cs @@ -128,7 +128,7 @@ namespace osu.Game.Graphics.Cursor } }; - cursorScale = config.GetBindable(OsuConfig.MenuCursorSize); + cursorScale = config.GetBindable(OsuSetting.MenuCursorSize); cursorScale.ValueChanged += newScale => cursorContainer.Scale = new Vector2((float)newScale); cursorScale.TriggerChange(); } diff --git a/osu.Game/Graphics/Cursor/TooltipContainer.cs b/osu.Game/Graphics/Cursor/TooltipContainer.cs index 5f0743746a..c5b8382816 100644 --- a/osu.Game/Graphics/Cursor/TooltipContainer.cs +++ b/osu.Game/Graphics/Cursor/TooltipContainer.cs @@ -8,7 +8,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Framework.Threading; diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs index b666442f19..3d83668d07 100644 --- a/osu.Game/Graphics/OsuColour.cs +++ b/osu.Game/Graphics/OsuColour.cs @@ -85,5 +85,7 @@ namespace osu.Game.Graphics public readonly Color4 Red = FromHex(@"ed1121"); public readonly Color4 RedDark = FromHex(@"ba0011"); public readonly Color4 RedDarker = FromHex(@"870000"); + + public readonly Color4 ChatBlue = FromHex(@"17292e"); } } diff --git a/osu.Game/Graphics/UserInterface/OsuCheckbox.cs b/osu.Game/Graphics/UserInterface/OsuCheckbox.cs index e81db4954e..85231ffab9 100644 --- a/osu.Game/Graphics/UserInterface/OsuCheckbox.cs +++ b/osu.Game/Graphics/UserInterface/OsuCheckbox.cs @@ -6,7 +6,6 @@ using osu.Framework.Audio; using osu.Framework.Audio.Sample; using osu.Framework.Configuration; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 59bee8baad..4f286ba7b5 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -7,7 +7,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.Sprites; diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index c51c5d210e..84b88da96e 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -5,7 +5,6 @@ using OpenTK; using OpenTK.Graphics; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; namespace osu.Game.Graphics.UserInterface diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 242a9a8f6a..a9fad0c739 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -9,7 +9,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; @@ -25,15 +24,15 @@ namespace osu.Game.Graphics.UserInterface protected override bool InternalContains(Vector2 screenSpacePos) => base.InternalContains(screenSpacePos) || Dropdown.Contains(screenSpacePos); + private bool isEnumType => typeof(T).IsEnum; + public OsuTabControl() { TabContainer.Spacing = new Vector2(10f, 0f); - if (!typeof(T).IsEnum) - throw new InvalidOperationException("OsuTabControl only supports enums as the generic type argument"); - - foreach (var val in (T[])Enum.GetValues(typeof(T))) - AddItem(val); + if (isEnumType) + foreach (var val in (T[])Enum.GetValues(typeof(T))) + AddItem(val); } [BackgroundDependencyLoader] @@ -136,7 +135,7 @@ namespace osu.Game.Graphics.UserInterface Margin = new MarginPadding { Top = 5, Bottom = 5 }, Origin = Anchor.BottomLeft, Anchor = Anchor.BottomLeft, - Text = (value as Enum)?.GetDescription(), + Text = (value as Enum)?.GetDescription() ?? value.ToString(), TextSize = 14, Font = @"Exo2.0-Bold", // Font should only turn bold when active? }, diff --git a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs index f732916889..6fc3875f61 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs @@ -6,7 +6,6 @@ using OpenTK.Graphics; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; diff --git a/osu.Game/Graphics/UserInterface/OsuTextBox.cs b/osu.Game/Graphics/UserInterface/OsuTextBox.cs index 62b10b96ef..97c38f6b85 100644 --- a/osu.Game/Graphics/UserInterface/OsuTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuTextBox.cs @@ -3,7 +3,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; diff --git a/osu.Game/Screens/Select/SearchTextBox.cs b/osu.Game/Graphics/UserInterface/SearchTextBox.cs similarity index 87% rename from osu.Game/Screens/Select/SearchTextBox.cs rename to osu.Game/Graphics/UserInterface/SearchTextBox.cs index 4f2ab221cb..0a37024d0f 100644 --- a/osu.Game/Screens/Select/SearchTextBox.cs +++ b/osu.Game/Graphics/UserInterface/SearchTextBox.cs @@ -1,20 +1,19 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using OpenTK.Input; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Input; -using osu.Game.Graphics; -using osu.Game.Graphics.UserInterface; +using OpenTK.Input; -namespace osu.Game.Screens.Select +namespace osu.Game.Graphics.UserInterface { /// /// A textbox which holds focus eagerly. /// public class SearchTextBox : FocusedTextBox { + protected virtual bool AllowCommit => false; + public SearchTextBox() { Height = 35; @@ -45,8 +44,10 @@ namespace osu.Game.Screens.Select case Key.Right: case Key.Up: case Key.Down: - case Key.Enter: return false; + case Key.Enter: + if (!AllowCommit) return false; + break; } } diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 4933c170e8..f2ae47354e 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -6,7 +6,6 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Input; using osu.Framework.Threading; using OpenTK; -using osu.Framework.Graphics.Primitives; using osu.Framework.Audio; using osu.Framework.Allocation; diff --git a/osu.Game/Online/Chat/Channel.cs b/osu.Game/Online/Chat/Channel.cs index d3bd57a1c9..2925c3ccb4 100644 --- a/osu.Game/Online/Chat/Channel.cs +++ b/osu.Game/Online/Chat/Channel.cs @@ -27,6 +27,8 @@ namespace osu.Game.Online.Chat //internal bool Joined; + public bool ReadOnly => Name != "#lazer"; + public const int MAX_HISTORY = 300; [JsonConstructor] @@ -36,9 +38,9 @@ namespace osu.Game.Online.Chat public event Action> NewMessagesArrived; - public void AddNewMessages(IEnumerable messages) + public void AddNewMessages(params Message[] messages) { - messages = messages.Except(Messages).ToList(); + messages = messages.Except(Messages).ToArray(); Messages.AddRange(messages); @@ -53,5 +55,7 @@ namespace osu.Game.Online.Chat if (messageCount > MAX_HISTORY) Messages.RemoveRange(0, messageCount - MAX_HISTORY); } + + public override string ToString() => Name; } } diff --git a/osu.Game/Online/Chat/ErrorMessage.cs b/osu.Game/Online/Chat/ErrorMessage.cs new file mode 100644 index 0000000000..a410e9044a --- /dev/null +++ b/osu.Game/Online/Chat/ErrorMessage.cs @@ -0,0 +1,25 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System; +using osu.Game.Users; + +namespace osu.Game.Online.Chat +{ + public class ErrorMessage : Message + { + private static int errorId = -1; + + public ErrorMessage(string message) : base(errorId--) + { + Timestamp = DateTime.Now; + Content = message; + + Sender = new User + { + Username = @"system", + Colour = @"ff0000", + }; + } + } +} \ No newline at end of file diff --git a/osu.Game/Online/Chat/Message.cs b/osu.Game/Online/Chat/Message.cs index 372e43be38..bf53a68910 100644 --- a/osu.Game/Online/Chat/Message.cs +++ b/osu.Game/Online/Chat/Message.cs @@ -37,6 +37,11 @@ namespace osu.Game.Online.Chat { } + public Message(long id) + { + Id = id; + } + public override bool Equals(object obj) { var objMessage = obj as Message; diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index ccead95ede..5a3b47eb23 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -19,7 +19,6 @@ using osu.Game.Screens; using osu.Game.Screens.Menu; using OpenTK; using System.Linq; -using osu.Framework.Graphics.Primitives; using System.Threading.Tasks; using osu.Framework.Threading; using osu.Game.Database; @@ -62,14 +61,14 @@ namespace osu.Game private readonly string[] args; - private OptionsOverlay options; + private SettingsOverlay settings; public OsuGame(string[] args = null) { this.args = args; } - public void ToggleOptions() => options.ToggleVisibility(); + public void ToggleSettings() => settings.ToggleVisibility(); [BackgroundDependencyLoader] private void load() @@ -88,7 +87,7 @@ namespace osu.Game Dependencies.Cache(this); - configRuleset = LocalConfig.GetBindable(OsuConfig.Ruleset); + configRuleset = LocalConfig.GetBindable(OsuSetting.Ruleset); Ruleset.Value = RulesetDatabase.GetRuleset(configRuleset.Value); Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; } @@ -160,8 +159,8 @@ namespace osu.Game }); //overlay elements - LoadComponentAsync(chat = new ChatOverlay { Depth = 0 }, overlayContent.Add); - LoadComponentAsync(options = new OptionsOverlay { Depth = -1 }, overlayContent.Add); + LoadComponentAsync(chat = new ChatOverlay { Depth = -1 }, mainContent.Add); + LoadComponentAsync(settings = new SettingsOverlay { Depth = -1 }, overlayContent.Add); LoadComponentAsync(musicController = new MusicController { Depth = -2, @@ -192,7 +191,7 @@ namespace osu.Game }); }; - Dependencies.Cache(options); + Dependencies.Cache(settings); Dependencies.Cache(chat); Dependencies.Cache(musicController); Dependencies.Cache(notificationManager); @@ -204,15 +203,15 @@ namespace osu.Game OnHome = delegate { intro?.ChildScreen?.MakeCurrent(); }, }, overlayContent.Add); - options.StateChanged += delegate + settings.StateChanged += delegate { - switch (options.State) + switch (settings.State) { case Visibility.Hidden: - intro.MoveToX(0, OptionsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint); + intro.MoveToX(0, SettingsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint); break; case Visibility.Visible: - intro.MoveToX(OptionsOverlay.SIDEBAR_WIDTH / 2, OptionsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint); + intro.MoveToX(SettingsOverlay.SIDEBAR_WIDTH / 2, SettingsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint); break; } }; @@ -247,7 +246,7 @@ namespace osu.Game Toolbar.ToggleVisibility(); return true; case Key.O: - options.ToggleVisibility(); + settings.ToggleVisibility(); return true; } } @@ -276,7 +275,7 @@ namespace osu.Game //central game screen change logic. if (!currentScreen.ShowOverlays) { - options.State = Visibility.Hidden; + settings.State = Visibility.Hidden; Toolbar.State = Visibility.Hidden; musicController.State = Visibility.Hidden; chat.State = Visibility.Hidden; @@ -320,8 +319,7 @@ namespace osu.Game { base.UpdateAfterChildren(); - if (intro?.ChildScreen != null) - intro.ChildScreen.Padding = new MarginPadding { Top = Toolbar.Position.Y + Toolbar.DrawHeight }; + mainContent.Padding = new MarginPadding { Top = Toolbar.Position.Y + Toolbar.DrawHeight }; Cursor.State = currentScreen?.HasLocalCursorDisplayed == false ? Visibility.Visible : Visibility.Hidden; } diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index a814b5f125..7e16030ec3 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -125,8 +125,8 @@ namespace osu.Game Dependencies.Cache(API = new APIAccess { - Username = LocalConfig.Get(OsuConfig.Username), - Token = LocalConfig.Get(OsuConfig.Token) + Username = LocalConfig.Get(OsuSetting.Username), + Token = LocalConfig.Get(OsuSetting.Token) }); API.Register(this); @@ -137,7 +137,7 @@ namespace osu.Game switch (state) { case APIState.Online: - LocalConfig.Set(OsuConfig.Username, LocalConfig.Get(OsuConfig.SaveUsername) ? API.Username : string.Empty); + LocalConfig.Set(OsuSetting.Username, LocalConfig.Get(OsuSetting.SaveUsername) ? API.Username : string.Empty); break; } } @@ -166,7 +166,7 @@ namespace osu.Game // TODO: This is temporary until we reimplement the local FPS display. // It's just to allow end-users to access the framework FPS display without knowing the shortcut key. - fpsDisplayVisible = LocalConfig.GetBindable(OsuConfig.ShowFpsDisplay); + fpsDisplayVisible = LocalConfig.GetBindable(OsuSetting.ShowFpsDisplay); fpsDisplayVisible.ValueChanged += val => { FrameStatisticsMode = val ? FrameStatisticsMode.Minimal : FrameStatisticsMode.None; @@ -192,7 +192,7 @@ namespace osu.Game //refresh token may have changed. if (LocalConfig != null && API != null) { - LocalConfig.Set(OsuConfig.Token, LocalConfig.Get(OsuConfig.SavePassword) ? API.Token : string.Empty); + LocalConfig.Set(OsuSetting.Token, LocalConfig.Get(OsuSetting.SavePassword) ? API.Token : string.Empty); LocalConfig.Save(); } diff --git a/osu.Game/Online/Chat/Drawables/ChatLine.cs b/osu.Game/Overlays/Chat/ChatLine.cs similarity index 87% rename from osu.Game/Online/Chat/Drawables/ChatLine.cs rename to osu.Game/Overlays/Chat/ChatLine.cs index 6bfa25755f..3aaca7593c 100644 --- a/osu.Game/Online/Chat/Drawables/ChatLine.cs +++ b/osu.Game/Overlays/Chat/ChatLine.cs @@ -3,13 +3,13 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; +using osu.Game.Online.Chat; using OpenTK; using OpenTK.Graphics; -namespace osu.Game.Online.Chat.Drawables +namespace osu.Game.Overlays.Chat { public class ChatLine : Container { @@ -62,7 +62,10 @@ namespace osu.Game.Online.Chat.Drawables return username_colours[message.UserId % username_colours.Length]; } - private const float padding = 200; + public const float LEFT_PADDING = message_padding + padding * 2; + + private const float padding = 15; + private const float message_padding = 200; private const float text_size = 20; public ChatLine(Message message) @@ -72,13 +75,13 @@ namespace osu.Game.Online.Chat.Drawables RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; - Padding = new MarginPadding { Left = 15, Right = 15 }; + Padding = new MarginPadding { Left = padding, Right = padding }; Children = new Drawable[] { new Container { - Size = new Vector2(padding, text_size), + Size = new Vector2(message_padding, text_size), Children = new Drawable[] { new OsuSpriteText @@ -106,7 +109,7 @@ namespace osu.Game.Online.Chat.Drawables { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Padding = new MarginPadding { Left = padding + 15 }, + Padding = new MarginPadding { Left = message_padding + padding }, Children = new Drawable[] { new OsuSpriteText diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs new file mode 100644 index 0000000000..57447f1913 --- /dev/null +++ b/osu.Game/Overlays/Chat/ChatTabControl.cs @@ -0,0 +1,196 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.UserInterface; +using osu.Framework.Input; +using osu.Game.Graphics; +using osu.Game.Graphics.Sprites; +using osu.Game.Graphics.UserInterface; +using osu.Game.Online.Chat; +using OpenTK; +using OpenTK.Graphics; + +namespace osu.Game.Overlays.Chat +{ + public class ChatTabControl : OsuTabControl + { + protected override TabItem CreateTabItem(Channel value) => new ChannelTabItem(value); + + private const float shear_width = 10; + + public ChatTabControl() + { + TabContainer.Margin = new MarginPadding { Left = 50 }; + TabContainer.Spacing = new Vector2(-shear_width, 0); + TabContainer.Masking = false; + + AddInternal(new TextAwesome + { + Icon = FontAwesome.fa_comments, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = 20, + Padding = new MarginPadding(10), + }); + } + + private class ChannelTabItem : TabItem + { + private Color4 backgroundInactive; + private Color4 backgroundHover; + private Color4 backgroundActive; + + private readonly SpriteText text; + private readonly SpriteText textBold; + private readonly Box box; + private readonly Box highlightBox; + + public override bool Active + { + get { return base.Active; } + set + { + if (Active == value) return; + + base.Active = value; + updateState(); + } + } + + private void updateState() + { + if (Active) + fadeActive(); + else + fadeInactive(); + } + + private const float transition_length = 400; + + private void fadeActive() + { + ResizeTo(new Vector2(Width, 1.1f), transition_length, EasingTypes.OutQuint); + + box.FadeColour(backgroundActive, transition_length, EasingTypes.OutQuint); + highlightBox.FadeIn(transition_length, EasingTypes.OutQuint); + + text.FadeOut(transition_length, EasingTypes.OutQuint); + textBold.FadeIn(transition_length, EasingTypes.OutQuint); + } + + private void fadeInactive() + { + ResizeTo(new Vector2(Width, 1), transition_length, EasingTypes.OutQuint); + + box.FadeColour(backgroundInactive, transition_length, EasingTypes.OutQuint); + highlightBox.FadeOut(transition_length, EasingTypes.OutQuint); + + text.FadeIn(transition_length, EasingTypes.OutQuint); + textBold.FadeOut(transition_length, EasingTypes.OutQuint); + } + + protected override bool OnHover(InputState state) + { + if (!Active) + box.FadeColour(backgroundHover, transition_length, EasingTypes.OutQuint); + return true; + } + + protected override void OnHoverLost(InputState state) + { + updateState(); + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + backgroundActive = colours.ChatBlue; + backgroundInactive = colours.Gray4; + backgroundHover = colours.Gray7; + + highlightBox.Colour = colours.Yellow; + + updateState(); + } + + public ChannelTabItem(Channel value) : base(value) + { + Width = 150; + + RelativeSizeAxes = Axes.Y; + + Anchor = Anchor.BottomLeft; + Origin = Anchor.BottomLeft; + + Shear = new Vector2(shear_width / ChatOverlay.TAB_AREA_HEIGHT, 0); + + Masking = true; + EdgeEffect = new EdgeEffect + { + Type = EdgeEffectType.Shadow, + Radius = 10, + Colour = Color4.Black.Opacity(0.2f), + }; + + Children = new Drawable[] + { + box = new Box + { + EdgeSmoothness = new Vector2(1, 0), + RelativeSizeAxes = Axes.Both, + }, + highlightBox = new Box + { + Width = 5, + Alpha = 0, + Anchor = Anchor.BottomRight, + Origin = Anchor.BottomRight, + EdgeSmoothness = new Vector2(1, 0), + RelativeSizeAxes = Axes.Y, + }, + new Container + { + Shear = new Vector2(-shear_width / ChatOverlay.TAB_AREA_HEIGHT, 0), + RelativeSizeAxes = Axes.Both, + Children = new Drawable[] + { + new TextAwesome + { + Icon = FontAwesome.fa_hashtag, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Colour = Color4.Black, + X = -10, + Alpha = 0.2f, + TextSize = ChatOverlay.TAB_AREA_HEIGHT, + }, + text = new OsuSpriteText + { + Margin = new MarginPadding(5), + Origin = Anchor.CentreLeft, + Anchor = Anchor.CentreLeft, + Text = value.ToString(), + TextSize = 18, + }, + textBold = new OsuSpriteText + { + Alpha = 0, + Margin = new MarginPadding(5), + Origin = Anchor.CentreLeft, + Anchor = Anchor.CentreLeft, + Text = value.ToString(), + Font = @"Exo2.0-Bold", + TextSize = 18, + }, + } + } + }; + } + } + } +} diff --git a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs b/osu.Game/Overlays/Chat/DrawableChannel.cs similarity index 78% rename from osu.Game/Online/Chat/Drawables/DrawableChannel.cs rename to osu.Game/Overlays/Chat/DrawableChannel.cs index e3101e8fd7..355aeed134 100644 --- a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs +++ b/osu.Game/Overlays/Chat/DrawableChannel.cs @@ -6,33 +6,24 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; -using osu.Game.Graphics.Sprites; +using osu.Game.Online.Chat; -namespace osu.Game.Online.Chat.Drawables +namespace osu.Game.Overlays.Chat { public class DrawableChannel : Container { - private readonly Channel channel; + public readonly Channel Channel; private readonly FillFlowContainer flow; private readonly ScrollContainer scroll; public DrawableChannel(Channel channel) { - this.channel = channel; + Channel = channel; RelativeSizeAxes = Axes.Both; Children = new Drawable[] { - new OsuSpriteText - { - Text = channel.Name, - TextSize = 50, - Alpha = 0.3f, - Anchor = Anchor.Centre, - Origin = Anchor.Centre - }, scroll = new ScrollContainer { RelativeSizeAxes = Axes.Both, @@ -56,14 +47,14 @@ namespace osu.Game.Online.Chat.Drawables { base.LoadComplete(); - newMessagesArrived(channel.Messages); + newMessagesArrived(Channel.Messages); scrollToEnd(); } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); - channel.NewMessagesArrived -= newMessagesArrived; + Channel.NewMessagesArrived -= newMessagesArrived; } private void newMessagesArrived(IEnumerable newMessages) @@ -93,4 +84,4 @@ namespace osu.Game.Online.Chat.Drawables private void scrollToEnd() => Scheduler.AddDelayed(() => scroll.ScrollToEnd(), 50); } -} \ No newline at end of file +} diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs index dc586bd363..e6dffbfe63 100644 --- a/osu.Game/Overlays/ChatOverlay.cs +++ b/osu.Game/Overlays/ChatOverlay.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.Linq; using OpenTK; using osu.Framework.Allocation; +using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; @@ -15,24 +16,23 @@ using osu.Game.Graphics.Sprites; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.Chat; -using osu.Game.Online.Chat.Drawables; using osu.Game.Graphics.UserInterface; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using OpenTK.Graphics; using osu.Framework.Input; +using osu.Game.Configuration; +using osu.Game.Graphics; +using osu.Game.Overlays.Chat; namespace osu.Game.Overlays { public class ChatOverlay : FocusedOverlayContainer, IOnlineComponent { - private const float textbox_height = 40; + private const float textbox_height = 60; private ScheduledDelegate messageRequest; - private readonly Container content; - - protected override Container Content => content; + private readonly Container currentChannelContainer; private readonly FocusedTextBox inputTextBox; @@ -40,50 +40,114 @@ namespace osu.Game.Overlays private const int transition_length = 500; + public const float DEFAULT_HEIGHT = 0.4f; + + public const float TAB_AREA_HEIGHT = 50; + private GetMessagesRequest fetchReq; + private readonly ChatTabControl channelTabs; + + private readonly Box chatBackground; + private readonly Box tabBackground; + + private Bindable chatHeight; + public ChatOverlay() { - RelativeSizeAxes = Axes.X; - Size = new Vector2(1, 300); + RelativeSizeAxes = Axes.Both; + RelativePositionAxes = Axes.Both; + Size = new Vector2(1, DEFAULT_HEIGHT); Anchor = Anchor.BottomLeft; Origin = Anchor.BottomLeft; - AddInternal(new Drawable[] + const float padding = 5; + + Children = new Drawable[] { - new Box + new Container { - Depth = float.MaxValue, + Name = @"chat area", RelativeSizeAxes = Axes.Both, - Colour = Color4.Black, - Alpha = 0.9f, - }, - content = new Container - { - RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Top = 5, Bottom = textbox_height + 5 }, + Padding = new MarginPadding { Top = TAB_AREA_HEIGHT }, + Children = new Drawable[] + { + chatBackground = new Box + { + RelativeSizeAxes = Axes.Both, + }, + currentChannelContainer = new Container + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding + { + Top = padding, + Bottom = textbox_height + padding + }, + }, + new Container + { + Anchor = Anchor.BottomLeft, + Origin = Anchor.BottomLeft, + RelativeSizeAxes = Axes.X, + Height = textbox_height, + Padding = new MarginPadding + { + Top = padding * 2, + Bottom = padding * 2, + Left = ChatLine.LEFT_PADDING + padding * 2, + Right = padding * 2, + }, + Children = new Drawable[] + { + inputTextBox = new FocusedTextBox + { + RelativeSizeAxes = Axes.Both, + Height = 1, + PlaceholderText = "type your message", + Exit = () => State = Visibility.Hidden, + OnCommit = postMessage, + HoldFocus = true, + } + } + } + } }, new Container { - Anchor = Anchor.BottomLeft, - Origin = Anchor.BottomLeft, + Name = @"tabs area", RelativeSizeAxes = Axes.X, - Height = textbox_height, - Padding = new MarginPadding(5), + Height = TAB_AREA_HEIGHT, Children = new Drawable[] { - inputTextBox = new FocusedTextBox + tabBackground = new Box { RelativeSizeAxes = Axes.Both, - Height = 1, - PlaceholderText = "type your message", - Exit = () => State = Visibility.Hidden, - OnCommit = postMessage, - HoldFocus = true, - } + Colour = Color4.Black, + }, + channelTabs = new ChatTabControl + { + RelativeSizeAxes = Axes.Both, + }, } - } - }); + }, + }; + + channelTabs.Current.ValueChanged += newChannel => CurrentChannel = newChannel; + } + + protected override bool OnDragStart(InputState state) + { + if (channelTabs.Hovering) + return true; + + return base.OnDragStart(state); + } + + protected override bool OnDrag(InputState state) + { + chatHeight.Value = Height - state.Mouse.Delta.Y / Parent.DrawSize.Y; + return base.OnDrag(state); } public void APIStateChanged(APIAccess api, APIState state) @@ -117,7 +181,7 @@ namespace osu.Game.Overlays protected override void PopOut() { - MoveToY(DrawSize.Y, transition_length, EasingTypes.InSine); + MoveToY(Height, transition_length, EasingTypes.InSine); FadeOut(transition_length, EasingTypes.InSine); inputTextBox.HoldFocus = false; @@ -125,19 +189,33 @@ namespace osu.Game.Overlays } [BackgroundDependencyLoader] - private void load(APIAccess api) + private void load(APIAccess api, OsuConfigManager config, OsuColour colours) { this.api = api; api.Register(this); + + chatHeight = config.GetBindable(OsuSetting.ChatDisplayHeight); + chatHeight.ValueChanged += h => + { + Height = (float)h; + tabBackground.FadeTo(Height == 1 ? 1 : 0.8f, 200); + }; + chatHeight.TriggerChange(); + + chatBackground.Colour = colours.ChatBlue; } private long? lastMessageId; private List careChannels; + private readonly List loadedChannels = new List(); + private void initializeChannels() { - Clear(); + currentChannelContainer.Clear(); + + loadedChannels.Clear(); careChannels = new List(); @@ -160,18 +238,77 @@ namespace osu.Game.Overlays Scheduler.Add(delegate { loading.FadeOut(100); + addChannel(channels.Find(c => c.Name == @"#lazer")); + addChannel(channels.Find(c => c.Name == @"#osu")); + addChannel(channels.Find(c => c.Name == @"#lobby")); }); messageRequest = Scheduler.AddDelayed(fetchNewMessages, 1000, true); }; + api.Queue(req); } + private Channel currentChannel; + + protected Channel CurrentChannel + { + get + { + return currentChannel; + } + + set + { + if (currentChannel == value) return; + + if (currentChannel != null) + currentChannelContainer.Clear(false); + + currentChannel = value; + + var loaded = loadedChannels.Find(d => d.Channel == value); + if (loaded == null) + loadedChannels.Add(loaded = new DrawableChannel(currentChannel)); + + inputTextBox.Current.Disabled = currentChannel.ReadOnly; + + currentChannelContainer.Add(loaded); + + channelTabs.Current.Value = value; + } + } + private void addChannel(Channel channel) { - Add(new DrawableChannel(channel)); + if (channel == null) return; + careChannels.Add(channel); + channelTabs.AddItem(channel); + + // we need to get a good number of messages initially for each channel we care about. + fetchInitialMessages(channel); + + if (CurrentChannel == null) + CurrentChannel = channel; + } + + private void fetchInitialMessages(Channel channel) + { + var req = new GetMessagesRequest(new List { channel }, null); + + req.Success += delegate (List messages) + { + channel.AddNewMessages(messages.ToArray()); + Debug.Write("success!"); + }; + req.Failure += delegate + { + Debug.Write("failure!"); + }; + + api.Queue(req); } private void fetchNewMessages() @@ -185,7 +322,7 @@ namespace osu.Game.Overlays //batch messages per channel. foreach (var id in ids) - careChannels.Find(c => c.Id == id)?.AddNewMessages(messages.Where(m => m.TargetId == id)); + careChannels.Find(c => c.Id == id)?.AddNewMessages(messages.Where(m => m.TargetId == id).ToArray()); lastMessageId = messages.LastOrDefault()?.Id ?? lastMessageId; @@ -205,40 +342,45 @@ namespace osu.Game.Overlays { var postText = textbox.Text; - if (!string.IsNullOrEmpty(postText) && api.LocalUser.Value != null) + if (string.IsNullOrEmpty(postText) || api.LocalUser.Value == null) return; + + if (currentChannel == null) return; + + if (postText[0] == '/') { - var currentChannel = careChannels.FirstOrDefault(); - - if (currentChannel == null) return; - - var message = new Message - { - Sender = api.LocalUser.Value, - Timestamp = DateTimeOffset.Now, - TargetType = TargetType.Channel, //TODO: read this from currentChannel - TargetId = currentChannel.Id, - Content = postText - }; - - textbox.ReadOnly = true; - var req = new PostMessageRequest(message); - - req.Failure += e => - { - textbox.FlashColour(Color4.Red, 1000); - textbox.ReadOnly = false; - }; - - req.Success += m => - { - currentChannel.AddNewMessages(new[] { m }); - - textbox.ReadOnly = false; - textbox.Text = string.Empty; - }; - - api.Queue(req); + // TODO: handle commands + currentChannel.AddNewMessages(new ErrorMessage("Chat commands are not supported yet!")); + textbox.Text = string.Empty; + return; } + + var message = new Message + { + Sender = api.LocalUser.Value, + Timestamp = DateTimeOffset.Now, + TargetType = TargetType.Channel, //TODO: read this from currentChannel + TargetId = currentChannel.Id, + Content = postText + }; + + textbox.ReadOnly = true; + var req = new PostMessageRequest(message); + + req.Failure += e => + { + textbox.FlashColour(Color4.Red, 1000); + textbox.ReadOnly = false; + }; + + req.Success += m => + { + currentChannel.AddNewMessages(m); + + textbox.ReadOnly = false; + textbox.Text = string.Empty; + }; + + api.Queue(req); } } } diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs index b4127c8af4..47674de817 100644 --- a/osu.Game/Overlays/Dialog/PopupDialog.cs +++ b/osu.Game/Overlays/Dialog/PopupDialog.cs @@ -6,7 +6,6 @@ using System.Linq; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Game.Graphics; diff --git a/osu.Game/Overlays/LoginOverlay.cs b/osu.Game/Overlays/LoginOverlay.cs index 694eba2c41..e555600028 100644 --- a/osu.Game/Overlays/LoginOverlay.cs +++ b/osu.Game/Overlays/LoginOverlay.cs @@ -4,17 +4,16 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.General; +using osu.Game.Overlays.Settings.Sections.General; using OpenTK.Graphics; namespace osu.Game.Overlays { internal class LoginOverlay : FocusedOverlayContainer { - private LoginOptions optionsSection; + private LoginSettings settingsSection; private const float transition_time = 400; @@ -42,7 +41,7 @@ namespace osu.Game.Overlays AutoSizeEasing = EasingTypes.OutQuint, Children = new Drawable[] { - optionsSection = new LoginOptions + settingsSection = new LoginSettings { Padding = new MarginPadding(10), }, @@ -64,17 +63,17 @@ namespace osu.Game.Overlays { base.PopIn(); - optionsSection.Bounding = true; + settingsSection.Bounding = true; FadeIn(transition_time, EasingTypes.OutQuint); - optionsSection.TriggerFocus(); + settingsSection.TriggerFocus(); } protected override void PopOut() { base.PopOut(); - optionsSection.Bounding = false; + settingsSection.Bounding = false; FadeOut(transition_time); } } diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs index 40bd1e8b07..aac8a72dd7 100644 --- a/osu.Game/Overlays/Mods/ModSection.cs +++ b/osu.Game/Overlays/Mods/ModSection.cs @@ -6,7 +6,6 @@ using OpenTK.Graphics; using OpenTK.Input; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Input; using osu.Game.Graphics.Sprites; using osu.Game.Rulesets.Mods; diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 2840ffd1e4..c001d613e4 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -8,7 +8,6 @@ using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Backgrounds; diff --git a/osu.Game/Overlays/Music/FilterControl.cs b/osu.Game/Overlays/Music/FilterControl.cs index c6572c5ed2..6d8790a9e8 100644 --- a/osu.Game/Overlays/Music/FilterControl.cs +++ b/osu.Game/Overlays/Music/FilterControl.cs @@ -6,11 +6,9 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics; using osu.Game.Graphics.UserInterface; -using osu.Game.Screens.Select; using OpenTK; using OpenTK.Graphics; using System; @@ -62,6 +60,7 @@ namespace osu.Game.Overlays.Music protected override Color4 BackgroundUnfocused => backgroundColour; protected override Color4 BackgroundFocused => backgroundColour; + protected override bool AllowCommit => true; public FilterTextBox() { diff --git a/osu.Game/Overlays/Music/PlaylistItem.cs b/osu.Game/Overlays/Music/PlaylistItem.cs index da31e94e22..16978903a7 100644 --- a/osu.Game/Overlays/Music/PlaylistItem.cs +++ b/osu.Game/Overlays/Music/PlaylistItem.cs @@ -5,7 +5,6 @@ using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Database; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; @@ -132,6 +131,10 @@ namespace osu.Game.Overlays.Music FadeTo(matching ? 1 : 0, 200); } + get + { + return matching; + } } } } diff --git a/osu.Game/Overlays/Music/PlaylistList.cs b/osu.Game/Overlays/Music/PlaylistList.cs index c7909f1a63..ffe59a9d93 100644 --- a/osu.Game/Overlays/Music/PlaylistList.cs +++ b/osu.Game/Overlays/Music/PlaylistList.cs @@ -22,6 +22,8 @@ namespace osu.Game.Overlays.Music } } + public BeatmapSetInfo FirstVisibleSet => items.Children.FirstOrDefault(i => i.MatchingCurrentFilter)?.BeatmapSetInfo; + private void itemSelected(BeatmapSetInfo b) { OnSelect?.Invoke(b); diff --git a/osu.Game/Overlays/Music/PlaylistOverlay.cs b/osu.Game/Overlays/Music/PlaylistOverlay.cs index 92b8addd97..5e433aa414 100644 --- a/osu.Game/Overlays/Music/PlaylistOverlay.cs +++ b/osu.Game/Overlays/Music/PlaylistOverlay.cs @@ -10,7 +10,6 @@ using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Beatmaps; using osu.Game.Database; @@ -84,6 +83,11 @@ namespace osu.Game.Overlays.Music list.BeatmapSets = BeatmapSets = beatmaps.GetAllWithChildren().ToList(); beatmapBacking.BindTo(game.Beatmap); + + filter.Search.OnCommit = (sender, newText) => { + var beatmap = list.FirstVisibleSet?.Beatmaps?.FirstOrDefault(); + if (beatmap != null) playSpecified(beatmap); + }; } protected override void LoadComplete() diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index e3edaa0ca7..4faa339bed 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -12,7 +12,6 @@ using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Framework.Input; diff --git a/osu.Game/Overlays/NotificationManager.cs b/osu.Game/Overlays/NotificationManager.cs index 264543367c..b344d533ee 100644 --- a/osu.Game/Overlays/NotificationManager.cs +++ b/osu.Game/Overlays/NotificationManager.cs @@ -6,7 +6,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Overlays.Notifications; using OpenTK.Graphics; diff --git a/osu.Game/Overlays/Notifications/Notification.cs b/osu.Game/Overlays/Notifications/Notification.cs index 961e83e958..cb3efaf269 100644 --- a/osu.Game/Overlays/Notifications/Notification.cs +++ b/osu.Game/Overlays/Notifications/Notification.cs @@ -7,7 +7,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Transforms; using osu.Framework.Input; diff --git a/osu.Game/Overlays/Notifications/NotificationSection.cs b/osu.Game/Overlays/Notifications/NotificationSection.cs index 663c5cf90c..b53f8e6b14 100644 --- a/osu.Game/Overlays/Notifications/NotificationSection.cs +++ b/osu.Game/Overlays/Notifications/NotificationSection.cs @@ -8,7 +8,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using OpenTK; diff --git a/osu.Game/Overlays/Options/Sections/Audio/AudioDevicesOptions.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs similarity index 88% rename from osu.Game/Overlays/Options/Sections/Audio/AudioDevicesOptions.cs rename to osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs index e3033b876d..47f7abf571 100644 --- a/osu.Game/Overlays/Options/Sections/Audio/AudioDevicesOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs @@ -7,14 +7,14 @@ using osu.Framework.Graphics; using System.Collections.Generic; using System.Linq; -namespace osu.Game.Overlays.Options.Sections.Audio +namespace osu.Game.Overlays.Settings.Sections.Audio { - public class AudioDevicesOptions : OptionsSubsection + public class AudioDevicesSettings : SettingsSubsection { protected override string Header => "Devices"; private AudioManager audio; - private OptionDropdown dropdown; + private SettingsDropdown dropdown; [BackgroundDependencyLoader] private void load(AudioManager audio) @@ -56,7 +56,7 @@ namespace osu.Game.Overlays.Options.Sections.Audio Children = new Drawable[] { - dropdown = new OptionDropdown + dropdown = new SettingsDropdown { Bindable = audio.AudioDevice }, diff --git a/osu.Game/Overlays/Options/Sections/Audio/MainMenuOptions.cs b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs similarity index 63% rename from osu.Game/Overlays/Options/Sections/Audio/MainMenuOptions.cs rename to osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs index b2d1235b97..41a1bad364 100644 --- a/osu.Game/Overlays/Options/Sections/Audio/MainMenuOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs @@ -4,9 +4,9 @@ using osu.Framework.Allocation; using osu.Game.Configuration; -namespace osu.Game.Overlays.Options.Sections.Audio +namespace osu.Game.Overlays.Settings.Sections.Audio { - public class MainMenuOptions : OptionsSubsection + public class MainMenuSettings : SettingsSubsection { protected override string Header => "Main Menu"; @@ -15,15 +15,15 @@ namespace osu.Game.Overlays.Options.Sections.Audio { Children = new[] { - new OptionCheckbox + new SettingsCheckbox { LabelText = "Interface voices", - Bindable = config.GetBindable(OsuConfig.MenuVoice) + Bindable = config.GetBindable(OsuSetting.MenuVoice) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "osu! music theme", - Bindable = config.GetBindable(OsuConfig.MenuMusic) + Bindable = config.GetBindable(OsuSetting.MenuMusic) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/Audio/OffsetOptions.cs b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs similarity index 77% rename from osu.Game/Overlays/Options/Sections/Audio/OffsetOptions.cs rename to osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs index 72c3dd071a..bc09a2145a 100644 --- a/osu.Game/Overlays/Options/Sections/Audio/OffsetOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs @@ -6,9 +6,9 @@ using osu.Framework.Graphics; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.Audio +namespace osu.Game.Overlays.Settings.Sections.Audio { - public class OffsetOptions : OptionsSubsection + public class OffsetSettings : SettingsSubsection { protected override string Header => "Offset Adjustment"; @@ -17,10 +17,10 @@ namespace osu.Game.Overlays.Options.Sections.Audio { Children = new Drawable[] { - new OptionSlider + new SettingsSlider { LabelText = "Audio Offset", - Bindable = config.GetBindable(OsuConfig.AudioOffset) + Bindable = config.GetBindable(OsuSetting.AudioOffset) }, new OsuButton { diff --git a/osu.Game/Overlays/Options/Sections/Audio/VolumeOptions.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs similarity index 53% rename from osu.Game/Overlays/Options/Sections/Audio/VolumeOptions.cs rename to osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs index c3eb04da13..ea442cdfc2 100644 --- a/osu.Game/Overlays/Options/Sections/Audio/VolumeOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Graphics; -namespace osu.Game.Overlays.Options.Sections.Audio +namespace osu.Game.Overlays.Settings.Sections.Audio { - public class VolumeOptions : OptionsSubsection + public class VolumeSettings : SettingsSubsection { protected override string Header => "Volume"; @@ -16,9 +16,9 @@ namespace osu.Game.Overlays.Options.Sections.Audio { Children = new Drawable[] { - new OptionSlider { LabelText = "Master", Bindable = audio.Volume }, - new OptionSlider { LabelText = "Effect", Bindable = audio.VolumeSample }, - new OptionSlider { LabelText = "Music", Bindable = audio.VolumeTrack }, + new SettingsSlider { LabelText = "Master", Bindable = audio.Volume }, + new SettingsSlider { LabelText = "Effect", Bindable = audio.VolumeSample }, + new SettingsSlider { LabelText = "Music", Bindable = audio.VolumeTrack }, }; } } diff --git a/osu.Game/Overlays/Options/Sections/AudioSection.cs b/osu.Game/Overlays/Settings/Sections/AudioSection.cs similarity index 58% rename from osu.Game/Overlays/Options/Sections/AudioSection.cs rename to osu.Game/Overlays/Settings/Sections/AudioSection.cs index a9f8265a68..c994a6296c 100644 --- a/osu.Game/Overlays/Options/Sections/AudioSection.cs +++ b/osu.Game/Overlays/Settings/Sections/AudioSection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.Audio; +using osu.Game.Overlays.Settings.Sections.Audio; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class AudioSection : OptionsSection + public class AudioSection : SettingsSection { public override string Header => "Audio"; public override FontAwesome Icon => FontAwesome.fa_headphones; @@ -16,10 +16,10 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new AudioDevicesOptions(), - new VolumeOptions(), - new OffsetOptions(), - new MainMenuOptions(), + new AudioDevicesSettings(), + new VolumeSettings(), + new OffsetSettings(), + new MainMenuSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/Debug/GCOptions.cs b/osu.Game/Overlays/Settings/Sections/Debug/GCSettings.cs similarity index 83% rename from osu.Game/Overlays/Options/Sections/Debug/GCOptions.cs rename to osu.Game/Overlays/Settings/Sections/Debug/GCSettings.cs index 4350625d51..29b96a59c2 100644 --- a/osu.Game/Overlays/Options/Sections/Debug/GCOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Debug/GCSettings.cs @@ -8,9 +8,9 @@ using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.Debug +namespace osu.Game.Overlays.Settings.Sections.Debug { - public class GCOptions : OptionsSubsection + public class GCSettings : SettingsSubsection { protected override string Header => "Garbage Collector"; @@ -19,7 +19,7 @@ namespace osu.Game.Overlays.Options.Sections.Debug { Children = new Drawable[] { - new OptionEnumDropdown + new SettingsEnumDropdown { LabelText = "Active mode", Bindable = config.GetBindable(FrameworkDebugConfig.ActiveGCMode) diff --git a/osu.Game/Overlays/Options/Sections/Debug/GeneralOptions.cs b/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs similarity index 80% rename from osu.Game/Overlays/Options/Sections/Debug/GeneralOptions.cs rename to osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs index 9258b8fbeb..9fbb4011b7 100644 --- a/osu.Game/Overlays/Options/Sections/Debug/GeneralOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Graphics; -namespace osu.Game.Overlays.Options.Sections.Debug +namespace osu.Game.Overlays.Settings.Sections.Debug { - public class GeneralOptions : OptionsSubsection + public class GeneralSettings : SettingsSubsection { protected override string Header => "General"; @@ -16,7 +16,7 @@ namespace osu.Game.Overlays.Options.Sections.Debug { Children = new Drawable[] { - new OptionCheckbox + new SettingsCheckbox { LabelText = "Bypass caching", Bindable = config.GetBindable(FrameworkDebugConfig.BypassCaching) diff --git a/osu.Game/Overlays/Options/Sections/DebugSection.cs b/osu.Game/Overlays/Settings/Sections/DebugSection.cs similarity index 65% rename from osu.Game/Overlays/Options/Sections/DebugSection.cs rename to osu.Game/Overlays/Settings/Sections/DebugSection.cs index a90558a319..05b7171eed 100644 --- a/osu.Game/Overlays/Options/Sections/DebugSection.cs +++ b/osu.Game/Overlays/Settings/Sections/DebugSection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.Debug; +using osu.Game.Overlays.Settings.Sections.Debug; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class DebugSection : OptionsSection + public class DebugSection : SettingsSection { public override string Header => "Debug"; public override FontAwesome Icon => FontAwesome.fa_bug; @@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new GeneralOptions(), - new GCOptions(), + new GeneralSettings(), + new GCSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/Gameplay/GeneralOptions.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs similarity index 60% rename from osu.Game/Overlays/Options/Sections/Gameplay/GeneralOptions.cs rename to osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs index 2598d95949..a8ec04514a 100644 --- a/osu.Game/Overlays/Options/Sections/Gameplay/GeneralOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Game.Configuration; -namespace osu.Game.Overlays.Options.Sections.Gameplay +namespace osu.Game.Overlays.Settings.Sections.Gameplay { - public class GeneralOptions : OptionsSubsection + public class GeneralSettings : SettingsSubsection { protected override string Header => "General"; @@ -16,20 +16,20 @@ namespace osu.Game.Overlays.Options.Sections.Gameplay { Children = new Drawable[] { - new OptionSlider + new SettingsSlider { LabelText = "Background dim", - Bindable = config.GetBindable(OsuConfig.DimLevel) + Bindable = config.GetBindable(OsuSetting.DimLevel) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Show score overlay", - Bindable = config.GetBindable(OsuConfig.ShowInterface) + Bindable = config.GetBindable(OsuSetting.ShowInterface) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Always show key overlay", - Bindable = config.GetBindable(OsuConfig.KeyOverlay) + Bindable = config.GetBindable(OsuSetting.KeyOverlay) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/Gameplay/SongSelectOptions.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs similarity index 66% rename from osu.Game/Overlays/Options/Sections/Gameplay/SongSelectOptions.cs rename to osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs index 910eae9a5a..7626911627 100644 --- a/osu.Game/Overlays/Options/Sections/Gameplay/SongSelectOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs @@ -6,9 +6,9 @@ using osu.Framework.Graphics; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.Gameplay +namespace osu.Game.Overlays.Settings.Sections.Gameplay { - public class SongSelectOptions : OptionsSubsection + public class SongSelectSettings : SettingsSubsection { protected override string Header => "Song Select"; @@ -17,15 +17,15 @@ namespace osu.Game.Overlays.Options.Sections.Gameplay { Children = new Drawable[] { - new OptionSlider + new SettingsSlider { LabelText = "Display beatmaps from", - Bindable = config.GetBindable(OsuConfig.DisplayStarsMinimum) + Bindable = config.GetBindable(OsuSetting.DisplayStarsMinimum) }, - new OptionSlider + new SettingsSlider { LabelText = "up to", - Bindable = config.GetBindable(OsuConfig.DisplayStarsMaximum) + Bindable = config.GetBindable(OsuSetting.DisplayStarsMaximum) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/GameplaySection.cs b/osu.Game/Overlays/Settings/Sections/GameplaySection.cs similarity index 64% rename from osu.Game/Overlays/Options/Sections/GameplaySection.cs rename to osu.Game/Overlays/Settings/Sections/GameplaySection.cs index 85a180ccbc..be957912c1 100644 --- a/osu.Game/Overlays/Options/Sections/GameplaySection.cs +++ b/osu.Game/Overlays/Settings/Sections/GameplaySection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.Gameplay; +using osu.Game.Overlays.Settings.Sections.Gameplay; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class GameplaySection : OptionsSection + public class GameplaySection : SettingsSection { public override string Header => "Gameplay"; public override FontAwesome Icon => FontAwesome.fa_circle_o; @@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new GeneralOptions(), - new SongSelectOptions(), + new GeneralSettings(), + new SongSelectSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/General/LanguageOptions.cs b/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs similarity index 77% rename from osu.Game/Overlays/Options/Sections/General/LanguageOptions.cs rename to osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs index 2778f2567d..552b8bea1b 100644 --- a/osu.Game/Overlays/Options/Sections/General/LanguageOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Graphics; -namespace osu.Game.Overlays.Options.Sections.General +namespace osu.Game.Overlays.Settings.Sections.General { - public class LanguageOptions : OptionsSubsection + public class LanguageSettings : SettingsSubsection { protected override string Header => "Language"; @@ -16,10 +16,10 @@ namespace osu.Game.Overlays.Options.Sections.General { Children = new Drawable[] { - new OptionCheckbox + new SettingsCheckbox { LabelText = "Prefer metadata in original language", - Bindable = frameworkConfig.GetBindable(FrameworkConfig.ShowUnicode) + Bindable = frameworkConfig.GetBindable(FrameworkSetting.ShowUnicode) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs similarity index 90% rename from osu.Game/Overlays/Options/Sections/General/LoginOptions.cs rename to osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index a3612a6396..86a47d8a95 100644 --- a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -13,9 +13,9 @@ using osu.Game.Online.API; using OpenTK; using osu.Framework.Input; -namespace osu.Game.Overlays.Options.Sections.General +namespace osu.Game.Overlays.Settings.Sections.General { - public class LoginOptions : OptionsSubsection, IOnlineComponent + public class LoginSettings : SettingsSubsection, IOnlineComponent { private bool bounding = true; private LoginForm form; @@ -132,15 +132,15 @@ namespace osu.Game.Overlays.Options.Sections.General TabbableContentContainer = this, OnCommit = (sender, newText) => performLogin() }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Remember username", - Bindable = config.GetBindable(OsuConfig.SaveUsername), + Bindable = config.GetBindable(OsuSetting.SaveUsername), }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Stay logged in", - Bindable = config.GetBindable(OsuConfig.SavePassword), + Bindable = config.GetBindable(OsuSetting.SavePassword), }, new OsuButton { diff --git a/osu.Game/Overlays/Options/Sections/General/UpdateOptions.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs similarity index 80% rename from osu.Game/Overlays/Options/Sections/General/UpdateOptions.cs rename to osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 1d9a5a7d72..3ceb8d2ff4 100644 --- a/osu.Game/Overlays/Options/Sections/General/UpdateOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -7,9 +7,9 @@ using osu.Framework.Platform; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.General +namespace osu.Game.Overlays.Settings.Sections.General { - public class UpdateOptions : OptionsSubsection + public class UpdateSettings : SettingsSubsection { protected override string Header => "Updates"; @@ -18,10 +18,10 @@ namespace osu.Game.Overlays.Options.Sections.General { Children = new Drawable[] { - new OptionEnumDropdown + new SettingsEnumDropdown { LabelText = "Release stream", - Bindable = config.GetBindable(OsuConfig.ReleaseStream), + Bindable = config.GetBindable(OsuSetting.ReleaseStream), }, new OsuButton { diff --git a/osu.Game/Overlays/Options/Sections/GeneralSection.cs b/osu.Game/Overlays/Settings/Sections/GeneralSection.cs similarity index 64% rename from osu.Game/Overlays/Options/Sections/GeneralSection.cs rename to osu.Game/Overlays/Settings/Sections/GeneralSection.cs index e0c447b08b..5511f827e2 100644 --- a/osu.Game/Overlays/Options/Sections/GeneralSection.cs +++ b/osu.Game/Overlays/Settings/Sections/GeneralSection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.General; +using osu.Game.Overlays.Settings.Sections.General; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class GeneralSection : OptionsSection + public class GeneralSection : SettingsSection { public override string Header => "General"; public override FontAwesome Icon => FontAwesome.fa_gear; @@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new LanguageOptions(), - new UpdateOptions(), + new LanguageSettings(), + new UpdateSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/Graphics/DetailOptions.cs b/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs similarity index 64% rename from osu.Game/Overlays/Options/Sections/Graphics/DetailOptions.cs rename to osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs index 6503a7ea90..78eab6ebd8 100644 --- a/osu.Game/Overlays/Options/Sections/Graphics/DetailOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Game.Configuration; -namespace osu.Game.Overlays.Options.Sections.Graphics +namespace osu.Game.Overlays.Settings.Sections.Graphics { - public class DetailOptions : OptionsSubsection + public class DetailSettings : SettingsSubsection { protected override string Header => "Detail Settings"; @@ -16,15 +16,15 @@ namespace osu.Game.Overlays.Options.Sections.Graphics { Children = new Drawable[] { - new OptionCheckbox + new SettingsCheckbox { LabelText = "Snaking in sliders", - Bindable = config.GetBindable(OsuConfig.SnakingInSliders) + Bindable = config.GetBindable(OsuSetting.SnakingInSliders) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Snaking out sliders", - Bindable = config.GetBindable(OsuConfig.SnakingOutSliders) + Bindable = config.GetBindable(OsuSetting.SnakingOutSliders) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/Graphics/LayoutOptions.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs similarity index 70% rename from osu.Game/Overlays/Options/Sections/Graphics/LayoutOptions.cs rename to osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs index 1b4b0b3c7d..9a5fd769cd 100644 --- a/osu.Game/Overlays/Options/Sections/Graphics/LayoutOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs @@ -5,43 +5,43 @@ using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Graphics; -namespace osu.Game.Overlays.Options.Sections.Graphics +namespace osu.Game.Overlays.Settings.Sections.Graphics { - public class LayoutOptions : OptionsSubsection + public class LayoutSettings : SettingsSubsection { protected override string Header => "Layout"; - private OptionSlider letterboxPositionX; - private OptionSlider letterboxPositionY; + private SettingsSlider letterboxPositionX; + private SettingsSlider letterboxPositionY; private Bindable letterboxing; [BackgroundDependencyLoader] private void load(FrameworkConfigManager config) { - letterboxing = config.GetBindable(FrameworkConfig.Letterboxing); + letterboxing = config.GetBindable(FrameworkSetting.Letterboxing); Children = new Drawable[] { - new OptionEnumDropdown + new SettingsEnumDropdown { LabelText = "Screen mode", - Bindable = config.GetBindable(FrameworkConfig.WindowMode), + Bindable = config.GetBindable(FrameworkSetting.WindowMode), }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Letterboxing", Bindable = letterboxing, }, - letterboxPositionX = new OptionSlider + letterboxPositionX = new SettingsSlider { LabelText = "Horizontal position", - Bindable = config.GetBindable(FrameworkConfig.LetterboxPositionX) + Bindable = config.GetBindable(FrameworkSetting.LetterboxPositionX) }, - letterboxPositionY = new OptionSlider + letterboxPositionY = new SettingsSlider { LabelText = "Vertical position", - Bindable = config.GetBindable(FrameworkConfig.LetterboxPositionY) + Bindable = config.GetBindable(FrameworkSetting.LetterboxPositionY) }, }; diff --git a/osu.Game/Overlays/Options/Sections/Graphics/MainMenuOptions.cs b/osu.Game/Overlays/Settings/Sections/Graphics/MainMenuSettings.cs similarity index 68% rename from osu.Game/Overlays/Options/Sections/Graphics/MainMenuOptions.cs rename to osu.Game/Overlays/Settings/Sections/Graphics/MainMenuSettings.cs index 6ebb8f263d..7fe5be2fa1 100644 --- a/osu.Game/Overlays/Options/Sections/Graphics/MainMenuOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/MainMenuSettings.cs @@ -4,9 +4,9 @@ using osu.Framework.Allocation; using osu.Game.Configuration; -namespace osu.Game.Overlays.Options.Sections.Graphics +namespace osu.Game.Overlays.Settings.Sections.Graphics { - public class MainMenuOptions : OptionsSubsection + public class MainMenuSettings : SettingsSubsection { protected override string Header => "User Interface"; @@ -15,10 +15,10 @@ namespace osu.Game.Overlays.Options.Sections.Graphics { Children = new[] { - new OptionCheckbox + new SettingsCheckbox { LabelText = "Parallax", - Bindable = config.GetBindable(OsuConfig.MenuParallax) + Bindable = config.GetBindable(OsuSetting.MenuParallax) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/Graphics/RendererOptions.cs b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs similarity index 72% rename from osu.Game/Overlays/Options/Sections/Graphics/RendererOptions.cs rename to osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs index f11c18d3b4..8e84a25bb9 100644 --- a/osu.Game/Overlays/Options/Sections/Graphics/RendererOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs @@ -6,9 +6,9 @@ using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Game.Configuration; -namespace osu.Game.Overlays.Options.Sections.Graphics +namespace osu.Game.Overlays.Settings.Sections.Graphics { - public class RendererOptions : OptionsSubsection + public class RendererSettings : SettingsSubsection { protected override string Header => "Renderer"; @@ -19,15 +19,15 @@ namespace osu.Game.Overlays.Options.Sections.Graphics Children = new Drawable[] { // TODO: this needs to be a custom dropdown at some point - new OptionEnumDropdown + new SettingsEnumDropdown { LabelText = "Frame limiter", - Bindable = config.GetBindable(FrameworkConfig.FrameSync) + Bindable = config.GetBindable(FrameworkSetting.FrameSync) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Show FPS", - Bindable = osuConfig.GetBindable(OsuConfig.ShowFpsDisplay) + Bindable = osuConfig.GetBindable(OsuSetting.ShowFpsDisplay) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/GraphicsSection.cs b/osu.Game/Overlays/Settings/Sections/GraphicsSection.cs similarity index 58% rename from osu.Game/Overlays/Options/Sections/GraphicsSection.cs rename to osu.Game/Overlays/Settings/Sections/GraphicsSection.cs index dbbcbde2b9..f188f2476c 100644 --- a/osu.Game/Overlays/Options/Sections/GraphicsSection.cs +++ b/osu.Game/Overlays/Settings/Sections/GraphicsSection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.Graphics; +using osu.Game.Overlays.Settings.Sections.Graphics; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class GraphicsSection : OptionsSection + public class GraphicsSection : SettingsSection { public override string Header => "Graphics"; public override FontAwesome Icon => FontAwesome.fa_laptop; @@ -16,10 +16,10 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new RendererOptions(), - new LayoutOptions(), - new DetailOptions(), - new MainMenuOptions(), + new RendererSettings(), + new LayoutSettings(), + new DetailSettings(), + new MainMenuSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/Input/KeyboardOptions.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs similarity index 76% rename from osu.Game/Overlays/Options/Sections/Input/KeyboardOptions.cs rename to osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs index b7e8598cff..9ead4ca7a4 100644 --- a/osu.Game/Overlays/Options/Sections/Input/KeyboardOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/KeyboardSettings.cs @@ -4,13 +4,13 @@ using osu.Framework.Graphics; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.Input +namespace osu.Game.Overlays.Settings.Sections.Input { - public class KeyboardOptions : OptionsSubsection + public class KeyboardSettings : SettingsSubsection { protected override string Header => "Keyboard"; - public KeyboardOptions() + public KeyboardSettings() { Children = new Drawable[] { diff --git a/osu.Game/Overlays/Options/Sections/Input/MouseOptions.cs b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs similarity index 69% rename from osu.Game/Overlays/Options/Sections/Input/MouseOptions.cs rename to osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs index b4ce11e2bc..9cf5c42319 100644 --- a/osu.Game/Overlays/Options/Sections/Input/MouseOptions.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs @@ -8,9 +8,9 @@ using osu.Framework.Input; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options.Sections.Input +namespace osu.Game.Overlays.Settings.Sections.Input { - public class MouseOptions : OptionsSubsection + public class MouseSettings : SettingsSubsection { protected override string Header => "Mouse"; @@ -19,20 +19,20 @@ namespace osu.Game.Overlays.Options.Sections.Input { Children = new Drawable[] { - new OptionEnumDropdown + new SettingsEnumDropdown { LabelText = "Confine mouse cursor", - Bindable = config.GetBindable(FrameworkConfig.ConfineMouseMode), + Bindable = config.GetBindable(FrameworkSetting.ConfineMouseMode), }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Disable mouse wheel during gameplay", - Bindable = osuConfig.GetBindable(OsuConfig.MouseDisableWheel) + Bindable = osuConfig.GetBindable(OsuSetting.MouseDisableWheel) }, - new OptionCheckbox + new SettingsCheckbox { LabelText = "Disable mouse buttons during gameplay", - Bindable = osuConfig.GetBindable(OsuConfig.MouseDisableButtons) + Bindable = osuConfig.GetBindable(OsuSetting.MouseDisableButtons) }, }; } diff --git a/osu.Game/Overlays/Options/Sections/InputSection.cs b/osu.Game/Overlays/Settings/Sections/InputSection.cs similarity index 65% rename from osu.Game/Overlays/Options/Sections/InputSection.cs rename to osu.Game/Overlays/Settings/Sections/InputSection.cs index d39d0a0e20..cfa3bc78f0 100644 --- a/osu.Game/Overlays/Options/Sections/InputSection.cs +++ b/osu.Game/Overlays/Settings/Sections/InputSection.cs @@ -3,11 +3,11 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Game.Overlays.Options.Sections.Input; +using osu.Game.Overlays.Settings.Sections.Input; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class InputSection : OptionsSection + public class InputSection : SettingsSection { public override string Header => "Input"; public override FontAwesome Icon => FontAwesome.fa_keyboard_o; @@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Options.Sections { Children = new Drawable[] { - new MouseOptions(), - new KeyboardOptions(), + new MouseSettings(), + new KeyboardSettings(), }; } } diff --git a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs b/osu.Game/Overlays/Settings/Sections/MaintenanceSection.cs similarity index 81% rename from osu.Game/Overlays/Options/Sections/MaintenanceSection.cs rename to osu.Game/Overlays/Settings/Sections/MaintenanceSection.cs index e8a4f91074..529cec79c1 100644 --- a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs +++ b/osu.Game/Overlays/Settings/Sections/MaintenanceSection.cs @@ -5,9 +5,9 @@ using osu.Framework.Graphics; using osu.Game.Graphics; using OpenTK; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class MaintenanceSection : OptionsSection + public class MaintenanceSection : SettingsSection { public override string Header => "Maintenance"; public override FontAwesome Icon => FontAwesome.fa_wrench; diff --git a/osu.Game/Overlays/Options/Sections/OnlineSection.cs b/osu.Game/Overlays/Settings/Sections/OnlineSection.cs similarity index 80% rename from osu.Game/Overlays/Options/Sections/OnlineSection.cs rename to osu.Game/Overlays/Settings/Sections/OnlineSection.cs index 1a65a23121..4494da1bf4 100644 --- a/osu.Game/Overlays/Options/Sections/OnlineSection.cs +++ b/osu.Game/Overlays/Settings/Sections/OnlineSection.cs @@ -4,9 +4,9 @@ using osu.Framework.Graphics; using osu.Game.Graphics; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class OnlineSection : OptionsSection + public class OnlineSection : SettingsSection { public override string Header => "Online"; public override FontAwesome Icon => FontAwesome.fa_globe; diff --git a/osu.Game/Overlays/Options/Sections/SkinSection.cs b/osu.Game/Overlays/Settings/Sections/SkinSection.cs similarity index 60% rename from osu.Game/Overlays/Options/Sections/SkinSection.cs rename to osu.Game/Overlays/Settings/Sections/SkinSection.cs index b3c225d00c..4b4426aca8 100644 --- a/osu.Game/Overlays/Options/Sections/SkinSection.cs +++ b/osu.Game/Overlays/Settings/Sections/SkinSection.cs @@ -8,9 +8,9 @@ using osu.Game.Graphics; using osu.Game.Graphics.UserInterface; using OpenTK; -namespace osu.Game.Overlays.Options.Sections +namespace osu.Game.Overlays.Settings.Sections { - public class SkinSection : OptionsSection + public class SkinSection : SettingsSection { public override string Header => "Skin"; public override FontAwesome Icon => FontAwesome.fa_paint_brush; @@ -21,15 +21,20 @@ namespace osu.Game.Overlays.Options.Sections FlowContent.Spacing = new Vector2(0, 5); Children = new Drawable[] { - new OptionSlider + new SettingsSlider { LabelText = "Menu cursor size", - Bindable = config.GetBindable(OsuConfig.MenuCursorSize) + Bindable = config.GetBindable(OsuSetting.MenuCursorSize) }, - new OptionSlider + new SettingsSlider { LabelText = "Gameplay cursor size", - Bindable = config.GetBindable(OsuConfig.GameplayCursorSize) + Bindable = config.GetBindable(OsuSetting.GameplayCursorSize) + }, + new SettingsCheckbox + { + LabelText = "Adjust gameplay cursor size based on current beatmap", + Bindable = config.GetBindable(OsuSetting.AutoCursorSize) }, }; } diff --git a/osu.Game/Overlays/Options/OptionCheckbox.cs b/osu.Game/Overlays/Settings/SettingsCheckbox.cs similarity index 82% rename from osu.Game/Overlays/Options/OptionCheckbox.cs rename to osu.Game/Overlays/Settings/SettingsCheckbox.cs index de7b138c3c..659754ce79 100644 --- a/osu.Game/Overlays/Options/OptionCheckbox.cs +++ b/osu.Game/Overlays/Settings/SettingsCheckbox.cs @@ -4,9 +4,9 @@ using osu.Framework.Graphics; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionCheckbox : OptionItem + public class SettingsCheckbox : SettingsItem { private OsuCheckbox checkbox; diff --git a/osu.Game/Overlays/Options/OptionDropdown.cs b/osu.Game/Overlays/Settings/SettingsDropdown.cs similarity index 85% rename from osu.Game/Overlays/Options/OptionDropdown.cs rename to osu.Game/Overlays/Settings/SettingsDropdown.cs index 1427eafe39..bf2cd10b9d 100644 --- a/osu.Game/Overlays/Options/OptionDropdown.cs +++ b/osu.Game/Overlays/Settings/SettingsDropdown.cs @@ -3,13 +3,12 @@ using System.Collections.Generic; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionDropdown : OptionItem + public class SettingsDropdown : SettingsItem { private Dropdown dropdown; diff --git a/osu.Game/Overlays/Options/OptionEnumDropdown.cs b/osu.Game/Overlays/Settings/SettingsEnumDropdown.cs similarity index 75% rename from osu.Game/Overlays/Options/OptionEnumDropdown.cs rename to osu.Game/Overlays/Settings/SettingsEnumDropdown.cs index 1a4f4635e2..a9f0848403 100644 --- a/osu.Game/Overlays/Options/OptionEnumDropdown.cs +++ b/osu.Game/Overlays/Settings/SettingsEnumDropdown.cs @@ -6,14 +6,14 @@ using System.Reflection; using System.ComponentModel; using System.Collections.Generic; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionEnumDropdown : OptionDropdown + public class SettingsEnumDropdown : SettingsDropdown { - public OptionEnumDropdown() + public SettingsEnumDropdown() { if (!typeof(T).IsEnum) - throw new InvalidOperationException("OptionsDropdown only supports enums as the generic type argument"); + throw new InvalidOperationException("SettingsDropdown only supports enums as the generic type argument"); List> items = new List>(); foreach(var val in (T[])Enum.GetValues(typeof(T))) diff --git a/osu.Game/Overlays/Options/OptionsFooter.cs b/osu.Game/Overlays/Settings/SettingsFooter.cs similarity index 91% rename from osu.Game/Overlays/Options/OptionsFooter.cs rename to osu.Game/Overlays/Settings/SettingsFooter.cs index c785f2d0c0..be08e61c1a 100644 --- a/osu.Game/Overlays/Options/OptionsFooter.cs +++ b/osu.Game/Overlays/Settings/SettingsFooter.cs @@ -5,16 +5,15 @@ using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Database; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using OpenTK; using OpenTK.Graphics; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionsFooter : FillFlowContainer + public class SettingsFooter : FillFlowContainer { [BackgroundDependencyLoader] private void load(OsuGameBase game, OsuColour colours, RulesetDatabase rulesets) diff --git a/osu.Game/Overlays/Settings/SettingsHeader.cs b/osu.Game/Overlays/Settings/SettingsHeader.cs new file mode 100644 index 0000000000..56018dc7d9 --- /dev/null +++ b/osu.Game/Overlays/Settings/SettingsHeader.cs @@ -0,0 +1,107 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System; +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Game.Graphics; +using osu.Game.Graphics.Sprites; +using osu.Game.Graphics.UserInterface; +using OpenTK.Graphics; + +namespace osu.Game.Overlays.Settings +{ + public class SettingsHeader : Container + { + public SearchTextBox SearchTextBox; + + private Box background; + + private readonly Func currentScrollOffset; + + public Action Exit; + + /// A reference to the current scroll position of the ScrollContainer we are contained within. + public SettingsHeader(Func currentScrollOffset) + { + this.currentScrollOffset = currentScrollOffset; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + RelativeSizeAxes = Axes.X; + AutoSizeAxes = Axes.Y; + + Children = new Drawable[] + { + background = new Box + { + Colour = Color4.Black, + RelativeSizeAxes = Axes.Both, + }, + new FillFlowContainer + { + AutoSizeAxes = Axes.Y, + RelativeSizeAxes = Axes.X, + Direction = FillDirection.Vertical, + Children = new Drawable[] + { + new OsuSpriteText + { + Text = "settings", + TextSize = 40, + Margin = new MarginPadding { + Left = SettingsOverlay.CONTENT_MARGINS, + Top = Toolbar.Toolbar.TOOLTIP_HEIGHT + }, + }, + new OsuSpriteText + { + Colour = colours.Pink, + Text = "Change the way osu! behaves", + TextSize = 18, + Margin = new MarginPadding { + Left = SettingsOverlay.CONTENT_MARGINS, + Bottom = 30 + }, + }, + SearchTextBox = new SearchTextBox + { + RelativeSizeAxes = Axes.X, + Origin = Anchor.TopCentre, + Anchor = Anchor.TopCentre, + Width = 0.95f, + Margin = new MarginPadding { + Top = 20, + Bottom = 20 + }, + Exit = () => Exit(), + }, + } + } + }; + } + + protected override void UpdateAfterChildren() + { + base.UpdateAfterChildren(); + + // the point at which we will start anchoring to the top. + float anchorOffset = SearchTextBox.Y; + + float scrollPosition = currentScrollOffset(); + + // we want to anchor the search field to the top of the screen when scrolling. + Margin = new MarginPadding { Top = Math.Max(0, scrollPosition - anchorOffset) }; + + // we don't want the header to scroll when scrolling beyond the upper extent. + Y = Math.Min(0, scrollPosition); + + // we get darker as scroll progresses + background.Alpha = Math.Min(1, scrollPosition / anchorOffset) * 0.5f; + } + } +} \ No newline at end of file diff --git a/osu.Game/Overlays/Options/OptionItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs similarity index 87% rename from osu.Game/Overlays/Options/OptionItem.cs rename to osu.Game/Overlays/Settings/SettingsItem.cs index 2124796089..e592ca9e37 100644 --- a/osu.Game/Overlays/Options/OptionItem.cs +++ b/osu.Game/Overlays/Settings/SettingsItem.cs @@ -5,14 +5,13 @@ using OpenTK.Graphics; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.Sprites; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public abstract class OptionItem : FillFlowContainer, IFilterable + public abstract class SettingsItem : FillFlowContainer, IFilterable { protected abstract Drawable CreateControl(); @@ -37,7 +36,7 @@ namespace osu.Game.Overlays.Options } } - // hold a reference to the provided bindable so we don't have to in every options section. + // hold a reference to the provided bindable so we don't have to in every settings section. private Bindable bindable; public Bindable Bindable @@ -65,7 +64,7 @@ namespace osu.Game.Overlays.Options } } - protected OptionItem() + protected SettingsItem() { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; diff --git a/osu.Game/Overlays/Options/OptionLabel.cs b/osu.Game/Overlays/Settings/SettingsLabel.cs similarity index 80% rename from osu.Game/Overlays/Options/OptionLabel.cs rename to osu.Game/Overlays/Settings/SettingsLabel.cs index 3f3c569f3a..7d1364ef41 100644 --- a/osu.Game/Overlays/Options/OptionLabel.cs +++ b/osu.Game/Overlays/Settings/SettingsLabel.cs @@ -5,9 +5,9 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Game.Graphics; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - internal class OptionLabel : OptionItem + internal class SettingsLabel : SettingsItem { protected override Drawable CreateControl() => null; diff --git a/osu.Game/Overlays/Options/OptionsSection.cs b/osu.Game/Overlays/Settings/SettingsSection.cs similarity index 77% rename from osu.Game/Overlays/Options/OptionsSection.cs rename to osu.Game/Overlays/Settings/SettingsSection.cs index d5dafad9ba..8b95c72412 100644 --- a/osu.Game/Overlays/Options/OptionsSection.cs +++ b/osu.Game/Overlays/Settings/SettingsSection.cs @@ -6,14 +6,15 @@ using OpenTK.Graphics; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; +using System.Collections.Generic; +using System.Linq; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public abstract class OptionsSection : Container + public abstract class SettingsSection : Container, IHasFilterableChildren { protected FillFlowContainer FlowContent; protected override Container Content => FlowContent; @@ -21,9 +22,19 @@ namespace osu.Game.Overlays.Options public abstract FontAwesome Icon { get; } public abstract string Header { get; } + public IEnumerable FilterableChildren => Children.OfType(); + public string[] FilterTerms => new[] { Header }; + public bool MatchingCurrentFilter + { + set + { + FadeTo(value ? 1 : 0); + } + } + private readonly SpriteText headerLabel; - protected OptionsSection() + protected SettingsSection() { Margin = new MarginPadding { Top = 20 }; AutoSizeAxes = Axes.Y; @@ -45,8 +56,8 @@ namespace osu.Game.Overlays.Options Padding = new MarginPadding { Top = 20 + border_size, - Left = OptionsOverlay.CONTENT_MARGINS, - Right = OptionsOverlay.CONTENT_MARGINS, + Left = SettingsOverlay.CONTENT_MARGINS, + Right = SettingsOverlay.CONTENT_MARGINS, Bottom = 10, }, RelativeSizeAxes = Axes.X, diff --git a/osu.Game/Overlays/Options/OptionSlider.cs b/osu.Game/Overlays/Settings/SettingsSlider.cs similarity index 71% rename from osu.Game/Overlays/Options/OptionSlider.cs rename to osu.Game/Overlays/Settings/SettingsSlider.cs index 2cceb085a7..beb2bdf645 100644 --- a/osu.Game/Overlays/Options/OptionSlider.cs +++ b/osu.Game/Overlays/Settings/SettingsSlider.cs @@ -2,18 +2,17 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionSlider : OptionSlider> + public class SettingsSlider : SettingsSlider> where T : struct { } - public class OptionSlider : OptionItem + public class SettingsSlider : SettingsItem where T : struct where U : SliderBar, new() { diff --git a/osu.Game/Overlays/Options/OptionsSubsection.cs b/osu.Game/Overlays/Settings/SettingsSubsection.cs similarity index 67% rename from osu.Game/Overlays/Options/OptionsSubsection.cs rename to osu.Game/Overlays/Settings/SettingsSubsection.cs index 9fd2e8fb1e..30abbc3805 100644 --- a/osu.Game/Overlays/Options/OptionsSubsection.cs +++ b/osu.Game/Overlays/Settings/SettingsSubsection.cs @@ -4,12 +4,13 @@ using OpenTK; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Graphics.Sprites; +using System.Collections.Generic; +using System.Linq; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public abstract class OptionsSubsection : FillFlowContainer + public abstract class SettingsSubsection : FillFlowContainer, IHasFilterableChildren { protected override Container Content => content; @@ -17,7 +18,17 @@ namespace osu.Game.Overlays.Options protected abstract string Header { get; } - protected OptionsSubsection() + public IEnumerable FilterableChildren => Children.OfType(); + public string[] FilterTerms => new[] { Header }; + public bool MatchingCurrentFilter + { + set + { + FadeTo(value ? 1 : 0); + } + } + + protected SettingsSubsection() { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; diff --git a/osu.Game/Overlays/Options/OptionTextBox.cs b/osu.Game/Overlays/Settings/SettingsTextBox.cs similarity index 74% rename from osu.Game/Overlays/Options/OptionTextBox.cs rename to osu.Game/Overlays/Settings/SettingsTextBox.cs index 498f27796a..710330ad41 100644 --- a/osu.Game/Overlays/Options/OptionTextBox.cs +++ b/osu.Game/Overlays/Settings/SettingsTextBox.cs @@ -4,9 +4,9 @@ using osu.Framework.Graphics; using osu.Game.Graphics.UserInterface; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { - public class OptionTextBox : OptionItem + public class SettingsTextBox : SettingsItem { protected override Drawable CreateControl() => new OsuTextBox(); } diff --git a/osu.Game/Overlays/Options/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs similarity index 95% rename from osu.Game/Overlays/Options/Sidebar.cs rename to osu.Game/Overlays/Settings/Sidebar.cs index eb489810ad..be93fdbac5 100644 --- a/osu.Game/Overlays/Options/Sidebar.cs +++ b/osu.Game/Overlays/Settings/Sidebar.cs @@ -10,7 +10,7 @@ using osu.Framework.Input; using osu.Framework.Threading; using osu.Game.Overlays.Toolbar; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { public class Sidebar : Container { diff --git a/osu.Game/Overlays/Options/SidebarButton.cs b/osu.Game/Overlays/Settings/SidebarButton.cs similarity index 93% rename from osu.Game/Overlays/Options/SidebarButton.cs rename to osu.Game/Overlays/Settings/SidebarButton.cs index 7c0049e8c7..766c6cf7e2 100644 --- a/osu.Game/Overlays/Options/SidebarButton.cs +++ b/osu.Game/Overlays/Settings/SidebarButton.cs @@ -12,7 +12,7 @@ using osu.Framework.Input; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; -namespace osu.Game.Overlays.Options +namespace osu.Game.Overlays.Settings { public class SidebarButton : Container { @@ -23,8 +23,8 @@ namespace osu.Game.Overlays.Options private readonly Container text; public Action Action; - private OptionsSection section; - public OptionsSection Section + private SettingsSection section; + public SettingsSection Section { get { diff --git a/osu.Game/Overlays/OptionsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs similarity index 67% rename from osu.Game/Overlays/OptionsOverlay.cs rename to osu.Game/Overlays/SettingsOverlay.cs index dcbce80c69..71ad18e081 100644 --- a/osu.Game/Overlays/OptionsOverlay.cs +++ b/osu.Game/Overlays/SettingsOverlay.cs @@ -6,17 +6,15 @@ using OpenTK.Graphics; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; -using osu.Game.Overlays.Options; +using osu.Game.Overlays.Settings; using System; -using osu.Game.Graphics; -using osu.Game.Graphics.Sprites; -using osu.Game.Overlays.Options.Sections; +using osu.Game.Overlays.Settings.Sections; +using osu.Framework.Input; namespace osu.Game.Overlays { - public class OptionsOverlay : FocusedOverlayContainer + public class SettingsOverlay : FocusedOverlayContainer { internal const float CONTENT_MARGINS = 10; @@ -31,19 +29,26 @@ namespace osu.Game.Overlays private ScrollContainer scrollContainer; private Sidebar sidebar; private SidebarButton[] sidebarButtons; - private OptionsSection[] sections; + private SettingsSection[] sections; + + private SettingsHeader header; + + private SettingsFooter footer; + + private SearchContainer searchContainer; + private float lastKnownScroll; - public OptionsOverlay() + public SettingsOverlay() { RelativeSizeAxes = Axes.Y; AutoSizeAxes = Axes.X; } [BackgroundDependencyLoader(permitNulls: true)] - private void load(OsuGame game, OsuColour colours) + private void load(OsuGame game) { - sections = new OptionsSection[] + sections = new SettingsSection[] { new GeneralSection(), new GraphicsSection(), @@ -69,39 +74,20 @@ namespace osu.Game.Overlays RelativeSizeAxes = Axes.Y, Width = width, Margin = new MarginPadding { Left = SIDEBAR_WIDTH }, - Children = new[] + Children = new Drawable[] { - new FillFlowContainer + searchContainer = new SearchContainer { AutoSizeAxes = Axes.Y, RelativeSizeAxes = Axes.X, Direction = FillDirection.Vertical, - - Children = new Drawable[] - { - new OsuSpriteText - { - Text = "settings", - TextSize = 40, - Margin = new MarginPadding { Left = CONTENT_MARGINS, Top = Toolbar.Toolbar.TOOLTIP_HEIGHT }, - }, - new OsuSpriteText - { - Colour = colours.Pink, - Text = "Change the way osu! behaves", - TextSize = 18, - Margin = new MarginPadding { Left = CONTENT_MARGINS, Bottom = 30 }, - }, - new FillFlowContainer - { - AutoSizeAxes = Axes.Y, - RelativeSizeAxes = Axes.X, - Direction = FillDirection.Vertical, - Children = sections, - }, - new OptionsFooter() - } - } + Children = sections, + }, + footer = new SettingsFooter(), + header = new SettingsHeader(() => scrollContainer.Current) + { + Exit = Hide, + }, } }, sidebar = new Sidebar @@ -118,9 +104,20 @@ namespace osu.Game.Overlays } }; + header.SearchTextBox.Current.ValueChanged += newValue => searchContainer.SearchTerm = newValue; + scrollContainer.Padding = new MarginPadding { Top = game?.Toolbar.DrawHeight ?? 0 }; } + protected override void UpdateAfterChildren() + { + base.UpdateAfterChildren(); + + //we need to update these manually because we can't put the SettingsHeader inside the SearchContainer (due to its anchoring). + searchContainer.Y = header.DrawHeight; + footer.Y = searchContainer.Y + searchContainer.DrawHeight; + } + protected override void Update() { base.Update(); @@ -130,10 +127,10 @@ namespace osu.Game.Overlays { lastKnownScroll = currentScroll; - OptionsSection bestCandidate = null; + SettingsSection bestCandidate = null; float bestDistance = float.MaxValue; - foreach (OptionsSection section in sections) + foreach (SettingsSection section in sections) { float distance = Math.Abs(scrollContainer.GetChildPosInContent(section) - currentScroll); if (distance < bestDistance) @@ -157,6 +154,8 @@ namespace osu.Game.Overlays scrollContainer.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint); sidebar.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint); FadeTo(1, TRANSITION_LENGTH / 2); + + header.SearchTextBox.HoldFocus = true; } protected override void PopOut() @@ -166,6 +165,15 @@ namespace osu.Game.Overlays scrollContainer.MoveToX(-width, TRANSITION_LENGTH, EasingTypes.OutQuint); sidebar.MoveToX(-SIDEBAR_WIDTH, TRANSITION_LENGTH, EasingTypes.OutQuint); FadeTo(0, TRANSITION_LENGTH / 2); + + header.SearchTextBox.HoldFocus = false; + header.SearchTextBox.TriggerFocusLost(); + } + + protected override bool OnFocus(InputState state) + { + header.SearchTextBox.TriggerFocus(state); + return false; } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 6be63b1fe8..5ae88d9049 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -8,7 +8,6 @@ using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Game.Graphics; diff --git a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs index 209b64e709..8e610545f5 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs @@ -6,7 +6,6 @@ using osu.Framework.Allocation; using osu.Framework.Caching; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Database; using OpenTK; diff --git a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs index ae54b98aca..2eb8c15dcf 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs @@ -16,9 +16,9 @@ namespace osu.Game.Overlays.Toolbar } [BackgroundDependencyLoader] - private void load(OptionsOverlay options) + private void load(SettingsOverlay settings) { - StateContainer = options; + StateContainer = settings; } } } \ No newline at end of file diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs index b0d12cb5a1..72db445052 100644 --- a/osu.Game/Screens/Menu/ButtonSystem.cs +++ b/osu.Game/Screens/Menu/ButtonSystem.cs @@ -82,7 +82,7 @@ namespace osu.Game.Screens.Menu AutoSizeAxes = Axes.Both, Children = new[] { - settingsButton = new Button(@"settings", @"options", FontAwesome.fa_gear, new Color4(85, 85, 85, 255), () => OnSettings?.Invoke(), -WEDGE_WIDTH, Key.O), + settingsButton = new Button(@"settings", @"settings", FontAwesome.fa_gear, new Color4(85, 85, 85, 255), () => OnSettings?.Invoke(), -WEDGE_WIDTH, Key.O), backButton = new Button(@"back", @"back", FontAwesome.fa_osu_left_o, new Color4(51, 58, 94, 255), onBack, -WEDGE_WIDTH), iconFacade = new Container //need a container to make the osu! icon flow properly. { @@ -245,8 +245,14 @@ namespace osu.Game.Screens.Menu buttonArea.FadeIn(300); if (lastState == MenuState.Initial) + { buttonArea.Delay(150, true); + if (osuLogo.Scale.X > 0.5f) + using (osuLogo.BeginDelayedSequence(200, true)) + osuLogo.Impact(); + } + Scheduler.AddDelayed(() => toolbar?.Show(), 150); foreach (Button b in buttonsTopLevel) diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs index 4640067017..beaaa373b6 100644 --- a/osu.Game/Screens/Menu/Disclaimer.cs +++ b/osu.Game/Screens/Menu/Disclaimer.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Screens; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs index 92032e5120..01659edd72 100644 --- a/osu.Game/Screens/Menu/Intro.cs +++ b/osu.Game/Screens/Menu/Intro.cs @@ -64,8 +64,8 @@ namespace osu.Game.Screens.Menu [BackgroundDependencyLoader] private void load(AudioManager audio, OsuConfigManager config) { - menuVoice = config.GetBindable(OsuConfig.MenuVoice); - menuMusic = config.GetBindable(OsuConfig.MenuMusic); + menuVoice = config.GetBindable(OsuSetting.MenuVoice); + menuMusic = config.GetBindable(OsuSetting.MenuMusic); bgm = audio.Track.Get(@"circles"); bgm.Looping = true; diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs index c8a00e0671..71d020b0f2 100644 --- a/osu.Game/Screens/Menu/MainMenu.cs +++ b/osu.Game/Screens/Menu/MainMenu.cs @@ -66,7 +66,7 @@ namespace osu.Game.Screens.Menu [BackgroundDependencyLoader] private void load(OsuGame game, OsuConfigManager config, BeatmapDatabase beatmaps) { - menuMusic = config.GetBindable(OsuConfig.MenuMusic); + menuMusic = config.GetBindable(OsuSetting.MenuMusic); LoadComponentAsync(background); if (!menuMusic) @@ -84,7 +84,7 @@ namespace osu.Game.Screens.Menu } } - buttons.OnSettings = game.ToggleOptions; + buttons.OnSettings = game.ToggleSettings; preloadSongSelect(); } diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index f3fffedd43..e28adeacff 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -35,7 +35,7 @@ namespace osu.Game.Screens.Menu public Action Action; - public float SizeForFlow => logo == null ? 0 : logo.DrawSize.X * logo.Scale.X * logoBounceContainer.Scale.X * logoHoverContainer.Scale.X * 0.78f; + public float SizeForFlow => logo == null ? 0 : logo.DrawSize.X * logo.Scale.X * logoBounceContainer.Scale.X * logoHoverContainer.Scale.X * 0.74f; private readonly Sprite ripple; @@ -63,8 +63,14 @@ namespace osu.Game.Screens.Menu public bool Interactive = true; private readonly Box flashLayer; + private readonly Container impactContainer; + + private const float default_size = 480; + public OsuLogo() { + Size = new Vector2(default_size); + Anchor = Anchor.Centre; Origin = Anchor.Centre; @@ -92,7 +98,7 @@ namespace osu.Game.Screens.Menu Anchor = Anchor.Centre, Origin = Anchor.Centre, RelativeSizeAxes = Axes.Both, - Scale = new Vector2(0.8f), + Scale = new Vector2(0.88f), Masking = true, Children = new Drawable[] { @@ -137,6 +143,7 @@ namespace osu.Game.Screens.Menu { Anchor = Anchor.Centre, Origin = Anchor.Centre, + RelativeSizeAxes = Axes.Both, Children = new Drawable[] { ripple = new Sprite @@ -148,11 +155,30 @@ namespace osu.Game.Screens.Menu } } }, + impactContainer = new CircularContainer + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Alpha = 0, + BorderColour = Color4.White, + RelativeSizeAxes = Axes.Both, + BorderThickness = 10, + Masking = true, + Children = new Drawable[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + AlwaysPresent = true, + Alpha = 0, + } + } + }, new MenuVisualisation { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Size = logo.Size, + RelativeSizeAxes = Axes.Both, BlendingMode = BlendingMode.Additive, Alpha = 0.2f, } @@ -211,7 +237,8 @@ namespace osu.Game.Screens.Menu protected override bool OnHover(InputState state) { if (!Interactive) return false; - logoHoverContainer.ScaleTo(1.2f, 500, EasingTypes.OutElastic); + + logoHoverContainer.ScaleTo(1.1f, 500, EasingTypes.OutElastic); return true; } @@ -219,5 +246,12 @@ namespace osu.Game.Screens.Menu { logoHoverContainer.ScaleTo(1, 500, EasingTypes.OutElastic); } + + public void Impact() + { + impactContainer.FadeOutFromOne(250, EasingTypes.In); + impactContainer.ScaleTo(0.96f); + impactContainer.ScaleTo(1.12f, 250); + } } } \ No newline at end of file diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index 0b3ecb4f5a..16bdd6132f 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -7,6 +7,7 @@ using osu.Framework.Screens; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Graphics.Containers; +using OpenTK; namespace osu.Game.Screens { @@ -96,6 +97,9 @@ namespace osu.Game.Screens } else if (bg != null) { + // this makes up for the fact our padding changes when the global toolbar is visible. + bg.Scale = new Vector2(1.06f); + AddInternal(new ParallaxContainer { Depth = float.MaxValue, diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs index a130bc2eab..46c7084cec 100644 --- a/osu.Game/Screens/Play/HUD/ComboCounter.cs +++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs @@ -4,7 +4,6 @@ using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Transforms; using osu.Framework.MathUtils; diff --git a/osu.Game/Screens/Play/HUD/ModDisplay.cs b/osu.Game/Screens/Play/HUD/ModDisplay.cs index 1b67d8dc66..92c40f6351 100644 --- a/osu.Game/Screens/Play/HUD/ModDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ModDisplay.cs @@ -6,7 +6,6 @@ using System.Linq; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.Sprites; using osu.Game.Rulesets.Mods; diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs index 12e2cb197e..1e57c2ba2a 100644 --- a/osu.Game/Screens/Play/HUDOverlay.cs +++ b/osu.Game/Screens/Play/HUDOverlay.cs @@ -67,7 +67,7 @@ namespace osu.Game.Screens.Play [BackgroundDependencyLoader(true)] private void load(OsuConfigManager config, NotificationManager notificationManager) { - showKeyCounter = config.GetBindable(OsuConfig.KeyOverlay); + showKeyCounter = config.GetBindable(OsuSetting.KeyOverlay); showKeyCounter.ValueChanged += keyCounterVisibility => { if (keyCounterVisibility) @@ -77,7 +77,7 @@ namespace osu.Game.Screens.Play }; showKeyCounter.TriggerChange(); - showHud = config.GetBindable(OsuConfig.ShowInterface); + showHud = config.GetBindable(OsuSetting.ShowInterface); showHud.ValueChanged += hudVisibility => { if (hudVisibility) diff --git a/osu.Game/Screens/Play/Pause/PauseProgressBar.cs b/osu.Game/Screens/Play/Pause/PauseProgressBar.cs index fa380540a3..bfde7dd6d7 100644 --- a/osu.Game/Screens/Play/Pause/PauseProgressBar.cs +++ b/osu.Game/Screens/Play/Pause/PauseProgressBar.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Beatmaps; using OpenTK.Graphics; diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 7b910c11e5..de390b63b3 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -79,8 +79,8 @@ namespace osu.Game.Screens.Play [BackgroundDependencyLoader(permitNulls: true)] private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config, OsuGame osu) { - dimLevel = config.GetBindable(OsuConfig.DimLevel); - mouseWheelDisabled = config.GetBindable(OsuConfig.MouseDisableWheel); + dimLevel = config.GetBindable(OsuSetting.DimLevel); + mouseWheelDisabled = config.GetBindable(OsuSetting.MouseDisableWheel); Ruleset rulesetInstance; @@ -138,7 +138,7 @@ namespace osu.Game.Screens.Play offsetClock = new FramedOffsetClock(decoupledClock); - userAudioOffset = config.GetBindable(OsuConfig.AudioOffset); + userAudioOffset = config.GetBindable(OsuSetting.AudioOffset); userAudioOffset.ValueChanged += v => offsetClock.Offset = v; userAudioOffset.TriggerChange(); diff --git a/osu.Game/Screens/Play/PlayerInputManager.cs b/osu.Game/Screens/Play/PlayerInputManager.cs index 9707ccbc35..f5e57f9e9d 100644 --- a/osu.Game/Screens/Play/PlayerInputManager.cs +++ b/osu.Game/Screens/Play/PlayerInputManager.cs @@ -40,7 +40,7 @@ namespace osu.Game.Screens.Play [BackgroundDependencyLoader] private void load(OsuConfigManager config) { - mouseDisabled = config.GetBindable(OsuConfig.MouseDisableButtons); + mouseDisabled = config.GetBindable(OsuSetting.MouseDisableButtons); } protected override void LoadComplete() diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 9afa1018c6..726397a3b1 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Screens; using osu.Game.Beatmaps; diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs index ed57dad644..887442b8c0 100644 --- a/osu.Game/Screens/Play/SongProgress.cs +++ b/osu.Game/Screens/Play/SongProgress.cs @@ -12,7 +12,6 @@ using System.Linq; using osu.Framework.Timing; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; -using osu.Framework.Graphics.Primitives; namespace osu.Game.Screens.Play { @@ -28,10 +27,12 @@ namespace osu.Game.Screens.Play private readonly SongProgressBar bar; private readonly SongProgressGraph graph; + private readonly SongProgressInfo info; public Action OnSeek; - public IClock AudioClock; + private IClock audioClock; + public IClock AudioClock { set { audioClock = info.AudioClock = value; } } private double lastHitTime => ((objects.Last() as IHasEndTime)?.EndTime ?? objects.Last().StartTime) + 1; @@ -44,6 +45,9 @@ namespace osu.Game.Screens.Play set { graph.Objects = objects = value; + + info.StartTime = firstHitTime; + info.EndTime = lastHitTime; } } @@ -62,6 +66,14 @@ namespace osu.Game.Screens.Play Children = new Drawable[] { + info = new SongProgressInfo + { + Origin = Anchor.BottomLeft, + Anchor = Anchor.BottomLeft, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Margin = new MarginPadding { Bottom = bottom_bar_height + graph_height }, + }, graph = new SongProgressGraph { RelativeSizeAxes = Axes.X, @@ -130,10 +142,13 @@ namespace osu.Game.Screens.Play if (objects == null) return; - double progress = ((AudioClock?.CurrentTime ?? Time.Current) - firstHitTime) / lastHitTime; + double progress = ((audioClock?.CurrentTime ?? Time.Current) - firstHitTime) / (lastHitTime - firstHitTime); - bar.UpdatePosition((float)progress); - graph.Progress = (int)(graph.ColumnCount * progress); + if(progress < 1) + { + bar.UpdatePosition((float)progress); + graph.Progress = (int)(graph.ColumnCount * progress); + } } } } diff --git a/osu.Game/Screens/Play/SongProgressGraph.cs b/osu.Game/Screens/Play/SongProgressGraph.cs index 20548970e5..4e56f60c31 100644 --- a/osu.Game/Screens/Play/SongProgressGraph.cs +++ b/osu.Game/Screens/Play/SongProgressGraph.cs @@ -20,12 +20,13 @@ namespace osu.Game.Screens.Play const int granularity = 200; + var firstHit = objects.First().StartTime; var lastHit = (objects.Last() as IHasEndTime)?.EndTime ?? 0; if (lastHit == 0) lastHit = objects.Last().StartTime; - var interval = (lastHit + 1) / granularity; + var interval = (lastHit - firstHit + 1) / granularity; var values = new int[granularity]; @@ -33,8 +34,8 @@ namespace osu.Game.Screens.Play { IHasEndTime end = h as IHasEndTime; - int startRange = (int)(h.StartTime / interval); - int endRange = (int)((end?.EndTime > 0 ? end.EndTime : h.StartTime) / interval); + int startRange = (int)((h.StartTime - firstHit)/ interval); + int endRange = (int)(((end?.EndTime > 0 ? end.EndTime : h.StartTime) - firstHit) / interval); for (int i = startRange; i <= endRange; i++) values[i]++; } diff --git a/osu.Game/Screens/Play/SongProgressInfo.cs b/osu.Game/Screens/Play/SongProgressInfo.cs new file mode 100644 index 0000000000..06d7176cc5 --- /dev/null +++ b/osu.Game/Screens/Play/SongProgressInfo.cs @@ -0,0 +1,95 @@ +// Copyright (c) 2007-2017 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.Containers; +using osu.Framework.Timing; +using osu.Game.Graphics; +using osu.Game.Graphics.Sprites; +using System; + +namespace osu.Game.Screens.Play +{ + public class SongProgressInfo : Container + { + private OsuSpriteText timeCurrent; + private OsuSpriteText timeLeft; + private OsuSpriteText progress; + + private double startTime; + private double endTime; + + private int? previousPercent; + private int? previousSecond; + + private double songLength => endTime - startTime; + + private const int margin = 10; + + public IClock AudioClock; + + public double StartTime { set { startTime = value; } } + public double EndTime { set { endTime = value; } } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + Children = new Drawable[] + { + timeCurrent = new OsuSpriteText + { + Origin = Anchor.BottomLeft, + Anchor = Anchor.BottomLeft, + Colour = colours.BlueLighter, + Font = @"Venera", + Margin = new MarginPadding + { + Left = margin, + }, + }, + progress = new OsuSpriteText + { + Origin = Anchor.BottomCentre, + Anchor = Anchor.BottomCentre, + Colour = colours.BlueLighter, + Font = @"Venera", + }, + timeLeft = new OsuSpriteText + { + Origin = Anchor.BottomRight, + Anchor = Anchor.BottomRight, + Colour = colours.BlueLighter, + Font = @"Venera", + Margin = new MarginPadding + { + Right = margin, + }, + } + }; + } + + protected override void Update() + { + base.Update(); + + double songCurrentTime = AudioClock.CurrentTime - startTime; + int currentPercent = Math.Max(0, Math.Min(100, (int)(songCurrentTime / songLength * 100))); + int currentSecond = (int)Math.Floor(songCurrentTime / 1000.0); + + if (currentPercent != previousPercent) + { + progress.Text = currentPercent.ToString() + @"%"; + previousPercent = currentPercent; + } + + if (currentSecond != previousSecond && songCurrentTime < songLength) + { + timeCurrent.Text = TimeSpan.FromSeconds(currentSecond).ToString(songCurrentTime < 0 ? @"\-m\:ss" : @"m\:ss"); + timeLeft.Text = TimeSpan.FromMilliseconds(endTime - AudioClock.CurrentTime).ToString(@"\-m\:ss"); + + previousSecond = currentSecond; + } + } + } +} diff --git a/osu.Game/Screens/Play/StandardHUDOverlay.cs b/osu.Game/Screens/Play/StandardHUDOverlay.cs index 41f9ee1394..87fbea6810 100644 --- a/osu.Game/Screens/Play/StandardHUDOverlay.cs +++ b/osu.Game/Screens/Play/StandardHUDOverlay.cs @@ -3,7 +3,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Game.Graphics; using osu.Game.Graphics.UserInterface; using osu.Game.Rulesets.Scoring; diff --git a/osu.Game/Screens/Ranking/ResultModeTabControl.cs b/osu.Game/Screens/Ranking/ResultModeTabControl.cs index 346bff5720..06a6d31e37 100644 --- a/osu.Game/Screens/Ranking/ResultModeTabControl.cs +++ b/osu.Game/Screens/Ranking/ResultModeTabControl.cs @@ -2,7 +2,6 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using OpenTK; diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs index 5bcaba7813..f3dae710b2 100644 --- a/osu.Game/Screens/Ranking/Results.cs +++ b/osu.Game/Screens/Ranking/Results.cs @@ -7,7 +7,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Rulesets.Scoring; using osu.Framework.Graphics.Sprites; using osu.Framework.Screens; diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 4bfd998c54..fad914e9d4 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -11,7 +11,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Framework.Localisation; diff --git a/osu.Game/Screens/Select/BeatmapDetailArea.cs b/osu.Game/Screens/Select/BeatmapDetailArea.cs index cc22cca8bf..d116e5b159 100644 --- a/osu.Game/Screens/Select/BeatmapDetailArea.cs +++ b/osu.Game/Screens/Select/BeatmapDetailArea.cs @@ -3,7 +3,6 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Game.Beatmaps; using osu.Game.Screens.Select.Leaderboards; diff --git a/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs b/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs index 51ec6f7707..e3c95d42a1 100644 --- a/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs +++ b/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs @@ -35,7 +35,7 @@ namespace osu.Game.Screens.Select { modsCheckbox.AccentColour = tabs.AccentColour = colour.YellowLight; - selectedTab = config.GetBindable(OsuConfig.BeatmapDetailTab); + selectedTab = config.GetBindable(OsuSetting.BeatmapDetailTab); tabs.Current.BindTo(selectedTab); tabs.Current.TriggerChange(); diff --git a/osu.Game/Screens/Select/BeatmapDetails.cs b/osu.Game/Screens/Select/BeatmapDetails.cs index 63fdfe3717..aaa267a299 100644 --- a/osu.Game/Screens/Select/BeatmapDetails.cs +++ b/osu.Game/Screens/Select/BeatmapDetails.cs @@ -6,7 +6,6 @@ using OpenTK.Graphics; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Database; using osu.Game.Graphics; diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs index 44f2aeb0da..2f5b35f92a 100644 --- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs +++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs @@ -11,7 +11,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.MathUtils; using osu.Game.Beatmaps; @@ -124,7 +123,7 @@ namespace osu.Game.Screens.Select Content = getBPMRange(beatmap.Beatmap), })); - //get statistics fromt he current ruleset. + //get statistics from the current ruleset. labels.AddRange(beatmapInfo.Ruleset.CreateInstance().GetBeatmapStatistics(beatmap).Select(s => new InfoLabel(s))); } diff --git a/osu.Game/Screens/Select/FilterControl.cs b/osu.Game/Screens/Select/FilterControl.cs index e0b197e9ca..7c7863acd1 100644 --- a/osu.Game/Screens/Select/FilterControl.cs +++ b/osu.Game/Screens/Select/FilterControl.cs @@ -8,7 +8,6 @@ using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics; diff --git a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs index 02a412685c..a136e298b5 100644 --- a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs +++ b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs @@ -8,7 +8,6 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using System; using osu.Framework.Allocation; using osu.Framework.Threading; diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs index 8df95f6913..c5fa0a5011 100644 --- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs +++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs @@ -5,7 +5,6 @@ using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs index 965ea12fe2..182f778dd4 100644 --- a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs +++ b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs @@ -1,17 +1,16 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Input; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Input; namespace osu.Game.Screens.Select.Options { diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs index 77001950f6..c064a0272e 100644 --- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs +++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs @@ -4,14 +4,14 @@ using System; using System.Collections.Generic; using System.Linq; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Input; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Input; namespace osu.Game.Screens.Select.Options { diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 315992c113..8f91f1ed0f 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -5,7 +5,6 @@ using OpenTK.Input; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Screens; using osu.Game.Beatmaps; using osu.Game.Graphics; diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 51b67bdbef..4438b656b0 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -11,7 +11,6 @@ using osu.Framework.Audio.Track; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Input; using osu.Framework.Screens; using osu.Framework.Threading; diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs index eada42a53e..05bf3a250f 100644 --- a/osu.Game/Screens/Tournament/Drawings.cs +++ b/osu.Game/Screens/Tournament/Drawings.cs @@ -9,7 +9,6 @@ using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Framework.Logging; diff --git a/osu.Game/Screens/Tournament/Group.cs b/osu.Game/Screens/Tournament/Group.cs index f5695ae1cb..90ee90901f 100644 --- a/osu.Game/Screens/Tournament/Group.cs +++ b/osu.Game/Screens/Tournament/Group.cs @@ -7,7 +7,6 @@ using System.Text; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Game.Graphics.Sprites; diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index fd15115fe2..919b2bb732 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -75,10 +75,13 @@ + + - + + @@ -205,13 +208,13 @@ - - + + - - - - + + + + @@ -227,6 +230,7 @@ + @@ -275,6 +279,8 @@ + + @@ -304,13 +310,13 @@ - - + + - + @@ -343,46 +349,46 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - + @@ -407,8 +413,6 @@ - - diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings index 03d9e34805..70bfacd6ef 100644 --- a/osu.sln.DotSettings +++ b/osu.sln.DotSettings @@ -20,6 +20,8 @@ HINT WARNING HINT + SUGGESTION + HINT HINT WARNING WARNING