summaryrefslogtreecommitdiff
path: root/src/guiChatConsole.cpp
Commit message (Expand)AuthorAge
* Fix console resize issue when maximising game window (#6023)Ezhh2017-06-21
* Merge cguittfont lib in irrlicht change folder. (#6016)Loïc Blot2017-06-20
* Fix console not being properly resized after window size changed (#6020)Zeno-2017-06-20
* Cpp11 initializers 2 (#5999)Loïc Blot2017-06-17
* C++11 patchset 9: move hardcoded init parameters to class definitions (part 1...Loïc Blot2017-06-16
* Real control fix (#5787)Loïc Blot2017-05-20
* Fix wchar_t type on 605599b6f150b89ba6539c4d088231b326adcb48Loic Blot2017-05-20
* Fix shift key producing space in console (#5777)Craig Davison2017-05-20
* Clean up getTime helpersShadowNinja2017-04-28
* Rename height to scale for openConsole() (#5139)Zeno-2017-01-29
* Irrlicht 1.9 supportsfan52016-12-26
* Fix & make linux conditionals uniform (#4278)Rogier-52016-07-04
* Add colored text (not only colored chat).Ekdohibs2016-05-31
* Colored chat working as expected for both freetype and non-freetype builds. @...TriBlade92016-05-31
* Fix holding down F10 (open console) causing GUI to freezeCraig Robbins2016-05-04
* Fix chat console not opening after formspec opened over itShadowNinja2016-03-12
* Add support for non-ASCII characters to chat consoleShadowNinja2016-03-02
* Add text selection and copying to consoleShadowNinja2016-03-02
* Unlock cursor when opening consoleShadowNinja2016-03-02
* Use the console instead of a dedicated window when pressing keymap_chat/cmdEsteban I. Ruiz Moreno2016-03-02
* Move globals from main.cpp to more sane locationsCraig Robbins2015-04-01
* Replace std::list to std::vector into tile.cpp (m_texture_trash) and move til...Loic Blot2015-03-05
* Grab GUIChatConsole::m_font, fixes segfault when changing font_sizeKahrl2015-02-18
* Reduce gettext wide/narrow and string/char* conversionsShadowNinja2015-02-05
* Fix use of uninit data in Sky and (potentially) GUIChatConsole constructorsKahrl2015-01-18
* Add paste command (Ctrl-V) in GUIChatConsoleKahrl2014-12-10
* Make hud use fontengine toosapier2014-11-30
* Implement proper font handlingsapier2014-11-30
* Make freetype usage configureable by a settingPilzAdam2013-08-04
* Add basic unicode support to the console (linux workaround)Esteban I. Ruiz Moreno2013-06-15
* Close console when it loses focus but it is still on screenEsteban I. Ruiz Moreno2013-06-05
* Dont drop fonts with ENABLE_FREETYPE=0PilzAdam2013-05-16
* Fix memory leaks: delete font in main and GUIChatConsolePilzAdam2013-05-10
* Fix nick completionPilzAdam2013-04-05
* Migrate to STL containers/algorithms.Ilya Zhuravlev2013-03-11
* Update Copyright YearsSfan52013-02-24
* Change Minetest-c55 to MinetestPilzAdam2013-02-24
* Add Freetype supportIlya Zhuravlev2013-02-14
* Switch the license to be LGPLv2/later, with small parts still remaining as GP...Perttu Ahola2012-06-05
* Chat console, including a number of rebases and modifications.Kahrl2012-03-10
opt">&a_text): name(a_name), text(a_text) { } ChatLine(const EnrichedString &a_name, const EnrichedString &a_text): name(a_name), text(a_text) { } }; struct ChatFormattedFragment { // text string EnrichedString text; // starting column u32 column; // formatting //u8 bold:1; }; struct ChatFormattedLine { // Array of text fragments std::vector<ChatFormattedFragment> fragments; // true if first line of one formatted ChatLine bool first; }; class ChatBuffer { public: ChatBuffer(u32 scrollback); ~ChatBuffer() = default; // Append chat line // Removes oldest chat line if scrollback size is reached 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 reference to i-th chat line. const ChatLine& getLine(u32 index) const; // Increase each chat line's age by dtime. void step(f32 dtime); // Delete oldest N chat lines. void deleteOldest(u32 count); // 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. void reformat(u32 cols, u32 rows); // Get formatted line for a given row (0 is top of screen). // Only valid after reformat has been called at least once const ChatFormattedLine& getFormattedLine(u32 row) const; // Scrolling in formatted buffer (relative) // positive rows == scroll up, negative rows == scroll down void scroll(s32 rows); // Scrolling in formatted buffer (absolute) void scrollAbsolute(s32 scroll); // Scroll to bottom of buffer (newest) void scrollBottom(); // Scroll to top of buffer (oldest) void scrollTop(); // Format a chat line for the given number of columns. // Appends the formatted lines to the destination array and // returns the number of formatted lines. u32 formatChatLine(const ChatLine& line, u32 cols, std::vector<ChatFormattedLine>& destination) const; void resize(u32 scrollback); protected: s32 getTopScrollPos() const; s32 getBottomScrollPos() const; private: // Scrollback size u32 m_scrollback; // Array of unformatted chat lines std::vector<ChatLine> m_unformatted; // Number of character columns in console u32 m_cols = 0; // Number of character rows in console u32 m_rows = 0; // Scroll position (console's top line index into m_formatted) s32 m_scroll = 0; // Array of formatted lines std::vector<ChatFormattedLine> m_formatted; // Empty formatted line, for error returns ChatFormattedLine m_empty_formatted_line; }; class ChatPrompt { public: ChatPrompt(const std::wstring &prompt, u32 history_limit); ~ChatPrompt() = default; // 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; } // 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 std::wstring replace(const std::wstring &line); // Select previous command from history void historyPrev(); // Select next command from history void historyNext(); // Nick completion void nickCompletion(const std::list<std::string>& names, bool backwards); // Update console size and reformat the visible portion of the prompt void reformat(u32 cols); // Get visible portion of the prompt. 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 }; // Cursor operation direction enum CursorOpDir { CURSOROP_DIR_LEFT, CURSOROP_DIR_RIGHT }; // Cursor operation scope enum CursorOpScope { CURSOROP_SCOPE_CHARACTER, CURSOROP_SCOPE_WORD, CURSOROP_SCOPE_LINE, CURSOROP_SCOPE_SELECTION }; // Cursor operation // op specifies whether it's a move or delete operation // dir specifies whether the operation goes left or right // scope specifies how far the operation will reach (char/word/line) // Examples: // cursorOperation(CURSOROP_MOVE, CURSOROP_DIR_RIGHT, CURSOROP_SCOPE_LINE) // moves the cursor to the end of the line. // cursorOperation(CURSOROP_DELETE, CURSOROP_DIR_LEFT, CURSOROP_SCOPE_WORD) // deletes the word to the left of the cursor. void cursorOperation(CursorOp op, CursorOpDir dir, CursorOpScope scope); protected: // set m_view to ensure that 0 <= m_view <= m_cursor < m_view + m_cols // if line can be fully shown, set m_view to zero // else, also ensure m_view <= m_line.size() + 1 - m_cols void clampView(); private: // Prompt prefix std::wstring m_prompt = L""; // Currently edited line std::wstring m_line = L""; // History buffer std::vector<std::wstring> 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 = 0; // Start of visible portion (index into m_line) s32 m_view = 0; // Cursor (index into m_line) 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 = 0; // Last nick completion start (index into m_line) s32 m_nick_completion_end = 0; }; class ChatBackend { public: ChatBackend(); ~ChatBackend() = default; // Add chat message void addMessage(const std::wstring &name, std::wstring text); // Parse and add unparsed chat message void addUnparsedMessage(std::wstring line); // Get the console buffer ChatBuffer& getConsoleBuffer(); // Get the recent messages buffer ChatBuffer& getRecentBuffer(); // Concatenate all recent messages EnrichedString getRecentChat() const; // Get the console prompt ChatPrompt& getPrompt(); // Reformat all buffers void reformat(u32 cols, u32 rows); // Clear all recent messages void clearRecentChat(); // Age recent messages void step(float dtime); // Scrolling void scroll(s32 rows); void scrollPageDown(); void scrollPageUp(); // Resize recent buffer based on settings void applySettings(); private: ChatBuffer m_console_buffer; ChatBuffer m_recent_buffer; ChatPrompt m_prompt; };