osu/osu.Game.Tournament/Screens/Drawings/DrawingsScreen.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

290 lines
9.5 KiB
C#
Raw Normal View History

2019-03-04 04:24:19 +00:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 09:19:50 +00:00
2022-06-17 07:37:17 +00:00
#nullable disable
2017-02-27 05:19:07 +00:00
using System;
using System.Collections.Generic;
using System.IO;
2017-02-27 05:19:07 +00:00
using System.Linq;
using System.Threading.Tasks;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
2017-02-28 01:26:37 +00:00
using osu.Framework.Graphics.Textures;
2017-03-03 06:59:33 +00:00
using osu.Framework.Logging;
using osu.Framework.Platform;
2018-11-03 19:58:35 +00:00
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
2018-08-25 16:24:19 +00:00
using osu.Game.Tournament.Components;
2019-06-18 05:51:48 +00:00
using osu.Game.Tournament.Models;
using osu.Game.Tournament.Screens.Drawings.Components;
using osuTK;
using osuTK.Graphics;
2018-04-13 09:19:50 +00:00
namespace osu.Game.Tournament.Screens.Drawings
2017-02-27 05:19:07 +00:00
{
public class DrawingsScreen : TournamentScreen
2017-02-27 05:19:07 +00:00
{
private const string results_filename = "drawings_results.txt";
2018-04-13 09:19:50 +00:00
private ScrollingTeamContainer teamsContainer;
2017-03-03 11:46:07 +00:00
private GroupContainer groupsContainer;
private TournamentSpriteText fullTeamNameText;
2018-04-13 09:19:50 +00:00
private readonly List<TournamentTeam> allTeams = new List<TournamentTeam>();
2018-04-13 09:19:50 +00:00
2017-02-27 14:09:26 +00:00
private DrawingsConfigManager drawingsConfig;
2018-04-13 09:19:50 +00:00
private Task writeOp;
2018-04-13 09:19:50 +00:00
private Storage storage;
2018-04-13 09:19:50 +00:00
public ITeamList TeamList;
2018-04-13 09:19:50 +00:00
[BackgroundDependencyLoader]
2018-08-30 22:04:40 +00:00
private void load(TextureStore textures, Storage storage)
{
2018-11-03 19:58:35 +00:00
RelativeSizeAxes = Axes.Both;
this.storage = storage;
2018-04-13 09:19:50 +00:00
TeamList ??= new StorageBackedTeamList(storage);
2018-04-13 09:19:50 +00:00
if (!TeamList.Teams.Any())
2017-03-03 03:43:48 +00:00
{
LinkFlowContainer links;
InternalChildren = new Drawable[]
{
new Box
{
Colour = Color4.Black,
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Height = 0.3f,
},
new WarningBox("No drawings.txt file found. Please create one and restart the client."),
links = new LinkFlowContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Y = 60,
AutoSizeAxes = Axes.Both
}
};
links.AddLink("Click for details on the file format", "https://osu.ppy.sh/wiki/en/Tournament_Drawings", t => t.Colour = Color4.White);
2017-03-03 03:43:48 +00:00
return;
}
2018-04-13 09:19:50 +00:00
drawingsConfig = new DrawingsConfigManager(storage);
2018-04-13 09:19:50 +00:00
InternalChildren = new Drawable[]
2017-02-27 05:19:07 +00:00
{
2018-11-03 19:58:35 +00:00
// Main container
new Container
2017-02-28 01:26:37 +00:00
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
2018-11-03 19:58:35 +00:00
new Sprite
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fill,
Texture = textures.Get(@"Backgrounds/Drawings/background.png")
},
// Visualiser
new VisualiserContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
RelativeSizeAxes = Axes.X,
Size = new Vector2(1, 10),
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
Colour = new Color4(255, 204, 34, 255),
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
Lines = 6
},
// Groups
groupsContainer = new GroupContainer(drawingsConfig.Get<int>(DrawingsConfig.Groups), drawingsConfig.Get<int>(DrawingsConfig.TeamsPerGroup))
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
Padding = new MarginPadding
{
Top = 35f,
Bottom = 35f
}
},
// Scrolling teams
teamsContainer = new ScrollingTeamContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
RelativeSizeAxes = Axes.X,
},
// Scrolling team name
fullTeamNameText = new TournamentSpriteText
2018-11-03 19:58:35 +00:00
{
Anchor = Anchor.Centre,
Origin = Anchor.TopCentre,
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
Position = new Vector2(0, 45f),
2018-04-13 09:19:50 +00:00
Colour = OsuColour.Gray(0.95f),
2018-04-13 09:19:50 +00:00
2018-11-03 19:58:35 +00:00
Alpha = 0,
2018-04-13 09:19:50 +00:00
Font = OsuFont.Torus.With(weight: FontWeight.Light, size: 42),
2018-11-03 19:58:35 +00:00
}
}
},
// Control panel container
new ControlPanel
2018-11-03 19:58:35 +00:00
{
new TourneyButton
2018-11-03 19:58:35 +00:00
{
RelativeSizeAxes = Axes.X,
2018-11-03 19:58:35 +00:00
Text = "Begin random",
Action = teamsContainer.StartScrolling,
},
new TourneyButton
{
RelativeSizeAxes = Axes.X,
2018-04-13 09:19:50 +00:00
Text = "Stop random",
Action = teamsContainer.StopScrolling,
},
new TourneyButton
{
RelativeSizeAxes = Axes.X,
2018-04-13 09:19:50 +00:00
Text = "Reload",
Action = reloadTeams
},
new ControlPanel.Spacer(),
new TourneyButton
{
RelativeSizeAxes = Axes.X,
2018-04-13 09:19:50 +00:00
Text = "Reset",
Action = () => reset()
}
}
2017-02-27 05:19:07 +00:00
};
2018-04-13 09:19:50 +00:00
2017-03-03 05:51:19 +00:00
teamsContainer.OnSelected += onTeamSelected;
teamsContainer.OnScrollStarted += () => fullTeamNameText.FadeOut(200);
2018-04-13 09:19:50 +00:00
2017-03-03 05:51:19 +00:00
reset(true);
}
2018-04-13 09:19:50 +00:00
private void onTeamSelected(TournamentTeam team)
2017-03-03 05:51:19 +00:00
{
groupsContainer.AddTeam(team);
2018-04-13 09:19:50 +00:00
fullTeamNameText.Text = team.FullName.Value;
2017-03-03 05:51:19 +00:00
fullTeamNameText.FadeIn(200);
2018-04-13 09:19:50 +00:00
2017-03-03 11:42:22 +00:00
writeResults(groupsContainer.GetStringRepresentation());
}
2018-04-13 09:19:50 +00:00
private void writeResults(string text)
{
2018-01-15 18:42:17 +00:00
void writeAction()
{
2017-03-03 06:59:33 +00:00
try
{
2017-03-03 06:59:33 +00:00
// Write to drawings_results
2022-05-16 09:03:53 +00:00
using (Stream stream = storage.CreateFileSafely(results_filename))
2017-03-03 06:59:33 +00:00
using (StreamWriter sw = new StreamWriter(stream))
{
sw.Write(text);
}
}
catch (Exception ex)
{
Logger.Error(ex, "Failed to write results.");
}
2018-01-15 18:42:17 +00:00
}
2018-04-13 09:19:50 +00:00
2019-10-30 15:09:08 +00:00
writeOp = writeOp?.ContinueWith(t => { writeAction(); }) ?? Task.Run(writeAction);
}
2018-04-13 09:19:50 +00:00
private void reloadTeams()
{
teamsContainer.ClearTeams();
allTeams.Clear();
2018-04-13 09:19:50 +00:00
foreach (TournamentTeam t in TeamList.Teams)
2017-02-27 05:19:07 +00:00
{
if (groupsContainer.ContainsTeam(t.FullName.Value))
2017-03-03 09:47:56 +00:00
continue;
2018-04-13 09:19:50 +00:00
2017-03-17 21:16:59 +00:00
allTeams.Add(t);
teamsContainer.AddTeam(t);
2017-02-27 05:19:07 +00:00
}
}
2018-04-13 09:19:50 +00:00
private void reset(bool loadLastResults = false)
{
groupsContainer.ClearTeams();
2018-04-13 09:19:50 +00:00
reloadTeams();
2018-04-13 09:19:50 +00:00
if (!storage.Exists(results_filename))
return;
2018-04-13 09:19:50 +00:00
2017-03-03 06:59:33 +00:00
if (loadLastResults)
{
2017-03-03 06:59:33 +00:00
try
{
// Read from drawings_results
using (Stream stream = storage.GetStream(results_filename, FileAccess.Read, FileMode.Open))
using (StreamReader sr = new StreamReader(stream))
{
2017-03-03 11:24:34 +00:00
string line;
2017-03-03 11:24:34 +00:00
while ((line = sr.ReadLine()?.Trim()) != null)
{
if (string.IsNullOrEmpty(line))
continue;
2018-04-13 09:19:50 +00:00
if (line.ToUpperInvariant().StartsWith("GROUP", StringComparison.Ordinal))
continue;
2018-04-13 09:19:50 +00:00
// ReSharper disable once AccessToModifiedClosure
TournamentTeam teamToAdd = allTeams.FirstOrDefault(t => t.FullName.Value == line);
2018-04-13 09:19:50 +00:00
if (teamToAdd == null)
continue;
2018-04-13 09:19:50 +00:00
groupsContainer.AddTeam(teamToAdd);
teamsContainer.RemoveTeam(teamToAdd);
}
}
}
2017-03-03 06:59:33 +00:00
catch (Exception ex)
{
2017-03-03 06:59:33 +00:00
Logger.Error(ex, "Failed to read last drawings results.");
}
}
2017-03-03 06:59:33 +00:00
else
{
2017-03-03 06:59:33 +00:00
writeResults(string.Empty);
}
2017-02-27 05:19:07 +00:00
}
}
}