]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/chat.cpp
Merge pull request #35 from arydevy/patch-1
[dragonfireclient.git] / src / chat.cpp
index 72abc466960181b36b1563683c69d70d5b37ff7d..c9317a079dadd73be72c4266e5d2e36a7fb8921f 100644 (file)
@@ -18,11 +18,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "chat.h"
-#include "debug.h"
-#include "config.h"
-#include "util/strfnd.h"
+
+#include <algorithm>
 #include <cctype>
 #include <sstream>
+
+#include "config.h"
+#include "debug.h"
+#include "util/strfnd.h"
 #include "util/string.h"
 #include "util/numeric.h"
 
@@ -34,17 +37,12 @@ ChatBuffer::ChatBuffer(u32 scrollback):
        m_empty_formatted_line.first = true;
 }
 
-ChatBuffer::~ChatBuffer()
-{
-}
-
-void ChatBuffer::addLine(std::wstring name, std::wstring text)
+void ChatBuffer::addLine(const std::wstring &name, const std::wstring &text)
 {
        ChatLine line(name, text);
        m_unformatted.push_back(line);
 
-       if (m_rows > 0)
-       {
+       if (m_rows > 0) {
                // m_formatted is valid and must be kept valid
                bool scrolled_at_bottom = (m_scroll == getBottomScrollPos());
                u32 num_added = formatChatLine(line, m_cols, m_formatted);
@@ -53,8 +51,7 @@ void ChatBuffer::addLine(std::wstring name, std::wstring text)
        }
 
        // Limit number of lines by m_scrollback
-       if (m_unformatted.size() > m_scrollback)
-       {
+       if (m_unformatted.size() > m_scrollback) {
                deleteOldest(m_unformatted.size() - m_scrollback);
        }
 }
@@ -79,9 +76,8 @@ const ChatLine& ChatBuffer::getLine(u32 index) const
 
 void ChatBuffer::step(f32 dtime)
 {
-       for (u32 i = 0; i < m_unformatted.size(); ++i)
-       {
-               m_unformatted[i].age += dtime;
+       for (ChatLine &line : m_unformatted) {
+               line.age += dtime;
        }
 }
 
@@ -127,14 +123,14 @@ void ChatBuffer::deleteByAge(f32 maxAge)
        deleteOldest(count);
 }
 
-u32 ChatBuffer::getColumns() const
+u32 ChatBuffer::getRows() const
 {
-       return m_cols;
+       return m_rows;
 }
 
-u32 ChatBuffer::getRows() const
+void ChatBuffer::scrollTop()
 {
-       return m_rows;
+       m_scroll = getTopScrollPos();
 }
 
 void ChatBuffer::reformat(u32 cols, u32 rows)
@@ -198,8 +194,8 @@ const ChatFormattedLine& ChatBuffer::getFormattedLine(u32 row) const
        s32 index = m_scroll + (s32) row;
        if (index >= 0 && index < (s32) m_formatted.size())
                return m_formatted[index];
-       else
-               return m_empty_formatted_line;
+
+       return m_empty_formatted_line;
 }
 
 void ChatBuffer::scroll(s32 rows)
@@ -224,11 +220,6 @@ void ChatBuffer::scrollBottom()
        m_scroll = getBottomScrollPos();
 }
 
-void ChatBuffer::scrollTop()
-{
-       m_scroll = getTopScrollPos();
-}
-
 u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
                std::vector<ChatFormattedLine>& destination) const
 {
@@ -357,10 +348,11 @@ s32 ChatBuffer::getTopScrollPos() const
        s32 rows = (s32) m_rows;
        if (rows == 0)
                return 0;
-       else if (formatted_count <= rows)
+
+       if (formatted_count <= rows)
                return formatted_count - rows;
-       else
-               return 0;
+
+       return 0;
 }
 
 s32 ChatBuffer::getBottomScrollPos() const
@@ -369,10 +361,16 @@ s32 ChatBuffer::getBottomScrollPos() const
        s32 rows = (s32) m_rows;
        if (rows == 0)
                return 0;
