add filter show UI
This commit is contained in:
@@ -36,6 +36,7 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
private ObjectPool<ChatMessageView> _pool;
|
||||
|
||||
private bool _userAtBottom = true;
|
||||
private ChatChannel _currentFilterChannel = ChatChannel.GP_CHAT_LOCAL;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
@@ -49,6 +50,7 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
}
|
||||
|
||||
EventBus.Subscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
|
||||
EventBus.Subscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
|
||||
_pool = new ObjectPool<ChatMessageView>(
|
||||
CreateItem,
|
||||
OnGetItem,
|
||||
@@ -65,6 +67,23 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
private void OnDestroy()
|
||||
{
|
||||
EventBus.Unsubscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
|
||||
EventBus.Unsubscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
|
||||
}
|
||||
|
||||
private void OnChannelFilterChanged(ChatChannelFilterChangedEvent e)
|
||||
{
|
||||
_currentFilterChannel = e.channel;
|
||||
if (chatPanelUIGO.activeSelf)
|
||||
{
|
||||
RefreshVisible();
|
||||
}
|
||||
}
|
||||
|
||||
private bool ShouldShowMessage(ChatMessageData data)
|
||||
{
|
||||
if (_currentFilterChannel == ChatChannel.GP_CHAT_LOCAL) return true;
|
||||
if (data.channel == (byte)ChatChannel.GP_CHAT_MISC) return true;
|
||||
return data.channel == (byte)_currentFilterChannel;
|
||||
}
|
||||
|
||||
private void OnChatMessageReceived(GameSession.ChatMessageEvent x)
|
||||
@@ -123,10 +142,13 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
if (!chatPanelUIGO.activeSelf)
|
||||
return;
|
||||
|
||||
AddMessageView(data);
|
||||
if (ShouldShowMessage(data))
|
||||
{
|
||||
AddMessageView(data);
|
||||
|
||||
if (_userAtBottom)
|
||||
ScrollToBottom();
|
||||
if (_userAtBottom)
|
||||
ScrollToBottom();
|
||||
}
|
||||
}
|
||||
|
||||
void AddMessageView(ChatMessageData data)
|
||||
@@ -157,15 +179,24 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
|
||||
_visibleViews.Clear();
|
||||
|
||||
int start = Mathf.Max(0, _messages.Count - maxVisibleMessages);
|
||||
var filteredMessages = new List<ChatMessageData>();
|
||||
foreach (var msg in _messages)
|
||||
{
|
||||
if (ShouldShowMessage(msg))
|
||||
{
|
||||
filteredMessages.Add(msg);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = start; i < _messages.Count; i++)
|
||||
int start = Mathf.Max(0, filteredMessages.Count - maxVisibleMessages);
|
||||
|
||||
for (int i = start; i < filteredMessages.Count; i++)
|
||||
{
|
||||
var view = _pool.Get();
|
||||
view.transform.SetParent(content, false);
|
||||
view.transform.SetAsLastSibling();
|
||||
|
||||
var data = _messages[i];
|
||||
var data = filteredMessages[i];
|
||||
Sprite icon = _iconCache.ContainsKey(data.channel) ? _iconCache[data.channel] : null;
|
||||
view.Bind(icon, data.message);
|
||||
|
||||
|
||||
@@ -8,6 +8,12 @@ using CSNetwork;
|
||||
|
||||
namespace BrewMonster.Scripts.ChatUI
|
||||
{
|
||||
public struct ChatChannelFilterChangedEvent
|
||||
{
|
||||
public ChatChannel channel;
|
||||
public ChatChannelFilterChangedEvent(ChatChannel c) { channel = c; }
|
||||
}
|
||||
|
||||
public class ChatInputHandler : MonoBehaviour
|
||||
{
|
||||
public TMP_InputField inputField;
|
||||
@@ -88,16 +94,30 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
}
|
||||
|
||||
m_currentChannel = channel;
|
||||
var config = chatSystem.channelIcons.Find(c => c.channel == channel);
|
||||
if (config.prefix != null)
|
||||
|
||||
// Handle System channel input restriction
|
||||
if (m_currentChannel == ChatChannel.GP_CHAT_SYSTEM)
|
||||
{
|
||||
string currentText = inputField.text;
|
||||
currentText = RemoveKnownPrefix(currentText);
|
||||
inputField.text = config.prefix + currentText;
|
||||
inputField.interactable = false;
|
||||
inputField.text = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
inputField.interactable = true;
|
||||
|
||||
var config = chatSystem.channelIcons.Find(c => c.channel == channel);
|
||||
if (config.prefix != null)
|
||||
{
|
||||
string currentText = inputField.text;
|
||||
currentText = RemoveKnownPrefix(currentText);
|
||||
inputField.text = config.prefix + currentText;
|
||||
}
|
||||
|
||||
inputField.ActivateInputField();
|
||||
inputField.MoveTextEnd(false);
|
||||
}
|
||||
|
||||
inputField.ActivateInputField();
|
||||
inputField.MoveTextEnd(false);
|
||||
EventBus.Publish(new ChatChannelFilterChangedEvent(m_currentChannel));
|
||||
}
|
||||
|
||||
private string RemoveKnownPrefix(string text)
|
||||
@@ -304,6 +324,12 @@ namespace BrewMonster.Scripts.ChatUI
|
||||
HandleWhisper(text, nPack, nSlot);
|
||||
return ChatChannel.GP_CHAT_WHISPER;
|
||||
}
|
||||
else if (channel == ChatChannel.GP_CHAT_WHISPER)
|
||||
{
|
||||
// Cho phép chat kênh Whisper mượt mà mà không bắt buộc gõ ký tự "/" ở đầu
|
||||
HandleWhisper("/" + text, nPack, nSlot);
|
||||
return ChatChannel.GP_CHAT_WHISPER;
|
||||
}
|
||||
// Không gõ prefix thủ công thì sẽ dùng m_currentChannel đã được gán ở đầu hàm
|
||||
|
||||
SendChat(channel, pszMsg, nPack, nSlot);
|
||||
|
||||
Reference in New Issue
Block a user