void TrySendMessage() { if (mLastChatTime > Globals.System.GetTimeMs()) { ChatboxMsg.AddMessage(new ChatboxMsg(Strings.Chatbox.toofast, Color.Red)); mLastChatTime = Globals.System.GetTimeMs() + Options.MinChatInterval; return; } mLastChatTime = Globals.System.GetTimeMs() + Options.MinChatInterval; if (mChatboxInput.Text.Trim().Length <= 0 || mChatboxInput.Text == GetDefaultInputText()) { mChatboxInput.Text = GetDefaultInputText(); return; } PacketSender.SendChatMsg( mChatboxInput.Text.Trim(), byte.Parse(mChannelCombobox.SelectedItem.UserData.ToString()) ); mChatboxInput.Text = GetDefaultInputText(); }
//Update public void Update() { if (mReceivedMessage) { mChatboxMessages.ScrollToBottom(); mReceivedMessage = false; } var msgs = ChatboxMsg.GetMessages(); for (var i = mMessageIndex; i < msgs.Count; i++) { var msg = msgs[i]; var myText = Interface.WrapText( msg.GetMessage(), mChatboxMessages.Width - mChatboxMessages.GetVerticalScrollBar().Width - 8, mChatboxText.Font ); foreach (var t in myText) { var rw = mChatboxMessages.AddRow(t.Trim()); rw.SetTextFont(mChatboxText.Font); rw.SetTextColor(msg.GetColor()); rw.ShouldDrawBackground = false; rw.UserData = msg.GetTarget(); rw.Clicked += ChatboxRow_Clicked; mReceivedMessage = true; while (mChatboxMessages.RowCount > ClientConfiguration.Instance.ChatLines) { mChatboxMessages.RemoveRow(0); } } mMessageIndex++; } }
//Init public Chatbox(Canvas gameCanvas, GameInterface gameUi) { mGameUi = gameUi; //Chatbox Window mChatboxWindow = new ImagePanel(gameCanvas, "ChatboxWindow"); mChatboxMessages = new ListBox(mChatboxWindow, "MessageList"); mChatboxMessages.EnableScroll(false, true); mChatboxWindow.ShouldCacheToTexture = true; mChatboxTitle = new Label(mChatboxWindow, "ChatboxTitle"); mChatboxTitle.Text = Strings.Chatbox.title; mChatboxTitle.IsHidden = true; mChatbar = new ImagePanel(mChatboxWindow, "Chatbar"); mChatbar.IsHidden = true; mChatboxInput = new TextBox(mChatboxWindow, "ChatboxInputField"); mChatboxInput.SubmitPressed += ChatBoxInput_SubmitPressed; mChatboxInput.Text = GetDefaultInputText(); mChatboxInput.Clicked += ChatBoxInput_Clicked; mChatboxInput.IsTabable = false; mChatboxInput.SetMaxLength(Options.MaxChatLength); Interface.FocusElements.Add(mChatboxInput); mChannelLabel = new Label(mChatboxWindow, "ChannelLabel"); mChannelLabel.Text = Strings.Chatbox.channel; mChannelLabel.IsHidden = true; mChannelCombobox = new ComboBox(mChatboxWindow, "ChatChannelCombobox"); for (var i = 0; i < 3; i++) { var menuItem = mChannelCombobox.AddItem(Strings.Chatbox.channels[i]); menuItem.UserData = i; } //Add admin channel only if power > 0. if (Globals.Me.Type > 0) { var menuItem = mChannelCombobox.AddItem(Strings.Chatbox.channeladmin); menuItem.UserData = 3; } mChatboxText = new Label(mChatboxWindow); mChatboxText.Name = "ChatboxText"; mChatboxText.Font = mChatboxWindow.Parent.Skin.DefaultFont; mChatboxSendButton = new Button(mChatboxWindow, "ChatboxSendButton"); mChatboxSendButton.Text = Strings.Chatbox.send; mChatboxSendButton.Clicked += ChatBoxSendBtn_Clicked; mChatboxWindow.LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString()); mChatboxText.IsHidden = true; // Platform check, are we capable of copy/pasting on this machine? if (GameClipboard.Instance == null || !GameClipboard.Instance.CanCopyPaste()) { ChatboxMsg.AddMessage(new ChatboxMsg(Strings.Chatbox.UnableToCopy, CustomColors.Alerts.Error)); } }
//Init public Chatbox(Canvas gameCanvas, GameInterface gameUi) { mGameUi = gameUi; //Chatbox Window mChatboxWindow = new ImagePanel(gameCanvas, "ChatboxWindow"); mChatboxMessages = new ListBox(mChatboxWindow, "MessageList"); mChatboxMessages.EnableScroll(false, true); mChatboxWindow.ShouldCacheToTexture = true; mChatboxTitle = new Label(mChatboxWindow, "ChatboxTitle"); mChatboxTitle.Text = Strings.Chatbox.title; mChatboxTitle.IsHidden = true; // Generate tab butons. for (var btn = 0; btn < (int)ChatboxTab.Count; btn++) { mTabButtons.Add((ChatboxTab)btn, new Button(mChatboxWindow, $"{(ChatboxTab)btn}TabButton")); // Do we have a localized string for this chat tab? If not assign none as the text. LocalizedString name; mTabButtons[(ChatboxTab)btn].Text = Strings.Chatbox.ChatTabButtons.TryGetValue((ChatboxTab)btn, out name) ? name : Strings.General.none; mTabButtons[(ChatboxTab)btn].Clicked += TabButtonClicked; // We'll be using the user data to determine which tab we've clicked later. mTabButtons[(ChatboxTab)btn].UserData = (ChatboxTab)btn; } mChatbar = new ImagePanel(mChatboxWindow, "Chatbar"); mChatbar.IsHidden = true; mChatboxInput = new TextBox(mChatboxWindow, "ChatboxInputField"); mChatboxInput.SubmitPressed += ChatBoxInput_SubmitPressed; mChatboxInput.Text = GetDefaultInputText(); mChatboxInput.Clicked += ChatBoxInput_Clicked; mChatboxInput.IsTabable = false; mChatboxInput.SetMaxLength(Options.MaxChatLength); Interface.FocusElements.Add(mChatboxInput); mChannelLabel = new Label(mChatboxWindow, "ChannelLabel"); mChannelLabel.Text = Strings.Chatbox.channel; mChannelLabel.IsHidden = true; mChannelCombobox = new ComboBox(mChatboxWindow, "ChatChannelCombobox"); for (var i = 0; i < 3; i++) { var menuItem = mChannelCombobox.AddItem(Strings.Chatbox.channels[i]); menuItem.UserData = i; menuItem.Selected += MenuItem_Selected; } //Add admin channel only if power > 0. if (Globals.Me.Type > 0) { var menuItem = mChannelCombobox.AddItem(Strings.Chatbox.channeladmin); menuItem.UserData = 3; menuItem.Selected += MenuItem_Selected; } mChatboxText = new Label(mChatboxWindow); mChatboxText.Name = "ChatboxText"; mChatboxText.Font = mChatboxWindow.Parent.Skin.DefaultFont; mChatboxSendButton = new Button(mChatboxWindow, "ChatboxSendButton"); mChatboxSendButton.Text = Strings.Chatbox.send; mChatboxSendButton.Clicked += ChatBoxSendBtn_Clicked; mChatboxWindow.LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString()); mChatboxText.IsHidden = true; // Disable this to start, since this is the default tab we open the client on. mTabButtons[ChatboxTab.All].Disable(); // Platform check, are we capable of copy/pasting on this machine? if (GameClipboard.Instance == null || !GameClipboard.Instance.CanCopyPaste()) { ChatboxMsg.AddMessage(new ChatboxMsg(Strings.Chatbox.UnableToCopy, CustomColors.Alerts.Error, ChatMessageType.Error)); } }
//Update public void Update() { // TODO: Find a cleaner way to do this logic, right now this will only start working properly (ie not resetting scroll height) after a few chat messages. // Can't seem to find a cleaner way yet. But works in longer chat convos. var scrollAmount = mChatboxMessages.GetVerticalScrollBar().ScrollAmount; var scrollToBottom = mChatboxMessages.GetVerticalScrollBar().ScrollAmount == 1 || (mChatboxMessages.RowCount <= 10 && mChatboxMessages.GetVerticalScrollBar().ScrollAmount <= 1); // Did the tab change recently? If so, we need to reset a few things to make it work... if (mLastTab != mCurrentTab) { mChatboxMessages.Clear(); mChatboxMessages.GetHorizontalScrollBar().SetScrollAmount(0); mMessageIndex = 0; mReceivedMessage = true; mLastTab = mCurrentTab; } if (mReceivedMessage) { mChatboxMessages.ScrollToBottom(); mReceivedMessage = false; } var msgs = ChatboxMsg.GetMessages(mCurrentTab); for (var i = mMessageIndex; i < msgs.Count; i++) { var msg = msgs[i]; var myText = Interface.WrapText( msg.Message, mChatboxMessages.Width - mChatboxMessages.GetVerticalScrollBar().Width - 8, mChatboxText.Font ); foreach (var t in myText) { var rw = mChatboxMessages.AddRow(t.Trim()); rw.SetTextFont(mChatboxText.Font); rw.SetTextColor(msg.Color); rw.ShouldDrawBackground = false; rw.UserData = msg.Target; rw.Clicked += ChatboxRow_Clicked; rw.RightClicked += ChatboxRow_RightClicked; mReceivedMessage = true; while (mChatboxMessages.RowCount > ClientConfiguration.Instance.ChatLines) { mChatboxMessages.RemoveRow(0); } } mMessageIndex++; } if (!scrollToBottom) { mChatboxMessages.GetVerticalScrollBar().SetScrollAmount(scrollAmount); } else { mChatboxMessages.GetVerticalScrollBar().SetScrollAmount(1); } }
/// <summary> /// Adds a new chat message to the stored list. /// </summary> /// <param name="msg">The message to add.</param> public static void AddMessage(ChatboxMsg msg) { sGameMessages.Add(msg); }