--- 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("<span class=\"nick\">%1</span>").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, "<a href=\"http://\\3\">\\3</a>");
+ 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<QSortFilterProxyModel *>(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, "<a href=\"http://\\3\">\\3</a>");
-
- // 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()