1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-15 03:47:26 +08:00
osu-lazer/osu.Game/Screens/Multiplayer/RoomInspector.cs

413 lines
18 KiB
C#
Raw Normal View History

2017-05-30 16:12:11 +08:00
// 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.Linq;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
2017-05-30 16:12:11 +08:00
using osu.Framework.Localisation;
2017-07-26 12:22:46 +08:00
using osu.Game.Beatmaps;
2017-05-30 16:12:11 +08:00
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
2017-05-30 16:12:11 +08:00
using osu.Game.Graphics.Sprites;
using osu.Game.Online.Multiplayer;
using osu.Game.Users;
namespace osu.Game.Screens.Multiplayer
{
public class RoomInspector : Container
{
2017-05-31 09:23:00 +08:00
private readonly MarginPadding contentPadding = new MarginPadding { Horizontal = 20, Vertical = 10 };
private const float transition_duration = 100;
2017-05-30 16:12:11 +08:00
private readonly Box statusStrip;
2017-06-24 17:03:40 +08:00
private readonly Container coverContainer;
private readonly FillFlowContainer topFlow, participantsFlow;
private readonly ModeTypeInfo modeTypeInfo;
private readonly OsuSpriteText participants, participantsSlash, maxParticipants, name, status, beatmapTitle, beatmapDash, beatmapArtist, beatmapAuthor;
private readonly ParticipantInfo participantInfo;
2017-05-30 16:12:11 +08:00
private readonly ScrollContainer participantsScroll;
2017-05-31 09:23:00 +08:00
private readonly Bindable<string> nameBind = new Bindable<string>();
private readonly Bindable<User> hostBind = new Bindable<User>();
private readonly Bindable<RoomStatus> statusBind = new Bindable<RoomStatus>();
private readonly Bindable<GameType> typeBind = new Bindable<GameType>();
private readonly Bindable<BeatmapInfo> beatmapBind = new Bindable<BeatmapInfo>();
private readonly Bindable<int?> maxParticipantsBind = new Bindable<int?>();
private readonly Bindable<User[]> participantsBind = new Bindable<User[]>();
2017-05-30 16:12:11 +08:00
private OsuColour colours;
private LocalisationEngine localisation;
private Room room;
2017-06-23 21:14:56 +08:00
2017-05-30 16:12:11 +08:00
public Room Room
{
get { return room; }
set
{
if (value == room) return;
room = value;
nameBind.BindTo(Room.Name);
hostBind.BindTo(Room.Host);
statusBind.BindTo(Room.Status);
2017-05-31 08:41:20 +08:00
typeBind.BindTo(Room.Type);
2017-05-30 16:12:11 +08:00
beatmapBind.BindTo(Room.Beatmap);
maxParticipantsBind.BindTo(Room.MaxParticipants);
participantsBind.BindTo(Room.Participants);
}
}
public RoomInspector()
{
Width = 520;
RelativeSizeAxes = Axes.Y;
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = OsuColour.FromHex(@"343138"),
},
topFlow = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
new Container
{
RelativeSizeAxes = Axes.X,
Height = 200,
Masking = true,
Children = new Drawable[]
{
2017-05-31 06:35:37 +08:00
new Container
2017-05-30 16:12:11 +08:00
{
2017-05-31 06:35:37 +08:00
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = Color4.Black,
},
coverContainer = new Container
{
RelativeSizeAxes = Axes.Both,
},
},
2017-05-30 16:12:11 +08:00
},
new Box
{
RelativeSizeAxes = Axes.Both,
2017-07-23 13:30:50 +08:00
Colour = ColourInfo.GradientVertical(Color4.Black.Opacity(0.5f), Color4.Black.Opacity(0)),
2017-05-30 16:12:11 +08:00
},
new Container
{
RelativeSizeAxes = Axes.Both,
Padding = new MarginPadding(20),
Children = new Drawable[]
{
new FillFlowContainer
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
LayoutDuration = transition_duration,
2017-05-30 16:12:11 +08:00
Children = new[]
{
participants = new OsuSpriteText
{
TextSize = 30,
Font = @"Exo2.0-Bold"
},
participantsSlash = new OsuSpriteText
{
Text = @"/",
TextSize = 30,
Font = @"Exo2.0-Light"
},
maxParticipants = new OsuSpriteText
{
TextSize = 30,
Font = @"Exo2.0-Light"
},
},
},
name = new OsuSpriteText
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
TextSize = 30,
},
},
},
},
},
statusStrip = new Box
{
RelativeSizeAxes = Axes.X,
Height = 5,
},
new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = OsuColour.FromHex(@"28242d"),
},
new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
2017-05-31 09:23:00 +08:00
Padding = contentPadding,
2017-05-30 16:12:11 +08:00
Spacing = new Vector2(0f, 5f),
Children = new Drawable[]
{
status = new OsuSpriteText
{
TextSize = 14,
Font = @"Exo2.0-Bold",
},
new FillFlowContainer
{
AutoSizeAxes = Axes.X,
Height = 30,
2017-05-30 16:12:11 +08:00
Direction = FillDirection.Horizontal,
LayoutDuration = transition_duration,
2017-05-30 16:12:11 +08:00
Spacing = new Vector2(5f, 0f),
Children = new Drawable[]
{
modeTypeInfo = new ModeTypeInfo(),
2017-05-30 16:12:11 +08:00
new Container
{
AutoSizeAxes = Axes.X,
RelativeSizeAxes = Axes.Y,
2017-05-30 16:12:11 +08:00
Margin = new MarginPadding { Left = 5 },
Children = new[]
{
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Children = new[]
{
beatmapTitle = new OsuSpriteText
{
Font = @"Exo2.0-BoldItalic",
},
beatmapDash = new OsuSpriteText
{
Font = @"Exo2.0-BoldItalic",
},
beatmapArtist = new OsuSpriteText
{
Font = @"Exo2.0-RegularItalic",
},
},
},
beatmapAuthor = new OsuSpriteText
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
TextSize = 14,
},
},
},
},
},
},
},
},
},
new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
2017-05-31 09:23:00 +08:00
Padding = contentPadding,
2017-05-30 16:12:11 +08:00
Children = new Drawable[]
{
participantInfo = new ParticipantInfo(@"Rank Range "),
2017-05-30 16:12:11 +08:00
},
},
},
},
participantsScroll = new OsuScrollContainer
2017-05-30 16:12:11 +08:00
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
RelativeSizeAxes = Axes.X,
2017-05-31 09:23:00 +08:00
Padding = new MarginPadding { Top = contentPadding.Top, Left = 38, Right = 37 },
2017-05-30 16:12:11 +08:00
Children = new[]
{
participantsFlow = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
LayoutDuration = transition_duration,
2017-05-30 16:12:11 +08:00
Spacing = new Vector2(5f),
},
},
},
};
nameBind.ValueChanged += displayName;
hostBind.ValueChanged += displayUser;
2017-06-24 16:54:00 +08:00
typeBind.ValueChanged += displayGameType;
2017-05-30 16:12:11 +08:00
maxParticipantsBind.ValueChanged += displayMaxParticipants;
participantsBind.ValueChanged += displayParticipants;
}
[BackgroundDependencyLoader]
private void load(OsuColour colours, LocalisationEngine localisation)
2017-05-30 16:12:11 +08:00
{
this.localisation = localisation;
this.colours = colours;
beatmapAuthor.Colour = colours.Gray9;
2017-05-30 16:12:11 +08:00
//binded here instead of ctor because dependencies are needed
statusBind.ValueChanged += displayStatus;
beatmapBind.ValueChanged += displayBeatmap;
statusBind.TriggerChange();
beatmapBind.TriggerChange();
}
protected override void UpdateAfterChildren()
2017-05-30 16:12:11 +08:00
{
base.UpdateAfterChildren();
2017-05-30 16:12:11 +08:00
participantsScroll.Height = DrawHeight - topFlow.DrawHeight;
}
private void displayName(string value)
{
name.Text = value;
}
private void displayUser(User value)
{
participantInfo.Host = value;
2017-05-30 16:12:11 +08:00
}
private void displayStatus(RoomStatus value)
{
status.Text = value.Message;
foreach (Drawable d in new Drawable[] { statusStrip, status })
d.FadeColour(value.GetAppropriateColour(colours), transition_duration);
2017-05-30 16:12:11 +08:00
}
2017-05-31 08:41:20 +08:00
private void displayGameType(GameType value)
{
modeTypeInfo.Type = value;
2017-05-31 08:41:20 +08:00
}
2017-05-30 16:12:11 +08:00
private void displayBeatmap(BeatmapInfo value)
{
modeTypeInfo.Beatmap = value;
2017-05-30 16:12:11 +08:00
if (value != null)
{
2017-05-31 06:35:37 +08:00
coverContainer.FadeIn(transition_duration);
coverContainer.Children = new[]
{
new AsyncLoadWrapper(new BeatmapSetCover(value.BeatmapSet)
2017-05-31 06:35:37 +08:00
{
RelativeSizeAxes = Axes.Both,
2017-05-31 06:35:37 +08:00
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
FillMode = FillMode.Fill,
2017-07-23 02:50:25 +08:00
OnLoadComplete = d => d.FadeInFromZero(400, Easing.Out),
2017-06-24 16:54:00 +08:00
}) { RelativeSizeAxes = Axes.Both },
2017-05-30 16:12:11 +08:00
};
beatmapTitle.Current = localisation.GetUnicodePreference(value.Metadata.TitleUnicode, value.Metadata.Title);
beatmapDash.Text = @" - ";
beatmapArtist.Current = localisation.GetUnicodePreference(value.Metadata.ArtistUnicode, value.Metadata.Artist);
beatmapAuthor.Text = $"mapped by {value.Metadata.Author}";
}
else
{
2017-05-31 06:35:37 +08:00
coverContainer.FadeOut(transition_duration);
2017-05-30 16:12:11 +08:00
beatmapTitle.Current = null;
beatmapArtist.Current = null;
beatmapTitle.Text = "Changing map";
beatmapDash.Text = beatmapArtist.Text = beatmapAuthor.Text = string.Empty;
}
}
private void displayMaxParticipants(int? value)
{
if (value == null)
{
participantsSlash.FadeOut(transition_duration);
maxParticipants.FadeOut(transition_duration);
2017-05-30 16:12:11 +08:00
}
else
{
participantsSlash.FadeIn(transition_duration);
maxParticipants.FadeIn(transition_duration);
2017-05-30 16:12:11 +08:00
maxParticipants.Text = value.ToString();
}
}
private void displayParticipants(User[] value)
{
participants.Text = value.Length.ToString();
participantInfo.Participants = value;
participantsFlow.ChildrenEnumerable = value.Select(u => new UserTile(u));
2017-05-30 16:12:11 +08:00
}
private class UserTile : Container, IHasTooltip
{
private readonly User user;
public string TooltipText => user.Username;
public UserTile(User user)
{
this.user = user;
Size = new Vector2(70f);
CornerRadius = 5f;
Masking = true;
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = OsuColour.FromHex(@"27252d"),
},
new UpdateableAvatar
{
RelativeSizeAxes = Axes.Both,
User = user,
},
};
}
}
}
}