diff -r cea15ef417ea -r 19db164dd20d QTfrontend/chatwidget.cpp --- 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 #include #include +#include +#include #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 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("%1").arg(formattedStr); + color = QString("#c0c0c0"); else if (str.startsWith("\x02")) - formattedStr = QString("%1").arg(formattedStr); + color = QString(isFriend ? "#00ff00" : "#ff00ff"); + else if (isFriend) + color = QString("#00c000"); + if(color.compare("") != 0) + formattedStr = QString("%1").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 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)