X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=gui%2Fchannelwidget.cpp;h=5053654b4dfe2d115b5915c30bb9d64de1d4284d;hp=f5024b2312e14e2f529183d441f3ec61166f44cc;hb=057883f768f86257c9dbefeb5ef12403b207b773;hpb=13e45fd2d89d3704aebfba1031cfc7b23aad73d2 diff --git a/gui/channelwidget.cpp b/gui/channelwidget.cpp index f5024b23..5053654b 100644 --- a/gui/channelwidget.cpp +++ b/gui/channelwidget.cpp @@ -24,10 +24,18 @@ #include #include -ChannelWidget::ChannelWidget(QString netname, QString bufname, QWidget *parent) : QWidget(parent) { +ChannelWidget::ChannelWidget(QString netname, QString bufname, QString own, QWidget *parent) : QWidget(parent) { ui.setupUi(this); _networkName = netname; _bufferName = bufname; + ui.ownNick->clear(); + ui.ownNick->addItem(own); + if(bufname.isEmpty()) { + // Server Buffer + ui.nickTree->hide(); + ui.topicEdit->hide(); + ui.chanSettingsButton->hide(); + } connect(ui.inputEdit, SIGNAL(returnPressed()), this, SLOT(enterPressed())); //ui.inputEdit->setFocus(); @@ -43,7 +51,7 @@ ChannelWidget::ChannelWidget(QString netname, QString bufname, QWidget *parent) } void ChannelWidget::enterPressed() { - emit sendMessage(networkName(), bufferName(), ui.inputEdit->text()); + emit sendInput(networkName(), bufferName(), ui.inputEdit->text()); ui.inputEdit->clear(); } @@ -51,18 +59,29 @@ void ChannelWidget::recvMessage(Message msg) { QString s; QColor c = stdCol; switch(msg.type) { + case Message::Msg: + c = stdCol; s = QString("<%1> %2").arg(msg.sender).arg(msg.msg); + break; case Message::Server: c = serverCol; s = msg.msg; break; case Message::Error: c = errorCol; s = msg.msg; break; + case Message::Join: + c = joinCol; s = msg.msg; + break; default: c = stdCol; s = QString("[%1] %2").arg(msg.sender).arg(msg.msg); break; } ui.chatWidget->setTextColor(c); - ui.chatWidget->insertPlainText(QString("%1\n").arg(s)); + ui.chatWidget->insertPlainText(QString("[%2] %1\n").arg(s).arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss"))); + //ui.chatWidget->insertHtml(QString("" + // "" + // "" + // "
[12:13]
[nickname]
This is the Message!
[12:13]
[nick]
This is the Message!
[12:13]
[looongnickname]
This is the Message!
[12:13]
[nickname]
This is the Message!
" + // )); ui.chatWidget->ensureCursorVisible(); } @@ -80,6 +99,59 @@ void ChannelWidget::setNicks(QStringList nicks) { } +void ChannelWidget::addNick(QString nick, VarMap props) { + nicks[nick] = props; + updateNickList(); +} + +void ChannelWidget::updateNick(QString nick, VarMap props) { + nicks[nick] = props; + updateNickList(); +} + +void ChannelWidget::removeNick(QString nick) { + nicks[nick].toMap().remove(nick); + updateNickList(); +} + +void ChannelWidget::setOwnNick(QString nick) { + ui.ownNick->clear(); + ui.ownNick->addItem(nick); +} + +void ChannelWidget::updateNickList() { + ui.nickTree->clear(); + if(nicks.count() != 1) ui.nickTree->setHeaderLabel(tr("%1 Users").arg(nicks.count())); + else ui.nickTree->setHeaderLabel(tr("1 User")); + QTreeWidgetItem *ops = new QTreeWidgetItem(); + QTreeWidgetItem *voiced = new QTreeWidgetItem(); + QTreeWidgetItem *users = new QTreeWidgetItem(); + // To sort case-insensitive, we have to put all nicks in a map which is sorted by (lowercase) key... + QMap sorted; + foreach(QString n, nicks.keys()) { sorted[n.toLower()] = n; } + foreach(QString n, sorted.keys()) { + QString nick = sorted[n]; + QString mode = nicks[nick].toMap()["Channels"].toMap()[bufferName()].toMap()["Mode"].toString(); + if(mode.contains('o')) { new QTreeWidgetItem(ops, QStringList(QString("@%1").arg(nick))); } + else if(mode.contains('v')) { new QTreeWidgetItem(voiced, QStringList(QString("+%1").arg(nick))); } + else new QTreeWidgetItem(users, QStringList(nick)); + } + if(ops->childCount()) { + ops->setText(0, tr("%1 Operators").arg(ops->childCount())); + ui.nickTree->addTopLevelItem(ops); + ops->setExpanded(true); + } else delete ops; + if(voiced->childCount()) { + voiced->setText(0, tr("%1 Voiced").arg(voiced->childCount())); + ui.nickTree->addTopLevelItem(voiced); + voiced->setExpanded(true); + } else delete voiced; + if(users->childCount()) { + users->setText(0, tr("%1 Users").arg(users->childCount())); + ui.nickTree->addTopLevelItem(users); + users->setExpanded(true); + } else delete users; +} /**********************************************************************************************/ @@ -87,18 +159,22 @@ IrcWidget::IrcWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.tabWidget->removeTab(0); - connect(guiProxy, SIGNAL(csSendMessage(QString, QString, Message)), this, SLOT(recvMessage(QString, QString, Message))); - connect(guiProxy, SIGNAL(csSendStatusMsg(QString, QString)), this, SLOT(recvStatusMsg(QString, QString))); - connect(guiProxy, SIGNAL(csSetTopic(QString, QString, QString)), this, SLOT(setTopic(QString, QString, QString))); + connect(guiProxy, SIGNAL(csDisplayMsg(QString, QString, Message)), this, SLOT(recvMessage(QString, QString, Message))); + connect(guiProxy, SIGNAL(csDisplayStatusMsg(QString, QString)), this, SLOT(recvStatusMsg(QString, QString))); + connect(guiProxy, SIGNAL(csTopicSet(QString, QString, QString)), this, SLOT(setTopic(QString, QString, QString))); connect(guiProxy, SIGNAL(csSetNicks(QString, QString, QStringList)), this, SLOT(setNicks(QString, QString, QStringList))); - connect(this, SIGNAL(sendMessage( QString, QString, QString )), guiProxy, SLOT(gsUserInput(QString, QString, QString))); + connect(guiProxy, SIGNAL(csNickAdded(QString, QString, VarMap)), this, SLOT(addNick(QString, QString, VarMap))); + connect(guiProxy, SIGNAL(csNickRemoved(QString, QString)), this, SLOT(removeNick(QString, QString))); + connect(guiProxy, SIGNAL(csNickUpdated(QString, QString, VarMap)), this, SLOT(updateNick(QString, QString, VarMap))); + connect(guiProxy, SIGNAL(csOwnNickSet(QString, QString)), this, SLOT(setOwnNick(QString, QString))); + connect(this, SIGNAL(sendInput( QString, QString, QString )), guiProxy, SLOT(gsUserInput(QString, QString, QString))); } ChannelWidget * IrcWidget::getBuffer(QString net, QString buf) { QString key = net + buf; if(!buffers.contains(key)) { - ChannelWidget *cw = new ChannelWidget(net, buf); - connect(cw, SIGNAL(sendMessage(QString, QString, QString)), this, SLOT(userInput(QString, QString, QString))); + ChannelWidget *cw = new ChannelWidget(net, buf, ownNick); + connect(cw, SIGNAL(sendInput(QString, QString, QString)), this, SLOT(userInput(QString, QString, QString))); ui.tabWidget->addTab(cw, net+buf); ui.tabWidget->setCurrentWidget(cw); //cw->setFocus(); @@ -119,7 +195,7 @@ void IrcWidget::recvStatusMsg(QString net, QString msg) { } void IrcWidget::userInput(QString net, QString buf, QString msg) { - emit sendMessage(net, buf, msg); + emit sendInput(net, buf, msg); } void IrcWidget::setTopic(QString net, QString buf, QString topic) { @@ -132,3 +208,42 @@ void IrcWidget::setNicks(QString net, QString buf, QStringList nicks) { cw->setNicks(nicks); } +void IrcWidget::addNick(QString net, QString nick, VarMap props) { + nicks[net].toMap()[nick] = props; + VarMap chans = props["Channels"].toMap(); + QStringList c = chans.keys(); + foreach(QString bufname, c) { + getBuffer(net, bufname)->addNick(nick, props); + } +} + +void IrcWidget::updateNick(QString net, QString nick, VarMap props) { + QStringList oldchans = nicks[net].toMap()[nick].toMap()["Channels"].toMap().keys(); + QStringList newchans = props["Channels"].toMap().keys(); + foreach(QString c, newchans) { + if(oldchans.contains(c)) getBuffer(net, c)->updateNick(nick, props); + else getBuffer(net, c)->addNick(nick, props); + } + foreach(QString c, oldchans) { + if(!newchans.contains(c)) getBuffer(net, c)->removeNick(nick); + } + nicks[net].toMap()[nick] = props; +} + +void IrcWidget::removeNick(QString net, QString nick) { + VarMap chans = nicks[net].toMap()[nick].toMap()["Channels"].toMap(); + foreach(QString bufname, chans.keys()) { + getBuffer(net, bufname)->removeNick(nick); + } + qDebug() << nicks; + nicks[net].toMap().remove(nick); + qDebug() << nicks; +} + +void IrcWidget::setOwnNick(QString net, QString nick) { + ownNick = nick; + foreach(ChannelWidget *cw, buffers.values()) { + if(cw->networkName() == net) cw->setOwnNick(nick); + } +} +