1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-29 01:13:21 +08:00

Add ability to close chat tabs.

This commit is contained in:
naoey 2017-08-03 20:55:52 +05:30
parent 384b8c0600
commit 2ae3ce8b91
2 changed files with 53 additions and 4 deletions

View File

@ -16,15 +16,16 @@ using osu.Game.Online.Chat;
using OpenTK; using OpenTK;
using OpenTK.Graphics; using OpenTK.Graphics;
using osu.Framework.Configuration; using osu.Framework.Configuration;
using System;
namespace osu.Game.Overlays.Chat namespace osu.Game.Overlays.Chat
{ {
public class ChatTabControl : OsuTabControl<Channel> public class ChatTabControl : OsuTabControl<Channel>
{ {
protected override TabItem<Channel> CreateTabItem(Channel value) => new ChannelTabItem(value);
private const float shear_width = 10; private const float shear_width = 10;
public Action<Channel> OnRequestLeave;
public readonly Bindable<bool> ChannelSelectorActive = new Bindable<bool>(); public readonly Bindable<bool> ChannelSelectorActive = new Bindable<bool>();
private readonly ChannelTabItem.ChannelSelectorTabItem selectorTab; private readonly ChannelTabItem.ChannelSelectorTabItem selectorTab;
@ -49,6 +50,14 @@ namespace osu.Game.Overlays.Chat
ChannelSelectorActive.BindTo(selectorTab.Active); ChannelSelectorActive.BindTo(selectorTab.Active);
} }
protected override TabItem<Channel> CreateTabItem(Channel value)
{
ChannelTabItem tab = new ChannelTabItem(value);
tab.OnRequestClose = () => OnRequestLeave?.Invoke(value);
return tab;
}
protected override void SelectTab(TabItem<Channel> tab) protected override void SelectTab(TabItem<Channel> tab)
{ {
if (tab is ChannelTabItem.ChannelSelectorTabItem) if (tab is ChannelTabItem.ChannelSelectorTabItem)
@ -68,12 +77,17 @@ namespace osu.Game.Overlays.Chat
private Color4 backgroundHover; private Color4 backgroundHover;
private Color4 backgroundActive; private Color4 backgroundActive;
protected override bool isClosable => !Pinned;
private readonly SpriteText text; private readonly SpriteText text;
private readonly SpriteText textBold; private readonly SpriteText textBold;
private readonly Button closeButton;
private readonly Box box; private readonly Box box;
private readonly Box highlightBox; private readonly Box highlightBox;
private readonly SpriteIcon icon; private readonly SpriteIcon icon;
public Action OnRequestClose;
private void updateState() private void updateState()
{ {
if (Active) if (Active)
@ -88,6 +102,7 @@ namespace osu.Game.Overlays.Chat
{ {
this.ResizeTo(new Vector2(Width, 1.1f), transition_length, Easing.OutQuint); this.ResizeTo(new Vector2(Width, 1.1f), transition_length, Easing.OutQuint);
closeButton?.MoveToX(-5f, 0.5f, EasingTypes.OutElastic);
box.FadeColour(backgroundActive, transition_length, Easing.OutQuint); box.FadeColour(backgroundActive, transition_length, Easing.OutQuint);
highlightBox.FadeIn(transition_length, Easing.OutQuint); highlightBox.FadeIn(transition_length, Easing.OutQuint);
@ -99,6 +114,7 @@ namespace osu.Game.Overlays.Chat
{ {
this.ResizeTo(new Vector2(Width, 1), transition_length, Easing.OutQuint); this.ResizeTo(new Vector2(Width, 1), transition_length, Easing.OutQuint);
closeButton?.MoveToX(5f, 0.5f, EasingTypes.InElastic);
box.FadeColour(backgroundInactive, transition_length, Easing.OutQuint); box.FadeColour(backgroundInactive, transition_length, Easing.OutQuint);
highlightBox.FadeOut(transition_length, Easing.OutQuint); highlightBox.FadeOut(transition_length, Easing.OutQuint);
@ -108,6 +124,8 @@ namespace osu.Game.Overlays.Chat
protected override bool OnHover(InputState state) protected override bool OnHover(InputState state)
{ {
closeButton?.FadeIn(1f, EasingTypes.InBounce);
if (!Active) if (!Active)
box.FadeColour(backgroundHover, transition_length, Easing.OutQuint); box.FadeColour(backgroundHover, transition_length, Easing.OutQuint);
return true; return true;
@ -115,6 +133,7 @@ namespace osu.Game.Overlays.Chat
protected override void OnHoverLost(InputState state) protected override void OnHoverLost(InputState state)
{ {
closeButton?.FadeOut(1f, EasingTypes.OutBounce);
updateState(); updateState();
} }
@ -204,13 +223,31 @@ namespace osu.Game.Overlays.Chat
Font = @"Exo2.0-Bold", Font = @"Exo2.0-Bold",
TextSize = 18, TextSize = 18,
}, },
} },
} },
}; };
if (isClosable)
{
Add(closeButton = new Button
{
Alpha = 0,
Width = 20,
Height = 20,
Margin = new MarginPadding { Right = 10 },
Origin = Anchor.CentreRight,
Anchor = Anchor.CentreRight,
Text = @"x",
BackgroundColour = Color4.Transparent,
Action = () => OnRequestClose?.Invoke(),
});
}
} }
public class ChannelSelectorTabItem : ChannelTabItem public class ChannelSelectorTabItem : ChannelTabItem
{ {
protected override bool isClosable => false;
public ChannelSelectorTabItem(Channel value) : base(value) public ChannelSelectorTabItem(Channel value) : base(value)
{ {
Depth = float.MaxValue; Depth = float.MaxValue;

View File

@ -160,6 +160,7 @@ namespace osu.Game.Overlays
channelTabs = new ChatTabControl channelTabs = new ChatTabControl
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
OnRequestLeave = removeChannel,
}, },
} }
}, },
@ -305,6 +306,7 @@ namespace osu.Game.Overlays
addChannel(channels.Find(c => c.Name == @"#lobby")); addChannel(channels.Find(c => c.Name == @"#lobby"));
channelSelection.OnRequestJoin = addChannel; channelSelection.OnRequestJoin = addChannel;
channelSelection.OnRequestLeave = removeChannel;
channelSelection.Sections = new[] channelSelection.Sections = new[]
{ {
new ChannelSection new ChannelSection
@ -391,6 +393,16 @@ namespace osu.Game.Overlays
channel.Joined.Value = true; channel.Joined.Value = true;
} }
private void removeChannel(Channel channel)
{
if (channel == null) return;
careChannels.Remove(channel);
channelTabs.RemoveItem(channel);
channel.Joined.Value = false;
}
private void fetchInitialMessages(Channel channel) private void fetchInitialMessages(Channel channel)
{ {
var req = new GetMessagesRequest(new List<Channel> { channel }, null); var req = new GetMessagesRequest(new List<Channel> { channel }, null);