X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=gui%2Fbuffer.cpp;h=9c9726e1bf0f7e3badd24d4a0bef73778fff12af;hp=751da803b8cf19799fb53b1a3c2b4d1e3ea44c19;hb=0ac86f1eb59d72558aa9286c9e438c2bc0941298;hpb=12369966345e76e3bba92f64c84c940ef4d8d916 diff --git a/gui/buffer.cpp b/gui/buffer.cpp index 751da803..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 * @@ -21,224 +21,110 @@ #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)); - widget = 0; - chatWidget = 0; - contentsWidget = 0; - active = false; -} -Buffer::~Buffer() { - delete widget; - delete chatWidget; } +*/ -void Buffer::setActive(bool a) { - if(a != active) { - active = a; - if(widget) widget->setActive(a); - } -} +Buffer::Buffer(BufferId bufid) { + id = bufid; + _networkName = bufid.network(); + _bufferName = bufid.buffer(); -void Buffer::displayMsg(Message msg) { - contents.append(msg); - if(widget) widget->displayMsg(msg); -} + if(_bufferName.isEmpty()) type = ServerBuffer; + else if(isChannelName(_bufferName)) type = ChannelBuffer; + else type = QueryBuffer; -void Buffer::userInput(QString msg) { - emit userInput(networkName, bufferName, msg); + 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); } -/* FIXME do we need this? */ -void Buffer::scrollToEnd() { - if(!widget) return; - //widget->scrollToEnd(); +Buffer::~Buffer() { + //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); } -QWidget * Buffer::showWidget(QWidget *parent) { +void Buffer::init() { - if(widget) { - return qobject_cast(widget); - } - if(!contentsWidget) { - contentsWidget = new ChatWidgetContents(networkName, bufferName, 0); - contentsWidget->hide(); - /* FIXME do we need this? */ - for(int i = 0; i < contents.count(); i++) { - contentsWidget->appendMsg(contents[i]); - } +} + +void Buffer::setActive(bool a) { + if(a != active) { + active = a; + emit bufferUpdated(this); } - contentsWidget->hide(); - widget = new BufferWidget(networkName, bufferName, isActive(), ownNick, contentsWidget, this, parent); - widget->setTopic(topic); - widget->updateNickList(nicks); - connect(widget, SIGNAL(userInput(QString)), this, SLOT(userInput(QString))); - return qobject_cast(widget); } -void Buffer::hideWidget() { - delete widget; - widget = 0; +void Buffer::appendChatLine(ChatLine *line) { + lines.append(line); + emit chatLineAppended(line); } -void Buffer::deleteWidget() { - 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, ChatWidgetContents *contents, Buffer *pBuf, QWidget *parent) : QWidget(parent) { - ui.setupUi(this); - networkName = netname; - bufferName = bufname; - active = act; - parentBuffer = pBuf; - - ui.chatWidget->init(netname, bufname, contents); - - 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())); - - opsExpanded = voicedExpanded = usersExpanded = true; - - ui.chatWidget->setFocusProxy(ui.inputEdit); - updateTitle(); -} - -BufferWidget::~BufferWidget() { - ui.chatWidget->takeWidget(); /* remove ownership so the chatwidget contents does not get destroyed */ - parentBuffer->deleteWidget(); /* make sure the parent buffer knows we are gone */ -} - -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::displayMsg(Message msg) { - ui.chatWidget->appendMsg(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(); -} -