diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs index 1143241496..c270d58fc4 100644 --- a/osu.Game/Screens/Tournament/Drawings.cs +++ b/osu.Game/Screens/Tournament/Drawings.cs @@ -30,11 +30,12 @@ namespace osu.Game.Screens.Tournament private ScrollingTeamContainer teamsContainer; private GroupsContainer groupsContainer; + private List allTeams = new List(); + private DrawingsConfigManager drawingsConfig; - public Drawings() - { - } + private Task lastWriteOp; + private Task writeOp; [BackgroundDependencyLoader] private void load(Framework.Game game, TextureStore textures) @@ -202,7 +203,7 @@ namespace osu.Game.Screens.Tournament RelativeSizeAxes = Axes.X, Text = "Reset", - Action = reset + Action = () => reset(false) } } } @@ -229,16 +230,38 @@ namespace osu.Game.Screens.Tournament st.Text = t.Team.FullName; st.FadeIn(200); + + writeResults(groupsContainer.ToStringRepresentation()); }; teamsContainer.OnScrollStarted += () => st.FadeOut(200); - reloadTeams(); + reset(true); + } + + private void writeResults(string text) + { + lastWriteOp = writeOp; + writeOp = Task.Run(async () => + { + if (lastWriteOp != null) + await lastWriteOp; + + // Write to drawings_results + try + { + File.WriteAllText("drawings_results.txt", text); + } + catch + { + } + }); } private void reloadTeams() { teamsContainer.ClearTeams(); + allTeams.Clear(); try { @@ -255,23 +278,61 @@ namespace osu.Game.Screens.Tournament if (groupsContainer.ContainsTeam(name)) continue; - teamsContainer.AddTeam(new Team() + Team t = new Team() { FlagName = flagName, FullName = name, Acronym = acronym - }); + }; + + allTeams.Add(t); + teamsContainer.AddTeam(t); } } catch { } } - private void reset() + private void reset(bool loadLastResults = false) { groupsContainer.ClearTeams(); - teamsContainer.ClearTeams(); reloadTeams(); + + try + { + if (loadLastResults) + { + // Read from drawings_results + using (StreamReader sr = new StreamReader(File.OpenRead("drawings_results.txt"))) + { + while (sr.Peek() != -1) + { + string line = sr.ReadLine(); + + if (string.IsNullOrEmpty(line)) + continue; + + if (line.ToUpper().StartsWith("GROUP")) + continue; + + Team teamToAdd = allTeams.FirstOrDefault(t => t.FullName == line); + + if (teamToAdd == null) + continue; + + groupsContainer.AddTeam(teamToAdd); + teamsContainer.RemoveTeam(teamToAdd); + } + } + } + else + { + writeResults(string.Empty); + } + } + catch + { + } } } } diff --git a/osu.Game/Screens/Tournament/Group.cs b/osu.Game/Screens/Tournament/Group.cs index f311f44ac4..5c830c6b8a 100644 --- a/osu.Game/Screens/Tournament/Group.cs +++ b/osu.Game/Screens/Tournament/Group.cs @@ -147,6 +147,14 @@ namespace osu.Game.Screens.Tournament bottomTeamsCount = 0; } + public string ToStringRepresentation() + { + StringBuilder sb = new StringBuilder(); + foreach (GroupTeam gt in allTeams) + sb.AppendLine(gt.Team.FullName); + return sb.ToString(); + } + class GroupTeam : Container { public Team Team; diff --git a/osu.Game/Screens/Tournament/GroupsContainer.cs b/osu.Game/Screens/Tournament/GroupsContainer.cs index 5aef4134df..1c8059b873 100644 --- a/osu.Game/Screens/Tournament/GroupsContainer.cs +++ b/osu.Game/Screens/Tournament/GroupsContainer.cs @@ -62,12 +62,12 @@ namespace osu.Game.Screens.Tournament public void AddTeam(Team team) { - for (int i = 0; i < allGroups.Count; i++) + foreach (Group g in allGroups) { - if (allGroups[i].TeamsCount == maxTeams) + if (g.TeamsCount == maxTeams) continue; - allGroups[i].AddTeam(team); + g.AddTeam(team); break; } } @@ -79,9 +79,9 @@ namespace osu.Game.Screens.Tournament public bool RemoveTeam(Team team) { - for (int i = 0; i < allGroups.Count; i++) + foreach (Group g in allGroups) { - if (allGroups[i].RemoveTeam(team)) + if (g.RemoveTeam(team)) return true; } @@ -95,5 +95,20 @@ namespace osu.Game.Screens.Tournament allGroups[i].ClearTeams(); } } + + public string ToStringRepresentation() + { + StringBuilder sb = new StringBuilder(); + + foreach (Group g in allGroups) + { + if (g != allGroups.First()) + sb.AppendLine(); + sb.AppendLine($"Group {g.GroupName}"); + sb.Append(g.ToStringRepresentation()); + } + + return sb.ToString(); + } } } diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs index a4dd687f50..a79d83402e 100644 --- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs +++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs @@ -169,6 +169,8 @@ namespace osu.Game.Screens.Tournament public void RemoveTeam(Team team) { + availableTeams.Remove(team); + foreach (var c in Children) { ScrollingTeam st = c as ScrollingTeam; @@ -186,11 +188,17 @@ namespace osu.Game.Screens.Tournament public void StartScrolling() { + if (availableTeams.Count == 0) + return; + scrollState = ScrollState.Scrolling; } public void StopScrolling() { + if (availableTeams.Count == 0) + return; + scrollState = ScrollState.Stopping; }