QTfrontend/ui/widget/chatwidget.cpp
branchsdl2transition
changeset 11342 ed5a6478e710
parent 11046 47a8c19ecb60
child 11521 6873bd4d120c
--- a/QTfrontend/ui/widget/chatwidget.cpp	Tue Nov 10 18:16:35 2015 +0100
+++ b/QTfrontend/ui/widget/chatwidget.cpp	Tue Nov 10 20:43:13 2015 +0100
@@ -1,7 +1,7 @@
 /*
  * Hedgewars, a free turn based strategy game
  * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2004-2013 Andrey Korotaev <unC0Rr@gmail.com>
+ * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include <QDesktopServices>
@@ -179,9 +179,14 @@
     this->gameSettings = NULL;
     this->notify = notify;
 
+    m_usersModel = NULL;
+
     m_isAdmin = false;
     m_autoKickEnabled = false;
 
+    m_scrollToBottom = false;
+    m_scrollBarPos = 0;
+
     QStringList vpList =
          QStringList() << "Classic" << "Default" << "Mobster" << "Russian";
 
@@ -406,26 +411,27 @@
 void HWChatWidget::printChatString(
     const QString & nick, const QString & str, const QString & cssClassPart, bool highlight)
 {
-    QSortFilterProxyModel * playersSortFilterModel = qobject_cast<QSortFilterProxyModel *>(chatNicks->model());
-    if(!playersSortFilterModel)
-        return;
-
-    PlayersListModel * players = qobject_cast<PlayersListModel *>(playersSortFilterModel->sourceModel());
-
-    if(!players)
+    if(!m_usersModel)
         return;
 
     // don't show chat lines that are from ignored nicks
-    if (players->isFlagSet(nick, PlayersListModel::Ignore))
+    if (m_usersModel->isFlagSet(nick, PlayersListModel::Ignore))
         return;
 
-    bool isFriend = (!nick.isEmpty()) && players->isFlagSet(nick, PlayersListModel::Friend);
+    bool isFriend = (!nick.isEmpty()) && m_usersModel->isFlagSet(nick, PlayersListModel::Friend);
 
     QString cssClass = (isFriend ? "msg_Friend" : "msg_User") + cssClassPart;
 
     addLine(cssClass, str, highlight);
 }
 
+bool HWChatWidget::isInGame() {
+    if (!m_usersModel)
+        return false;
+
+    return m_usersModel->isFlagSet(m_userNick, PlayersListModel::InGame);
+}
+
 void HWChatWidget::addLine(const QString & cssClass, QString line, bool isHighlight)
 {
     if (s_displayNone->contains(cssClass))
@@ -449,7 +455,8 @@
     {
         line = QString("<span class=\"highlight\">%1</span>").arg(line);
         SDLInteraction::instance().playSoundFile(m_hilightSound);
-        HWApplication::alert(this, 800);
+        if (!isInGame())
+            HWApplication::alert(this, 800);
     }
 
     chatStrings.append(line);
@@ -544,7 +551,8 @@
     QString hlRegExp("^(.* )?%1[^-a-z0-9_]*( .*)?$");
     QRegExp whitespace("\\s");
 
-    m_highlights.append(QRegExp(hlRegExp.arg(m_userNick.toLower())));
+    if (!m_userNick.isEmpty())
+        m_highlights.append(QRegExp(hlRegExp.arg(QRegExp::escape(m_userNick.toLower()))));
 
     QFile file(cfgdir->absolutePath() + "/" + m_userNick.toLower() + "_highlight.txt");
 
@@ -589,9 +597,10 @@
 {
     addLine("msg_PlayerInfo", QString(" >>> %1 - <span class=\"ipaddress\">%2</span> <span class=\"version\">%3</span> <span class=\"location\">%4</span>")
         .arg(linkedNick(nick))
-        .arg(ip)
-        .arg(version)
-        .arg(roomInfo));
+        .arg(Qt::escape(ip == "[]"?"":ip))
+        .arg(Qt::escape(version))
+        .arg(Qt::escape(roomInfo))
+    );
 }
 
 void HWChatWidget::onKick()
@@ -717,14 +726,14 @@
 void HWChatWidget::adminAccess(bool b)
 {
     chatNicks->removeAction(acKick);
-    chatNicks->removeAction(acBan);
+    //chatNicks->removeAction(acBan);
 
     m_isAdmin = b;
 
     if(b)
     {
         chatNicks->insertAction(0, acKick);
-        chatNicks->insertAction(0, acBan);
+        //chatNicks->insertAction(0, acBan);
     }
 }
 
@@ -848,6 +857,12 @@
 
     chatNicks->setModel(model);
     chatNicks->setModelColumn(0);
+
+    QSortFilterProxyModel * sfpModel = qobject_cast<QSortFilterProxyModel *>(model);
+    if (sfpModel)
+        m_usersModel = qobject_cast<PlayersListModel*>(sfpModel->sourceModel());
+    else
+        m_usersModel = qobject_cast<PlayersListModel*>(model);
 }
 
 void HWChatWidget::nicksContextMenuRequested(const QPoint &pos)