1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-09 09:30:08 +08:00
osu-lazer/osu.Game/Online/Chat/StandAloneChatDisplay.cs

207 lines
6.4 KiB
C#
Raw Normal View History

// 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-12-20 15:50:38 +08:00
using System;
2018-12-20 15:50:38 +08:00
using osu.Framework.Allocation;
2019-02-21 18:04:31 +08:00
using osu.Framework.Bindables;
2018-12-20 15:50:38 +08:00
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
2018-12-20 17:21:37 +08:00
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input.Events;
using osu.Game.Graphics;
2018-12-20 17:21:37 +08:00
using osu.Game.Graphics.UserInterface;
using osu.Game.Overlays.Chat;
using osu.Game.Resources.Localisation.Web;
2018-12-20 15:50:38 +08:00
using osuTK.Graphics;
using osuTK.Input;
2018-12-20 15:50:38 +08:00
namespace osu.Game.Online.Chat
{
/// <summary>
/// Display a chat channel in an insolated region.
/// </summary>
public class StandAloneChatDisplay : CompositeDrawable
{
public readonly Bindable<Channel> Channel = new Bindable<Channel>();
2018-12-20 15:50:38 +08:00
protected readonly ChatTextBox TextBox;
2018-12-20 17:21:37 +08:00
2022-01-13 16:10:48 +08:00
private ChannelManager channelManager;
2018-12-20 17:21:37 +08:00
private StandAloneDrawableChannel drawableChannel;
private readonly bool postingTextBox;
2018-12-25 16:14:56 +08:00
protected readonly Box Background;
private const float text_box_height = 30;
2018-12-20 17:21:37 +08:00
/// <summary>
/// Construct a new instance.
/// </summary>
/// <param name="postingTextBox">Whether a textbox for posting new messages should be displayed.</param>
public StandAloneChatDisplay(bool postingTextBox = false)
2018-12-20 15:50:38 +08:00
{
const float corner_radius = 10;
this.postingTextBox = postingTextBox;
CornerRadius = corner_radius;
2018-12-20 15:50:38 +08:00
Masking = true;
InternalChildren = new Drawable[]
{
Background = new Box
2018-12-20 15:50:38 +08:00
{
Colour = Color4.Black,
Alpha = 0.8f,
RelativeSizeAxes = Axes.Both
},
};
if (postingTextBox)
2018-12-20 17:21:37 +08:00
{
AddInternal(TextBox = new ChatTextBox
2018-12-20 17:21:37 +08:00
{
RelativeSizeAxes = Axes.X,
Height = text_box_height,
PlaceholderText = ChatStrings.InputPlaceholder,
CornerRadius = corner_radius,
2018-12-20 17:21:37 +08:00
ReleaseFocusOnCommit = false,
HoldFocus = true,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
});
TextBox.OnCommit += postMessage;
2018-12-20 17:21:37 +08:00
}
2018-12-20 15:50:38 +08:00
Channel.BindValueChanged(channelChanged);
}
2018-12-20 17:21:37 +08:00
[BackgroundDependencyLoader(true)]
private void load(ChannelManager manager)
{
2022-01-13 16:10:48 +08:00
channelManager ??= manager;
2018-12-20 17:21:37 +08:00
}
protected virtual StandAloneDrawableChannel CreateDrawableChannel(Channel channel) =>
new StandAloneDrawableChannel(channel);
private void postMessage(TextBox sender, bool newText)
2018-12-20 17:21:37 +08:00
{
string text = TextBox.Text.Trim();
2018-12-20 17:21:37 +08:00
if (string.IsNullOrWhiteSpace(text))
return;
if (text[0] == '/')
2022-01-13 16:10:48 +08:00
channelManager?.PostCommand(text.Substring(1), Channel.Value);
2018-12-20 17:21:37 +08:00
else
2022-01-13 16:10:48 +08:00
channelManager?.PostMessage(text, target: Channel.Value);
2018-12-20 17:21:37 +08:00
TextBox.Text = string.Empty;
2018-12-20 17:21:37 +08:00
}
protected virtual ChatLine CreateMessage(Message message) => new StandAloneMessage(message);
2018-12-20 15:50:38 +08:00
2019-02-21 17:56:34 +08:00
private void channelChanged(ValueChangedEvent<Channel> e)
2018-12-20 15:50:38 +08:00
{
drawableChannel?.Expire();
2018-12-20 15:50:38 +08:00
2019-02-21 17:56:34 +08:00
if (e.NewValue == null) return;
2018-12-20 15:50:38 +08:00
drawableChannel = CreateDrawableChannel(e.NewValue);
drawableChannel.CreateChatLineAction = CreateMessage;
drawableChannel.Padding = new MarginPadding { Bottom = postingTextBox ? text_box_height : 0 };
AddInternal(drawableChannel);
2018-12-20 15:50:38 +08:00
}
public class ChatTextBox : FocusedTextBox
{
protected override bool OnKeyDown(KeyDownEvent e)
{
// Chat text boxes are generally used in places where they retain focus, but shouldn't block interaction with other
// elements on the same screen.
switch (e.Key)
{
case Key.Up:
case Key.Down:
return false;
}
return base.OnKeyDown(e);
}
protected override void LoadComplete()
{
base.LoadComplete();
BackgroundUnfocused = new Color4(10, 10, 10, 10);
BackgroundFocused = new Color4(10, 10, 10, 255);
}
protected override void OnFocusLost(FocusLostEvent e)
{
base.OnFocusLost(e);
FocusLost?.Invoke();
}
public Action FocusLost;
}
public class StandAloneDrawableChannel : DrawableChannel
2018-12-20 15:50:38 +08:00
{
2019-02-28 12:31:40 +08:00
public Func<Message, ChatLine> CreateChatLineAction;
protected override ChatLine CreateChatLine(Message m) => CreateChatLineAction(m);
2018-12-20 15:50:38 +08:00
protected override DaySeparator CreateDaySeparator(DateTimeOffset time) => new CustomDaySeparator(time);
2019-10-22 06:30:37 +08:00
public StandAloneDrawableChannel(Channel channel)
: base(channel)
2019-06-20 22:01:39 +08:00
{
}
[BackgroundDependencyLoader]
private void load()
2018-12-20 15:50:38 +08:00
{
ChatLineFlow.Padding = new MarginPadding { Horizontal = 0 };
2018-12-20 15:50:38 +08:00
}
private class CustomDaySeparator : DaySeparator
{
2019-10-22 23:26:47 +08:00
public CustomDaySeparator(DateTimeOffset time)
: base(time)
{
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
Colour = colours.Yellow;
TextSize = 14;
LineHeight = 1;
Padding = new MarginPadding { Horizontal = 10 };
Margin = new MarginPadding { Vertical = 5 };
}
}
2018-12-20 15:50:38 +08:00
}
protected class StandAloneMessage : ChatLine
2018-12-20 15:50:38 +08:00
{
protected override float TextSize => 15;
2018-12-20 15:50:38 +08:00
protected override float HorizontalPadding => 10;
protected override float MessagePadding => 120;
2019-10-02 00:18:03 +08:00
protected override float TimestampPadding => 50;
2018-12-20 15:50:38 +08:00
2019-02-28 12:31:40 +08:00
public StandAloneMessage(Message message)
: base(message)
2018-12-20 15:50:38 +08:00
{
}
}
}
}