From f4fa80c1e3bd9ae5056185a087f7ee4d65c071c8 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 4 Mar 2022 23:28:40 +0300 Subject: [PATCH] Add support to highlight messages in chat overlay --- osu.Game/Overlays/ChatOverlay.cs | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs index fde9d28b43..d642bf3bb2 100644 --- a/osu.Game/Overlays/ChatOverlay.cs +++ b/osu.Game/Overlays/ChatOverlay.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; +using JetBrains.Annotations; using osuTK; using osuTK.Graphics; using osu.Framework.Allocation; @@ -46,6 +47,8 @@ namespace osu.Game.Overlays private Container currentChannelContainer; + private DrawableChannel currentDrawableChannel => currentChannelContainer.SingleOrDefault(); + private readonly List loadedChannels = new List(); private LoadingSpinner loading; @@ -249,6 +252,9 @@ namespace osu.Game.Overlays private Bindable currentChannel; + [CanBeNull] + private Message messagePendingHighlight; + private void currentChannelChanged(ValueChangedEvent e) { if (e.NewValue == null) @@ -290,12 +296,24 @@ namespace osu.Game.Overlays currentChannelContainer.Clear(false); currentChannelContainer.Add(loaded); currentChannelContainer.FadeIn(500, Easing.OutQuint); + + if (messagePendingHighlight != null) + { + tryHighlightMessage(messagePendingHighlight); + messagePendingHighlight = null; + } }); } else { currentChannelContainer.Clear(false); currentChannelContainer.Add(loaded); + + if (messagePendingHighlight != null) + { + tryHighlightMessage(messagePendingHighlight); + messagePendingHighlight = null; + } } // mark channel as read when channel switched @@ -303,6 +321,29 @@ namespace osu.Game.Overlays channelManager.MarkChannelAsRead(e.NewValue); } + /// + /// Highlights a certain message in the specified channel. + /// + /// The message to highlight. + public void HighlightMessage(Message message) + { + if (currentDrawableChannel?.Channel.Id == message.ChannelId) + tryHighlightMessage(message); + else + { + messagePendingHighlight = message; + currentChannel.Value = channelManager.JoinedChannels.Single(c => c.Id == message.ChannelId); + } + } + + private void tryHighlightMessage(Message message) + { + if (message.ChannelId != currentChannel.Value.Id) + return; + + currentDrawableChannel.HighlightMessage(message); + } + private float startDragChatHeight; private bool isDragging;