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

188 lines
5.8 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;
2018-12-20 15:50:38 +08:00
using osuTK.Graphics;
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
protected ChannelManager ChannelManager;
private StandAloneDrawableChannel drawableChannel;
2018-12-25 16:14:56 +08:00
private readonly bool postingTextbox;
protected readonly Box Background;
private const float textbox_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
{
this.postingTextbox = postingTextbox;
2018-12-20 15:50:38 +08:00
CornerRadius = 10;
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
},
};
2018-12-20 17:21:37 +08:00
if (postingTextbox)
{
AddInternal(Textbox = new ChatTextBox
2018-12-20 17:21:37 +08:00
{
RelativeSizeAxes = Axes.X,
Height = textbox_height,
PlaceholderText = "type your message",
ReleaseFocusOnCommit = false,
HoldFocus = true,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
});
2021-08-17 13:39:51 +08:00
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)
{
ChannelManager ??= manager;
2018-12-20 17:21:37 +08:00
}
protected virtual StandAloneDrawableChannel CreateDrawableChannel(Channel channel) =>
new StandAloneDrawableChannel(channel);
2018-12-20 17:21:37 +08:00
private void postMessage(TextBox sender, bool newtext)
{
2021-08-17 13:39:51 +08:00
var text = Textbox.Text.Trim();
2018-12-20 17:21:37 +08:00
if (string.IsNullOrWhiteSpace(text))
return;
if (text[0] == '/')
2019-02-21 17:56:34 +08:00
ChannelManager?.PostCommand(text.Substring(1), Channel.Value);
2018-12-20 17:21:37 +08:00
else
2019-02-21 17:56:34 +08:00
ChannelManager?.PostMessage(text, target: Channel.Value);
2018-12-20 17:21:37 +08:00
2021-08-17 13:39:51 +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 ? textbox_height : 0 };
AddInternal(drawableChannel);
2018-12-20 15:50:38 +08:00
}
public class ChatTextBox : FocusedTextBox
{
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
{
}
}
}
}