X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fchat.h;h=0b98e4d3c0507118b6485a70754998ad36ba128b;hb=2f6393f49d5ebf21abfaa7bff876b8c0cf4ca191;hp=27863922cc265a6affce52faa0a32c4c97aa23cd;hpb=6d0ea26c2d62c3774ff384cf1bfc2a3372b49a3b;p=dragonfireclient.git diff --git a/src/chat.h b/src/chat.h index 27863922c..0b98e4d3c 100644 --- a/src/chat.h +++ b/src/chat.h @@ -17,25 +17,34 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef CHAT_HEADER -#define CHAT_HEADER +#pragma once -#include "irrlichttypes_bloated.h" #include +#include +#include -// Chat console related classes, only used by the client +#include "irrlichttypes.h" +#include "util/enriched_string.h" +#include "settings.h" + +// Chat console related classes struct ChatLine { // age in seconds - f32 age; + f32 age = 0.0f; // name of sending player, or empty if sent by server - std::wstring name; + EnrichedString name; // message text - std::wstring text; + EnrichedString text; + + ChatLine(const std::wstring &a_name, const std::wstring &a_text): + name(a_name), + text(a_text) + { + } - ChatLine(std::wstring a_name, std::wstring a_text): - age(0.0), + ChatLine(const EnrichedString &a_name, const EnrichedString &a_text): name(a_name), text(a_text) { @@ -45,7 +54,7 @@ struct ChatLine struct ChatFormattedFragment { // text string - std::wstring text; + EnrichedString text; // starting column u32 column; // formatting @@ -55,7 +64,7 @@ struct ChatFormattedFragment struct ChatFormattedLine { // Array of text fragments - core::array fragments; + std::vector fragments; // true if first line of one formatted ChatLine bool first; }; @@ -64,19 +73,17 @@ class ChatBuffer { public: ChatBuffer(u32 scrollback); - ~ChatBuffer(); + ~ChatBuffer() = default; // Append chat line // Removes oldest chat line if scrollback size is reached - void addLine(std::wstring name, std::wstring text); + void addLine(const std::wstring &name, const std::wstring &text); // Remove all chat lines void clear(); // Get number of lines currently in buffer. u32 getLineCount() const; - // Get scrollback size, maximum number of lines in buffer. - u32 getScrollback() const; // Get reference to i-th chat line. const ChatLine& getLine(u32 index) const; @@ -87,8 +94,6 @@ class ChatBuffer // Delete lines older than maxAge. void deleteByAge(f32 maxAge); - // Get number of columns, 0 if reformat has not been called yet. - u32 getColumns() const; // Get number of rows, 0 if reformat has not been called yet. u32 getRows() const; // Update console size and reformat all formatted lines. @@ -110,8 +115,9 @@ class ChatBuffer // Appends the formatted lines to the destination array and // returns the number of formatted lines. u32 formatChatLine(const ChatLine& line, u32 cols, - core::array& destination) const; + std::vector& destination) const; + void resize(u32 scrollback); protected: s32 getTopScrollPos() const; s32 getBottomScrollPos() const; @@ -120,16 +126,16 @@ class ChatBuffer // Scrollback size u32 m_scrollback; // Array of unformatted chat lines - core::array m_unformatted; - + std::vector m_unformatted; + // Number of character columns in console - u32 m_cols; + u32 m_cols = 0; // Number of character rows in console - u32 m_rows; + u32 m_rows = 0; // Scroll position (console's top line index into m_formatted) - s32 m_scroll; + s32 m_scroll = 0; // Array of formatted lines - core::array m_formatted; + std::vector m_formatted; // Empty formatted line, for error returns ChatFormattedLine m_empty_formatted_line; }; @@ -137,20 +143,27 @@ class ChatBuffer class ChatPrompt { public: - ChatPrompt(std::wstring prompt, u32 history_limit); - ~ChatPrompt(); + ChatPrompt(const std::wstring &prompt, u32 history_limit); + ~ChatPrompt() = default; - // Input character + // Input character or string void input(wchar_t ch); + void input(const std::wstring &str); + + // Add a string to the history + void addToHistory(const std::wstring &line); + + // Get current line + std::wstring getLine() const { return m_line; } - // Submit, clear and return current line - std::wstring submit(); + // Get section of line that is currently selected + std::wstring getSelection() const { return m_line.substr(m_cursor, m_cursor_len); } // Clear the current line void clear(); // Replace the current line with the given text - void replace(std::wstring line); + std::wstring replace(const std::wstring &line); // Select previous command from history void historyPrev(); @@ -158,7 +171,7 @@ class ChatPrompt void historyNext(); // Nick completion - void nickCompletion(const core::list& names, bool backwards); + void nickCompletion(const std::list& names, bool backwards); // Update console size and reformat the visible portion of the prompt void reformat(u32 cols); @@ -166,10 +179,13 @@ class ChatPrompt std::wstring getVisiblePortion() const; // Get cursor position (relative to visible portion). -1 if invalid s32 getVisibleCursorPosition() const; + // Get length of cursor selection + s32 getCursorLength() const { return m_cursor_len; } // Cursor operations enum CursorOp { CURSOROP_MOVE, + CURSOROP_SELECT, CURSOROP_DELETE }; @@ -183,7 +199,8 @@ class ChatPrompt enum CursorOpScope { CURSOROP_SCOPE_CHARACTER, CURSOROP_SCOPE_WORD, - CURSOROP_SCOPE_LINE + CURSOROP_SCOPE_LINE, + CURSOROP_SCOPE_SELECTION }; // Cursor operation @@ -205,37 +222,39 @@ class ChatPrompt private: // Prompt prefix - std::wstring m_prompt; + std::wstring m_prompt = L""; // Currently edited line - std::wstring m_line; + std::wstring m_line = L""; // History buffer - core::array m_history; - // History index (0 <= m_history_index <= m_history.size()) - u32 m_history_index; + std::vector m_history; + // History index (0 <= m_history_index <= m_history.size()) + u32 m_history_index = 0; // Maximum number of history entries u32 m_history_limit; // Number of columns excluding columns reserved for the prompt - s32 m_cols; + s32 m_cols = 0; // Start of visible portion (index into m_line) - s32 m_view; + s32 m_view = 0; // Cursor (index into m_line) - s32 m_cursor; + s32 m_cursor = 0; + // Cursor length (length of selected portion of line) + s32 m_cursor_len = 0; // Last nick completion start (index into m_line) - s32 m_nick_completion_start; + s32 m_nick_completion_start = 0; // Last nick completion start (index into m_line) - s32 m_nick_completion_end; + s32 m_nick_completion_end = 0; }; class ChatBackend { public: ChatBackend(); - ~ChatBackend(); + ~ChatBackend() = default; // Add chat message - void addMessage(std::wstring name, std::wstring text); + void addMessage(const std::wstring &name, std::wstring text); // Parse and add unparsed chat message void addUnparsedMessage(std::wstring line); @@ -244,7 +263,7 @@ class ChatBackend // Get the recent messages buffer ChatBuffer& getRecentBuffer(); // Concatenate all recent messages - std::wstring getRecentChat(); + EnrichedString getRecentChat() const; // Get the console prompt ChatPrompt& getPrompt(); @@ -262,11 +281,11 @@ class ChatBackend void scrollPageDown(); void scrollPageUp(); + // Resize recent buffer based on settings + void applySettings(); + private: ChatBuffer m_console_buffer; ChatBuffer m_recent_buffer; ChatPrompt m_prompt; }; - -#endif -