X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=gui%2Fbuffer.cpp;h=9c9726e1bf0f7e3badd24d4a0bef73778fff12af;hp=4718b28748f7979683219b4e10cfaf9dd84faff3;hb=26c07f2ab71ab640cba10bd3ecec0f05dd5a0d64;hpb=59a71bb6795f9cf4b470742816ccf61afe1de9b0 diff --git a/gui/buffer.cpp b/gui/buffer.cpp index 4718b287..9c9726e1 100644 --- a/gui/buffer.cpp +++ b/gui/buffer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005/06 by The Quassel Team * + * Copyright (C) 2005-07 by The Quassel Team * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,295 +20,111 @@ #include "buffer.h" #include "util.h" +#include "chatwidget.h" +#include "bufferwidget.h" +/* Buffer::Buffer(QString netname, QString bufname) { - networkName = netname; - bufferName = bufname; + Buffer(BufferId(0, netname, bufname)); + + +} +*/ + +Buffer::Buffer(BufferId bufid) { + id = bufid; + _networkName = bufid.network(); + _bufferName = bufid.buffer(); + + if(_bufferName.isEmpty()) type = ServerBuffer; + else if(isChannelName(_bufferName)) type = ChannelBuffer; + else type = QueryBuffer; - widget = 0; active = false; +/* + QSettings s; + s.beginGroup(QString("GUI/BufferStates/%1/%2").arg(netname).arg(bufname)); + state->splitterState = s.value("Splitter").toByteArray(); + s.endGroup(); + */ + emit bufferUpdated(this); } Buffer::~Buffer() { - delete widget; + //delete widget; + /* + QSettings s; + s.beginGroup(QString("GUI/BufferStates/%1/%2").arg(networkName).arg(bufferName)); + s.setValue("Splitter", state->splitterState); + s.endGroup(); +*/ + //delete state; + emit bufferDestroyed(this); } -void Buffer::setActive(bool a) { - if(a != active) { - active = a; - if(widget) widget->setActive(a); - } -} +void Buffer::init() { -void Buffer::displayMsg(Message msg) { - contents.append(msg); - if(widget) widget->displayMsg(msg); -} -void Buffer::userInput(QString msg) { - emit userInput(networkName, bufferName, msg); } -void Buffer::scrollToEnd() { - if(!widget) return; - widget->scrollToEnd(); +void Buffer::setActive(bool a) { + if(a != active) { + active = a; + emit bufferUpdated(this); + } } -QWidget * Buffer::showWidget(QWidget *parent) { - if(widget) { - widget->scrollToEnd(); - return qobject_cast(widget); - } - widget = new BufferWidget(networkName, bufferName, isActive(), ownNick, contents, parent); - widget->setTopic(topic); - widget->updateNickList(nicks); - //widget->renderContents(); - widget->scrollToEnd(); - connect(widget, SIGNAL(userInput(QString)), this, SLOT(userInput(QString))); - return qobject_cast(widget); +void Buffer::appendChatLine(ChatLine *line) { + lines.append(line); + emit chatLineAppended(line); } -void Buffer::hideWidget() { - delete widget; - widget = 0; +void Buffer::prependChatLine(ChatLine *line) { + lines.prepend(line); + emit chatLinePrepended(line); } -QWidget * Buffer::getWidget() { - return qobject_cast(widget); +void Buffer::processUserInput(QString msg) { + // TODO User Input processing (plugins) -> well, this goes through MainWin into Core for processing... so... + emit userInput(id, msg); } void Buffer::setTopic(QString t) { - topic = t; - if(widget) widget->setTopic(t); + _topic = t; + emit topicSet(t); + emit bufferUpdated(this); } void Buffer::addNick(QString nick, VarMap props) { - if(nick == ownNick) setActive(true); + if(nick == ownNick()) setActive(true); nicks[nick] = props; - if(widget) widget->updateNickList(nicks); + emit nickListChanged(nicks); } void Buffer::updateNick(QString nick, VarMap props) { nicks[nick] = props; - if(widget) widget->updateNickList(nicks); + emit nickListChanged(nicks); } void Buffer::renameNick(QString oldnick, QString newnick) { QVariant v = nicks.take(oldnick); nicks[newnick] = v; - if(widget) widget->updateNickList(nicks); + emit nickListChanged(nicks); } void Buffer::removeNick(QString nick) { - if(nick == ownNick) setActive(false); + if(nick == ownNick()) setActive(false); nicks.remove(nick); - if(widget) widget->updateNickList(nicks); + emit nickListChanged(nicks); } void Buffer::setOwnNick(QString nick) { - ownNick = nick; - if(widget) widget->setOwnNick(nick); + _ownNick = nick; + emit ownNickSet(nick); } /****************************************************************************************/ -BufferWidget::BufferWidget(QString netname, QString bufname, bool act, QString own, QList cont, QWidget *parent) : QWidget(parent) { - ui.setupUi(this); - networkName = netname; - bufferName = bufname; - active = act; - contents = cont; - ui.ownNick->clear(); - ui.ownNick->addItem(own); - if(bufname.isEmpty()) { - // Server Buffer - ui.nickTree->hide(); - ui.topicEdit->hide(); - ui.chanSettingsButton->hide(); - } - connect(ui.nickTree, SIGNAL(itemExpanded(QTreeWidgetItem *)), this, SLOT(itemExpansionChanged(QTreeWidgetItem*))); - connect(ui.nickTree, SIGNAL(itemCollapsed(QTreeWidgetItem *)), this, SLOT(itemExpansionChanged(QTreeWidgetItem*))); - connect(ui.inputEdit, SIGNAL(returnPressed()), this, SLOT(enterPressed())); - - ui.chatWidget->setFocusProxy(ui.inputEdit); - - opsExpanded = voicedExpanded = usersExpanded = true; - // 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); - 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(); - } -} - -void BufferWidget::renderContents() { - QString html; - for(int i = 0; i < contents.count(); i++) { - html += htmlFromMsg(contents[i]); - } - ui.chatWidget->clear(); - ui.chatWidget->setHtml(html); - 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("" - "") - .arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")).arg("darkblue"); - if(!n.isEmpty()) - html += QString("") - .arg(n).arg("royalblue"); - html += QString("""
[%1]
%1
%1
").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 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(); -} +/****************************************************************************************/