-       else
-               return formatted_count - rows;
+
+       return formatted_count - rows;
 }
 
+void ChatBuffer::resize(u32 scrollback)
+{
+       m_scrollback = scrollback;
+       if (m_unformatted.size() > m_scrollback)
+               deleteOldest(m_unformatted.size() - m_scrollback);
+}
 
 
 ChatPrompt::ChatPrompt(const std::wstring &prompt, u32 history_limit):
@@ -381,10 +379,6 @@ ChatPrompt::ChatPrompt(const std::wstring &prompt, u32 history_limit):
 {
 }
 
-ChatPrompt::~ChatPrompt()
-{
-}
-
 void ChatPrompt::input(wchar_t ch)
 {
        m_line.insert(m_cursor, 1, ch);
@@ -403,10 +397,16 @@ void ChatPrompt::input(const std::wstring &str)
        m_nick_completion_end = 0;
 }
 
-void ChatPrompt::addToHistory(std::wstring line)
+void ChatPrompt::addToHistory(const std::wstring &line)
 {
-       if (!line.empty())
+       if (!line.empty() &&
+                       (m_history.size() == 0 || m_history.back() != line)) {
+               // Remove all duplicates
+               m_history.erase(std::remove(m_history.begin(), m_history.end(),
+                       line), m_history.end());
+               // Push unique line
                m_history.push_back(line);
+       }
        if (m_history.size() > m_history_limit)
                m_history.erase(m_history.begin());
        m_history_index = m_history.size();
@@ -421,7 +421,7 @@ void ChatPrompt::clear()
        m_nick_completion_end = 0;
 }
 
-std::wstring ChatPrompt::replace(std::wstring line)
+std::wstring ChatPrompt::replace(const std::wstring &line)
 {
        std::wstring old_line = m_line;
        m_line =  line;
@@ -484,18 +484,15 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa
 
        // find all names that start with the selected prefix
        std::vector<std::wstring> completions;
-       for (std::list<std::string>::const_iterator
-                       i = names.begin();
-                       i != names.end(); ++i)
-       {
-               if (str_starts_with(narrow_to_wide(*i), prefix, true))
-               {
-                       std::wstring completion = narrow_to_wide(*i);
+       for (const std::string &name : names) {
+               std::wstring completion = utf8_to_wide(name);
+               if (str_starts_with(completion, prefix, true)) {
                        if (prefix_start == 0)
                                completion += L": ";
                        completions.push_back(completion);
                }
        }
+
        if (completions.empty())
                return;
 
@@ -658,13 +655,10 @@ ChatBackend::ChatBackend():
 {
 }
 
-ChatBackend::~ChatBackend()
-{
-}
-
-void ChatBackend::addMessage(std::wstring name, std::wstring text)
+void ChatBackend::addMessage(const std::wstring &name, std::wstring text)
 {
        // Note: A message may consist of multiple lines, for example the MOTD.
+       text = translate_string(text);
        WStrfnd fnd(text);
        while (!fnd.at_end())
        {
@@ -707,11 +701,10 @@ ChatBuffer& ChatBackend::getRecentBuffer()
        return m_recent_buffer;
 }
 
-EnrichedString ChatBackend::getRecentChat()
+EnrichedString ChatBackend::getRecentChat() const
 {
        EnrichedString result;
-       for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i)
-       {
+       for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i) {
                const ChatLine& line = m_recent_buffer.getLine(i);
                if (i != 0)
                        result += L"\n";
@@ -745,6 +738,14 @@ void ChatBackend::clearRecentChat()
        m_recent_buffer.clear();
 }
 
+
+void ChatBackend::applySettings()
+{
+       u32 recent_lines = g_settings->getU32("recent_chat_messages");
+       recent_lines = rangelim(recent_lines, 2, 20);
+       m_recent_buffer.resize(recent_lines);
+}
+
 void ChatBackend::step(float dtime)
 {
        m_recent_buffer.step(dtime);