]> git.lizzy.rs Git - minetest.git/blobdiff - src/chat.cpp
Set acceleration only once in falling node
[minetest.git] / src / chat.cpp
index b9d115bd088c937fb7934a3c23ec252696d777ca..495e3450b2d132d6203a383176ae551b5d5e31fa 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "chat.h"
 #include "debug.h"
-#include <cassert>
+#include "strfnd.h"
 #include <cctype>
 #include <sstream>
 #include "util/string.h"
@@ -83,7 +83,7 @@ u32 ChatBuffer::getScrollback() const
 
 const ChatLine& ChatBuffer::getLine(u32 index) const
 {
-       assert(index < getLineCount());
+       assert(index < getLineCount()); // pre-condition
        return m_unformatted[index];
 }
 
@@ -107,7 +107,8 @@ void ChatBuffer::deleteOldest(u32 count)
                // keep m_formatted in sync
                if (del_formatted < m_formatted.size())
                {
-                       assert(m_formatted[del_formatted].first);
+
+                       sanity_check(m_formatted[del_formatted].first);
                        ++del_formatted;
                        while (del_formatted < m_formatted.size() &&
                                        !m_formatted[del_formatted].first)
@@ -117,8 +118,8 @@ void ChatBuffer::deleteOldest(u32 count)
                --count;
        }
 
-       m_unformatted.erase(0, del_unformatted);
-       m_formatted.erase(0, del_formatted);
+       m_unformatted.erase(m_unformatted.begin(), m_unformatted.begin() + del_unformatted);
+       m_formatted.erase(m_formatted.begin(), m_formatted.begin() + del_formatted);
 }
 
 void ChatBuffer::deleteByAge(f32 maxAge)
@@ -151,7 +152,7 @@ void ChatBuffer::reformat(u32 cols, u32 rows)
        }
        else if (cols != m_cols || rows != m_rows)
        {
-               // TODO: Avoid reformatting ALL lines (even inivisble ones)
+               // TODO: Avoid reformatting ALL lines (even invisible ones)
                // each time the console size changes.
 
                // Find out the scroll position in *unformatted* lines
@@ -232,10 +233,10 @@ void ChatBuffer::scrollTop()
 }
 
 u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
-               core::array<ChatFormattedLine>& destination) const
+               std::vector<ChatFormattedLine>& destination) const
 {
        u32 num_added = 0;
-       core::array<ChatFormattedFragment> next_frags;
+       std::vector<ChatFormattedFragment> next_frags;
        ChatFormattedLine next_line;
        ChatFormattedFragment temp_frag;
        u32 out_column = 0;
@@ -292,7 +293,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
                                frag.column = out_column;
                                next_line.fragments.push_back(frag);
                                out_column += frag.text.size();
-                               next_frags.erase(0, 1);
+                               next_frags.erase(next_frags.begin());
                        }
                        else
                        {
@@ -389,6 +390,7 @@ ChatPrompt::ChatPrompt(std::wstring prompt, u32 history_limit):
        m_cols(0),
        m_view(0),
        m_cursor(0),
+       m_cursor_len(0),
        m_nick_completion_start(0),
        m_nick_completion_end(0)
 {
@@ -407,20 +409,22 @@ void ChatPrompt::input(wchar_t ch)
        m_nick_completion_end = 0;
 }
 
-std::wstring ChatPrompt::submit()
+void ChatPrompt::input(const std::wstring &str)
+{
+       m_line.insert(m_cursor, str);
+       m_cursor += str.size();
+       clampView();
+       m_nick_completion_start = 0;
+       m_nick_completion_end = 0;
+}
+
+void ChatPrompt::addToHistory(std::wstring line)
 {
-       std::wstring line = m_line;
-       m_line.clear();
        if (!line.empty())
                m_history.push_back(line);
        if (m_history.size() > m_history_limit)
-               m_history.erase(0);
+               m_history.erase(m_history.begin());
        m_history_index = m_history.size();
-       m_view = 0;
-       m_cursor = 0;
-       m_nick_completion_start = 0;
-       m_nick_completion_end = 0;
-       return line;
 }
 
 void ChatPrompt::clear()
@@ -432,13 +436,15 @@ void ChatPrompt::clear()
        m_nick_completion_end = 0;
 }
 
-void ChatPrompt::replace(std::wstring line)
+std::wstring ChatPrompt::replace(std::wstring line)
 {
+       std::wstring old_line = m_line;
        m_line =  line;
        m_view = m_cursor = line.size();
        clampView();
        m_nick_completion_start = 0;
        m_nick_completion_end = 0;
+       return old_line;
 }
 
 void ChatPrompt::historyPrev()
@@ -464,7 +470,7 @@ void ChatPrompt::historyNext()
        }
 }
 
