diff -r eeae1cb6b6bf -r 8e6b79a020f8 QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Sat Sep 29 19:26:18 2012 +0400 +++ b/QTfrontend/ui/widget/chatwidget.cpp Mon Oct 01 00:31:38 2012 +0400 @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -43,30 +44,18 @@ #include "chatwidget.h" + ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick) { - this->aFriend = isFriend; - this->isIgnored = isIgnored; -} - -void ListWidgetNickItem::setFriend(bool isFriend) -{ - this->aFriend = isFriend; + setData(Friend, isFriend); + setData(Ignore, isIgnored); } -void ListWidgetNickItem::setIgnored(bool isIgnored) -{ - this->isIgnored = isIgnored; -} - -bool ListWidgetNickItem::isFriend() +void ListWidgetNickItem::setData(StateFlag role, const QVariant &value) { - return aFriend; -} + QListWidgetItem::setData(role, value); -bool ListWidgetNickItem::ignored() -{ - return isIgnored; + updateIcon(); } bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const @@ -77,12 +66,12 @@ ListWidgetNickItem otherNick = const_cast(dynamic_cast(other)); // ignored always down - if (isIgnored != otherNick.ignored()) - return !isIgnored; + if (data(Ignore).toBool() != otherNick.data(Ignore).toBool()) + return !data(Ignore).toBool(); // friends always up - if (aFriend != otherNick.isFriend()) - return aFriend; + if (data(Friend).toBool() != otherNick.data(Friend).toBool()) + return data(Friend).toBool(); QString txt1 = text().toLower(); QString txt2 = other.text().toLower(); @@ -102,6 +91,82 @@ return firstIsShorter; } +void ListWidgetNickItem::updateIcon() +{ + quint32 iconNum = 0; + + QList flags; + flags + << data(Ready).toBool() + << data(ServerAdmin).toBool() + << data(RoomAdmin).toBool() + << data(Registered).toBool() + << data(Friend).toBool() + << data(Ignore).toBool() + ; + + for(int i = flags.size() - 1; i >= 0; --i) + if(flags[i]) + iconNum |= 1 << i; + + if(m_icons().contains(iconNum)) + { + setIcon(m_icons().value(iconNum)); + } + else + { + QPixmap result(24, 16); + result.fill(Qt::transparent); + + QPainter painter(&result); + + if(data(Ready).toBool()) + painter.drawPixmap(8, 0, 16, 16, QPixmap(":/res/chat/lamp.png")); + + QString mainIconName(":/res/chat/"); + + if(data(RoomAdmin).toBool()) + mainIconName += "roomadmin"; + else if(data(ServerAdmin).toBool()) + mainIconName += "serveradmin"; + else + mainIconName += "hedgehog"; + + if(!data(Registered).toBool()) + mainIconName += "_gray"; + + painter.drawPixmap(0, 0, 16, 16, QPixmap(mainIconName + ".png")); + + if(data(Ignore).toBool()) + painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/chat/ignore.png")); + else + if(data(Friend).toBool()) + painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/chat/friend.png")); + + painter.end(); + + QIcon icon(result); + + setIcon(icon); + m_icons().insert(iconNum, icon); + } + + if(data(Ignore).toBool()) + setForeground(Qt::gray); + else + if(data(Friend).toBool()) + setForeground(Qt::green); + else + setForeground(QBrush(QColor(0xff, 0xcc, 0x00))); +} + +QHash & ListWidgetNickItem::m_icons() +{ + static QHash iconsCache; + + return iconsCache; +} + QString * HWChatWidget::s_styleSheet = NULL; QStringList * HWChatWidget::s_displayNone = NULL; bool HWChatWidget::s_isTimeStamped = true; @@ -290,6 +355,7 @@ mainLayout.addWidget(chatText, 0, 0, 2, 1); chatNicks = new QListWidget(this); + chatNicks->setIconSize(QSize(24, 16)); chatNicks->setMinimumHeight(10); chatNicks->setMinimumWidth(10); chatNicks->setSortingEnabled(true); @@ -333,7 +399,6 @@ chatNicks->insertAction(0, acInfo); chatNicks->insertAction(0, acIgnore); - showReady = false; setShowFollow(true); setAcceptDrops(true); @@ -460,24 +525,8 @@ QString nick = nickItem->text(); ListWidgetNickItem * item = dynamic_cast(nickItem); - item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive)); - item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive)); - - if(item->ignored()) - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png")); - item->setForeground(Qt::gray); - } - else if(item->isFriend()) - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png")); - item->setForeground(Qt::green); - } - else - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png")); - item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00))); - } + item->setData(ListWidgetNickItem::Friend, QVariant(friendsList.contains(nick, Qt::CaseInsensitive))); + item->setData(ListWidgetNickItem::Ignore, QVariant(ignoreList.contains(nick, Qt::CaseInsensitive))); } void HWChatWidget::updateNickItems() @@ -891,25 +940,36 @@ } } -void HWChatWidget::setShowReady(bool s) +void HWChatWidget::setStatus(const QString & nick, ListWidgetNickItem::StateFlag flag, bool status) { - showReady = s; + QList items = chatNicks->findItems(nick, Qt::MatchExactly); + + if (items.size() == 1) + { + items[0]->setData(flag, status); + updateNickItem(items[0]); + } } void HWChatWidget::setReadyStatus(const QString & nick, bool isReady) { - QList items = chatNicks->findItems(nick, Qt::MatchExactly); - if (items.size() != 1) - { - qWarning("Bug: cannot find user in chat"); - return; - } + setStatus(nick, ListWidgetNickItem::Ready, isReady); +} + +void HWChatWidget::setAdminStatus(const QString & nick, bool isAdmin) +{ + setStatus(nick, ListWidgetNickItem::ServerAdmin, isAdmin); +} - items[0]->setData(Qt::UserRole, isReady); // bulb status - updateNickItem(items[0]); +void HWChatWidget::setRoomMasterStatus(const QString & nick, bool isAdmin) +{ + setStatus(nick, ListWidgetNickItem::RoomAdmin, isAdmin); +} - // ensure we're still showing the status bulbs - showReady = true; +void HWChatWidget::setRegisteredStatus(const QStringList & nicks, bool isRegistered) +{ + foreach(const QString & nick, nicks) + setStatus(nick, ListWidgetNickItem::Registered, isRegistered); } void HWChatWidget::adminAccess(bool b)