mirror of
https://github.com/ppy/osu.git
synced 2025-01-15 10:42:55 +08:00
Merge remote-tracking branch 'upstream/master' into judgement-revamp
This commit is contained in:
commit
5ce76d8023
@ -1 +1 @@
|
|||||||
Subproject commit 2bd341b29d6a7ed864aa9c1c5fad4668dafe03a4
|
Subproject commit e24d24ae70a78cea5a11635c37d2808d29233e96
|
@ -1 +1 @@
|
|||||||
Subproject commit f6042e1cb37cfad6c879d0e1245f7880c7fcd5f5
|
Subproject commit a4418111f8ed2350a6fd46fe69258884f0757745
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Desktop.Deploy</RootNamespace>
|
<RootNamespace>osu.Desktop.Deploy</RootNamespace>
|
||||||
<AssemblyName>osu.Desktop.Deploy</AssemblyName>
|
<AssemblyName>osu.Desktop.Deploy</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -1,17 +1,14 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using NUnit.Framework;
|
|
||||||
using osu.Framework.Desktop.Platform;
|
using osu.Framework.Desktop.Platform;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game;
|
using osu.Game;
|
||||||
|
|
||||||
namespace osu.Desktop.Tests.Visual
|
namespace osu.Desktop.Tests.Visual
|
||||||
{
|
{
|
||||||
[TestFixture]
|
|
||||||
public abstract class OsuTestCase : TestCase
|
public abstract class OsuTestCase : TestCase
|
||||||
{
|
{
|
||||||
[Test]
|
|
||||||
public override void RunTest()
|
public override void RunTest()
|
||||||
{
|
{
|
||||||
using (var host = new HeadlessGameHost(realtime: false))
|
using (var host = new HeadlessGameHost(realtime: false))
|
||||||
|
@ -12,50 +12,104 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
{
|
{
|
||||||
public override string Description => "BeatmapDetails tab of BeatmapDetailArea";
|
public override string Description => "BeatmapDetails tab of BeatmapDetailArea";
|
||||||
|
|
||||||
private readonly BeatmapDetails details;
|
|
||||||
|
|
||||||
public TestCaseBeatmapDetails()
|
public TestCaseBeatmapDetails()
|
||||||
{
|
{
|
||||||
|
BeatmapDetails details;
|
||||||
Add(details = new BeatmapDetails
|
Add(details = new BeatmapDetails
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Padding = new MarginPadding(150),
|
Padding = new MarginPadding(150),
|
||||||
Beatmap = new BeatmapInfo
|
});
|
||||||
|
|
||||||
|
AddStep("beatmap all metrics", () => details.Beatmap = new BeatmapInfo
|
||||||
|
{
|
||||||
|
Version = "All Metrics",
|
||||||
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Version = "VisualTest",
|
Source = "osu!lazer",
|
||||||
Metadata = new BeatmapMetadata
|
Tags = "this beatmap has all the metrics",
|
||||||
{
|
},
|
||||||
Source = "Some guy",
|
Difficulty = new BeatmapDifficulty
|
||||||
Tags = "beatmap metadata example with a very very long list of tags and not much creativity",
|
{
|
||||||
},
|
CircleSize = 7,
|
||||||
Difficulty = new BeatmapDifficulty
|
DrainRate = 1,
|
||||||
{
|
OverallDifficulty = 5.7f,
|
||||||
CircleSize = 7,
|
ApproachRate = 3.5f,
|
||||||
ApproachRate = 3.5f,
|
},
|
||||||
OverallDifficulty = 5.7f,
|
StarDifficulty = 5.3f,
|
||||||
DrainRate = 1,
|
Metrics = new BeatmapMetrics
|
||||||
},
|
{
|
||||||
StarDifficulty = 5.3f,
|
Ratings = Enumerable.Range(0, 10),
|
||||||
Metrics = new BeatmapMetrics
|
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
|
||||||
{
|
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
|
||||||
Ratings = Enumerable.Range(0, 10),
|
|
||||||
Fails = Enumerable.Range(lastRange, 100).Select(i => i % 12 - 6),
|
|
||||||
Retries = Enumerable.Range(lastRange - 3, 100).Select(i => i % 12 - 6),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
AddRepeatStep("fail values", newRetryAndFailValues, 10);
|
AddStep("beatmap ratings", () => details.Beatmap = new BeatmapInfo
|
||||||
}
|
{
|
||||||
|
Version = "Only Ratings",
|
||||||
|
Metadata = new BeatmapMetadata
|
||||||
|
{
|
||||||
|
Source = "osu!lazer",
|
||||||
|
Tags = "this beatmap has ratings metrics but not retries or fails",
|
||||||
|
},
|
||||||
|
Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
CircleSize = 6,
|
||||||
|
DrainRate = 9,
|
||||||
|
OverallDifficulty = 6,
|
||||||
|
ApproachRate = 6,
|
||||||
|
},
|
||||||
|
StarDifficulty = 4.8f,
|
||||||
|
Metrics = new BeatmapMetrics
|
||||||
|
{
|
||||||
|
Ratings = Enumerable.Range(0, 10),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
private int lastRange = 1;
|
AddStep("beatmap fails retries", () => details.Beatmap = new BeatmapInfo
|
||||||
|
{
|
||||||
|
Version = "Only Retries and Fails",
|
||||||
|
Metadata = new BeatmapMetadata
|
||||||
|
{
|
||||||
|
Source = "osu!lazer",
|
||||||
|
Tags = "this beatmap has retries and fails but no ratings",
|
||||||
|
},
|
||||||
|
Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
CircleSize = 3.7f,
|
||||||
|
DrainRate = 6,
|
||||||
|
OverallDifficulty = 6,
|
||||||
|
ApproachRate = 7,
|
||||||
|
},
|
||||||
|
StarDifficulty = 2.91f,
|
||||||
|
Metrics = new BeatmapMetrics
|
||||||
|
{
|
||||||
|
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
|
||||||
|
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
private void newRetryAndFailValues()
|
AddStep("beatmap no metrics", () => details.Beatmap = new BeatmapInfo
|
||||||
{
|
{
|
||||||
details.Beatmap.Metrics.Fails = Enumerable.Range(lastRange, 100).Select(i => i % 12 - 6);
|
Version = "No Metrics",
|
||||||
details.Beatmap.Metrics.Retries = Enumerable.Range(lastRange - 3, 100).Select(i => i % 12 - 6);
|
Metadata = new BeatmapMetadata
|
||||||
details.Beatmap = details.Beatmap;
|
{
|
||||||
lastRange += 100;
|
Source = "osu!lazer",
|
||||||
|
Tags = "this beatmap has no metrics",
|
||||||
|
},
|
||||||
|
Difficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
CircleSize = 5,
|
||||||
|
DrainRate = 5,
|
||||||
|
OverallDifficulty = 5.5f,
|
||||||
|
ApproachRate = 6.5f,
|
||||||
|
},
|
||||||
|
StarDifficulty = 1.97f,
|
||||||
|
Metrics = new BeatmapMetrics(),
|
||||||
|
});
|
||||||
|
|
||||||
|
AddStep("null beatmap", () => details.Beatmap = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,12 +41,14 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
{
|
{
|
||||||
new BeatmapSetInfo
|
new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
|
OnlineBeatmapSetID = 578332,
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Title = @"OrVid",
|
Title = @"OrVid",
|
||||||
Artist = @"An",
|
Artist = @"An",
|
||||||
Author = @"RLC",
|
Author = @"RLC",
|
||||||
Source = @"",
|
Source = @"",
|
||||||
|
Tags = @"acuticnotes an-fillnote revid tear tearvid encrpted encryption axi axivid quad her hervid recoll",
|
||||||
},
|
},
|
||||||
OnlineInfo = new BeatmapSetOnlineInfo
|
OnlineInfo = new BeatmapSetOnlineInfo
|
||||||
{
|
{
|
||||||
@ -71,12 +73,14 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
},
|
},
|
||||||
new BeatmapSetInfo
|
new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
|
OnlineBeatmapSetID = 599627,
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Title = @"tiny lamp",
|
Title = @"tiny lamp",
|
||||||
Artist = @"fhana",
|
Artist = @"fhana",
|
||||||
Author = @"Sotarks",
|
Author = @"Sotarks",
|
||||||
Source = @"ぎんぎつね",
|
Source = @"ぎんぎつね",
|
||||||
|
Tags = @"lantis junichi sato yuxuki waga kevin mitsunaga towana gingitsune opening op full ver version kalibe collab collaboration",
|
||||||
},
|
},
|
||||||
OnlineInfo = new BeatmapSetOnlineInfo
|
OnlineInfo = new BeatmapSetOnlineInfo
|
||||||
{
|
{
|
||||||
@ -101,12 +105,14 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
},
|
},
|
||||||
new BeatmapSetInfo
|
new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
|
OnlineBeatmapSetID = 513268,
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Title = @"At Gwanghwamun",
|
Title = @"At Gwanghwamun",
|
||||||
Artist = @"KYUHYUN",
|
Artist = @"KYUHYUN",
|
||||||
Author = @"Cerulean Veyron",
|
Author = @"Cerulean Veyron",
|
||||||
Source = @"",
|
Source = @"",
|
||||||
|
Tags = @"soul ballad kh super junior sj suju 슈퍼주니어 kt뮤직 sm엔터테인먼트 s.m.entertainment kt music 1st mini album ep",
|
||||||
},
|
},
|
||||||
OnlineInfo = new BeatmapSetOnlineInfo
|
OnlineInfo = new BeatmapSetOnlineInfo
|
||||||
{
|
{
|
||||||
@ -146,12 +152,14 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
},
|
},
|
||||||
new BeatmapSetInfo
|
new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
|
OnlineBeatmapSetID = 586841,
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Title = @"RHAPSODY OF BLUE SKY",
|
Title = @"RHAPSODY OF BLUE SKY",
|
||||||
Artist = @"fhana",
|
Artist = @"fhana",
|
||||||
Author = @"[Kamiya]",
|
Author = @"[Kamiya]",
|
||||||
Source = @"小林さんちのメイドラゴン",
|
Source = @"小林さんちのメイドラゴン",
|
||||||
|
Tags = @"kobayashi san chi no maidragon aozora no opening anime maid dragon oblivion karen dynamix imoutosan pata-mon gxytcgxytc",
|
||||||
},
|
},
|
||||||
OnlineInfo = new BeatmapSetOnlineInfo
|
OnlineInfo = new BeatmapSetOnlineInfo
|
||||||
{
|
{
|
||||||
|
84
osu.Desktop.Tests/Visual/TestCaseEditorMenuBar.cs
Normal file
84
osu.Desktop.Tests/Visual/TestCaseEditorMenuBar.cs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Screens.Edit.Menus;
|
||||||
|
|
||||||
|
namespace osu.Desktop.Tests.Visual
|
||||||
|
{
|
||||||
|
public class TestCaseEditorMenuBar : OsuTestCase
|
||||||
|
{
|
||||||
|
public TestCaseEditorMenuBar()
|
||||||
|
{
|
||||||
|
Add(new EditorMenuBar
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Y = 50,
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuBarItem("File")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Clear All Notes"),
|
||||||
|
new EditorMenuItem("Open Difficulty..."),
|
||||||
|
new EditorMenuItem("Save"),
|
||||||
|
new EditorMenuItem("Create a new Difficulty..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Revert to Saved"),
|
||||||
|
new EditorMenuItem("Revert to Saved (Full)"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Test Beatmap"),
|
||||||
|
new EditorMenuItem("Open AiMod"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Upload Beatmap..."),
|
||||||
|
new EditorMenuItem("Export Package"),
|
||||||
|
new EditorMenuItem("Export Map Package"),
|
||||||
|
new EditorMenuItem("Import from..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Open Song Folder"),
|
||||||
|
new EditorMenuItem("Open .osu in Notepad"),
|
||||||
|
new EditorMenuItem("Open .osb in Notepad"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Exit"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Timing")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Time Signature"),
|
||||||
|
new EditorMenuItem("Metronome Clicks"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Add Timing Section"),
|
||||||
|
new EditorMenuItem("Add Inheriting Section"),
|
||||||
|
new EditorMenuItem("Reset Current Section"),
|
||||||
|
new EditorMenuItem("Delete Timing Section"),
|
||||||
|
new EditorMenuItem("Resnap Current Section"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Timing Setup"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Resnap All Notes", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Move all notes in time...", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Recalculate Slider Lengths", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Delete All Timing Sections", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Set Current Position as Preview Point"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Testing")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Item 1"),
|
||||||
|
new EditorMenuItem("Item 2"),
|
||||||
|
new EditorMenuItem("Item 3"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,13 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using OpenTK;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Osu.Mods;
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Screens.Select.Leaderboards;
|
using osu.Game.Screens.Select.Leaderboards;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using OpenTK;
|
|
||||||
|
|
||||||
namespace osu.Desktop.Tests.Visual
|
namespace osu.Desktop.Tests.Visual
|
||||||
{
|
{
|
||||||
@ -24,7 +24,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.XH,
|
Rank = ScoreRank.XH,
|
||||||
Accuracy = 100,
|
Accuracy = 1,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -42,7 +42,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.X,
|
Rank = ScoreRank.X,
|
||||||
Accuracy = 100,
|
Accuracy = 1,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -60,7 +60,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.SH,
|
Rank = ScoreRank.SH,
|
||||||
Accuracy = 100,
|
Accuracy = 1,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -78,7 +78,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.S,
|
Rank = ScoreRank.S,
|
||||||
Accuracy = 100,
|
Accuracy = 1,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -96,7 +96,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.A,
|
Rank = ScoreRank.A,
|
||||||
Accuracy = 100,
|
Accuracy = 1,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -114,7 +114,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.B,
|
Rank = ScoreRank.B,
|
||||||
Accuracy = 98.26,
|
Accuracy = 0.9826,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -132,7 +132,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.C,
|
Rank = ScoreRank.C,
|
||||||
Accuracy = 96.54,
|
Accuracy = 0.9654,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -150,7 +150,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.F,
|
Rank = ScoreRank.F,
|
||||||
Accuracy = 60.25,
|
Accuracy = 0.6025,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -168,7 +168,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.F,
|
Rank = ScoreRank.F,
|
||||||
Accuracy = 51.40,
|
Accuracy = 0.5140,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
@ -186,7 +186,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
new Score
|
new Score
|
||||||
{
|
{
|
||||||
Rank = ScoreRank.F,
|
Rank = ScoreRank.F,
|
||||||
Accuracy = 42.22,
|
Accuracy = 0.4222,
|
||||||
MaxCombo = 244,
|
MaxCombo = 244,
|
||||||
TotalScore = 1707827,
|
TotalScore = 1707827,
|
||||||
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
|
||||||
|
@ -32,7 +32,7 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
backingDatabase.CreateTable<StoreVersion>();
|
backingDatabase.CreateTable<StoreVersion>();
|
||||||
|
|
||||||
rulesets = new RulesetStore(backingDatabase);
|
rulesets = new RulesetStore(backingDatabase);
|
||||||
manager = new BeatmapManager(storage, null, backingDatabase, rulesets);
|
manager = new BeatmapManager(storage, null, backingDatabase, rulesets, null);
|
||||||
|
|
||||||
for (int i = 0; i < 100; i += 10)
|
for (int i = 0; i < 100; i += 10)
|
||||||
manager.Import(createTestBeatmapSet(i));
|
manager.Import(createTestBeatmapSet(i));
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Desktop.Tests</RootNamespace>
|
<RootNamespace>osu.Desktop.Tests</RootNamespace>
|
||||||
<AssemblyName>osu.Desktop.Tests</AssemblyName>
|
<AssemblyName>osu.Desktop.Tests</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
@ -87,6 +87,7 @@
|
|||||||
<Compile Include="Visual\TestCaseManiaHitObjects.cs" />
|
<Compile Include="Visual\TestCaseManiaHitObjects.cs" />
|
||||||
<Compile Include="Visual\TestCaseManiaPlayfield.cs" />
|
<Compile Include="Visual\TestCaseManiaPlayfield.cs" />
|
||||||
<Compile Include="Visual\TestCaseMedalOverlay.cs" />
|
<Compile Include="Visual\TestCaseMedalOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseEditorMenuBar.cs" />
|
||||||
<Compile Include="Visual\TestCaseMenuButtonSystem.cs" />
|
<Compile Include="Visual\TestCaseMenuButtonSystem.cs" />
|
||||||
<Compile Include="Visual\TestCaseMenuOverlays.cs" />
|
<Compile Include="Visual\TestCaseMenuOverlays.cs" />
|
||||||
<Compile Include="Visual\TestCaseMods.cs" />
|
<Compile Include="Visual\TestCaseMods.cs" />
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||||
<SignAssembly>false</SignAssembly>
|
<SignAssembly>false</SignAssembly>
|
||||||
<TargetZone>LocalIntranet</TargetZone>
|
<TargetZone>LocalIntranet</TargetZone>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<PublishUrl>publish\</PublishUrl>
|
<PublishUrl>publish\</PublishUrl>
|
||||||
<Install>true</Install>
|
<Install>true</Install>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||||
<SignAssembly>false</SignAssembly>
|
<SignAssembly>false</SignAssembly>
|
||||||
<TargetZone>LocalIntranet</TargetZone>
|
<TargetZone>LocalIntranet</TargetZone>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<PublishUrl>publish\</PublishUrl>
|
<PublishUrl>publish\</PublishUrl>
|
||||||
<Install>true</Install>
|
<Install>true</Install>
|
||||||
|
@ -93,8 +93,6 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Mod GetAutoplayMod() => new ModAutoplay();
|
|
||||||
|
|
||||||
public override string Description => "osu!catch";
|
public override string Description => "osu!catch";
|
||||||
|
|
||||||
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_fruits_o };
|
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_fruits_o };
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Game.Rulesets.Catch</RootNamespace>
|
<RootNamespace>osu.Game.Rulesets.Catch</RootNamespace>
|
||||||
<AssemblyName>osu.Game.Rulesets.Catch</AssemblyName>
|
<AssemblyName>osu.Game.Rulesets.Catch</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
@ -105,8 +105,6 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Mod GetAutoplayMod() => new ModAutoplay();
|
|
||||||
|
|
||||||
public override string Description => "osu!mania";
|
public override string Description => "osu!mania";
|
||||||
|
|
||||||
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_mania_o };
|
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_mania_o };
|
||||||
|
@ -68,6 +68,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public class ManiaModFadeIn : Mod
|
public class ManiaModFadeIn : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "FadeIn";
|
public override string Name => "FadeIn";
|
||||||
|
public override string ShortenedName => "FI";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
@ -78,12 +79,14 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public class ManiaModRandom : Mod
|
public class ManiaModRandom : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Random";
|
public override string Name => "Random";
|
||||||
|
public override string ShortenedName => "RD";
|
||||||
public override string Description => @"Shuffle around the notes!";
|
public override string Description => @"Shuffle around the notes!";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class ManiaKeyMod : Mod
|
public abstract class ManiaKeyMod : Mod
|
||||||
{
|
{
|
||||||
|
public override string ShortenedName => Name;
|
||||||
public abstract int KeyCount { get; }
|
public abstract int KeyCount { get; }
|
||||||
public override double ScoreMultiplier => 1; // TODO: Implement the mania key mod score multiplier
|
public override double ScoreMultiplier => 1; // TODO: Implement the mania key mod score multiplier
|
||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
@ -146,6 +149,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public class ManiaModKeyCoop : Mod
|
public class ManiaModKeyCoop : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "KeyCoop";
|
public override string Name => "KeyCoop";
|
||||||
|
public override string ShortenedName => "2P";
|
||||||
public override string Description => @"Double the key amount, double the fun!";
|
public override string Description => @"Double the key amount, double the fun!";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
|
@ -15,6 +15,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public class ManiaModGravity : Mod, IGenerateSpeedAdjustments
|
public class ManiaModGravity : Mod, IGenerateSpeedAdjustments
|
||||||
{
|
{
|
||||||
public override string Name => "Gravity";
|
public override string Name => "Gravity";
|
||||||
|
public override string ShortenedName => "GR";
|
||||||
|
|
||||||
public override double ScoreMultiplier => 0;
|
public override double ScoreMultiplier => 0;
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
{
|
{
|
||||||
if (action == Action)
|
if (action == Action)
|
||||||
{
|
{
|
||||||
background.FadeTo(background.Alpha + 0.2f, 50, Easing.OutQuint);
|
background.FadeTo(0.6f, 50, Easing.OutQuint);
|
||||||
keyIcon.ScaleTo(1.4f, 50, Easing.OutQuint);
|
keyIcon.ScaleTo(1.4f, 50, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using System;
|
using System;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using OpenTK.Input;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
@ -24,12 +23,6 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
{
|
{
|
||||||
public const float HIT_TARGET_POSITION = 50;
|
public const float HIT_TARGET_POSITION = 50;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Default column keys, expanding outwards from the middle as more column are added.
|
|
||||||
/// E.g. 2 columns use FJ, 4 columns use DFJK, 6 use SDFJKL, etc...
|
|
||||||
/// </summary>
|
|
||||||
private static readonly Key[] default_keys = { Key.A, Key.S, Key.D, Key.F, Key.J, Key.K, Key.L, Key.Semicolon };
|
|
||||||
|
|
||||||
private SpecialColumnPosition specialColumnPosition;
|
private SpecialColumnPosition specialColumnPosition;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The style to use for the special column.
|
/// The style to use for the special column.
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Game.Rulesets.Mania</RootNamespace>
|
<RootNamespace>osu.Game.Rulesets.Mania</RootNamespace>
|
||||||
<AssemblyName>osu.Game.Rulesets.Mania</AssemblyName>
|
<AssemblyName>osu.Game.Rulesets.Mania</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
@ -96,6 +96,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public class OsuModSpunOut : Mod
|
public class OsuModSpunOut : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Spun Out";
|
public override string Name => "Spun Out";
|
||||||
|
public override string ShortenedName => "SO";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_spunout;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_spunout;
|
||||||
public override string Description => @"Spinners will be automatically completed";
|
public override string Description => @"Spinners will be automatically completed";
|
||||||
public override double ScoreMultiplier => 0.9;
|
public override double ScoreMultiplier => 0.9;
|
||||||
@ -106,6 +107,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public class OsuModAutopilot : Mod
|
public class OsuModAutopilot : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Autopilot";
|
public override string Name => "Autopilot";
|
||||||
|
public override string ShortenedName => "AP";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot;
|
||||||
public override string Description => @"Automatic cursor movement - just follow the rhythm.";
|
public override string Description => @"Automatic cursor movement - just follow the rhythm.";
|
||||||
public override double ScoreMultiplier => 0;
|
public override double ScoreMultiplier => 0;
|
||||||
@ -126,6 +128,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public class OsuModTarget : Mod
|
public class OsuModTarget : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Target";
|
public override string Name => "Target";
|
||||||
|
public override string ShortenedName => "TP";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_target;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_target;
|
||||||
public override string Description => @"";
|
public override string Description => @"";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
|
@ -51,6 +51,7 @@ namespace osu.Game.Rulesets.Osu.OsuDifficulty.Preprocessing
|
|||||||
|
|
||||||
foreach (OsuDifficultyHitObject h in onScreen)
|
foreach (OsuDifficultyHitObject h in onScreen)
|
||||||
{
|
{
|
||||||
|
// ReSharper disable once PossibleNullReferenceException (resharper not smart enough to understand IEnumerator.MoveNext())
|
||||||
h.TimeUntilHit -= latest.DeltaTime;
|
h.TimeUntilHit -= latest.DeltaTime;
|
||||||
// Calculate reading strain here
|
// Calculate reading strain here
|
||||||
}
|
}
|
||||||
|
@ -112,8 +112,6 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Mod GetAutoplayMod() => new OsuModAutoplay();
|
|
||||||
|
|
||||||
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_osu_o };
|
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_osu_o };
|
||||||
|
|
||||||
public override DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap) => new OsuDifficultyCalculator(beatmap);
|
public override DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap) => new OsuDifficultyCalculator(beatmap);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Game.Rulesets.Osu</RootNamespace>
|
<RootNamespace>osu.Game.Rulesets.Osu</RootNamespace>
|
||||||
<AssemblyName>osu.Game.Rulesets.Osu</AssemblyName>
|
<AssemblyName>osu.Game.Rulesets.Osu</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -242,6 +242,7 @@ namespace osu.Game.Rulesets.Taiko.Scoring
|
|||||||
base.Reset();
|
base.Reset();
|
||||||
|
|
||||||
Health.Value = 0;
|
Health.Value = 0;
|
||||||
|
Accuracy.Value = 1;
|
||||||
|
|
||||||
bonusScore = 0;
|
bonusScore = 0;
|
||||||
comboPortion = 0;
|
comboPortion = 0;
|
||||||
|
@ -95,8 +95,6 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Mod GetAutoplayMod() => new TaikoModAutoplay();
|
|
||||||
|
|
||||||
public override string Description => "osu!taiko";
|
public override string Description => "osu!taiko";
|
||||||
|
|
||||||
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_taiko_o };
|
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_taiko_o };
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Game.Rulesets.Taiko</RootNamespace>
|
<RootNamespace>osu.Game.Rulesets.Taiko</RootNamespace>
|
||||||
<AssemblyName>osu.Game.Rulesets.Taiko</AssemblyName>
|
<AssemblyName>osu.Game.Rulesets.Taiko</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<RootNamespace>osu.Game.Tests</RootNamespace>
|
<RootNamespace>osu.Game.Tests</RootNamespace>
|
||||||
<AssemblyName>osu.Game.Tests</AssemblyName>
|
<AssemblyName>osu.Game.Tests</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
@ -17,7 +17,7 @@ namespace osu.Game.Beatmaps
|
|||||||
public class Beatmap<T>
|
public class Beatmap<T>
|
||||||
where T : HitObject
|
where T : HitObject
|
||||||
{
|
{
|
||||||
public BeatmapInfo BeatmapInfo;
|
public BeatmapInfo BeatmapInfo = new BeatmapInfo();
|
||||||
public ControlPointInfo ControlPointInfo = new ControlPointInfo();
|
public ControlPointInfo ControlPointInfo = new ControlPointInfo();
|
||||||
public List<BreakPeriod> Breaks = new List<BreakPeriod>();
|
public List<BreakPeriod> Breaks = new List<BreakPeriod>();
|
||||||
public readonly List<Color4> ComboColors = new List<Color4>
|
public readonly List<Color4> ComboColors = new List<Color4>
|
||||||
@ -33,7 +33,7 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The HitObjects this Beatmap contains.
|
/// The HitObjects this Beatmap contains.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<T> HitObjects;
|
public List<T> HitObjects = new List<T>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Total amount of break time in the beatmap.
|
/// Total amount of break time in the beatmap.
|
||||||
@ -44,12 +44,13 @@ namespace osu.Game.Beatmaps
|
|||||||
/// Constructs a new beatmap.
|
/// Constructs a new beatmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="original">The original beatmap to use the parameters of.</param>
|
/// <param name="original">The original beatmap to use the parameters of.</param>
|
||||||
public Beatmap(Beatmap original = null)
|
public Beatmap(Beatmap<T> original = null)
|
||||||
{
|
{
|
||||||
BeatmapInfo = original?.BeatmapInfo.DeepClone() ?? BeatmapInfo;
|
BeatmapInfo = original?.BeatmapInfo.DeepClone() ?? BeatmapInfo;
|
||||||
ControlPointInfo = original?.ControlPointInfo ?? ControlPointInfo;
|
ControlPointInfo = original?.ControlPointInfo ?? ControlPointInfo;
|
||||||
Breaks = original?.Breaks ?? Breaks;
|
Breaks = original?.Breaks ?? Breaks;
|
||||||
ComboColors = original?.ComboColors ?? ComboColors;
|
ComboColors = original?.ComboColors ?? ComboColors;
|
||||||
|
HitObjects = original?.HitObjects ?? HitObjects;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +66,6 @@ namespace osu.Game.Beatmaps
|
|||||||
public Beatmap(Beatmap original = null)
|
public Beatmap(Beatmap original = null)
|
||||||
: base(original)
|
: base(original)
|
||||||
{
|
{
|
||||||
HitObjects = original?.HitObjects;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,9 @@ using osu.Game.IPC;
|
|||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using SQLite.Net;
|
using SQLite.Net;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
@ -63,6 +66,10 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
private readonly BeatmapStore beatmaps;
|
private readonly BeatmapStore beatmaps;
|
||||||
|
|
||||||
|
private readonly APIAccess api;
|
||||||
|
|
||||||
|
private readonly List<DownloadBeatmapSetRequest> currentDownloads = new List<DownloadBeatmapSetRequest>();
|
||||||
|
|
||||||
// ReSharper disable once NotAccessedField.Local (we should keep a reference to this so it is not finalised)
|
// ReSharper disable once NotAccessedField.Local (we should keep a reference to this so it is not finalised)
|
||||||
private BeatmapIPCChannel ipc;
|
private BeatmapIPCChannel ipc;
|
||||||
|
|
||||||
@ -76,7 +83,7 @@ namespace osu.Game.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Func<Storage> GetStableStorage { private get; set; }
|
public Func<Storage> GetStableStorage { private get; set; }
|
||||||
|
|
||||||
public BeatmapManager(Storage storage, FileStore files, SQLiteConnection connection, RulesetStore rulesets, IIpcHost importHost = null)
|
public BeatmapManager(Storage storage, FileStore files, SQLiteConnection connection, RulesetStore rulesets, APIAccess api, IIpcHost importHost = null)
|
||||||
{
|
{
|
||||||
beatmaps = new BeatmapStore(connection);
|
beatmaps = new BeatmapStore(connection);
|
||||||
beatmaps.BeatmapSetAdded += s => BeatmapSetAdded?.Invoke(s);
|
beatmaps.BeatmapSetAdded += s => BeatmapSetAdded?.Invoke(s);
|
||||||
@ -88,6 +95,7 @@ namespace osu.Game.Beatmaps
|
|||||||
this.files = files;
|
this.files = files;
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
this.rulesets = rulesets;
|
this.rulesets = rulesets;
|
||||||
|
this.api = api;
|
||||||
|
|
||||||
if (importHost != null)
|
if (importHost != null)
|
||||||
ipc = new BeatmapIPCChannel(importHost, this);
|
ipc = new BeatmapIPCChannel(importHost, this);
|
||||||
@ -177,6 +185,74 @@ namespace osu.Game.Beatmaps
|
|||||||
beatmaps.Add(beatmapSetInfo);
|
beatmaps.Add(beatmapSetInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Downloads a beatmap.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmapSetInfo">The <see cref="BeatmapSetInfo"/> to be downloaded.</param>
|
||||||
|
/// <returns>A new <see cref="DownloadBeatmapSetRequest"/>, or an existing one if a download is already in progress.</returns>
|
||||||
|
public DownloadBeatmapSetRequest Download(BeatmapSetInfo beatmapSetInfo)
|
||||||
|
{
|
||||||
|
var existing = GetExistingDownload(beatmapSetInfo);
|
||||||
|
|
||||||
|
if (existing != null) return existing;
|
||||||
|
|
||||||
|
if (api == null) return null;
|
||||||
|
|
||||||
|
ProgressNotification downloadNotification = new ProgressNotification
|
||||||
|
{
|
||||||
|
Text = $"Downloading {beatmapSetInfo.Metadata.Artist} - {beatmapSetInfo.Metadata.Title}",
|
||||||
|
};
|
||||||
|
|
||||||
|
var request = new DownloadBeatmapSetRequest(beatmapSetInfo);
|
||||||
|
|
||||||
|
request.DownloadProgressed += progress =>
|
||||||
|
{
|
||||||
|
downloadNotification.State = ProgressNotificationState.Active;
|
||||||
|
downloadNotification.Progress = progress;
|
||||||
|
};
|
||||||
|
|
||||||
|
request.Success += data =>
|
||||||
|
{
|
||||||
|
downloadNotification.State = ProgressNotificationState.Completed;
|
||||||
|
|
||||||
|
using (var stream = new MemoryStream(data))
|
||||||
|
using (var archive = new OszArchiveReader(stream))
|
||||||
|
Import(archive);
|
||||||
|
|
||||||
|
currentDownloads.Remove(request);
|
||||||
|
};
|
||||||
|
|
||||||
|
request.Failure += data =>
|
||||||
|
{
|
||||||
|
downloadNotification.State = ProgressNotificationState.Completed;
|
||||||
|
Logger.Error(data, "Failed to get beatmap download information");
|
||||||
|
currentDownloads.Remove(request);
|
||||||
|
};
|
||||||
|
|
||||||
|
downloadNotification.CancelRequested += () =>
|
||||||
|
{
|
||||||
|
request.Cancel();
|
||||||
|
currentDownloads.Remove(request);
|
||||||
|
downloadNotification.State = ProgressNotificationState.Cancelled;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
currentDownloads.Add(request);
|
||||||
|
PostNotification?.Invoke(downloadNotification);
|
||||||
|
|
||||||
|
// don't run in the main api queue as this is a long-running task.
|
||||||
|
Task.Run(() => request.Perform(api));
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get an existing download request if it exists.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmap">The <see cref="BeatmapSetInfo"/> whose download request is wanted.</param>
|
||||||
|
/// <returns>The <see cref="DownloadBeatmapSetRequest"/> object if it exists, or null.</returns>
|
||||||
|
public DownloadBeatmapSetRequest GetExistingDownload(BeatmapSetInfo beatmap) => currentDownloads.Find(d => d.BeatmapSet.OnlineBeatmapSetID == beatmap.OnlineBeatmapSetID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delete a beatmap from the manager.
|
/// Delete a beatmap from the manager.
|
||||||
/// Is a no-op for already deleted beatmaps.
|
/// Is a no-op for already deleted beatmaps.
|
||||||
|
@ -11,6 +11,8 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
{
|
{
|
||||||
public class BeatmapGroup : IStateful<BeatmapGroupState>
|
public class BeatmapGroup : IStateful<BeatmapGroupState>
|
||||||
{
|
{
|
||||||
|
public event Action<BeatmapGroupState> StateChanged;
|
||||||
|
|
||||||
public BeatmapPanel SelectedPanel;
|
public BeatmapPanel SelectedPanel;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -31,17 +33,18 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
|
|
||||||
public BeatmapSetHeader Header;
|
public BeatmapSetHeader Header;
|
||||||
|
|
||||||
private BeatmapGroupState state;
|
|
||||||
|
|
||||||
public List<BeatmapPanel> BeatmapPanels;
|
public List<BeatmapPanel> BeatmapPanels;
|
||||||
|
|
||||||
public BeatmapSetInfo BeatmapSet;
|
public BeatmapSetInfo BeatmapSet;
|
||||||
|
|
||||||
|
private BeatmapGroupState state;
|
||||||
public BeatmapGroupState State
|
public BeatmapGroupState State
|
||||||
{
|
{
|
||||||
get { return state; }
|
get { return state; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
state = value;
|
||||||
|
|
||||||
switch (value)
|
switch (value)
|
||||||
{
|
{
|
||||||
case BeatmapGroupState.Expanded:
|
case BeatmapGroupState.Expanded:
|
||||||
@ -60,7 +63,8 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
panel.State = PanelSelectedState.Hidden;
|
panel.State = PanelSelectedState.Hidden;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
state = value;
|
|
||||||
|
StateChanged?.Invoke(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,6 +94,7 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
Header.AddDifficultyIcons(BeatmapPanels);
|
Header.AddDifficultyIcons(BeatmapPanels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void headerGainedSelection(BeatmapSetHeader panel)
|
private void headerGainedSelection(BeatmapSetHeader panel)
|
||||||
{
|
{
|
||||||
State = BeatmapGroupState.Expanded;
|
State = BeatmapGroupState.Expanded;
|
||||||
|
@ -33,7 +33,8 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
Normal,
|
Normal,
|
||||||
Hard,
|
Hard,
|
||||||
Insane,
|
Insane,
|
||||||
Expert
|
Expert,
|
||||||
|
ExpertPlus
|
||||||
}
|
}
|
||||||
|
|
||||||
private DifficultyRating getDifficultyRating(BeatmapInfo beatmap)
|
private DifficultyRating getDifficultyRating(BeatmapInfo beatmap)
|
||||||
@ -44,7 +45,8 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
if (rating < 2.25) return DifficultyRating.Normal;
|
if (rating < 2.25) return DifficultyRating.Normal;
|
||||||
if (rating < 3.75) return DifficultyRating.Hard;
|
if (rating < 3.75) return DifficultyRating.Hard;
|
||||||
if (rating < 5.25) return DifficultyRating.Insane;
|
if (rating < 5.25) return DifficultyRating.Insane;
|
||||||
return DifficultyRating.Expert;
|
if (rating < 6.75) return DifficultyRating.Expert;
|
||||||
|
return DifficultyRating.ExpertPlus;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color4 getColour(BeatmapInfo beatmap)
|
private Color4 getColour(BeatmapInfo beatmap)
|
||||||
@ -55,12 +57,14 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
return palette.Green;
|
return palette.Green;
|
||||||
default:
|
default:
|
||||||
case DifficultyRating.Normal:
|
case DifficultyRating.Normal:
|
||||||
return palette.Yellow;
|
return palette.Blue;
|
||||||
case DifficultyRating.Hard:
|
case DifficultyRating.Hard:
|
||||||
return palette.Pink;
|
return palette.Yellow;
|
||||||
case DifficultyRating.Insane:
|
case DifficultyRating.Insane:
|
||||||
return palette.Purple;
|
return palette.Pink;
|
||||||
case DifficultyRating.Expert:
|
case DifficultyRating.Expert:
|
||||||
|
return palette.Purple;
|
||||||
|
case DifficultyRating.ExpertPlus:
|
||||||
return palette.Gray0;
|
return palette.Gray0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
@ -15,6 +16,8 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
{
|
{
|
||||||
public const float MAX_HEIGHT = 80;
|
public const float MAX_HEIGHT = 80;
|
||||||
|
|
||||||
|
public event Action<PanelSelectedState> StateChanged;
|
||||||
|
|
||||||
public override bool RemoveWhenNotAlive => false;
|
public override bool RemoveWhenNotAlive => false;
|
||||||
|
|
||||||
private readonly Container nestedContainer;
|
private readonly Container nestedContainer;
|
||||||
@ -77,11 +80,15 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (state == value) return;
|
if (state == value)
|
||||||
|
return;
|
||||||
|
|
||||||
var last = state;
|
var last = state;
|
||||||
state = value;
|
state = value;
|
||||||
|
|
||||||
ApplyState(last);
|
ApplyState(last);
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ using osu.Framework.Audio.Track;
|
|||||||
using osu.Framework.Graphics.Textures;
|
using osu.Framework.Graphics.Textures;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
|
|
||||||
@ -42,10 +41,7 @@ namespace osu.Game.Beatmaps
|
|||||||
this.game = game;
|
this.game = game;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Beatmap GetBeatmap() => new Beatmap
|
protected override Beatmap GetBeatmap() => new Beatmap();
|
||||||
{
|
|
||||||
HitObjects = new List<HitObject>(),
|
|
||||||
};
|
|
||||||
|
|
||||||
protected override Texture GetBackground() => game.Textures.Get(@"Backgrounds/bg4");
|
protected override Texture GetBackground() => game.Textures.Get(@"Backgrounds/bg4");
|
||||||
|
|
||||||
@ -59,8 +55,6 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
public override IEnumerable<Mod> GetModsFor(ModType type) => new Mod[] { };
|
public override IEnumerable<Mod> GetModsFor(ModType type) => new Mod[] { };
|
||||||
|
|
||||||
public override Mod GetAutoplayMod() => new ModAutoplay();
|
|
||||||
|
|
||||||
public override RulesetContainer CreateRulesetContainerWith(WorkingBeatmap beatmap, bool isForCurrentRuleset)
|
public override RulesetContainer CreateRulesetContainerWith(WorkingBeatmap beatmap, bool isForCurrentRuleset)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps.Formats
|
namespace osu.Game.Beatmaps.Formats
|
||||||
{
|
{
|
||||||
@ -21,7 +20,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
string line;
|
string line;
|
||||||
do { line = stream.ReadLine()?.Trim(); }
|
do { line = stream.ReadLine()?.Trim(); }
|
||||||
while (line != null && line.Length == 0);
|
while (line != null && line.Length == 0);
|
||||||
|
|
||||||
if (line == null || !decoders.ContainsKey(line))
|
if (line == null || !decoders.ContainsKey(line))
|
||||||
throw new IOException(@"Unknown file format");
|
throw new IOException(@"Unknown file format");
|
||||||
@ -47,7 +46,6 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
var beatmap = new Beatmap
|
var beatmap = new Beatmap
|
||||||
{
|
{
|
||||||
HitObjects = new List<HitObject>(),
|
|
||||||
BeatmapInfo = new BeatmapInfo
|
BeatmapInfo = new BeatmapInfo
|
||||||
{
|
{
|
||||||
Metadata = new BeatmapMetadata(),
|
Metadata = new BeatmapMetadata(),
|
||||||
|
@ -54,7 +54,7 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
if (beatmap != null) return beatmap;
|
if (beatmap != null) return beatmap;
|
||||||
|
|
||||||
beatmap = GetBeatmap();
|
beatmap = GetBeatmap() ?? new Beatmap();
|
||||||
|
|
||||||
// use the database-backed info.
|
// use the database-backed info.
|
||||||
beatmap.BeatmapInfo = BeatmapInfo;
|
beatmap.BeatmapInfo = BeatmapInfo;
|
||||||
|
@ -19,12 +19,12 @@ namespace osu.Game.Graphics.Containers
|
|||||||
samplePopIn = audio.Sample.Get(@"UI/melodic-5");
|
samplePopIn = audio.Sample.Get(@"UI/melodic-5");
|
||||||
samplePopOut = audio.Sample.Get(@"UI/melodic-4");
|
samplePopOut = audio.Sample.Get(@"UI/melodic-4");
|
||||||
|
|
||||||
StateChanged += OsuFocusedOverlayContainer_StateChanged;
|
StateChanged += onStateChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OsuFocusedOverlayContainer_StateChanged(VisibilityContainer arg1, Visibility arg2)
|
private void onStateChanged(Visibility visibility)
|
||||||
{
|
{
|
||||||
switch (arg2)
|
switch (visibility)
|
||||||
{
|
{
|
||||||
case Visibility.Visible:
|
case Visibility.Visible:
|
||||||
samplePopIn?.Play();
|
samplePopIn?.Play();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
@ -35,6 +36,8 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
private class BreadcrumbTabItem : OsuTabItem, IStateful<Visibility>
|
private class BreadcrumbTabItem : OsuTabItem, IStateful<Visibility>
|
||||||
{
|
{
|
||||||
|
public event Action<Visibility> StateChanged;
|
||||||
|
|
||||||
public readonly SpriteIcon Chevron;
|
public readonly SpriteIcon Chevron;
|
||||||
|
|
||||||
//don't allow clicking between transitions and don't make the chevron clickable
|
//don't allow clicking between transitions and don't make the chevron clickable
|
||||||
@ -42,6 +45,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
public override bool HandleInput => State == Visibility.Visible;
|
public override bool HandleInput => State == Visibility.Visible;
|
||||||
|
|
||||||
private Visibility state;
|
private Visibility state;
|
||||||
|
|
||||||
public Visibility State
|
public Visibility State
|
||||||
{
|
{
|
||||||
get { return state; }
|
get { return state; }
|
||||||
@ -62,6 +66,8 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
this.FadeOut(transition_duration, Easing.OutQuint);
|
this.FadeOut(transition_duration, Easing.OutQuint);
|
||||||
this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, Easing.OutQuint);
|
this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,14 +14,17 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
private const int fade_duration = 250;
|
private const int fade_duration = 250;
|
||||||
|
|
||||||
public OsuContextMenu()
|
public OsuContextMenu()
|
||||||
|
: base(Direction.Vertical)
|
||||||
{
|
{
|
||||||
CornerRadius = 5;
|
MaskingContainer.CornerRadius = 5;
|
||||||
EdgeEffect = new EdgeEffectParameters
|
MaskingContainer.EdgeEffect = new EdgeEffectParameters
|
||||||
{
|
{
|
||||||
Type = EdgeEffectType.Shadow,
|
Type = EdgeEffectType.Shadow,
|
||||||
Colour = Color4.Black.Opacity(0.1f),
|
Colour = Color4.Black.Opacity(0.1f),
|
||||||
Radius = 4,
|
Radius = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ItemsContainer.Padding = new MarginPadding { Vertical = DrawableOsuMenuItem.MARGIN_VERTICAL };
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -32,7 +35,5 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint);
|
protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint);
|
||||||
protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint);
|
protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint);
|
||||||
|
|
||||||
protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Vertical = DrawableOsuMenuItem.MARGIN_VERTICAL };
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -57,6 +57,9 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
{
|
{
|
||||||
CornerRadius = 4;
|
CornerRadius = 4;
|
||||||
BackgroundColour = Color4.Black.Opacity(0.5f);
|
BackgroundColour = Color4.Black.Opacity(0.5f);
|
||||||
|
|
||||||
|
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
||||||
|
ItemsContainer.Padding = new MarginPadding(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
||||||
@ -64,13 +67,18 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint);
|
protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint);
|
||||||
|
|
||||||
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
||||||
protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(5);
|
protected override void UpdateSize(Vector2 newSize)
|
||||||
|
|
||||||
// todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring
|
|
||||||
protected override void UpdateMenuHeight()
|
|
||||||
{
|
{
|
||||||
var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
|
if (Direction == Direction.Vertical)
|
||||||
this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint);
|
{
|
||||||
|
Width = newSize.X;
|
||||||
|
this.ResizeHeightTo(newSize.Y, 300, Easing.OutQuint);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Height = newSize.Y;
|
||||||
|
this.ResizeWidthTo(newSize.X, 300, Easing.OutQuint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color4 accentColour;
|
private Color4 accentColour;
|
||||||
@ -88,7 +96,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuDropdownMenuItem(item) { AccentColour = accentColour };
|
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuDropdownMenuItem(item) { AccentColour = accentColour };
|
||||||
|
|
||||||
#region DrawableOsuDropdownMenuItem
|
#region DrawableOsuDropdownMenuItem
|
||||||
protected class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem, IHasAccentColour
|
public class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem, IHasAccentColour
|
||||||
{
|
{
|
||||||
private Color4? accentColour;
|
private Color4? accentColour;
|
||||||
public Color4 AccentColour
|
public Color4 AccentColour
|
||||||
@ -141,7 +149,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
protected override Drawable CreateContent() => new Content();
|
protected override Drawable CreateContent() => new Content();
|
||||||
|
|
||||||
protected class Content : FillFlowContainer, IHasText
|
protected new class Content : FillFlowContainer, IHasText
|
||||||
{
|
{
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
|
@ -12,30 +12,45 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Graphics.UserInterface;
|
using osu.Framework.Graphics.UserInterface;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterface
|
namespace osu.Game.Graphics.UserInterface
|
||||||
{
|
{
|
||||||
public class OsuMenu : Menu
|
public class OsuMenu : Menu
|
||||||
{
|
{
|
||||||
public OsuMenu()
|
public OsuMenu(Direction direction, bool topLevelMenu = false)
|
||||||
|
: base(direction, topLevelMenu)
|
||||||
{
|
{
|
||||||
CornerRadius = 4;
|
|
||||||
BackgroundColour = Color4.Black.Opacity(0.5f);
|
BackgroundColour = Color4.Black.Opacity(0.5f);
|
||||||
|
|
||||||
|
MaskingContainer.CornerRadius = 4;
|
||||||
|
ItemsContainer.Padding = new MarginPadding(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void AnimateOpen() => this.FadeIn(300, Easing.OutQuint);
|
protected override void AnimateOpen() => this.FadeIn(300, Easing.OutQuint);
|
||||||
protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint);
|
protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint);
|
||||||
|
|
||||||
protected override void UpdateMenuHeight()
|
protected override void UpdateSize(Vector2 newSize)
|
||||||
{
|
{
|
||||||
var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
|
if (Direction == Direction.Vertical)
|
||||||
this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint);
|
{
|
||||||
|
Width = newSize.X;
|
||||||
|
this.ResizeHeightTo(newSize.Y, 300, Easing.OutQuint);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Height = newSize.Y;
|
||||||
|
this.ResizeWidthTo(newSize.X, 300, Easing.OutQuint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(5);
|
|
||||||
|
|
||||||
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuMenuItem(item);
|
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuMenuItem(item);
|
||||||
|
|
||||||
|
protected override Menu CreateSubMenu() => new OsuMenu(Direction.Vertical)
|
||||||
|
{
|
||||||
|
Anchor = Direction == Direction.Horizontal ? Anchor.BottomLeft : Anchor.TopRight
|
||||||
|
};
|
||||||
|
|
||||||
protected class DrawableOsuMenuItem : DrawableMenuItem
|
protected class DrawableOsuMenuItem : DrawableMenuItem
|
||||||
{
|
{
|
||||||
private const int margin_horizontal = 17;
|
private const int margin_horizontal = 17;
|
||||||
@ -51,7 +66,6 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
public DrawableOsuMenuItem(MenuItem item)
|
public DrawableOsuMenuItem(MenuItem item)
|
||||||
: base(item)
|
: base(item)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -104,9 +118,10 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
return base.OnClick(state);
|
return base.OnClick(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Drawable CreateContent() => text = new TextContainer();
|
protected sealed override Drawable CreateContent() => text = CreateTextContainer();
|
||||||
|
protected virtual TextContainer CreateTextContainer() => new TextContainer();
|
||||||
|
|
||||||
private class TextContainer : Container, IHasText
|
protected class TextContainer : Container, IHasText
|
||||||
{
|
{
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
|
@ -15,11 +15,7 @@ namespace osu.Game.Graphics.UserInterface.Volume
|
|||||||
{
|
{
|
||||||
private readonly VolumeMeter volumeMeterMaster;
|
private readonly VolumeMeter volumeMeterMaster;
|
||||||
|
|
||||||
private void volumeChanged(double newVolume)
|
protected override bool BlockPassThroughMouse => false;
|
||||||
{
|
|
||||||
Show();
|
|
||||||
schedulePopOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
public VolumeControl()
|
public VolumeControl()
|
||||||
{
|
{
|
||||||
@ -85,6 +81,12 @@ namespace osu.Game.Graphics.UserInterface.Volume
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void volumeChanged(double newVolume)
|
||||||
|
{
|
||||||
|
Show();
|
||||||
|
schedulePopOut();
|
||||||
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(AudioManager audio)
|
private void load(AudioManager audio)
|
||||||
{
|
{
|
||||||
|
24
osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
Normal file
24
osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class DownloadBeatmapSetRequest : APIDownloadRequest
|
||||||
|
{
|
||||||
|
public readonly BeatmapSetInfo BeatmapSet;
|
||||||
|
|
||||||
|
public Action<float> DownloadProgressed;
|
||||||
|
|
||||||
|
public DownloadBeatmapSetRequest(BeatmapSetInfo set)
|
||||||
|
{
|
||||||
|
BeatmapSet = set;
|
||||||
|
|
||||||
|
Progress += (current, total) => DownloadProgressed?.Invoke((float) current / total);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => $@"beatmapsets/{BeatmapSet.OnlineBeatmapSetID}/download";
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,14 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using osu.Framework.IO.Network;
|
using osu.Framework.IO.Network;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Users;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
@ -16,6 +20,14 @@ namespace osu.Game.Online.API.Requests
|
|||||||
public GetScoresRequest(BeatmapInfo beatmap)
|
public GetScoresRequest(BeatmapInfo beatmap)
|
||||||
{
|
{
|
||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
|
|
||||||
|
Success += onSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onSuccess(GetScoresResponse r)
|
||||||
|
{
|
||||||
|
foreach (OnlineScore score in r.Scores)
|
||||||
|
score.ApplyBeatmap(beatmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override WebRequest CreateWebRequest()
|
protected override WebRequest CreateWebRequest()
|
||||||
@ -32,6 +44,88 @@ namespace osu.Game.Online.API.Requests
|
|||||||
public class GetScoresResponse
|
public class GetScoresResponse
|
||||||
{
|
{
|
||||||
[JsonProperty(@"scores")]
|
[JsonProperty(@"scores")]
|
||||||
public IEnumerable<Score> Scores;
|
public IEnumerable<OnlineScore> Scores;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public class OnlineScore : Score
|
||||||
|
{
|
||||||
|
[JsonProperty(@"score")]
|
||||||
|
private double totalScore
|
||||||
|
{
|
||||||
|
set { TotalScore = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"max_combo")]
|
||||||
|
private int maxCombo
|
||||||
|
{
|
||||||
|
set { MaxCombo = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"user")]
|
||||||
|
private User user
|
||||||
|
{
|
||||||
|
set { User = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"replay_data")]
|
||||||
|
private Replay replay
|
||||||
|
{
|
||||||
|
set { Replay = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"score_id")]
|
||||||
|
private long onlineScoreID
|
||||||
|
{
|
||||||
|
set { OnlineScoreID = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"created_at")]
|
||||||
|
private DateTimeOffset date
|
||||||
|
{
|
||||||
|
set { Date = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"statistics")]
|
||||||
|
private Dictionary<string, dynamic> jsonStats
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
foreach (var kvp in value)
|
||||||
|
{
|
||||||
|
string key = kvp.Key;
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case @"count_300":
|
||||||
|
key = @"300";
|
||||||
|
break;
|
||||||
|
case @"count_100":
|
||||||
|
key = @"100";
|
||||||
|
break;
|
||||||
|
case @"count_50":
|
||||||
|
key = @"50";
|
||||||
|
break;
|
||||||
|
case @"count_miss":
|
||||||
|
key = @"x";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Statistics.Add(key, kvp.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"mods")]
|
||||||
|
private string[] modStrings { get; set; }
|
||||||
|
|
||||||
|
public void ApplyBeatmap(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
Beatmap = beatmap;
|
||||||
|
Ruleset = beatmap.Ruleset;
|
||||||
|
|
||||||
|
// Evaluate the mod string
|
||||||
|
Mods = Ruleset.CreateInstance().GetAllMods().Where(mod => modStrings.Contains(mod.ShortenedName)).ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -30,7 +30,7 @@ namespace osu.Game.Online.Chat
|
|||||||
|
|
||||||
public Bindable<bool> Joined = new Bindable<bool>();
|
public Bindable<bool> Joined = new Bindable<bool>();
|
||||||
|
|
||||||
public bool ReadOnly => Name != "#lazer";
|
public bool ReadOnly => false;
|
||||||
|
|
||||||
public const int MAX_HISTORY = 300;
|
public const int MAX_HISTORY = 300;
|
||||||
|
|
||||||
|
@ -230,13 +230,13 @@ namespace osu.Game
|
|||||||
var singleDisplayOverlays = new OverlayContainer[] { chat, social, direct };
|
var singleDisplayOverlays = new OverlayContainer[] { chat, social, direct };
|
||||||
foreach (var overlay in singleDisplayOverlays)
|
foreach (var overlay in singleDisplayOverlays)
|
||||||
{
|
{
|
||||||
overlay.StateChanged += (container, state) =>
|
overlay.StateChanged += state =>
|
||||||
{
|
{
|
||||||
if (state == Visibility.Hidden) return;
|
if (state == Visibility.Hidden) return;
|
||||||
|
|
||||||
foreach (var c in singleDisplayOverlays)
|
foreach (var c in singleDisplayOverlays)
|
||||||
{
|
{
|
||||||
if (c == container) continue;
|
if (c == overlay) continue;
|
||||||
c.State = Visibility.Hidden;
|
c.State = Visibility.Hidden;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -245,7 +245,11 @@ namespace osu.Game
|
|||||||
LoadComponentAsync(Toolbar = new Toolbar
|
LoadComponentAsync(Toolbar = new Toolbar
|
||||||
{
|
{
|
||||||
Depth = -4,
|
Depth = -4,
|
||||||
OnHome = delegate { intro?.ChildScreen?.MakeCurrent(); },
|
OnHome = delegate
|
||||||
|
{
|
||||||
|
hideAllOverlays();
|
||||||
|
intro?.ChildScreen?.MakeCurrent();
|
||||||
|
},
|
||||||
}, overlayContent.Add);
|
}, overlayContent.Add);
|
||||||
|
|
||||||
settings.StateChanged += delegate
|
settings.StateChanged += delegate
|
||||||
@ -310,6 +314,16 @@ namespace osu.Game
|
|||||||
private OsuScreen currentScreen;
|
private OsuScreen currentScreen;
|
||||||
private FrameworkConfigManager frameworkConfig;
|
private FrameworkConfigManager frameworkConfig;
|
||||||
|
|
||||||
|
private void hideAllOverlays()
|
||||||
|
{
|
||||||
|
settings.State = Visibility.Hidden;
|
||||||
|
chat.State = Visibility.Hidden;
|
||||||
|
direct.State = Visibility.Hidden;
|
||||||
|
social.State = Visibility.Hidden;
|
||||||
|
userProfile.State = Visibility.Hidden;
|
||||||
|
notificationOverlay.State = Visibility.Hidden;
|
||||||
|
}
|
||||||
|
|
||||||
private void screenChanged(Screen newScreen)
|
private void screenChanged(Screen newScreen)
|
||||||
{
|
{
|
||||||
currentScreen = newScreen as OsuScreen;
|
currentScreen = newScreen as OsuScreen;
|
||||||
@ -323,19 +337,12 @@ namespace osu.Game
|
|||||||
//central game screen change logic.
|
//central game screen change logic.
|
||||||
if (!currentScreen.ShowOverlays)
|
if (!currentScreen.ShowOverlays)
|
||||||
{
|
{
|
||||||
settings.State = Visibility.Hidden;
|
hideAllOverlays();
|
||||||
Toolbar.State = Visibility.Hidden;
|
|
||||||
musicController.State = Visibility.Hidden;
|
musicController.State = Visibility.Hidden;
|
||||||
chat.State = Visibility.Hidden;
|
Toolbar.State = Visibility.Hidden;
|
||||||
direct.State = Visibility.Hidden;
|
|
||||||
social.State = Visibility.Hidden;
|
|
||||||
userProfile.State = Visibility.Hidden;
|
|
||||||
notificationOverlay.State = Visibility.Hidden;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
Toolbar.State = Visibility.Visible;
|
Toolbar.State = Visibility.Visible;
|
||||||
}
|
|
||||||
|
|
||||||
ScreenChanged?.Invoke(newScreen);
|
ScreenChanged?.Invoke(newScreen);
|
||||||
}
|
}
|
||||||
|
@ -106,9 +106,15 @@ namespace osu.Game
|
|||||||
|
|
||||||
connection.CreateTable<StoreVersion>();
|
connection.CreateTable<StoreVersion>();
|
||||||
|
|
||||||
|
dependencies.Cache(API = new APIAccess
|
||||||
|
{
|
||||||
|
Username = LocalConfig.Get<string>(OsuSetting.Username),
|
||||||
|
Token = LocalConfig.Get<string>(OsuSetting.Token)
|
||||||
|
});
|
||||||
|
|
||||||
dependencies.Cache(RulesetStore = new RulesetStore(connection));
|
dependencies.Cache(RulesetStore = new RulesetStore(connection));
|
||||||
dependencies.Cache(FileStore = new FileStore(connection, Host.Storage));
|
dependencies.Cache(FileStore = new FileStore(connection, Host.Storage));
|
||||||
dependencies.Cache(BeatmapManager = new BeatmapManager(Host.Storage, FileStore, connection, RulesetStore, Host));
|
dependencies.Cache(BeatmapManager = new BeatmapManager(Host.Storage, FileStore, connection, RulesetStore, API, Host));
|
||||||
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, connection, Host, BeatmapManager, RulesetStore));
|
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, connection, Host, BeatmapManager, RulesetStore));
|
||||||
dependencies.Cache(KeyBindingStore = new KeyBindingStore(connection, RulesetStore));
|
dependencies.Cache(KeyBindingStore = new KeyBindingStore(connection, RulesetStore));
|
||||||
dependencies.Cache(new OsuColour());
|
dependencies.Cache(new OsuColour());
|
||||||
@ -144,12 +150,6 @@ namespace osu.Game
|
|||||||
Beatmap = new NonNullableBindable<WorkingBeatmap>(defaultBeatmap);
|
Beatmap = new NonNullableBindable<WorkingBeatmap>(defaultBeatmap);
|
||||||
BeatmapManager.DefaultBeatmap = defaultBeatmap;
|
BeatmapManager.DefaultBeatmap = defaultBeatmap;
|
||||||
|
|
||||||
dependencies.Cache(API = new APIAccess
|
|
||||||
{
|
|
||||||
Username = LocalConfig.Get<string>(OsuSetting.Username),
|
|
||||||
Token = LocalConfig.Get<string>(OsuSetting.Token)
|
|
||||||
});
|
|
||||||
|
|
||||||
Beatmap.ValueChanged += b =>
|
Beatmap.ValueChanged += b =>
|
||||||
{
|
{
|
||||||
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
||||||
|
@ -76,7 +76,6 @@ namespace osu.Game.Overlays.Chat
|
|||||||
Size = new Vector2(text_size),
|
Size = new Vector2(text_size),
|
||||||
Shadow = false,
|
Shadow = false,
|
||||||
Margin = new MarginPadding { Right = 10f },
|
Margin = new MarginPadding { Right = 10f },
|
||||||
Alpha = 0f,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -109,7 +108,6 @@ namespace osu.Game.Overlays.Chat
|
|||||||
TextSize = text_size,
|
TextSize = text_size,
|
||||||
Font = @"Exo2.0-SemiBold",
|
Font = @"Exo2.0-SemiBold",
|
||||||
Shadow = false,
|
Shadow = false,
|
||||||
Alpha = 0.8f,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -151,6 +149,9 @@ namespace osu.Game.Overlays.Chat
|
|||||||
|
|
||||||
joinedBind.ValueChanged += updateColour;
|
joinedBind.ValueChanged += updateColour;
|
||||||
joinedBind.BindTo(channel.Joined);
|
joinedBind.BindTo(channel.Joined);
|
||||||
|
|
||||||
|
joinedBind.TriggerChange();
|
||||||
|
FinishTransforms(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnHover(InputState state)
|
protected override bool OnHover(InputState state)
|
||||||
|
@ -16,15 +16,16 @@ using osu.Game.Online.Chat;
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Chat
|
namespace osu.Game.Overlays.Chat
|
||||||
{
|
{
|
||||||
public class ChatTabControl : OsuTabControl<Channel>
|
public class ChatTabControl : OsuTabControl<Channel>
|
||||||
{
|
{
|
||||||
protected override TabItem<Channel> CreateTabItem(Channel value) => new ChannelTabItem(value);
|
|
||||||
|
|
||||||
private const float shear_width = 10;
|
private const float shear_width = 10;
|
||||||
|
|
||||||
|
public Action<Channel> OnRequestLeave;
|
||||||
|
|
||||||
public readonly Bindable<bool> ChannelSelectorActive = new Bindable<bool>();
|
public readonly Bindable<bool> ChannelSelectorActive = new Bindable<bool>();
|
||||||
|
|
||||||
private readonly ChannelTabItem.ChannelSelectorTabItem selectorTab;
|
private readonly ChannelTabItem.ChannelSelectorTabItem selectorTab;
|
||||||
@ -49,6 +50,20 @@ namespace osu.Game.Overlays.Chat
|
|||||||
ChannelSelectorActive.BindTo(selectorTab.Active);
|
ChannelSelectorActive.BindTo(selectorTab.Active);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void AddTabItem(TabItem<Channel> item, bool addToDropdown = true)
|
||||||
|
{
|
||||||
|
if (selectorTab.Depth < float.MaxValue)
|
||||||
|
// performTabSort might've made selectorTab's position wonky, fix it
|
||||||
|
TabContainer.ChangeChildDepth(selectorTab, float.MaxValue);
|
||||||
|
|
||||||
|
base.AddTabItem(item, addToDropdown);
|
||||||
|
|
||||||
|
if (SelectedTab == null)
|
||||||
|
SelectTab(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override TabItem<Channel> CreateTabItem(Channel value) => new ChannelTabItem(value) { OnRequestClose = tabCloseRequested };
|
||||||
|
|
||||||
protected override void SelectTab(TabItem<Channel> tab)
|
protected override void SelectTab(TabItem<Channel> tab)
|
||||||
{
|
{
|
||||||
if (tab is ChannelTabItem.ChannelSelectorTabItem)
|
if (tab is ChannelTabItem.ChannelSelectorTabItem)
|
||||||
@ -62,18 +77,38 @@ namespace osu.Game.Overlays.Chat
|
|||||||
base.SelectTab(tab);
|
base.SelectTab(tab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void tabCloseRequested(TabItem<Channel> tab)
|
||||||
|
{
|
||||||
|
int totalTabs = TabContainer.Count - 1; // account for selectorTab
|
||||||
|
int currentIndex = MathHelper.Clamp(TabContainer.IndexOf(tab), 1, totalTabs);
|
||||||
|
|
||||||
|
if (tab == SelectedTab && totalTabs > 1)
|
||||||
|
// Select the tab after tab-to-be-removed's index, or the tab before if current == last
|
||||||
|
SelectTab(TabContainer[currentIndex == totalTabs ? currentIndex - 1 : currentIndex + 1]);
|
||||||
|
else if (totalTabs == 1 && !selectorTab.Active)
|
||||||
|
// Open channel selection overlay if all channel tabs will be closed after removing this tab
|
||||||
|
SelectTab(selectorTab);
|
||||||
|
|
||||||
|
OnRequestLeave?.Invoke(tab.Value);
|
||||||
|
}
|
||||||
|
|
||||||
private class ChannelTabItem : TabItem<Channel>
|
private class ChannelTabItem : TabItem<Channel>
|
||||||
{
|
{
|
||||||
private Color4 backgroundInactive;
|
private Color4 backgroundInactive;
|
||||||
private Color4 backgroundHover;
|
private Color4 backgroundHover;
|
||||||
private Color4 backgroundActive;
|
private Color4 backgroundActive;
|
||||||
|
|
||||||
|
public override bool IsRemovable => !Pinned;
|
||||||
|
|
||||||
private readonly SpriteText text;
|
private readonly SpriteText text;
|
||||||
private readonly SpriteText textBold;
|
private readonly SpriteText textBold;
|
||||||
|
private readonly ClickableContainer closeButton;
|
||||||
private readonly Box box;
|
private readonly Box box;
|
||||||
private readonly Box highlightBox;
|
private readonly Box highlightBox;
|
||||||
private readonly SpriteIcon icon;
|
private readonly SpriteIcon icon;
|
||||||
|
|
||||||
|
public Action<ChannelTabItem> OnRequestClose;
|
||||||
|
|
||||||
private void updateState()
|
private void updateState()
|
||||||
{
|
{
|
||||||
if (Active)
|
if (Active)
|
||||||
@ -108,6 +143,9 @@ namespace osu.Game.Overlays.Chat
|
|||||||
|
|
||||||
protected override bool OnHover(InputState state)
|
protected override bool OnHover(InputState state)
|
||||||
{
|
{
|
||||||
|
if (IsRemovable)
|
||||||
|
closeButton.FadeIn(200, Easing.OutQuint);
|
||||||
|
|
||||||
if (!Active)
|
if (!Active)
|
||||||
box.FadeColour(backgroundHover, transition_length, Easing.OutQuint);
|
box.FadeColour(backgroundHover, transition_length, Easing.OutQuint);
|
||||||
return true;
|
return true;
|
||||||
@ -115,6 +153,7 @@ namespace osu.Game.Overlays.Chat
|
|||||||
|
|
||||||
protected override void OnHoverLost(InputState state)
|
protected override void OnHoverLost(InputState state)
|
||||||
{
|
{
|
||||||
|
closeButton.FadeOut(200, Easing.OutQuint);
|
||||||
updateState();
|
updateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,13 +243,69 @@ namespace osu.Game.Overlays.Chat
|
|||||||
Font = @"Exo2.0-Bold",
|
Font = @"Exo2.0-Bold",
|
||||||
TextSize = 18,
|
TextSize = 18,
|
||||||
},
|
},
|
||||||
}
|
closeButton = new CloseButton
|
||||||
}
|
{
|
||||||
|
Alpha = 0,
|
||||||
|
Margin = new MarginPadding { Right = 20 },
|
||||||
|
Origin = Anchor.CentreRight,
|
||||||
|
Anchor = Anchor.CentreRight,
|
||||||
|
Action = delegate
|
||||||
|
{
|
||||||
|
if (IsRemovable) OnRequestClose?.Invoke(this);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CloseButton : ClickableContainer
|
||||||
|
{
|
||||||
|
private readonly SpriteIcon icon;
|
||||||
|
|
||||||
|
public CloseButton()
|
||||||
|
{
|
||||||
|
Size = new Vector2(20);
|
||||||
|
|
||||||
|
Child = icon = new SpriteIcon
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
Scale = new Vector2(0.75f),
|
||||||
|
Icon = FontAwesome.fa_close,
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
|
||||||
|
{
|
||||||
|
icon.ScaleTo(0.5f, 1000, Easing.OutQuint);
|
||||||
|
return base.OnMouseDown(state, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
|
||||||
|
{
|
||||||
|
icon.ScaleTo(0.75f, 1000, Easing.OutElastic);
|
||||||
|
return base.OnMouseUp(state, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnHover(InputState state)
|
||||||
|
{
|
||||||
|
icon.FadeColour(Color4.Red, 200, Easing.OutQuint);
|
||||||
|
return base.OnHover(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnHoverLost(InputState state)
|
||||||
|
{
|
||||||
|
icon.FadeColour(Color4.White, 200, Easing.OutQuint);
|
||||||
|
base.OnHoverLost(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class ChannelSelectorTabItem : ChannelTabItem
|
public class ChannelSelectorTabItem : ChannelTabItem
|
||||||
{
|
{
|
||||||
|
public override bool IsRemovable => false;
|
||||||
|
|
||||||
public ChannelSelectorTabItem(Channel value) : base(value)
|
public ChannelSelectorTabItem(Channel value) : base(value)
|
||||||
{
|
{
|
||||||
Depth = float.MaxValue;
|
Depth = float.MaxValue;
|
||||||
|
@ -160,6 +160,7 @@ namespace osu.Game.Overlays
|
|||||||
channelTabs = new ChatTabControl
|
channelTabs = new ChatTabControl
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
OnRequestLeave = removeChannel,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -169,7 +170,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
channelTabs.Current.ValueChanged += newChannel => CurrentChannel = newChannel;
|
channelTabs.Current.ValueChanged += newChannel => CurrentChannel = newChannel;
|
||||||
channelTabs.ChannelSelectorActive.ValueChanged += value => channelSelection.State = value ? Visibility.Visible : Visibility.Hidden;
|
channelTabs.ChannelSelectorActive.ValueChanged += value => channelSelection.State = value ? Visibility.Visible : Visibility.Hidden;
|
||||||
channelSelection.StateChanged += (overlay, state) =>
|
channelSelection.StateChanged += state =>
|
||||||
{
|
{
|
||||||
channelTabs.ChannelSelectorActive.Value = state == Visibility.Visible;
|
channelTabs.ChannelSelectorActive.Value = state == Visibility.Visible;
|
||||||
|
|
||||||
@ -305,6 +306,7 @@ namespace osu.Game.Overlays
|
|||||||
addChannel(channels.Find(c => c.Name == @"#lobby"));
|
addChannel(channels.Find(c => c.Name == @"#lobby"));
|
||||||
|
|
||||||
channelSelection.OnRequestJoin = addChannel;
|
channelSelection.OnRequestJoin = addChannel;
|
||||||
|
channelSelection.OnRequestLeave = removeChannel;
|
||||||
channelSelection.Sections = new[]
|
channelSelection.Sections = new[]
|
||||||
{
|
{
|
||||||
new ChannelSection
|
new ChannelSection
|
||||||
@ -332,7 +334,15 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (currentChannel == value || value == null) return;
|
if (currentChannel == value) return;
|
||||||
|
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
currentChannel = null;
|
||||||
|
textbox.Current.Disabled = true;
|
||||||
|
currentChannelContainer.Clear(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
currentChannel = value;
|
currentChannel = value;
|
||||||
|
|
||||||
@ -391,6 +401,19 @@ namespace osu.Game.Overlays
|
|||||||
channel.Joined.Value = true;
|
channel.Joined.Value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeChannel(Channel channel)
|
||||||
|
{
|
||||||
|
if (channel == null) return;
|
||||||
|
|
||||||
|
if (channel == CurrentChannel) CurrentChannel = null;
|
||||||
|
|
||||||
|
careChannels.Remove(channel);
|
||||||
|
loadedChannels.Remove(loadedChannels.Find(c => c.Channel == channel));
|
||||||
|
channelTabs.RemoveItem(channel);
|
||||||
|
|
||||||
|
channel.Joined.Value = false;
|
||||||
|
}
|
||||||
|
|
||||||
private void fetchInitialMessages(Channel channel)
|
private void fetchInitialMessages(Channel channel)
|
||||||
{
|
{
|
||||||
var req = new GetMessagesRequest(new List<Channel> { channel }, null);
|
var req = new GetMessagesRequest(new List<Channel> { channel }, null);
|
||||||
|
@ -26,7 +26,7 @@ namespace osu.Game.Overlays
|
|||||||
dialogContainer.Add(currentDialog);
|
dialogContainer.Add(currentDialog);
|
||||||
|
|
||||||
currentDialog.Show();
|
currentDialog.Show();
|
||||||
currentDialog.StateChanged += onDialogOnStateChanged;
|
currentDialog.StateChanged += state => onDialogOnStateChanged(dialog, state);
|
||||||
State = Visibility.Visible;
|
State = Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
@ -20,8 +18,8 @@ using osu.Framework.Input;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Game.Beatmaps.IO;
|
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Direct
|
namespace osu.Game.Overlays.Direct
|
||||||
{
|
{
|
||||||
@ -97,6 +95,11 @@ namespace osu.Game.Overlays.Direct
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var downloadRequest = beatmaps.GetExistingDownload(SetInfo);
|
||||||
|
|
||||||
|
if (downloadRequest != null)
|
||||||
|
attachDownload(downloadRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnHover(InputState state)
|
protected override bool OnHover(InputState state)
|
||||||
@ -115,23 +118,8 @@ namespace osu.Game.Overlays.Direct
|
|||||||
base.OnHoverLost(state);
|
base.OnHoverLost(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this should eventually be moved to a more central place, like BeatmapManager.
|
|
||||||
private DownloadBeatmapSetRequest downloadRequest;
|
|
||||||
|
|
||||||
protected void StartDownload()
|
protected void StartDownload()
|
||||||
{
|
{
|
||||||
if (api == null) return;
|
|
||||||
|
|
||||||
// we already have an active download running.
|
|
||||||
if (downloadRequest != null)
|
|
||||||
{
|
|
||||||
content.MoveToX(-5, 50, Easing.OutSine).Then()
|
|
||||||
.MoveToX(5, 100, Easing.InOutSine).Then()
|
|
||||||
.MoveToX(-5, 100, Easing.InOutSine).Then()
|
|
||||||
.MoveToX(0, 50, Easing.InSine).Then();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!api.LocalUser.Value.IsSupporter)
|
if (!api.LocalUser.Value.IsSupporter)
|
||||||
{
|
{
|
||||||
notifications.Post(new SimpleNotification
|
notifications.Post(new SimpleNotification
|
||||||
@ -142,72 +130,43 @@ namespace osu.Game.Overlays.Direct
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (beatmaps.GetExistingDownload(SetInfo) != null)
|
||||||
|
{
|
||||||
|
// we already have an active download running.
|
||||||
|
content.MoveToX(-5, 50, Easing.OutSine).Then()
|
||||||
|
.MoveToX(5, 100, Easing.InOutSine).Then()
|
||||||
|
.MoveToX(-5, 100, Easing.InOutSine).Then()
|
||||||
|
.MoveToX(0, 50, Easing.InSine).Then();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = beatmaps.Download(SetInfo);
|
||||||
|
|
||||||
|
attachDownload(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void attachDownload(DownloadBeatmapSetRequest request)
|
||||||
|
{
|
||||||
progressBar.FadeIn(400, Easing.OutQuint);
|
progressBar.FadeIn(400, Easing.OutQuint);
|
||||||
progressBar.ResizeHeightTo(4, 400, Easing.OutQuint);
|
progressBar.ResizeHeightTo(4, 400, Easing.OutQuint);
|
||||||
|
|
||||||
progressBar.Current.Value = 0;
|
progressBar.Current.Value = 0;
|
||||||
|
|
||||||
ProgressNotification downloadNotification = new ProgressNotification
|
request.Failure += e =>
|
||||||
{
|
|
||||||
Text = $"Downloading {SetInfo.Metadata.Artist} - {SetInfo.Metadata.Title}",
|
|
||||||
};
|
|
||||||
|
|
||||||
downloadRequest = new DownloadBeatmapSetRequest(SetInfo);
|
|
||||||
downloadRequest.Failure += e =>
|
|
||||||
{
|
{
|
||||||
progressBar.Current.Value = 0;
|
progressBar.Current.Value = 0;
|
||||||
progressBar.FadeOut(500);
|
progressBar.FadeOut(500);
|
||||||
downloadNotification.State = ProgressNotificationState.Completed;
|
|
||||||
Logger.Error(e, "Failed to get beatmap download information");
|
Logger.Error(e, "Failed to get beatmap download information");
|
||||||
|
|
||||||
downloadRequest = null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
downloadRequest.Progress += (current, total) =>
|
request.DownloadProgressed += progress => progressBar.Current.Value = progress;
|
||||||
{
|
|
||||||
float progress = (float)current / total;
|
|
||||||
|
|
||||||
progressBar.Current.Value = progress;
|
request.Success += data =>
|
||||||
|
|
||||||
downloadNotification.State = ProgressNotificationState.Active;
|
|
||||||
downloadNotification.Progress = progress;
|
|
||||||
};
|
|
||||||
|
|
||||||
downloadRequest.Success += data =>
|
|
||||||
{
|
{
|
||||||
progressBar.Current.Value = 1;
|
progressBar.Current.Value = 1;
|
||||||
progressBar.FadeOut(500);
|
progressBar.FadeOut(500);
|
||||||
|
|
||||||
downloadNotification.State = ProgressNotificationState.Completed;
|
|
||||||
|
|
||||||
using (var stream = new MemoryStream(data))
|
|
||||||
using (var archive = new OszArchiveReader(stream))
|
|
||||||
beatmaps.Import(archive);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
downloadNotification.CancelRequested += () =>
|
|
||||||
{
|
|
||||||
downloadRequest.Cancel();
|
|
||||||
downloadRequest = null;
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
notifications.Post(downloadNotification);
|
|
||||||
|
|
||||||
// don't run in the main api queue as this is a long-running task.
|
|
||||||
Task.Run(() => downloadRequest.Perform(api));
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DownloadBeatmapSetRequest : APIDownloadRequest
|
|
||||||
{
|
|
||||||
private readonly BeatmapSetInfo beatmapSet;
|
|
||||||
|
|
||||||
public DownloadBeatmapSetRequest(BeatmapSetInfo beatmapSet)
|
|
||||||
{
|
|
||||||
this.beatmapSet = beatmapSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override string Target => $@"beatmapsets/{beatmapSet.OnlineBeatmapSetID}/download";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
|
@ -27,6 +27,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
private APIAccess api;
|
private APIAccess api;
|
||||||
private RulesetStore rulesets;
|
private RulesetStore rulesets;
|
||||||
|
private BeatmapManager beatmaps;
|
||||||
|
|
||||||
private readonly FillFlowContainer resultCountsContainer;
|
private readonly FillFlowContainer resultCountsContainer;
|
||||||
private readonly OsuSpriteText resultCountsText;
|
private readonly OsuSpriteText resultCountsText;
|
||||||
@ -46,9 +47,26 @@ namespace osu.Game.Overlays
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (beatmapSets?.Equals(value) ?? false) return;
|
if (beatmapSets?.Equals(value) ?? false) return;
|
||||||
|
|
||||||
beatmapSets = value;
|
beatmapSets = value;
|
||||||
|
|
||||||
recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
|
if (beatmapSets == null) return;
|
||||||
|
|
||||||
|
var artists = new List<string>();
|
||||||
|
var songs = new List<string>();
|
||||||
|
var tags = new List<string>();
|
||||||
|
foreach (var s in beatmapSets)
|
||||||
|
{
|
||||||
|
artists.Add(s.Metadata.Artist);
|
||||||
|
songs.Add(s.Metadata.Title);
|
||||||
|
tags.AddRange(s.Metadata.Tags.Split(' '));
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultAmounts = new ResultCounts(distinctCount(artists), distinctCount(songs), distinctCount(tags));
|
||||||
|
|
||||||
|
if (beatmapSets.Any() && panels == null)
|
||||||
|
// real use case? currently only seems to be for test case
|
||||||
|
recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,6 +165,8 @@ namespace osu.Game.Overlays
|
|||||||
{
|
{
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.rulesets = rulesets;
|
this.rulesets = rulesets;
|
||||||
|
this.beatmaps = beatmaps;
|
||||||
|
|
||||||
resultCountsContainer.Colour = colours.Yellow;
|
resultCountsContainer.Colour = colours.Yellow;
|
||||||
|
|
||||||
beatmaps.BeatmapSetAdded += setAdded;
|
beatmaps.BeatmapSetAdded += setAdded;
|
||||||
@ -156,6 +176,7 @@ namespace osu.Game.Overlays
|
|||||||
{
|
{
|
||||||
// if a new map was imported, we should remove it from search results (download completed etc.)
|
// if a new map was imported, we should remove it from search results (download completed etc.)
|
||||||
panels?.FirstOrDefault(p => p.SetInfo.OnlineBeatmapSetID == set.OnlineBeatmapSetID)?.FadeOut(400).Expire();
|
panels?.FirstOrDefault(p => p.SetInfo.OnlineBeatmapSetID == set.OnlineBeatmapSetID)?.FadeOut(400).Expire();
|
||||||
|
BeatmapSets = BeatmapSets?.Where(b => b.OnlineBeatmapSetID != set.OnlineBeatmapSetID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateResultCounts()
|
private void updateResultCounts()
|
||||||
@ -237,20 +258,11 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
getSetsRequest.Success += r =>
|
getSetsRequest.Success += r =>
|
||||||
{
|
{
|
||||||
BeatmapSets = r?.Select(response => response.ToBeatmapSet(rulesets));
|
BeatmapSets = r?.
|
||||||
if (BeatmapSets == null) return;
|
Select(response => response.ToBeatmapSet(rulesets)).
|
||||||
|
Where(b => beatmaps.QueryBeatmapSet(q => q.OnlineBeatmapSetID == b.OnlineBeatmapSetID) == null);
|
||||||
|
|
||||||
var artists = new List<string>();
|
recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
|
||||||
var songs = new List<string>();
|
|
||||||
var tags = new List<string>();
|
|
||||||
foreach (var s in BeatmapSets)
|
|
||||||
{
|
|
||||||
artists.Add(s.Metadata.Artist);
|
|
||||||
songs.Add(s.Metadata.Title);
|
|
||||||
tags.AddRange(s.Metadata.Tags.Split(' '));
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultAmounts = new ResultCounts(distinctCount(artists), distinctCount(songs), distinctCount(tags));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
api.Queue(getSetsRequest);
|
api.Queue(getSetsRequest);
|
||||||
|
@ -53,7 +53,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
private const float hidden_width = 120;
|
private const float hidden_width = 120;
|
||||||
|
|
||||||
private void keyBindingOverlay_StateChanged(VisibilityContainer container, Visibility visibility)
|
private void keyBindingOverlay_StateChanged(Visibility visibility)
|
||||||
{
|
{
|
||||||
switch (visibility)
|
switch (visibility)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
@ -19,6 +20,8 @@ namespace osu.Game.Overlays.MedalSplash
|
|||||||
private const float scale_when_unlocked = 0.76f;
|
private const float scale_when_unlocked = 0.76f;
|
||||||
private const float scale_when_full = 0.6f;
|
private const float scale_when_full = 0.6f;
|
||||||
|
|
||||||
|
public event Action<DisplayState> StateChanged;
|
||||||
|
|
||||||
private readonly Medal medal;
|
private readonly Medal medal;
|
||||||
private readonly Container medalContainer;
|
private readonly Container medalContainer;
|
||||||
private readonly Sprite medalSprite, medalGlow;
|
private readonly Sprite medalSprite, medalGlow;
|
||||||
@ -132,6 +135,8 @@ namespace osu.Game.Overlays.MedalSplash
|
|||||||
|
|
||||||
state = value;
|
state = value;
|
||||||
updateState();
|
updateState();
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
beatmapBacking.BindTo(game.Beatmap);
|
beatmapBacking.BindTo(game.Beatmap);
|
||||||
|
|
||||||
playlist.StateChanged += (c, s) => playlistButton.FadeColour(s == Visibility.Visible ? colours.Yellow : Color4.White, 200, Easing.OutQuint);
|
playlist.StateChanged += s => playlistButton.FadeColour(s == Visibility.Visible ? colours.Yellow : Color4.White, 200, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
@ -302,8 +302,8 @@ namespace osu.Game.Overlays
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//figure out the best direction based on order in playlist.
|
//figure out the best direction based on order in playlist.
|
||||||
var last = playlist.BeatmapSets.TakeWhile(b => b.ID != current.BeatmapSetInfo.ID).Count();
|
var last = playlist.BeatmapSets.TakeWhile(b => b.ID != current.BeatmapSetInfo?.ID).Count();
|
||||||
var next = beatmap == null ? -1 : playlist.BeatmapSets.TakeWhile(b => b.ID != beatmap.BeatmapSetInfo.ID).Count();
|
var next = beatmap == null ? -1 : playlist.BeatmapSets.TakeWhile(b => b.ID != beatmap.BeatmapSetInfo?.ID).Count();
|
||||||
|
|
||||||
direction = last > next ? TransformDirection.Prev : TransformDirection.Next;
|
direction = last > next ? TransformDirection.Prev : TransformDirection.Next;
|
||||||
}
|
}
|
||||||
|
@ -292,6 +292,8 @@ namespace osu.Game.Overlays.Settings.Sections.General
|
|||||||
Colour = Color4.Black.Opacity(0.25f),
|
Colour = Color4.Black.Opacity(0.25f),
|
||||||
Radius = 4,
|
Radius = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ItemsContainer.Padding = new MarginPadding();
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -300,8 +302,6 @@ namespace osu.Game.Overlays.Settings.Sections.General
|
|||||||
BackgroundColour = colours.Gray3;
|
BackgroundColour = colours.Gray3;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override MarginPadding ItemFlowContainerPadding => new MarginPadding();
|
|
||||||
|
|
||||||
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableUserDropdownMenuItem(item);
|
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableUserDropdownMenuItem(item);
|
||||||
|
|
||||||
private class DrawableUserDropdownMenuItem : DrawableOsuDropdownMenuItem
|
private class DrawableUserDropdownMenuItem : DrawableOsuDropdownMenuItem
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
@ -19,6 +20,9 @@ namespace osu.Game.Overlays.Settings
|
|||||||
private readonly FillFlowContainer<SidebarButton> content;
|
private readonly FillFlowContainer<SidebarButton> content;
|
||||||
internal const float DEFAULT_WIDTH = ToolbarButton.WIDTH;
|
internal const float DEFAULT_WIDTH = ToolbarButton.WIDTH;
|
||||||
internal const int EXPANDED_WIDTH = 200;
|
internal const int EXPANDED_WIDTH = 200;
|
||||||
|
|
||||||
|
public event Action<ExpandedState> StateChanged;
|
||||||
|
|
||||||
protected override Container<SidebarButton> Content => content;
|
protected override Container<SidebarButton> Content => content;
|
||||||
|
|
||||||
public Sidebar()
|
public Sidebar()
|
||||||
@ -102,6 +106,8 @@ namespace osu.Game.Overlays.Settings
|
|||||||
this.ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, Easing.OutQuint);
|
this.ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, Easing.OutQuint);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
stateContainer.StateChanged -= stateChanged;
|
stateContainer.StateChanged -= stateChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stateChanged(VisibilityContainer c, Visibility state)
|
private void stateChanged(Visibility state)
|
||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -167,6 +167,8 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
private class Wave : Container, IStateful<Visibility>
|
private class Wave : Container, IStateful<Visibility>
|
||||||
{
|
{
|
||||||
|
public event Action<Visibility> StateChanged;
|
||||||
|
|
||||||
public float FinalPosition;
|
public float FinalPosition;
|
||||||
|
|
||||||
public Wave()
|
public Wave()
|
||||||
@ -200,6 +202,7 @@ namespace osu.Game.Overlays
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Visibility state;
|
private Visibility state;
|
||||||
|
|
||||||
public Visibility State
|
public Visibility State
|
||||||
{
|
{
|
||||||
get { return state; }
|
get { return state; }
|
||||||
@ -216,6 +219,8 @@ namespace osu.Game.Overlays
|
|||||||
this.MoveToY(FinalPosition, APPEAR_DURATION, easing_show);
|
this.MoveToY(FinalPosition, APPEAR_DURATION, easing_show);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,11 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract string Name { get; }
|
public abstract string Name { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The shortened name of this mod.
|
||||||
|
/// </summary>
|
||||||
|
public abstract string ShortenedName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The icon of this mod.
|
/// The icon of this mod.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -24,6 +24,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public class ModAutoplay : Mod
|
public class ModAutoplay : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Autoplay";
|
public override string Name => "Autoplay";
|
||||||
|
public override string ShortenedName => "AT";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
|
||||||
public override string Description => "Watch a perfect automated play through the song";
|
public override string Description => "Watch a perfect automated play through the song";
|
||||||
public override double ScoreMultiplier => 0;
|
public override double ScoreMultiplier => 0;
|
||||||
|
@ -8,6 +8,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public class ModCinema : ModAutoplay
|
public class ModCinema : ModAutoplay
|
||||||
{
|
{
|
||||||
public override string Name => "Cinema";
|
public override string Name => "Cinema";
|
||||||
|
public override string ShortenedName => "CN";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_cinema;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_cinema;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModDaycore : ModHalfTime
|
public abstract class ModDaycore : ModHalfTime
|
||||||
{
|
{
|
||||||
public override string Name => "Daycore";
|
public override string Name => "Daycore";
|
||||||
|
public override string ShortenedName => "DC";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_question;
|
public override FontAwesome Icon => FontAwesome.fa_question;
|
||||||
public override string Description => "whoaaaaa";
|
public override string Description => "whoaaaaa";
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public class ModDoubleTime : Mod, IApplicableToClock
|
public class ModDoubleTime : Mod, IApplicableToClock
|
||||||
{
|
{
|
||||||
public override string Name => "Double Time";
|
public override string Name => "Double Time";
|
||||||
|
public override string ShortenedName => "DT";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override string Description => "Zoooooooooom";
|
public override string Description => "Zoooooooooom";
|
||||||
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModEasy : Mod, IApplicableToDifficulty
|
public abstract class ModEasy : Mod, IApplicableToDifficulty
|
||||||
{
|
{
|
||||||
public override string Name => "Easy";
|
public override string Name => "Easy";
|
||||||
|
public override string ShortenedName => "EZ";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy;
|
||||||
public override ModType Type => ModType.DifficultyReduction;
|
public override ModType Type => ModType.DifficultyReduction;
|
||||||
public override string Description => "Reduces overall difficulty - larger circles, more forgiving HP drain, less accuracy required.";
|
public override string Description => "Reduces overall difficulty - larger circles, more forgiving HP drain, less accuracy required.";
|
||||||
|
@ -8,6 +8,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModFlashlight : Mod
|
public abstract class ModFlashlight : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Flashlight";
|
public override string Name => "Flashlight";
|
||||||
|
public override string ShortenedName => "FL";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override string Description => "Restricted view area.";
|
public override string Description => "Restricted view area.";
|
||||||
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModHalfTime : Mod, IApplicableToClock
|
public abstract class ModHalfTime : Mod, IApplicableToClock
|
||||||
{
|
{
|
||||||
public override string Name => "Half Time";
|
public override string Name => "Half Time";
|
||||||
|
public override string ShortenedName => "HT";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime;
|
||||||
public override ModType Type => ModType.DifficultyReduction;
|
public override ModType Type => ModType.DifficultyReduction;
|
||||||
public override string Description => "Less zoom";
|
public override string Description => "Less zoom";
|
||||||
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModHardRock : Mod, IApplicableToDifficulty
|
public abstract class ModHardRock : Mod, IApplicableToDifficulty
|
||||||
{
|
{
|
||||||
public override string Name => "Hard Rock";
|
public override string Name => "Hard Rock";
|
||||||
|
public override string ShortenedName => "HR";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override string Description => "Everything just got a bit harder...";
|
public override string Description => "Everything just got a bit harder...";
|
||||||
|
@ -8,6 +8,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModHidden : Mod
|
public abstract class ModHidden : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Hidden";
|
public override string Name => "Hidden";
|
||||||
|
public override string ShortenedName => "HD";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
|
@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModNightcore : ModDoubleTime
|
public abstract class ModNightcore : ModDoubleTime
|
||||||
{
|
{
|
||||||
public override string Name => "Nightcore";
|
public override string Name => "Nightcore";
|
||||||
|
public override string ShortenedName => "NC";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore;
|
||||||
public override string Description => "uguuuuuuuu";
|
public override string Description => "uguuuuuuuu";
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModNoFail : Mod
|
public abstract class ModNoFail : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "NoFail";
|
public override string Name => "NoFail";
|
||||||
|
public override string ShortenedName => "NF";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail;
|
||||||
public override ModType Type => ModType.DifficultyReduction;
|
public override ModType Type => ModType.DifficultyReduction;
|
||||||
public override string Description => "You can't fail, no matter what.";
|
public override string Description => "You can't fail, no matter what.";
|
||||||
|
@ -6,6 +6,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModPerfect : ModSuddenDeath
|
public abstract class ModPerfect : ModSuddenDeath
|
||||||
{
|
{
|
||||||
public override string Name => "Perfect";
|
public override string Name => "Perfect";
|
||||||
|
public override string ShortenedName => "PF";
|
||||||
public override string Description => "SS or quit.";
|
public override string Description => "SS or quit.";
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,6 +9,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModRelax : Mod
|
public abstract class ModRelax : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Relax";
|
public override string Name => "Relax";
|
||||||
|
public override string ShortenedName => "RX";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
|
||||||
public override double ScoreMultiplier => 0;
|
public override double ScoreMultiplier => 0;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModNoFail), typeof(ModSuddenDeath) };
|
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModNoFail), typeof(ModSuddenDeath) };
|
||||||
|
@ -9,6 +9,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public abstract class ModSuddenDeath : Mod
|
public abstract class ModSuddenDeath : Mod
|
||||||
{
|
{
|
||||||
public override string Name => "Sudden Death";
|
public override string Name => "Sudden Death";
|
||||||
|
public override string ShortenedName => "SD";
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath;
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath;
|
||||||
public override ModType Type => ModType.DifficultyIncrease;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override string Description => "Miss a note and fail.";
|
public override string Description => "Miss a note and fail.";
|
||||||
|
@ -6,6 +6,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public class MultiMod : Mod
|
public class MultiMod : Mod
|
||||||
{
|
{
|
||||||
public override string Name => string.Empty;
|
public override string Name => string.Empty;
|
||||||
|
public override string ShortenedName => string.Empty;
|
||||||
public override string Description => string.Empty;
|
public override string Description => string.Empty;
|
||||||
public override double ScoreMultiplier => 0.0;
|
public override double ScoreMultiplier => 0.0;
|
||||||
|
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using osu.Game.Beatmaps;
|
using System;
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Rulesets.Mods;
|
|
||||||
using osu.Game.Rulesets.UI;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Rulesets.UI;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets
|
namespace osu.Game.Rulesets
|
||||||
{
|
{
|
||||||
@ -19,9 +21,18 @@ namespace osu.Game.Rulesets
|
|||||||
|
|
||||||
public virtual IEnumerable<BeatmapStatistic> GetBeatmapStatistics(WorkingBeatmap beatmap) => new BeatmapStatistic[] { };
|
public virtual IEnumerable<BeatmapStatistic> GetBeatmapStatistics(WorkingBeatmap beatmap) => new BeatmapStatistic[] { };
|
||||||
|
|
||||||
|
public IEnumerable<Mod> GetAllMods() => Enum.GetValues(typeof(ModType)).Cast<ModType>()
|
||||||
|
// Get all mod types as an IEnumerable<ModType>
|
||||||
|
.SelectMany(GetModsFor)
|
||||||
|
// Confine all mods of each mod type into a single IEnumerable<Mod>
|
||||||
|
.Where(mod => mod != null)
|
||||||
|
// Filter out all null mods
|
||||||
|
.SelectMany(mod => (mod as MultiMod)?.Mods ?? new[] { mod });
|
||||||
|
// Resolve MultiMods as their .Mods property
|
||||||
|
|
||||||
public abstract IEnumerable<Mod> GetModsFor(ModType type);
|
public abstract IEnumerable<Mod> GetModsFor(ModType type);
|
||||||
|
|
||||||
public abstract Mod GetAutoplayMod();
|
public Mod GetAutoplayMod() => GetAllMods().First(mod => mod is ModAutoplay);
|
||||||
|
|
||||||
protected Ruleset(RulesetInfo rulesetInfo)
|
protected Ruleset(RulesetInfo rulesetInfo)
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
@ -15,70 +14,30 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
{
|
{
|
||||||
public ScoreRank Rank { get; set; }
|
public ScoreRank Rank { get; set; }
|
||||||
|
|
||||||
[JsonProperty(@"score")]
|
|
||||||
public double TotalScore { get; set; }
|
public double TotalScore { get; set; }
|
||||||
|
|
||||||
public double Accuracy { get; set; }
|
public double Accuracy { get; set; }
|
||||||
|
|
||||||
public double Health { get; set; } = 1;
|
public double Health { get; set; } = 1;
|
||||||
|
|
||||||
[JsonProperty(@"max_combo")]
|
|
||||||
public int MaxCombo { get; set; }
|
public int MaxCombo { get; set; }
|
||||||
|
|
||||||
public int Combo { get; set; }
|
public int Combo { get; set; }
|
||||||
|
|
||||||
[JsonProperty(@"mods")]
|
|
||||||
protected string[] ModStrings { get; set; } //todo: parse to Mod objects
|
|
||||||
|
|
||||||
public RulesetInfo Ruleset { get; set; }
|
public RulesetInfo Ruleset { get; set; }
|
||||||
|
|
||||||
public Mod[] Mods { get; set; }
|
public Mod[] Mods { get; set; }
|
||||||
|
|
||||||
[JsonProperty(@"user")]
|
|
||||||
public User User;
|
public User User;
|
||||||
|
|
||||||
[JsonProperty(@"replay_data")]
|
|
||||||
public Replay Replay;
|
public Replay Replay;
|
||||||
|
|
||||||
public BeatmapInfo Beatmap;
|
public BeatmapInfo Beatmap;
|
||||||
|
|
||||||
[JsonProperty(@"score_id")]
|
|
||||||
public long OnlineScoreID;
|
public long OnlineScoreID;
|
||||||
|
|
||||||
[JsonProperty(@"created_at")]
|
|
||||||
public DateTimeOffset Date;
|
public DateTimeOffset Date;
|
||||||
|
|
||||||
[JsonProperty(@"statistics")]
|
|
||||||
private Dictionary<string, dynamic> jsonStats
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
foreach (var kvp in value)
|
|
||||||
{
|
|
||||||
string key = kvp.Key;
|
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case @"count_300":
|
|
||||||
key = @"300";
|
|
||||||
break;
|
|
||||||
case @"count_100":
|
|
||||||
key = @"100";
|
|
||||||
break;
|
|
||||||
case @"count_50":
|
|
||||||
key = @"50";
|
|
||||||
break;
|
|
||||||
case @"count_miss":
|
|
||||||
key = @"x";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Statistics.Add(key, kvp.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dictionary<string, dynamic> Statistics = new Dictionary<string, dynamic>();
|
public Dictionary<string, dynamic> Statistics = new Dictionary<string, dynamic>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
private readonly SpriteIcon modIcon;
|
private readonly SpriteIcon modIcon;
|
||||||
private readonly SpriteIcon background;
|
private readonly SpriteIcon background;
|
||||||
|
|
||||||
private const float icon_size = 80;
|
private const float background_size = 80;
|
||||||
|
|
||||||
public FontAwesome Icon
|
public FontAwesome Icon
|
||||||
{
|
{
|
||||||
@ -39,7 +39,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
{
|
{
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Size = new Vector2(icon_size),
|
Size = new Vector2(background_size),
|
||||||
Icon = FontAwesome.fa_osu_mod_bg,
|
Icon = FontAwesome.fa_osu_mod_bg,
|
||||||
Shadow = true,
|
Shadow = true,
|
||||||
},
|
},
|
||||||
@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Colour = OsuColour.Gray(84),
|
Colour = OsuColour.Gray(84),
|
||||||
Size = new Vector2(icon_size - 35),
|
Size = new Vector2(background_size - 35),
|
||||||
Y = 25,
|
Y = 25,
|
||||||
Icon = mod.Icon
|
Icon = mod.Icon
|
||||||
},
|
},
|
||||||
|
@ -75,9 +75,6 @@ namespace osu.Game.Rulesets.UI
|
|||||||
internal RulesetContainer(Ruleset ruleset)
|
internal RulesetContainer(Ruleset ruleset)
|
||||||
{
|
{
|
||||||
Ruleset = ruleset;
|
Ruleset = ruleset;
|
||||||
|
|
||||||
KeyBindingInputManager = CreateInputManager();
|
|
||||||
KeyBindingInputManager.RelativeSizeAxes = Axes.Both;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -206,6 +203,9 @@ namespace osu.Game.Rulesets.UI
|
|||||||
// Post-process the beatmap
|
// Post-process the beatmap
|
||||||
processor.PostProcess(Beatmap);
|
processor.PostProcess(Beatmap);
|
||||||
|
|
||||||
|
KeyBindingInputManager = CreateInputManager();
|
||||||
|
KeyBindingInputManager.RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
// Add mods, should always be the last thing applied to give full control to mods
|
// Add mods, should always be the last thing applied to give full control to mods
|
||||||
applyMods(Mods);
|
applyMods(Mods);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,11 @@ using osu.Framework.Screens;
|
|||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Screens.Edit.Menus;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Edit
|
namespace osu.Game.Screens.Edit
|
||||||
{
|
{
|
||||||
@ -17,6 +22,175 @@ namespace osu.Game.Screens.Edit
|
|||||||
|
|
||||||
protected override BackgroundScreen CreateBackground() => new BackgroundScreenCustom(@"Backgrounds/bg4");
|
protected override BackgroundScreen CreateBackground() => new BackgroundScreenCustom(@"Backgrounds/bg4");
|
||||||
|
|
||||||
|
internal override bool ShowOverlays => false;
|
||||||
|
|
||||||
|
public Editor()
|
||||||
|
{
|
||||||
|
Add(new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 40,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = OsuColour.FromHex("111")
|
||||||
|
},
|
||||||
|
new EditorMenuBar
|
||||||
|
{
|
||||||
|
Anchor = Anchor.CentreLeft,
|
||||||
|
Origin = Anchor.CentreLeft,
|
||||||
|
X = 100,
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuBarItem("File")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Clear all notes"),
|
||||||
|
new EditorMenuItem("Open difficulty..."),
|
||||||
|
new EditorMenuItem("Save"),
|
||||||
|
new EditorMenuItem("Create new difficulty..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Revert to saved"),
|
||||||
|
new EditorMenuItem("Revert to saved (full"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Test beatmap"),
|
||||||
|
new EditorMenuItem("Open AiMod"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Upload Beatmap..."),
|
||||||
|
new EditorMenuItem("Export package"),
|
||||||
|
new EditorMenuItem("Export map package"),
|
||||||
|
new EditorMenuItem("Import from..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Open song folder"),
|
||||||
|
new EditorMenuItem("Open .osu in Notepad"),
|
||||||
|
new EditorMenuItem("Open .osb in Notepad"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Exit", MenuItemType.Standard, Exit)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Edit")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Undo"),
|
||||||
|
new EditorMenuItem("Redo"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Cut"),
|
||||||
|
new EditorMenuItem("Copy"),
|
||||||
|
new EditorMenuItem("Paste"),
|
||||||
|
new EditorMenuItem("Delete"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Select all"),
|
||||||
|
new EditorMenuItem("Clone"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Reverse selection"),
|
||||||
|
new EditorMenuItem("Flip horizontally"),
|
||||||
|
new EditorMenuItem("Flip vertically"),
|
||||||
|
new EditorMenuItem("Rotate 90deg clockwise"),
|
||||||
|
new EditorMenuItem("Rotate 90deg anticlockwise"),
|
||||||
|
new EditorMenuItem("Rotate by..."),
|
||||||
|
new EditorMenuItem("Scale by..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Reset selected objects' samples"),
|
||||||
|
new EditorMenuItem("Reset all samples", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Reset combo colours", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Reset breaks", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Nudge backward"),
|
||||||
|
new EditorMenuItem("Nudge forward")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("View")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Compose"),
|
||||||
|
new EditorMenuItem("Design"),
|
||||||
|
new EditorMenuItem("Timing"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Song setup..."),
|
||||||
|
new EditorMenuItem("Timing setup..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Volume"),
|
||||||
|
new EditorMenuItem("Grid level"),
|
||||||
|
new EditorMenuItem("Show video"),
|
||||||
|
new EditorMenuItem("Show sample name"),
|
||||||
|
new EditorMenuItem("Snaking sliders"),
|
||||||
|
new EditorMenuItem("Hit animations"),
|
||||||
|
new EditorMenuItem("Follow points"),
|
||||||
|
new EditorMenuItem("Stacking")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Compose")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Snap divisor"),
|
||||||
|
new EditorMenuItem("Audio rate"),
|
||||||
|
new EditorMenuItem("Grid snapping"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Create polygon cricles..."),
|
||||||
|
new EditorMenuItem("Convert slider to stream"),
|
||||||
|
new EditorMenuItem("Enable live mapping mode"),
|
||||||
|
new EditorMenuItem("Sample import")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Design")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Move all elements in time...")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Timing")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Time signature"),
|
||||||
|
new EditorMenuItem("Metronome clicks"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Add timing section"),
|
||||||
|
new EditorMenuItem("Add inheriting section"),
|
||||||
|
new EditorMenuItem("Reset current section"),
|
||||||
|
new EditorMenuItem("Delete timing section"),
|
||||||
|
new EditorMenuItem("Resnap current section"),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Timing setup..."),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Resnap all notes", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Move all notes in time...", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Recalculate slider lengths", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItem("Delete all timing sections", MenuItemType.Destructive),
|
||||||
|
new EditorMenuItemSpacer(),
|
||||||
|
new EditorMenuItem("Set current position as preview point")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Web")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("This Beatmap's information page"),
|
||||||
|
new EditorMenuItem("This Beatmap's thread"),
|
||||||
|
new EditorMenuItem("Quick reply")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new EditorMenuBarItem("Help")
|
||||||
|
{
|
||||||
|
Items = new[]
|
||||||
|
{
|
||||||
|
new EditorMenuItem("Show in-game help"),
|
||||||
|
new EditorMenuItem("View FAQ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnResuming(Screen last)
|
protected override void OnResuming(Screen last)
|
||||||
{
|
{
|
||||||
Beatmap.Value.Track?.Stop();
|
Beatmap.Value.Track?.Stop();
|
||||||
|
122
osu.Game/Screens/Edit/Menus/EditorMenuBar.cs
Normal file
122
osu.Game/Screens/Edit/Menus/EditorMenuBar.cs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Graphics.UserInterface;
|
||||||
|
using osu.Framework.Input;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using OpenTK;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Menus
|
||||||
|
{
|
||||||
|
public class EditorMenuBar : OsuMenu
|
||||||
|
{
|
||||||
|
public EditorMenuBar()
|
||||||
|
: base(Direction.Horizontal, true)
|
||||||
|
{
|
||||||
|
ItemsContainer.Padding = new MarginPadding(0);
|
||||||
|
BackgroundColour = Color4.Transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Framework.Graphics.UserInterface.Menu CreateSubMenu() => new SubMenu();
|
||||||
|
|
||||||
|
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableEditorBarMenuItem(item);
|
||||||
|
|
||||||
|
private class DrawableEditorBarMenuItem : DrawableOsuMenuItem
|
||||||
|
{
|
||||||
|
private Color4 openedForegroundColour;
|
||||||
|
private Color4 openedBackgroundColour;
|
||||||
|
|
||||||
|
public DrawableEditorBarMenuItem(MenuItem item)
|
||||||
|
: base(item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colours)
|
||||||
|
{
|
||||||
|
ForegroundColour = ForegroundColourHover = colours.BlueLight;
|
||||||
|
BackgroundColour = BackgroundColourHover = Color4.Transparent;
|
||||||
|
openedForegroundColour = Color4.White;
|
||||||
|
openedBackgroundColour = colours.Gray3;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdateBackgroundColour()
|
||||||
|
{
|
||||||
|
if (State == MenuItemState.Selected)
|
||||||
|
Background.FadeColour(openedBackgroundColour);
|
||||||
|
else
|
||||||
|
base.UpdateBackgroundColour();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdateForegroundColour()
|
||||||
|
{
|
||||||
|
if (State == MenuItemState.Selected)
|
||||||
|
Foreground.FadeColour(openedForegroundColour);
|
||||||
|
else
|
||||||
|
base.UpdateForegroundColour();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Drawable CreateBackground() => new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Masking = true,
|
||||||
|
Child = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Height = 2,
|
||||||
|
Masking = true,
|
||||||
|
CornerRadius = 4,
|
||||||
|
Child = new Box { RelativeSizeAxes = Axes.Both }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SubMenu : OsuMenu
|
||||||
|
{
|
||||||
|
public SubMenu()
|
||||||
|
: base(Direction.Vertical)
|
||||||
|
{
|
||||||
|
OriginPosition = new Vector2(5, 1);
|
||||||
|
ItemsContainer.Padding = new MarginPadding { Top = 5, Bottom = 5 };
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colours)
|
||||||
|
{
|
||||||
|
BackgroundColour = colours.Gray3;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Framework.Graphics.UserInterface.Menu CreateSubMenu() => new SubMenu();
|
||||||
|
|
||||||
|
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableSubMenuItem(item);
|
||||||
|
|
||||||
|
private class DrawableSubMenuItem : DrawableOsuMenuItem
|
||||||
|
{
|
||||||
|
public DrawableSubMenuItem(MenuItem item)
|
||||||
|
: base(item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnHover(InputState state)
|
||||||
|
{
|
||||||
|
if (Item is EditorMenuItemSpacer)
|
||||||
|
return true;
|
||||||
|
return base.OnHover(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnClick(InputState state)
|
||||||
|
{
|
||||||
|
if (Item is EditorMenuItemSpacer)
|
||||||
|
return true;
|
||||||
|
return base.OnClick(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
osu.Game/Screens/Edit/Menus/EditorMenuBarItem.cs
Normal file
15
osu.Game/Screens/Edit/Menus/EditorMenuBarItem.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.UserInterface;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Menus
|
||||||
|
{
|
||||||
|
public class EditorMenuBarItem : MenuItem
|
||||||
|
{
|
||||||
|
public EditorMenuBarItem(string text)
|
||||||
|
: base(text)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
osu.Game/Screens/Edit/Menus/EditorMenuItem.cs
Normal file
23
osu.Game/Screens/Edit/Menus/EditorMenuItem.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Menus
|
||||||
|
{
|
||||||
|
public class EditorMenuItem : OsuMenuItem
|
||||||
|
{
|
||||||
|
private const int min_text_length = 40;
|
||||||
|
|
||||||
|
public EditorMenuItem(string text, MenuItemType type = MenuItemType.Standard)
|
||||||
|
: base(text.PadRight(min_text_length), type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public EditorMenuItem(string text, MenuItemType type, Action action)
|
||||||
|
: base(text.PadRight(min_text_length), type, action)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
osu.Game/Screens/Edit/Menus/EditorMenuItemSpacer.cs
Normal file
13
osu.Game/Screens/Edit/Menus/EditorMenuItemSpacer.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Menus
|
||||||
|
{
|
||||||
|
public class EditorMenuItemSpacer : EditorMenuItem
|
||||||
|
{
|
||||||
|
public EditorMenuItemSpacer()
|
||||||
|
: base(" ")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,8 @@ namespace osu.Game.Screens.Menu
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Button : BeatSyncedContainer, IStateful<ButtonState>
|
public class Button : BeatSyncedContainer, IStateful<ButtonState>
|
||||||
{
|
{
|
||||||
|
public event Action<ButtonState> StateChanged;
|
||||||
|
|
||||||
private readonly Container iconText;
|
private readonly Container iconText;
|
||||||
private readonly Container box;
|
private readonly Container box;
|
||||||
private readonly Box boxHoverLayer;
|
private readonly Box boxHoverLayer;
|
||||||
@ -266,6 +268,8 @@ namespace osu.Game.Screens.Menu
|
|||||||
this.FadeOut(explode_duration / 4f * 3);
|
this.FadeOut(explode_duration / 4f * 3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,8 @@ namespace osu.Game.Screens.Menu
|
|||||||
{
|
{
|
||||||
public class ButtonSystem : Container, IStateful<MenuState>
|
public class ButtonSystem : Container, IStateful<MenuState>
|
||||||
{
|
{
|
||||||
|
public event Action<MenuState> StateChanged;
|
||||||
|
|
||||||
public Action OnEdit;
|
public Action OnEdit;
|
||||||
public Action OnExit;
|
public Action OnExit;
|
||||||
public Action OnDirect;
|
public Action OnDirect;
|
||||||
@ -294,6 +296,8 @@ namespace osu.Game.Screens.Menu
|
|||||||
backButton.State = state == MenuState.Play ? ButtonState.Expanded : ButtonState.Contracted;
|
backButton.State = state == MenuState.Play ? ButtonState.Expanded : ButtonState.Contracted;
|
||||||
settingsButton.State = state == MenuState.TopLevel ? ButtonState.Expanded : ButtonState.Contracted;
|
settingsButton.State = state == MenuState.TopLevel ? ButtonState.Expanded : ButtonState.Contracted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
public override void Add(KeyCounter key)
|
public override void Add(KeyCounter key)
|
||||||
{
|
{
|
||||||
|
if (key == null) throw new ArgumentNullException(nameof(key));
|
||||||
|
|
||||||
base.Add(key);
|
base.Add(key);
|
||||||
key.IsCounting = IsCounting;
|
key.IsCounting = IsCounting;
|
||||||
key.FadeTime = FadeTime;
|
key.FadeTime = FadeTime;
|
||||||
|
@ -133,6 +133,8 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
private class FadeContainer : Container, IStateful<Visibility>
|
private class FadeContainer : Container, IStateful<Visibility>
|
||||||
{
|
{
|
||||||
|
public event Action<Visibility> StateChanged;
|
||||||
|
|
||||||
private Visibility state;
|
private Visibility state;
|
||||||
private ScheduledDelegate scheduledHide;
|
private ScheduledDelegate scheduledHide;
|
||||||
|
|
||||||
@ -144,8 +146,10 @@ namespace osu.Game.Screens.Play
|
|||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var lastState = state;
|
if (state == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var lastState = state;
|
||||||
state = value;
|
state = value;
|
||||||
|
|
||||||
scheduledHide?.Cancel();
|
scheduledHide?.Cancel();
|
||||||
@ -164,6 +168,8 @@ namespace osu.Game.Screens.Play
|
|||||||
this.FadeOut(1000, Easing.OutExpo);
|
this.FadeOut(1000, Easing.OutExpo);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
@ -170,6 +171,8 @@ namespace osu.Game.Screens.Play
|
|||||||
private const float padding = 2;
|
private const float padding = 2;
|
||||||
public const float WIDTH = cube_size + padding;
|
public const float WIDTH = cube_size + padding;
|
||||||
|
|
||||||
|
public event Action<ColumnState> StateChanged;
|
||||||
|
|
||||||
private readonly List<Box> drawableRows = new List<Box>();
|
private readonly List<Box> drawableRows = new List<Box>();
|
||||||
|
|
||||||
private float filled;
|
private float filled;
|
||||||
@ -186,6 +189,7 @@ namespace osu.Game.Screens.Play
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ColumnState state;
|
private ColumnState state;
|
||||||
|
|
||||||
public ColumnState State
|
public ColumnState State
|
||||||
{
|
{
|
||||||
get { return state; }
|
get { return state; }
|
||||||
@ -196,6 +200,8 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
if (IsLoaded)
|
if (IsLoaded)
|
||||||
fillActive();
|
fillActive();
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@ -10,6 +11,8 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
public class BeatmapDetailArea : Container
|
public class BeatmapDetailArea : Container
|
||||||
{
|
{
|
||||||
|
private const float details_padding = 10;
|
||||||
|
|
||||||
private readonly Container content;
|
private readonly Container content;
|
||||||
protected override Container<Drawable> Content => content;
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
@ -66,9 +69,8 @@ namespace osu.Game.Screens.Select
|
|||||||
Details = new BeatmapDetails
|
Details = new BeatmapDetails
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Masking = true,
|
|
||||||
Height = 352,
|
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
|
Margin = new MarginPadding { Top = details_padding },
|
||||||
},
|
},
|
||||||
Leaderboard = new Leaderboard
|
Leaderboard = new Leaderboard
|
||||||
{
|
{
|
||||||
@ -76,5 +78,12 @@ namespace osu.Game.Screens.Select
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void UpdateAfterChildren()
|
||||||
|
{
|
||||||
|
base.UpdateAfterChildren();
|
||||||
|
|
||||||
|
Details.Height = Math.Min(DrawHeight - details_padding * 3 - BeatmapDetailAreaTabControl.HEIGHT, 450);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,71 +9,189 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Game.Screens.Select.Details;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select
|
namespace osu.Game.Screens.Select
|
||||||
{
|
{
|
||||||
public class BeatmapDetails : Container
|
public class BeatmapDetails : Container
|
||||||
{
|
{
|
||||||
private readonly MetadataSegment description;
|
private const float spacing = 10;
|
||||||
private readonly MetadataSegment source;
|
private const float transition_duration = 250;
|
||||||
private readonly MetadataSegment tags;
|
|
||||||
|
|
||||||
private readonly DifficultyRow circleSize;
|
private readonly FillFlowContainer top, statsFlow;
|
||||||
private readonly DifficultyRow drainRate;
|
private readonly AdvancedStats advanced;
|
||||||
private readonly DifficultyRow overallDifficulty;
|
private readonly DetailBox ratingsContainer;
|
||||||
private readonly DifficultyRow approachRate;
|
private readonly UserRatings ratings;
|
||||||
private readonly DifficultyRow stars;
|
private readonly ScrollContainer metadataScroll;
|
||||||
|
private readonly MetadataSection description, source, tags;
|
||||||
|
private readonly Container failRetryContainer;
|
||||||
|
private readonly FailRetryGraph failRetryGraph;
|
||||||
|
private readonly DimmedLoadingAnimation loading;
|
||||||
|
|
||||||
private readonly Container ratingsContainer;
|
private APIAccess api;
|
||||||
private readonly Bar ratingsBar;
|
|
||||||
private readonly OsuSpriteText negativeRatings;
|
|
||||||
private readonly OsuSpriteText positiveRatings;
|
|
||||||
private readonly BarGraph ratingsGraph;
|
|
||||||
|
|
||||||
private readonly FillFlowContainer retryFailContainer;
|
|
||||||
private readonly BarGraph retryGraph;
|
|
||||||
private readonly BarGraph failGraph;
|
|
||||||
|
|
||||||
private ScheduledDelegate pendingBeatmapSwitch;
|
private ScheduledDelegate pendingBeatmapSwitch;
|
||||||
private BeatmapInfo beatmap;
|
|
||||||
|
|
||||||
|
private BeatmapInfo beatmap;
|
||||||
public BeatmapInfo Beatmap
|
public BeatmapInfo Beatmap
|
||||||
{
|
{
|
||||||
get { return beatmap; }
|
get { return beatmap; }
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (beatmap == value) return;
|
if (value == beatmap) return;
|
||||||
|
|
||||||
beatmap = value;
|
beatmap = value;
|
||||||
|
|
||||||
pendingBeatmapSwitch?.Cancel();
|
pendingBeatmapSwitch?.Cancel();
|
||||||
pendingBeatmapSwitch = Schedule(updateStats);
|
pendingBeatmapSwitch = Schedule(updateStatistics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateStats()
|
public BeatmapDetails()
|
||||||
{
|
{
|
||||||
if (beatmap == null) return;
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = Color4.Black.Opacity(0.5f),
|
||||||
|
},
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Padding = new MarginPadding { Horizontal = spacing },
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
top = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Direction = FillDirection.Horizontal,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
statsFlow = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Width = 0.5f,
|
||||||
|
Spacing = new Vector2(spacing),
|
||||||
|
Padding = new MarginPadding { Right = spacing / 2 },
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
new DetailBox
|
||||||
|
{
|
||||||
|
Child = advanced = new AdvancedStats
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Padding = new MarginPadding { Horizontal = spacing, Top = spacing * 2, Bottom = spacing },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ratingsContainer = new DetailBox
|
||||||
|
{
|
||||||
|
Child = ratings = new UserRatings
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 134,
|
||||||
|
Padding = new MarginPadding { Horizontal = spacing, Top = spacing },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metadataScroll = new ScrollContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Width = 0.5f,
|
||||||
|
ScrollbarVisible = false,
|
||||||
|
Padding = new MarginPadding { Left = spacing / 2 },
|
||||||
|
Child = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
LayoutDuration = transition_duration,
|
||||||
|
Spacing = new Vector2(spacing * 2),
|
||||||
|
Margin = new MarginPadding { Top = spacing * 2 },
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
description = new MetadataSection("Description")
|
||||||
|
{
|
||||||
|
TextColour = Color4.White.Opacity(0.75f),
|
||||||
|
},
|
||||||
|
source = new MetadataSection("Source")
|
||||||
|
{
|
||||||
|
TextColour = Color4.White.Opacity(0.75f),
|
||||||
|
},
|
||||||
|
tags = new MetadataSection("Tags"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
failRetryContainer = new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = "Points of Failure",
|
||||||
|
Font = @"Exo2.0-Bold",
|
||||||
|
TextSize = 14,
|
||||||
|
},
|
||||||
|
failRetryGraph = new FailRetryGraph
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Padding = new MarginPadding { Top = 14 + spacing / 2 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
loading = new DimmedLoadingAnimation
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
description.Text = beatmap.Version;
|
[BackgroundDependencyLoader]
|
||||||
source.Text = beatmap.Metadata.Source;
|
private void load(OsuColour colours, APIAccess api)
|
||||||
tags.Text = beatmap.Metadata.Tags;
|
{
|
||||||
|
this.api = api;
|
||||||
|
tags.TextColour = colours.Yellow;
|
||||||
|
}
|
||||||
|
|
||||||
circleSize.Value = beatmap.Difficulty.CircleSize;
|
protected override void UpdateAfterChildren()
|
||||||
drainRate.Value = beatmap.Difficulty.DrainRate;
|
{
|
||||||
overallDifficulty.Value = beatmap.Difficulty.OverallDifficulty;
|
base.UpdateAfterChildren();
|
||||||
approachRate.Value = beatmap.Difficulty.ApproachRate;
|
|
||||||
stars.Value = (float)beatmap.StarDifficulty;
|
|
||||||
|
|
||||||
var requestedBeatmap = beatmap;
|
metadataScroll.Height = statsFlow.DrawHeight;
|
||||||
|
failRetryContainer.Height = DrawHeight - Padding.TotalVertical - (top.DrawHeight + spacing / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateStatistics()
|
||||||
|
{
|
||||||
|
if (Beatmap == null)
|
||||||
|
{
|
||||||
|
clearStats();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ratingsContainer.FadeIn(transition_duration);
|
||||||
|
advanced.Beatmap = Beatmap;
|
||||||
|
description.Text = Beatmap.Version;
|
||||||
|
source.Text = Beatmap.Metadata.Source;
|
||||||
|
tags.Text = Beatmap.Metadata.Tags;
|
||||||
|
|
||||||
|
var requestedBeatmap = Beatmap;
|
||||||
if (requestedBeatmap.Metrics == null)
|
if (requestedBeatmap.Metrics == null)
|
||||||
{
|
{
|
||||||
var lookup = new GetBeatmapDetailsRequest(requestedBeatmap);
|
var lookup = new GetBeatmapDetailsRequest(requestedBeatmap);
|
||||||
@ -84,413 +202,195 @@ namespace osu.Game.Screens.Select
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
requestedBeatmap.Metrics = res;
|
requestedBeatmap.Metrics = res;
|
||||||
Schedule(() => updateMetrics(res));
|
Schedule(() => displayMetrics(res));
|
||||||
};
|
};
|
||||||
lookup.Failure += e => Schedule(() => updateMetrics(null));
|
lookup.Failure += e => Schedule(() => displayMetrics(null));
|
||||||
|
|
||||||
api.Queue(lookup);
|
api.Queue(lookup);
|
||||||
loading.Show();
|
loading.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateMetrics(requestedBeatmap.Metrics, false);
|
displayMetrics(requestedBeatmap.Metrics, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private void displayMetrics(BeatmapMetrics metrics, bool failOnMissing = true)
|
||||||
/// Update displayed metrics.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="metrics">New metrics to overwrite the existing display. Can be null.</param>
|
|
||||||
/// <param name="failOnMissing">Whether to hide the display on null or empty metrics. If false, we will dim as if waiting for further updates.</param>
|
|
||||||
private void updateMetrics(BeatmapMetrics metrics, bool failOnMissing = true)
|
|
||||||
{
|
{
|
||||||
var hasRatings = metrics?.Ratings.Any() ?? false;
|
var hasRatings = metrics?.Ratings?.Any() ?? false;
|
||||||
var hasRetriesFails = (metrics?.Retries.Any() ?? false) && metrics.Fails.Any();
|
var hasRetriesFails = (metrics?.Retries?.Any() ?? false) && (metrics.Fails?.Any() ?? false);
|
||||||
|
|
||||||
if (failOnMissing)
|
if (failOnMissing) loading.Hide();
|
||||||
loading.Hide();
|
|
||||||
|
|
||||||
if (hasRatings)
|
if (hasRatings)
|
||||||
{
|
{
|
||||||
var ratings = metrics.Ratings.ToList();
|
ratings.Metrics = metrics;
|
||||||
ratingsContainer.Show();
|
ratings.FadeIn(transition_duration);
|
||||||
|
|
||||||
negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2).Sum().ToString();
|
|
||||||
positiveRatings.Text = ratings.GetRange(ratings.Count / 2, ratings.Count / 2).Sum().ToString();
|
|
||||||
ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2).Sum() / ratings.Sum();
|
|
||||||
|
|
||||||
ratingsGraph.Values = ratings.Select(rating => (float)rating);
|
|
||||||
|
|
||||||
ratingsContainer.FadeColour(Color4.White, 500, Easing.Out);
|
|
||||||
}
|
}
|
||||||
else if (failOnMissing)
|
else if (failOnMissing)
|
||||||
ratingsGraph.Values = new float[10];
|
{
|
||||||
|
ratings.Metrics = new BeatmapMetrics
|
||||||
|
{
|
||||||
|
Ratings = new int[10],
|
||||||
|
};
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ratingsContainer.FadeColour(Color4.Gray, 500, Easing.Out);
|
{
|
||||||
|
ratings.FadeTo(0.25f, transition_duration);
|
||||||
|
}
|
||||||
|
|
||||||
if (hasRetriesFails)
|
if (hasRetriesFails)
|
||||||
{
|
{
|
||||||
var retries = metrics.Retries;
|
failRetryGraph.Metrics = metrics;
|
||||||
var fails = metrics.Fails;
|
failRetryContainer.FadeIn(transition_duration);
|
||||||
retryFailContainer.Show();
|
|
||||||
|
|
||||||
float maxValue = fails.Zip(retries, (fail, retry) => fail + retry).Max();
|
|
||||||
failGraph.MaxValue = maxValue;
|
|
||||||
retryGraph.MaxValue = maxValue;
|
|
||||||
|
|
||||||
failGraph.Values = fails.Select(fail => (float)fail);
|
|
||||||
retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
|
|
||||||
|
|
||||||
retryFailContainer.FadeColour(Color4.White, 500, Easing.Out);
|
|
||||||
}
|
}
|
||||||
else if (failOnMissing)
|
else if (failOnMissing)
|
||||||
{
|
{
|
||||||
failGraph.Values = new float[100];
|
failRetryGraph.Metrics = new BeatmapMetrics
|
||||||
retryGraph.Values = new float[100];
|
{
|
||||||
|
Fails = new int[100],
|
||||||
|
Retries = new int[100],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
retryFailContainer.FadeColour(Color4.Gray, 500, Easing.Out);
|
{
|
||||||
|
failRetryContainer.FadeTo(0.25f, transition_duration);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BeatmapDetails()
|
private void clearStats()
|
||||||
{
|
{
|
||||||
Children = new Drawable[]
|
description.Text = null;
|
||||||
|
source.Text = null;
|
||||||
|
tags.Text = null;
|
||||||
|
advanced.Beatmap = new BeatmapInfo
|
||||||
{
|
{
|
||||||
new Box
|
StarDifficulty = 0,
|
||||||
|
Difficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
CircleSize = 0,
|
||||||
Colour = Color4.Black,
|
DrainRate = 0,
|
||||||
Alpha = 0.5f,
|
OverallDifficulty = 0,
|
||||||
|
ApproachRate = 0,
|
||||||
},
|
},
|
||||||
new FillFlowContainer<MetadataSegment>
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopRight,
|
|
||||||
Origin = Anchor.TopRight,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Width = 0.4f,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
LayoutDuration = 200,
|
|
||||||
LayoutEasing = Easing.OutQuint,
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
description = new MetadataSegment("Description"),
|
|
||||||
source = new MetadataSegment("Source"),
|
|
||||||
tags = new MetadataSegment("Tags")
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Width = 0.6f,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
Spacing = new Vector2(0, 15),
|
|
||||||
Padding = new MarginPadding(10) { Top = 0 },
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.Black,
|
|
||||||
Alpha = 0.5f,
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
Spacing = new Vector2(0, 5),
|
|
||||||
Padding = new MarginPadding(10),
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
circleSize = new DifficultyRow("Circle Size", 7),
|
|
||||||
drainRate = new DifficultyRow("HP Drain"),
|
|
||||||
overallDifficulty = new DifficultyRow("Accuracy"),
|
|
||||||
approachRate = new DifficultyRow("Approach Rate"),
|
|
||||||
stars = new DifficultyRow("Star Difficulty"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ratingsContainer = new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Alpha = 0,
|
|
||||||
AlwaysPresent = true,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.Black,
|
|
||||||
Alpha = 0.5f,
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
Padding = new MarginPadding
|
|
||||||
{
|
|
||||||
Top = 25,
|
|
||||||
Left = 15,
|
|
||||||
Right = 15,
|
|
||||||
},
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = "User Rating",
|
|
||||||
Font = @"Exo2.0-Medium",
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
},
|
|
||||||
ratingsBar = new Bar
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = 5,
|
|
||||||
},
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
negativeRatings = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
Text = "0",
|
|
||||||
},
|
|
||||||
positiveRatings = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
Text = "0",
|
|
||||||
Anchor = Anchor.TopRight,
|
|
||||||
Origin = Anchor.TopRight,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = "Rating Spread",
|
|
||||||
TextSize = 14,
|
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
},
|
|
||||||
ratingsGraph = new BarGraph
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = 50,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
retryFailContainer = new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Alpha = 0,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = "Points of Failure",
|
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
},
|
|
||||||
new Container<BarGraph>
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Size = new Vector2(1 / 0.6f, 50),
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
retryGraph = new BarGraph
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
},
|
|
||||||
failGraph = new BarGraph
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
loading = new LoadingAnimation()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
loading.Hide();
|
||||||
|
ratingsContainer.FadeOut(transition_duration);
|
||||||
|
failRetryContainer.FadeOut(transition_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
private APIAccess api;
|
private class DetailBox : Container
|
||||||
private readonly LoadingAnimation loading;
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colour, APIAccess api)
|
|
||||||
{
|
{
|
||||||
this.api = api;
|
private readonly Container content;
|
||||||
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
description.AccentColour = colour.GrayB;
|
public DetailBox()
|
||||||
source.AccentColour = colour.GrayB;
|
|
||||||
tags.AccentColour = colour.YellowLight;
|
|
||||||
|
|
||||||
stars.AccentColour = colour.Yellow;
|
|
||||||
|
|
||||||
ratingsBar.BackgroundColour = colour.Green;
|
|
||||||
ratingsBar.AccentColour = colour.YellowDark;
|
|
||||||
ratingsGraph.Colour = colour.BlueDark;
|
|
||||||
|
|
||||||
failGraph.Colour = colour.YellowDarker;
|
|
||||||
retryGraph.Colour = colour.Yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DifficultyRow : Container, IHasAccentColour
|
|
||||||
{
|
|
||||||
private readonly OsuSpriteText name;
|
|
||||||
private readonly Bar bar;
|
|
||||||
private readonly OsuSpriteText valueText;
|
|
||||||
|
|
||||||
private readonly float maxValue;
|
|
||||||
|
|
||||||
private float difficultyValue;
|
|
||||||
public float Value
|
|
||||||
{
|
{
|
||||||
get
|
|
||||||
{
|
|
||||||
return difficultyValue;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
difficultyValue = value;
|
|
||||||
bar.Length = value / maxValue;
|
|
||||||
valueText.Text = value.ToString("N1", CultureInfo.CurrentCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color4 AccentColour
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return bar.AccentColour;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
bar.AccentColour = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DifficultyRow(string difficultyName, float maxValue = 10)
|
|
||||||
{
|
|
||||||
this.maxValue = maxValue;
|
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
Children = new Drawable[]
|
|
||||||
|
InternalChildren = new Drawable[]
|
||||||
{
|
{
|
||||||
name = new OsuSpriteText
|
new Box
|
||||||
{
|
{
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
Text = difficultyName,
|
|
||||||
},
|
|
||||||
bar = new Bar
|
|
||||||
{
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Size = new Vector2(1, 0.35f),
|
Colour = Color4.Black.Opacity(0.5f),
|
||||||
Padding = new MarginPadding { Left = 100, Right = 25 },
|
|
||||||
},
|
},
|
||||||
valueText = new OsuSpriteText
|
content = new Container
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopRight,
|
RelativeSizeAxes = Axes.X,
|
||||||
Origin = Anchor.TopRight,
|
AutoSizeAxes = Axes.Y,
|
||||||
Font = @"Exo2.0-Regular",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colour)
|
|
||||||
{
|
|
||||||
name.Colour = colour.GrayB;
|
|
||||||
bar.BackgroundColour = colour.Gray7;
|
|
||||||
valueText.Colour = colour.GrayB;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MetadataSegment : Container, IHasAccentColour
|
private class MetadataSection : Container
|
||||||
{
|
{
|
||||||
private readonly OsuSpriteText header;
|
private readonly TextFlowContainer textFlow;
|
||||||
private readonly FillFlowContainer<OsuSpriteText> content;
|
|
||||||
|
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(value))
|
if (string.IsNullOrEmpty(value))
|
||||||
Hide();
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
Show();
|
this.FadeOut(transition_duration);
|
||||||
if (header.Text == "Tags")
|
return;
|
||||||
content.ChildrenEnumerable = value.Split(' ').Select(text => new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = text,
|
|
||||||
Font = "Exo2.0-Regular",
|
|
||||||
});
|
|
||||||
else
|
|
||||||
content.Children = new[]
|
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = value,
|
|
||||||
Font = "Exo2.0-Regular",
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.FadeIn(transition_duration);
|
||||||
|
textFlow.Clear();
|
||||||
|
textFlow.AddText(value, s => s.TextSize = 14);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Color4 AccentColour
|
public Color4 TextColour
|
||||||
{
|
{
|
||||||
get
|
get { return textFlow.Colour; }
|
||||||
{
|
set { textFlow.Colour = value; }
|
||||||
return content.Colour;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
content.Colour = value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MetadataSegment(string headerText)
|
public MetadataSection(string title)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
Margin = new MarginPadding { Top = 10 };
|
|
||||||
|
InternalChild = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Spacing = new Vector2(spacing / 2),
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Child = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = title,
|
||||||
|
Font = @"Exo2.0-Bold",
|
||||||
|
TextSize = 14,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
textFlow = new TextFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class DimmedLoadingAnimation : VisibilityContainer
|
||||||
|
{
|
||||||
|
private readonly LoadingAnimation loading;
|
||||||
|
|
||||||
|
public DimmedLoadingAnimation()
|
||||||
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
header = new OsuSpriteText
|
new Box
|
||||||
{
|
{
|
||||||
Font = @"Exo2.0-Bold",
|
RelativeSizeAxes = Axes.Both,
|
||||||
Text = headerText,
|
Colour = Color4.Black.Opacity(0.5f),
|
||||||
},
|
},
|
||||||
content = new FillFlowContainer<OsuSpriteText>
|
loading = new LoadingAnimation(),
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Direction = FillDirection.Full,
|
|
||||||
Spacing = new Vector2(5, 0),
|
|
||||||
Margin = new MarginPadding { Top = header.TextSize }
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void PopIn()
|
||||||
|
{
|
||||||
|
this.FadeIn(transition_duration, Easing.OutQuint);
|
||||||
|
loading.State = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void PopOut()
|
||||||
|
{
|
||||||
|
this.FadeOut(transition_duration, Easing.OutQuint);
|
||||||
|
loading.State = Visibility.Hidden;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
152
osu.Game/Screens/Select/Details/AdvancedStats.cs
Normal file
152
osu.Game/Screens/Select/Details/AdvancedStats.cs
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using OpenTK;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using System;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Select.Details
|
||||||
|
{
|
||||||
|
public class AdvancedStats : Container
|
||||||
|
{
|
||||||
|
private readonly StatisticRow firstValue, hpDrain, accuracy, approachRate, starDifficulty;
|
||||||
|
|
||||||
|
private BeatmapInfo beatmap;
|
||||||
|
public BeatmapInfo Beatmap
|
||||||
|
{
|
||||||
|
get { return beatmap; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == beatmap) return;
|
||||||
|
beatmap = value;
|
||||||
|
|
||||||
|
//mania specific
|
||||||
|
if ((Beatmap?.Ruleset?.ID ?? 0) == 3)
|
||||||
|
{
|
||||||
|
firstValue.Title = "Key Amount";
|
||||||
|
firstValue.Value = (int)Math.Round(Beatmap?.Difficulty?.CircleSize ?? 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
firstValue.Title = "Circle Size";
|
||||||
|
firstValue.Value = Beatmap?.Difficulty?.CircleSize ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hpDrain.Value = beatmap.Difficulty.DrainRate;
|
||||||
|
accuracy.Value = beatmap.Difficulty.OverallDifficulty;
|
||||||
|
approachRate.Value = beatmap.Difficulty.ApproachRate;
|
||||||
|
starDifficulty.Value = (float)beatmap.StarDifficulty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdvancedStats()
|
||||||
|
{
|
||||||
|
Child = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Spacing = new Vector2(4f),
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
firstValue = new StatisticRow(), //circle size/key amount
|
||||||
|
hpDrain = new StatisticRow { Title = "HP Drain" },
|
||||||
|
accuracy = new StatisticRow { Title = "Accuracy" },
|
||||||
|
approachRate = new StatisticRow { Title = "Approach Rate" },
|
||||||
|
starDifficulty = new StatisticRow(10, true) { Title = "Star Difficulty" },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colours)
|
||||||
|
{
|
||||||
|
starDifficulty.AccentColour = colours.Yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class StatisticRow : Container, IHasAccentColour
|
||||||
|
{
|
||||||
|
private const float value_width = 25;
|
||||||
|
private const float name_width = 70;
|
||||||
|
|
||||||
|
private readonly float maxValue;
|
||||||
|
private readonly bool forceDecimalPlaces;
|
||||||
|
private readonly OsuSpriteText name, value;
|
||||||
|
private readonly Bar bar;
|
||||||
|
|
||||||
|
public string Title
|
||||||
|
{
|
||||||
|
get { return name.Text; }
|
||||||
|
set { name.Text = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private float difficultyValue;
|
||||||
|
public float Value
|
||||||
|
{
|
||||||
|
get { return difficultyValue; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
difficultyValue = value;
|
||||||
|
bar.Length = value / maxValue;
|
||||||
|
this.value.Text = value.ToString(forceDecimalPlaces ? "0.00" : "0.##");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color4 AccentColour
|
||||||
|
{
|
||||||
|
get { return bar.AccentColour; }
|
||||||
|
set { bar.AccentColour = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatisticRow(float maxValue = 10, bool forceDecimalPlaces = false)
|
||||||
|
{
|
||||||
|
this.maxValue = maxValue;
|
||||||
|
this.forceDecimalPlaces = forceDecimalPlaces;
|
||||||
|
RelativeSizeAxes = Axes.X;
|
||||||
|
AutoSizeAxes = Axes.Y;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
Width = name_width,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Child = name = new OsuSpriteText
|
||||||
|
{
|
||||||
|
TextSize = 13,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
bar = new Bar
|
||||||
|
{
|
||||||
|
Origin = Anchor.CentreLeft,
|
||||||
|
Anchor = Anchor.CentreLeft,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 5,
|
||||||
|
BackgroundColour = Color4.White.Opacity(0.5f),
|
||||||
|
Padding = new MarginPadding { Left = name_width + 10, Right = value_width + 10 },
|
||||||
|
},
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
Width = value_width,
|
||||||
|
RelativeSizeAxes = Axes.Y,
|
||||||
|
Child = value = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
TextSize = 13,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
62
osu.Game/Screens/Select/Details/FailRetryGraph.cs
Normal file
62
osu.Game/Screens/Select/Details/FailRetryGraph.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using OpenTK;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Select.Details
|
||||||
|
{
|
||||||
|
public class FailRetryGraph : Container
|
||||||
|
{
|
||||||
|
private readonly BarGraph retryGraph, failGraph;
|
||||||
|
|
||||||
|
private BeatmapMetrics metrics;
|
||||||
|
public BeatmapMetrics Metrics
|
||||||
|
{
|
||||||
|
get { return metrics; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == metrics) return;
|
||||||
|
metrics = value;
|
||||||
|
|
||||||
|
var retries = Metrics.Retries;
|
||||||
|
var fails = Metrics.Fails;
|
||||||
|
|
||||||
|
float maxValue = fails.Zip(retries, (fail, retry) => fail + retry).Max();
|
||||||
|
failGraph.MaxValue = maxValue;
|
||||||
|
retryGraph.MaxValue = maxValue;
|
||||||
|
|
||||||
|
failGraph.Values = fails.Select(f => (float)f);
|
||||||
|
retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FailRetryGraph()
|
||||||
|
{
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
retryGraph = new BarGraph
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
},
|
||||||
|
failGraph = new BarGraph
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colours)
|
||||||
|
{
|
||||||
|
retryGraph.Colour = colours.Yellow;
|
||||||
|
failGraph.Colour = colours.YellowDarker;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
122
osu.Game/Screens/Select/Details/UserRatings.cs
Normal file
122
osu.Game/Screens/Select/Details/UserRatings.cs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Select.Details
|
||||||
|
{
|
||||||
|
public class UserRatings : Container
|
||||||
|
{
|
||||||
|
private readonly FillFlowContainer header;
|
||||||
|
private readonly Bar ratingsBar;
|
||||||
|
private readonly OsuSpriteText negativeRatings, positiveRatings;
|
||||||
|
private readonly Container graphContainer;
|
||||||
|
private readonly BarGraph graph;
|
||||||
|
|
||||||
|
private BeatmapMetrics metrics;
|
||||||
|
public BeatmapMetrics Metrics
|
||||||
|
{
|
||||||
|
get { return metrics; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == metrics) return;
|
||||||
|
metrics = value;
|
||||||
|
|
||||||
|
var ratings = Metrics.Ratings.ToList();
|
||||||
|
negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2).Sum().ToString();
|
||||||
|
positiveRatings.Text = ratings.GetRange(ratings.Count / 2, ratings.Count / 2).Sum().ToString();
|
||||||
|
ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2).Sum() / ratings.Sum();
|
||||||
|
graph.Values = Metrics.Ratings.Select(r => (float)r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserRatings()
|
||||||
|
{
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
header = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Direction = FillDirection.Vertical,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Text = "User Rating",
|
||||||
|
TextSize = 13,
|
||||||
|
},
|
||||||
|
ratingsBar = new Bar
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 5,
|
||||||
|
Margin = new MarginPadding { Top = 5 },
|
||||||
|
},
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
negativeRatings = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = "0",
|
||||||
|
TextSize = 13,
|
||||||
|
},
|
||||||
|
positiveRatings = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
Text = @"0",
|
||||||
|
TextSize = 13,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Text = "Rating Spread",
|
||||||
|
TextSize = 13,
|
||||||
|
Margin = new MarginPadding { Top = 10, Bottom = 5 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
graphContainer = new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Child = graph = new BarGraph
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colours)
|
||||||
|
{
|
||||||
|
ratingsBar.BackgroundColour = colours.Green;
|
||||||
|
ratingsBar.AccentColour = colours.Yellow;
|
||||||
|
graph.Colour = colours.BlueDark;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdateAfterChildren()
|
||||||
|
{
|
||||||
|
base.UpdateAfterChildren();
|
||||||
|
|
||||||
|
graphContainer.Padding = new MarginPadding { Top = header.DrawHeight };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,15 +1,15 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Colour;
|
using osu.Framework.Graphics.Colour;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using System;
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Input;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Game.Rulesets.Mods;
|
|
||||||
using osu.Game.Users;
|
|
||||||
using osu.Framework;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Rulesets.UI;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Leaderboards
|
namespace osu.Game.Screens.Select.Leaderboards
|
||||||
{
|
{
|
||||||
@ -21,6 +24,8 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
{
|
{
|
||||||
public static readonly float HEIGHT = 60;
|
public static readonly float HEIGHT = 60;
|
||||||
|
|
||||||
|
public event Action<Visibility> StateChanged;
|
||||||
|
|
||||||
public readonly int RankPosition;
|
public readonly int RankPosition;
|
||||||
public readonly Score Score;
|
public readonly Score Score;
|
||||||
|
|
||||||
@ -38,14 +43,17 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
private readonly ScoreComponentLabel maxCombo;
|
private readonly ScoreComponentLabel maxCombo;
|
||||||
private readonly ScoreComponentLabel accuracy;
|
private readonly ScoreComponentLabel accuracy;
|
||||||
private readonly Container flagBadgeContainer;
|
private readonly Container flagBadgeContainer;
|
||||||
private readonly FillFlowContainer<ScoreModIcon> modsContainer;
|
private readonly FillFlowContainer<ModIcon> modsContainer;
|
||||||
|
|
||||||
private Visibility state;
|
private Visibility state;
|
||||||
|
|
||||||
public Visibility State
|
public Visibility State
|
||||||
{
|
{
|
||||||
get { return state; }
|
get { return state; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
if (state == value)
|
||||||
|
return;
|
||||||
state = value;
|
state = value;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
@ -88,6 +96,8 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateChanged?.Invoke(State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +249,7 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
modsContainer = new FillFlowContainer<ScoreModIcon>
|
modsContainer = new FillFlowContainer<ModIcon>
|
||||||
{
|
{
|
||||||
Anchor = Anchor.BottomRight,
|
Anchor = Anchor.BottomRight,
|
||||||
Origin = Anchor.BottomRight,
|
Origin = Anchor.BottomRight,
|
||||||
@ -252,13 +262,13 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Score.Mods != null)
|
foreach (Mod mod in Score.Mods)
|
||||||
{
|
{
|
||||||
foreach (Mod mod in Score.Mods)
|
modsContainer.Add(new ModIcon(mod)
|
||||||
{
|
{
|
||||||
// TODO: Get actual mod colours
|
AutoSizeAxes = Axes.Both,
|
||||||
modsContainer.Add(new ScoreModIcon(mod.Icon, OsuColour.FromHex(@"ffcc22")));
|
Scale = new Vector2(0.375f)
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,13 +277,13 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
public override void Hide() => State = Visibility.Hidden;
|
public override void Hide() => State = Visibility.Hidden;
|
||||||
public override void Show() => State = Visibility.Visible;
|
public override void Show() => State = Visibility.Visible;
|
||||||
|
|
||||||
protected override bool OnHover(Framework.Input.InputState state)
|
protected override bool OnHover(InputState state)
|
||||||
{
|
{
|
||||||
background.FadeTo(0.5f, 300, Easing.OutQuint);
|
background.FadeTo(0.5f, 300, Easing.OutQuint);
|
||||||
return base.OnHover(state);
|
return base.OnHover(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnHoverLost(Framework.Input.InputState state)
|
protected override void OnHoverLost(InputState state)
|
||||||
{
|
{
|
||||||
background.FadeTo(background_alpha, 200, Easing.OutQuint);
|
background.FadeTo(background_alpha, 200, Easing.OutQuint);
|
||||||
base.OnHoverLost(state);
|
base.OnHoverLost(state);
|
||||||
@ -303,8 +313,8 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Font = font,
|
Font = font,
|
||||||
TextSize = textSize,
|
|
||||||
FixedWidth = true,
|
FixedWidth = true,
|
||||||
|
TextSize = textSize,
|
||||||
Text = text,
|
Text = text,
|
||||||
Colour = glowColour,
|
Colour = glowColour,
|
||||||
Shadow = false,
|
Shadow = false,
|
||||||
@ -326,36 +336,6 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ScoreModIcon : Container
|
|
||||||
{
|
|
||||||
public ScoreModIcon(FontAwesome icon, Color4 colour)
|
|
||||||
{
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
new SpriteIcon
|
|
||||||
{
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Icon = FontAwesome.fa_osu_mod_bg,
|
|
||||||
Colour = colour,
|
|
||||||
Shadow = true,
|
|
||||||
Size = new Vector2(30),
|
|
||||||
},
|
|
||||||
new SpriteIcon
|
|
||||||
{
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Icon = icon,
|
|
||||||
Colour = OsuColour.Gray(84),
|
|
||||||
Size = new Vector2(18),
|
|
||||||
Position = new Vector2(0f, 2f),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ScoreComponentLabel : Container
|
private class ScoreComponentLabel : Container
|
||||||
{
|
{
|
||||||
public ScoreComponentLabel(FontAwesome icon, string value)
|
public ScoreComponentLabel(FontAwesome icon, string value)
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>osu.Game</RootNamespace>
|
<RootNamespace>osu.Game</RootNamespace>
|
||||||
<AssemblyName>osu.Game</AssemblyName>
|
<AssemblyName>osu.Game</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
<NuGetPackageImportStamp>
|
<NuGetPackageImportStamp>
|
||||||
@ -98,6 +98,7 @@
|
|||||||
<Compile Include="Input\Bindings\GlobalKeyBindingInputManager.cs" />
|
<Compile Include="Input\Bindings\GlobalKeyBindingInputManager.cs" />
|
||||||
<Compile Include="IO\FileStore.cs" />
|
<Compile Include="IO\FileStore.cs" />
|
||||||
<Compile Include="IO\FileInfo.cs" />
|
<Compile Include="IO\FileInfo.cs" />
|
||||||
|
<Compile Include="Online\API\Requests\DownloadBeatmapSetRequest.cs" />
|
||||||
<Compile Include="Online\API\Requests\GetUsersRequest.cs" />
|
<Compile Include="Online\API\Requests\GetUsersRequest.cs" />
|
||||||
<Compile Include="Online\API\Requests\PostMessageRequest.cs" />
|
<Compile Include="Online\API\Requests\PostMessageRequest.cs" />
|
||||||
<Compile Include="Online\Chat\ErrorMessage.cs" />
|
<Compile Include="Online\Chat\ErrorMessage.cs" />
|
||||||
@ -133,6 +134,10 @@
|
|||||||
<Compile Include="Overlays\Toolbar\ToolbarDirectButton.cs" />
|
<Compile Include="Overlays\Toolbar\ToolbarDirectButton.cs" />
|
||||||
<Compile Include="Rulesets\Mods\IApplicableToDifficulty.cs" />
|
<Compile Include="Rulesets\Mods\IApplicableToDifficulty.cs" />
|
||||||
<Compile Include="Rulesets\UI\RulesetInputManager.cs" />
|
<Compile Include="Rulesets\UI\RulesetInputManager.cs" />
|
||||||
|
<Compile Include="Screens\Edit\Menus\EditorMenuBar.cs" />
|
||||||
|
<Compile Include="Screens\Edit\Menus\EditorMenuBarItem.cs" />
|
||||||
|
<Compile Include="Screens\Edit\Menus\EditorMenuItem.cs" />
|
||||||
|
<Compile Include="Screens\Edit\Menus\EditorMenuItemSpacer.cs" />
|
||||||
<Compile Include="Screens\Play\KeyCounterAction.cs" />
|
<Compile Include="Screens\Play\KeyCounterAction.cs" />
|
||||||
<Compile Include="Users\UserCoverBackground.cs" />
|
<Compile Include="Users\UserCoverBackground.cs" />
|
||||||
<Compile Include="Overlays\UserProfileOverlay.cs" />
|
<Compile Include="Overlays\UserProfileOverlay.cs" />
|
||||||
@ -533,6 +538,9 @@
|
|||||||
<Compile Include="Screens\Multiplayer\ParticipantInfo.cs" />
|
<Compile Include="Screens\Multiplayer\ParticipantInfo.cs" />
|
||||||
<Compile Include="Screens\Multiplayer\ModeTypeInfo.cs" />
|
<Compile Include="Screens\Multiplayer\ModeTypeInfo.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\BeatmapSetCover.cs" />
|
<Compile Include="Beatmaps\Drawables\BeatmapSetCover.cs" />
|
||||||
|
<Compile Include="Screens\Select\Details\AdvancedStats.cs" />
|
||||||
|
<Compile Include="Screens\Select\Details\FailRetryGraph.cs" />
|
||||||
|
<Compile Include="Screens\Select\Details\UserRatings.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
|
Loading…
Reference in New Issue
Block a user