diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs index 735a37e334..baa6fb3ab6 100644 --- a/osu.Game/Overlays/Chat/ChatTabControl.cs +++ b/osu.Game/Overlays/Chat/ChatTabControl.cs @@ -53,7 +53,7 @@ namespace osu.Game.Overlays.Chat protected override TabItem CreateTabItem(Channel value) { ChannelTabItem tab = new ChannelTabItem(value); - tab.OnRequestClose = () => OnRequestLeave?.Invoke(value); + tab.OnRequestClose = () => onTabClose(tab); return tab; } @@ -71,13 +71,28 @@ namespace osu.Game.Overlays.Chat base.SelectTab(tab); } + private void onTabClose(TabItem tab) + { + int totalTabs = TabContainer.Children.Count - 1; // account for selectorTab + int currentIndex = MathHelper.Clamp(TabContainer.IndexOf(tab), 1, totalTabs); + + if (tab == SelectedTab && totalTabs > 1) + // Select the tab after tab-to-be-removed's index, or the tab before if current == last + SelectTab(TabContainer.Children[currentIndex == totalTabs ? currentIndex - 1 : currentIndex + 1]); + else if (totalTabs == 1 && !selectorTab.Active) + // Open channel selection overlay if all channel tabs will be closed after removing this tab + SelectTab(selectorTab); + + OnRequestLeave?.Invoke(tab.Value); + } + private class ChannelTabItem : TabItem { private Color4 backgroundInactive; private Color4 backgroundHover; private Color4 backgroundActive; - protected override bool IsRemovable => !Pinned; + public override bool IsRemovable => !Pinned; private readonly SpriteText text; private readonly SpriteText textBold; @@ -246,7 +261,7 @@ namespace osu.Game.Overlays.Chat public class ChannelSelectorTabItem : ChannelTabItem { - protected override bool IsRemovable => false; + public override bool IsRemovable => false; public ChannelSelectorTabItem(Channel value) : base(value) { diff --git a/osu.Game/Overlays/Chat/DrawableChannel.cs b/osu.Game/Overlays/Chat/DrawableChannel.cs index 3736a97981..8a2fa95ed1 100644 --- a/osu.Game/Overlays/Chat/DrawableChannel.cs +++ b/osu.Game/Overlays/Chat/DrawableChannel.cs @@ -46,7 +46,6 @@ namespace osu.Game.Overlays.Chat }; channel.NewMessagesArrived += newMessagesArrived; - channel.Joined.ValueChanged += channelJoinStatusChanged; } [BackgroundDependencyLoader] @@ -65,7 +64,6 @@ namespace osu.Game.Overlays.Chat { base.Dispose(isDisposing); Channel.NewMessagesArrived -= newMessagesArrived; - Channel.Joined.ValueChanged -= channelJoinStatusChanged; } private void newMessagesArrived(IEnumerable newMessages) @@ -92,11 +90,6 @@ namespace osu.Game.Overlays.Chat } } - private void channelJoinStatusChanged(bool joined) - { - if (!joined) flow.Clear(); - } - private void scrollToEnd() => ScheduleAfterChildren(() => scroll.ScrollToEnd()); } }