-void ChatPrompt::nickCompletion(const core::list<std::wstring>& names, bool backwards)
+void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwards)
 {
        // Two cases:
        // (a) m_nick_completion_start == m_nick_completion_end == 0
@@ -492,16 +498,16 @@ void ChatPrompt::nickCompletion(const core::list<std::wstring>& names, bool back
        std::wstring prefix = m_line.substr(prefix_start, prefix_end - prefix_start);
 
        // find all names that start with the selected prefix
-       core::array<std::wstring> completions;
-       for (core::list<std::wstring>::ConstIterator
+       std::vector<std::wstring> completions;
+       for (std::list<std::string>::const_iterator
                        i = names.begin();
-                       i != names.end(); i++)
+                       i != names.end(); ++i)
        {
-               if (str_starts_with(*i, prefix, true))
+               if (str_starts_with(narrow_to_wide(*i), prefix, true))
                {
-                       std::wstring completion = *i;
+                       std::wstring completion = narrow_to_wide(*i);
                        if (prefix_start == 0)
-                               completion += L":";
+                               completion += L": ";
                        completions.push_back(completion);
                }
        }
@@ -531,7 +537,7 @@ void ChatPrompt::nickCompletion(const core::list<std::wstring>& names, bool back
                        }
                }
        }
-       std::wstring replacement = completions[replacement_index] + L" ";
+       std::wstring replacement = completions[replacement_index];
        if (word_end < m_line.size() && isspace(word_end))
                ++word_end;
 
@@ -580,14 +586,12 @@ void ChatPrompt::cursorOperation(CursorOp op, CursorOpDir dir, CursorOpScope sco
        s32 length = m_line.size();
        s32 increment = (dir == CURSOROP_DIR_RIGHT) ? 1 : -1;
 
-       if (scope == CURSOROP_SCOPE_CHARACTER)
-       {
+       switch (scope) {
+       case CURSOROP_SCOPE_CHARACTER:
                new_cursor += increment;
-       }
-       else if (scope == CURSOROP_SCOPE_WORD)
-       {
-               if (increment > 0)
-               {
+               break;
+       case CURSOROP_SCOPE_WORD:
+               if (dir == CURSOROP_DIR_RIGHT) {
                        // skip one word to the right
                        while (new_cursor < length && isspace(m_line[new_cursor]))
                                new_cursor++;
@@ -595,39 +599,47 @@ void ChatPrompt::cursorOperation(CursorOp op, CursorOpDir dir, CursorOpScope sco
                                new_cursor++;
                        while (new_cursor < length && isspace(m_line[new_cursor]))
                                new_cursor++;
-               }
-               else
-               {
+               } else {
                        // skip one word to the left
                        while (new_cursor >= 1 && isspace(m_line[new_cursor - 1]))
                                new_cursor--;
                        while (new_cursor >= 1 && !isspace(m_line[new_cursor - 1]))
                                new_cursor--;
                }
-       }
-       else if (scope == CURSOROP_SCOPE_LINE)
-       {
+               break;
+       case CURSOROP_SCOPE_LINE:
                new_cursor += increment * length;
+               break;
+       case CURSOROP_SCOPE_SELECTION:
+               break;
        }
 
        new_cursor = MYMAX(MYMIN(new_cursor, length), 0);
 
-       if (op == CURSOROP_MOVE)
-       {
+       switch (op) {
+       case CURSOROP_MOVE:
                m_cursor = new_cursor;
-       }
-       else if (op == CURSOROP_DELETE)
-       {
-               if (new_cursor < old_cursor)
-               {
-                       m_line.erase(new_cursor, old_cursor - new_cursor);
-                       m_cursor = new_cursor;
+               m_cursor_len = 0;
+               break;
+       case CURSOROP_DELETE:
+               if (m_cursor_len > 0) { // Delete selected text first
+                       m_line.erase(m_cursor, m_cursor_len);
+               } else {
+                       m_cursor = MYMIN(new_cursor, old_cursor);
+                       m_line.erase(m_cursor, abs(new_cursor - old_cursor));
                }
-               else if (new_cursor > old_cursor)
-               {
-                       m_line.erase(old_cursor, new_cursor - old_cursor);
-                       m_cursor = old_cursor;
+               m_cursor_len = 0;
+               break;
+       case CURSOROP_SELECT:
+               if (scope == CURSOROP_SCOPE_LINE) {
+                       m_cursor = 0;
+                       m_cursor_len = length;
+               } else {
+                       m_cursor = MYMIN(new_cursor, old_cursor);
+                       m_cursor_len += abs(new_cursor - old_cursor);
+                       m_cursor_len = MYMIN(m_cursor_len, length - m_cursor);
                }
+               break;
        }
 
        clampView();
@@ -667,6 +679,9 @@ ChatBackend::~ChatBackend()
 
 void ChatBackend::addMessage(std::wstring name, std::wstring text)
 {
+       name = removeChatEscapes(name);
+       text = removeChatEscapes(text);
+
        // Note: A message may consist of multiple lines, for example the MOTD.
        WStrfnd fnd(text);
        while (!fnd.atend())
@@ -765,5 +780,5 @@ void ChatBackend::scrollPageDown()
 
 void ChatBackend::scrollPageUp()
 {
-       m_console_buffer.scroll(-m_console_buffer.getRows());
+       m_console_buffer.scroll(-(s32)m_console_buffer.getRows());
 }