QTfrontend/chatwidget.cpp
changeset 2845 19db164dd20d
parent 2779 e1ae0019d43f
child 2846 1cb8b4c425ed
--- a/QTfrontend/chatwidget.cpp	Mon Feb 22 10:56:43 2010 +0000
+++ b/QTfrontend/chatwidget.cpp	Mon Feb 22 22:51:21 2010 +0000
@@ -24,6 +24,8 @@
 #include <QTextDocument>
 #include <QDir>
 #include <QSettings>
+#include <QFile>
+#include <QTextStream>
 
 #include "hwconsts.h"
 #include "SDLs.h"
@@ -87,9 +89,91 @@
 	connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan()));
 	acFollow = new QAction(QAction::tr("Follow"), chatNicks);
 	connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow()));
+	acIgnore = new QAction(QAction::tr("Ignore"), chatNicks);
+	connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore()));
+	acFriend = new QAction(QAction::tr("Friend"), chatNicks);
+	connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend()));
 
 	chatNicks->insertAction(0, acInfo);
 	chatNicks->insertAction(0, acFollow);
+	chatNicks->insertAction(0, acIgnore);
+	chatNicks->insertAction(0, acFriend);
+	
+	showReady = false;
+}
+
+void HWChatWidget::loadList(QStringList & list, const QString & file)
+{
+	list.clear();
+	QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+	if(!txt.open(QIODevice::ReadOnly))
+		return;
+	QTextStream stream(&txt);
+	stream.setCodec("UTF-8");
+
+	while(!stream.atEnd())
+	{
+		QString str = stream.readLine();
+		if(str.startsWith(";") || str.length() == 0)
+			continue;
+		list << str.trimmed();
+	}
+	list.removeDuplicates();
+	txt.close();
+}
+
+void HWChatWidget::saveList(QStringList & list, const QString & file)
+{
+	QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+	if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
+		return;
+	QTextStream stream(&txt);
+	stream.setCodec("UTF-8");
+
+	stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl;
+	for(int i = 0; i < list.size(); i++)
+		stream << list[i] << endl;
+	txt.close();
+}
+
+void HWChatWidget::updateIcon(QListWidgetItem *item)
+{
+	QString nick = item->text();
+
+	if(ignoreList.contains(nick, Qt::CaseInsensitive))
+	{
+		item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on" : ":/res/chat_ignore_off") : ":/res/chat_ignore.png"));
+		item->setForeground(Qt::gray);
+	}
+	else if(friendsList.contains(nick, Qt::CaseInsensitive))
+	{
+		item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on" : ":/res/chat_friend_off") : ":/res/chat_friend.png"));
+		item->setForeground(Qt::green);
+	}
+	else
+	{
+		item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on" : ":/res/chat_default_off") : ":/res/chat_default.png"));
+		item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00)));
+	}
+}
+
+void HWChatWidget::updateIcons()
+{
+	for(int i = 0; i < chatNicks->count(); i++)
+		updateIcon(chatNicks->item(i));
+}
+
+void HWChatWidget::loadLists(const QString & nick)
+{
+	loadList(ignoreList, nick.toLower() + "_ignore.txt");
+	loadList(friendsList, nick.toLower() + "_friends.txt");
+	updateIcons();
+}
+
+void HWChatWidget::saveLists(const QString & nick)
+{
+	saveList(ignoreList, nick.toLower() + "_ignore.txt");
+	saveList(friendsList, nick.toLower() + "_friends.txt");
 }
 
 void HWChatWidget::returnPressed()
@@ -97,18 +181,35 @@
 	emit chatLine(chatEditLine->text());
 	chatEditLine->clear();
 }
-
+#include <QMessageBox>
 void HWChatWidget::onChatString(const QString& str)
 {
 	if (chatStrings.size() > 250)
 		chatStrings.removeFirst();
 
 	QString formattedStr = Qt::escape(str.mid(1));
+	QStringList parts = formattedStr.split(QRegExp("\\W+"), QString::SkipEmptyParts);
+
+	if (!formattedStr.startsWith(" ***")) // don't ignore status messages
+	{
+		if (formattedStr.startsWith(" *")) // emote
+			parts[0] = parts[1];
+		if(parts.size() > 0 && ignoreList.contains(parts[0], Qt::CaseInsensitive))
+			return;
+	}
+
+	QString color("");
+	bool isFriend = friendsList.contains(parts[0], Qt::CaseInsensitive);
+	
 	if (str.startsWith("\x03"))
-		formattedStr = QString("<font color=grey>%1</font>").arg(formattedStr);
+		color = QString("#c0c0c0");
 	else if (str.startsWith("\x02"))
-		formattedStr = QString("<font color=magenta>%1</font>").arg(formattedStr);
+		color = QString(isFriend ? "#00ff00" : "#ff00ff");
+	else if (isFriend)
+		color = QString("#00c000");
 
+	if(color.compare("") != 0)
+		formattedStr = QString("<font color=\"%2\">%1</font>").arg(formattedStr).arg(color);
 
 	chatStrings.append(formattedStr);
 
@@ -132,7 +233,7 @@
 void HWChatWidget::nickAdded(const QString& nick, bool notifyNick)
 {
 	QListWidgetItem * item = new QListWidgetItem(nick);
-	item->setIcon(QIcon(":/res/hh_small.png"));
+	updateIcon(item);
 	chatNicks->addItem(item);
 
     if(notifyNick && notify && gameSettings->value("audio/frontendsound", true).toBool()) {
@@ -184,11 +285,54 @@
 		emit follow(curritem->text());
 }
 
+void HWChatWidget::onIgnore()
+{
+	QListWidgetItem * curritem = chatNicks->currentItem();
+	if(!curritem)
+		return;
+
+	if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
+	{
+		ignoreList.removeAll(curritem->text().toLower());
+		onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text()));
+	}
+	else // not on list - add
+	{
+		ignoreList << curritem->text().toLower();
+		onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text()));
+	}
+	updateIcon(curritem);
+}
+
+void HWChatWidget::onFriend()
+{
+	QListWidgetItem * curritem = chatNicks->currentItem();
+	if(!curritem)
+		return;
+
+	if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
+	{
+		friendsList.removeAll(curritem->text().toLower());
+		onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text()));
+	}
+	else // not on list - add
+	{
+		friendsList << curritem->text().toLower();
+		onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text()));
+	}
+	updateIcon(curritem);
+}
+
 void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item)
 {
 	if (item) onFollow();
 }
 
+void HWChatWidget::setShowReady(bool s)
+{
+	showReady = s;
+}
+
 void HWChatWidget::setReadyStatus(const QString & nick, bool isReady)
 {
 	QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
@@ -198,10 +342,16 @@
 		return;
 	}
 
-	if(isReady)
+	/*if(isReady)
 		items[0]->setIcon(QIcon(":/res/lightbulb_on.png"));
 	else
-		items[0]->setIcon(QIcon(":/res/lightbulb_off.png"));
+		items[0]->setIcon(QIcon(":/res/lightbulb_off.png"));*/
+
+	items[0]->setData(Qt::UserRole, isReady); // bulb status
+	updateIcon(items[0]);
+
+	// ensure we're still showing the status bulbs
+	showReady = true;
 }
 
 void HWChatWidget::adminAccess(bool b)