diff -r 266df6d5ed73 -r 1a4b9b9fe2b0 QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Wed Mar 20 09:13:05 2013 +0400 +++ b/QTfrontend/ui/widget/chatwidget.cpp Wed Mar 20 23:18:46 2013 +0100 @@ -368,15 +368,43 @@ return QString("%1").arg(Qt::escape(nickname)); } +const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?((hedgewars\\.org|code\\.google\\.com|googlecode\\.com|hh\\.unit22\\.org)(/[^ ]*)?)"); -void HWChatWidget::onChatString(const QString& str) +bool HWChatWidget::containsHighlight(const QString & sender, const QString & message) { - onChatString("", str); + if ((sender != m_userNick) && (!m_userNick.isEmpty())) + { + QString lcStr = message.toLower(); + + foreach (const QRegExp & hl, m_highlights) + { + if (lcStr.contains(hl)) + return true; + } + } + return false; } -const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)"); +QString HWChatWidget::messageToHTML(const QString & message) +{ + QString formattedStr = Qt::escape(message); + // link some urls + formattedStr = formattedStr.replace(URLREGEXP, "\\3"); + return formattedStr; +} -void HWChatWidget::onChatString(const QString& nick, const QString& str) +void HWChatWidget::onChatAction(const QString & nick, const QString & action) +{ + printChatString(nick, "* " + linkedNick(nick) + " " + messageToHTML(action), "Action", containsHighlight(nick, action)); +} + +void HWChatWidget::onChatMessage(const QString & nick, const QString & message) +{ + printChatString(nick, linkedNick(nick) + ": " + messageToHTML(message), "Chat", containsHighlight(nick, message)); +} + +void HWChatWidget::printChatString( + const QString & nick, const QString & str, const QString & cssClassPart, bool highlight) { QSortFilterProxyModel * playersSortFilterModel = qobject_cast(chatNicks->model()); if(!playersSortFilterModel) @@ -387,58 +415,15 @@ if(!players) return; - if (!nick.isEmpty()) - { - // don't show chat lines that are from ignored nicks - if (players->isFlagSet(nick, PlayersListModel::Ignore)) - return; - } + // don't show chat lines that are from ignored nicks + if (players->isFlagSet(nick, PlayersListModel::Ignore)) + return; bool isFriend = (!nick.isEmpty()) && players->isFlagSet(nick, PlayersListModel::Friend); - QString formattedStr = Qt::escape(str.mid(1)); - // make hedgewars.org urls actual links - formattedStr = formattedStr.replace(URLREGEXP, "\\3"); - - // link the nick - if(!nick.isEmpty()) - formattedStr.replace("|nick|", linkedNick(nick)); - - QString cssClass("msg_UserChat"); + QString cssClass = (isFriend ? "msg_Friend" : "msg_User") + cssClassPart; - // check first character for color code and set color properly - char c = str[0].toAscii(); - switch (c) - { - case 3: - cssClass = (isFriend ? "msg_FriendJoin" : "msg_UserJoin"); - break; - case 2: - cssClass = (isFriend ? "msg_FriendAction" : "msg_UserAction"); - break; - default: - if (isFriend) - cssClass = "msg_FriendChat"; - } - - bool isHL = false; - - if ((c != 3) && (!nick.isEmpty()) && - (nick != m_userNick) && (!m_userNick.isEmpty())) - { - QString lcStr = str.toLower(); - - foreach (const QRegExp & hl, m_highlights) - { - if (lcStr.contains(hl)) - { - isHL = true; - break; - } - } - } - - addLine(cssClass, formattedStr, isHL); + addLine(cssClass, str, highlight); } void HWChatWidget::addLine(const QString & cssClass, QString line, bool isHighlight) @@ -512,6 +497,9 @@ emit nickCountUpdate(chatNicks->model()->rowCount()); + if (!isIgnored) + printChatString(nick, QString("*** ") + tr("%1 has joined").arg(linkedNick(nick)), "Join", false); + if (notifyNick && notify && (m_helloSounds.size() > 0)) { SDLInteraction::instance().playSoundFile( @@ -521,9 +509,19 @@ void HWChatWidget::nickRemoved(const QString& nick) { + nickRemoved(nick, ""); +} + +void HWChatWidget::nickRemoved(const QString& nick, const QString & message) +{ chatEditLine->removeNickname(nick); emit nickCountUpdate(chatNicks->model()->rowCount()); + + if (message.isEmpty()) + printChatString(nick, QString("*** ") + tr("%1 has left").arg(linkedNick(nick)), "Leave", false); + else + printChatString(nick, QString("*** ") + tr("%1 has left (%2)").arg(linkedNick(nick)).arg(messageToHTML(message)), "Leave", false); } void HWChatWidget::clear()