- // Define standard colors
- stdCol = "black";
- inactiveCol = "grey";
- noticeCol = "darkblue";
- serverCol = "darkblue";
- errorCol = "red";
- joinCol = "green";
- quitCol = "firebrick";
- partCol = "firebrick";
- kickCol = "firebrick";
- nickCol = "magenta";
-
- int i = contents.count() - 100;
- if(i < 0) i = 0;
- for(int j = 0; j < i; j++) contents.removeAt(0);
- show();
- renderContents();
- updateTitle();
- //show();
-}
-
-void BufferWidget::updateTitle() {
- QString title = QString("%1 in %2 [%3]: %4").arg(ui.ownNick->currentText()).arg(bufferName).arg(networkName).arg(ui.topicEdit->text());
- setWindowTitle(title);
-}
-
-void BufferWidget::enterPressed() {
- QStringList lines = ui.inputEdit->text().split('\n', QString::SkipEmptyParts);
- foreach(QString msg, lines) {
- if(msg.isEmpty()) continue;
- emit userInput(msg);
- }
- ui.inputEdit->clear();
-}
-
-void BufferWidget::setActive(bool act) {
- if(act != active) {
- active = act;
- renderContents();
- //scrollToEnd();
- }
-}
-
-void BufferWidget::renderContents() {
- QString html;
- //html = "<style type=\"text/css\">"
- // ".test { background-color:#339933 }"
- // "</style>";
- for(int i = 0; i < contents.count(); i++) {
- html += htmlFromMsg(contents[i]);
- }
- //ui.chatWidget->clear();
- hide();
- ui.chatWidget->setHtml(html); show();
- //ui.chatWidget->insertHtml("<div />"); // <-- bug that would not reset the scrollbar sizes...
- scrollToEnd();
-}
-
-void BufferWidget::scrollToEnd() {
- QScrollBar *sb = ui.chatWidget->verticalScrollBar();
- sb->setValue(sb->maximum());
- //qDebug() << bufferName << "scrolled" << sb->value() << sb->maximum();
-}
-
-QString BufferWidget::htmlFromMsg(Message msg) {
- QString s, n;
- QString c = stdCol;
- QString user = userFromMask(msg.sender);
- QString host = hostFromMask(msg.sender);
- QString nick = nickFromMask(msg.sender);
- switch(msg.type) {
- case Message::Plain:
- c = stdCol; n = QString("<%1>").arg(nick); s = msg.text;
- break;
- case Message::Server:
- c = serverCol; s = msg.text;
- break;
- case Message::Error:
- c = errorCol; s = msg.text;
- break;
- case Message::Join:
- c = joinCol;
- s = QString(tr("--> %1 (%2@%3) has joined %4")).arg(nick).arg(user).arg(host).arg(bufferName);
- break;
- case Message::Part:
- c = partCol;
- s = QString(tr("<-- %1 (%2@%3) has left %4")).arg(nick).arg(user).arg(host).arg(bufferName);
- if(!msg.text.isEmpty()) s = QString("%1 (%2)").arg(s).arg(msg.text);
- break;
- case Message::Kick:
- { c = kickCol;
- QString victim = msg.text.section(" ", 0, 0);
- if(victim == ui.ownNick->currentText()) victim = tr("you");
- QString kickmsg = msg.text.section(" ", 1);
- s = QString(tr("--> %1 has kicked %2 from %3")).arg(nick).arg(victim).arg(bufferName);
- if(!kickmsg.isEmpty()) s = QString("%1 (%2)").arg(s).arg(kickmsg);
- }
- break;
- case Message::Quit:
- c = quitCol;
- s = QString(tr("<-- %1 (%2@%3) has quit")).arg(nick).arg(user).arg(host);
- if(!msg.text.isEmpty()) s = QString("%1 (%2)").arg(s).arg(msg.text);
- break;
- case Message::Nick:
- c = nickCol;
- if(nick == msg.text) s = QString(tr("<-> You are now known as %1")).arg(msg.text);
- else s = QString(tr("<-> %1 is now known as %2")).arg(nick).arg(msg.text);
- break;
- case Message::Mode:
- c = serverCol;
- if(nick.isEmpty()) s = tr("*** User mode: %1").arg(msg.text);
- else s = tr("*** Mode %1 by %2").arg(msg.text).arg(nick);
- break;
- default:
- c = stdCol; n = QString("[%1]").arg(msg.sender); s = msg.text;
- break;
- }
- if(!active) c = inactiveCol;
- s.replace('&', "&"); s.replace('<', "<"); s.replace('>', ">");
- QString html = QString("<table cellspacing=0 cellpadding=0><tr>"
- "<td width=50><div style=\"color:%2;\">[%1]</div></td>")
- .arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")).arg("darkblue");
- if(!n.isEmpty())
- html += QString("<td width=100><div align=right style=\"white-space:pre;margin-left:6px;color:%2;\">%1</div></td>")
- .arg(n).arg("royalblue");
- html += QString("<td><div style=\"white-space:pre-wrap;margin-left:6px;color:%2;\">%1</div></td>""</tr></table>").arg(s).arg(c);
- return html;
-}
-
-void BufferWidget::displayMsg(Message msg) {
- contents.append(msg);
- ui.chatWidget->append(htmlFromMsg(msg));
-}
-
-void BufferWidget::setOwnNick(QString nick) {
- ui.ownNick->clear();
- ui.ownNick->addItem(nick);
- updateTitle();
-}
-
-void BufferWidget::setTopic(QString topic) {
- ui.topicEdit->setText(topic);
- updateTitle();
-}
-
-void BufferWidget::updateNickList(VarMap nicks) {
- 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<QString, QString> 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(opsExpanded);
- } else delete ops;
- if(voiced->childCount()) {
- voiced->setText(0, tr("%1 Voiced").arg(voiced->childCount()));
- ui.nickTree->addTopLevelItem(voiced);
- voiced->setExpanded(voicedExpanded);
- } else delete voiced;
- if(users->childCount()) {
- users->setText(0, tr("%1 Users").arg(users->childCount()));
- ui.nickTree->addTopLevelItem(users);
- users->setExpanded(usersExpanded);
- } else delete users;
-}
-
-void BufferWidget::itemExpansionChanged(QTreeWidgetItem *item) {
- if(item->child(0)->text(0).startsWith('@')) opsExpanded = item->isExpanded();
- else if(item->child(0)->text(0).startsWith('+')) voicedExpanded = item->isExpanded();
- else usersExpanded = item->isExpanded();
-}