+void MainWin::networkConnected(QString net) {
+ connected[net] = true;
+ //BufferId id = getStatusBufferId(net);
+ //Buffer *b = getBuffer(id);
+ //b->setActive(true);
+ //b->displayMsg(Message(id, Message::Server, tr("Connected."))); FIXME
+ // TODO buffersUpdated();
+}
+
+void MainWin::networkDisconnected(QString net) {
+ //getBuffer(net, "")->setActive(false);
+ foreach(BufferId id, buffers.keys()) {
+ if(id.network() != net) continue;
+ Buffer *b = getBuffer(id);
+ //b->displayMsg(Message(id, Message::Server, tr("Server disconnected."))); FIXME
+ b->setActive(false);
+ }
+ connected[net] = false;
+}
+
+void MainWin::updateBufferId(BufferId id) {
+ bufferIds[id.uid()] = id; // make lookups by id faster
+ getBuffer(id);
+}
+
+BufferId MainWin::getBufferId(QString net, QString buf) {
+ foreach(BufferId id, buffers.keys()) {
+ if(id.network() == net && id.buffer() == buf) return id;
+ }
+ Q_ASSERT(false);
+ return BufferId();
+}
+
+BufferId MainWin::getStatusBufferId(QString net) {
+ return getBufferId(net, "");
+}
+
+
+Buffer * MainWin::getBuffer(BufferId id) {
+ if(!buffers.contains(id)) {
+ Buffer *b = new Buffer(id);
+ b->setOwnNick(ownNick[id.network()]);
+ connect(b, SIGNAL(userInput(BufferId, QString)), this, SLOT(userInput(BufferId, QString)));
+ connect(b, SIGNAL(bufferUpdated(Buffer *)), this, SIGNAL(bufferUpdated(Buffer *)));
+ connect(b, SIGNAL(bufferDestroyed(Buffer *)), this, SIGNAL(bufferDestroyed(Buffer *)));
+ buffers[id] = b;
+ emit bufferUpdated(b);
+ }
+ return buffers[id];
+}
+
+void MainWin::recvNetworkState(QString net, QVariant state) {
+ connected[net] = true;
+ setOwnNick(net, state.toMap()["OwnNick"].toString());
+ getBuffer(getStatusBufferId(net))->setActive(true);
+ VarMap t = state.toMap()["Topics"].toMap();
+ VarMap n = state.toMap()["Nicks"].toMap();
+ foreach(QVariant v, t.keys()) {
+ QString buf = v.toString();
+ BufferId id = getBufferId(net, buf);
+ getBuffer(id)->setActive(true);
+ setTopic(net, buf, t[buf].toString());
+ }
+ foreach(QString nick, n.keys()) {
+ addNick(net, nick, n[nick].toMap());
+ }
+}
+
+void MainWin::recvMessage(Message msg) {
+ /*
+ Buffer *b;
+ if(msg.flags & Message::PrivMsg) {
+ // query
+ if(msg.flags & Message::Self) b = getBuffer(net, msg.target);
+ else b = getBuffer(net, nickFromMask(msg.sender));
+ } else {
+ b = getBuffer(net, msg.target);
+ }
+ */
+
+
+ Buffer *b = getBuffer(msg.buffer);
+
+ Buffer::ActivityLevel level = Buffer::OtherActivity;
+ if(msg.type == Message::Plain or msg.type == Message::Notice){
+ level |= Buffer::NewMessage;
+ }
+ if(msg.flags & Message::Highlight){
+ level |= Buffer::Highlight;
+ }
+ emit bufferActivity(level, b);
+
+ //b->displayMsg(msg);
+ b->appendChatLine(new ChatLine(msg));
+}
+
+void MainWin::recvStatusMsg(QString net, QString msg) {
+ //recvMessage(net, Message::server("", QString("[STATUS] %1").arg(msg)));
+
+}
+
+void MainWin::recvBacklogData(BufferId id, QList<QVariant> msgs, bool done) {
+ foreach(QVariant v, msgs) {
+ layoutQueue.append(v.value<Message>());
+ }
+ if(!layoutTimer->isActive()) layoutTimer->start();
+}
+
+
+void MainWin::layoutMsg() {
+ if(layoutQueue.count()) {
+ ChatLine *line = new ChatLine(layoutQueue.takeFirst());
+ getBuffer(line->bufferId())->prependChatLine(line);
+ }
+ if(!layoutQueue.count()) layoutTimer->stop();
+}
+
+void MainWin::userInput(BufferId id, QString msg) {
+ emit sendInput(id, msg);
+}
+
+void MainWin::setTopic(QString net, QString buf, QString topic) {
+ BufferId id = getBufferId(net, buf);
+ if(!connected[id.network()]) return;
+ Buffer *b = getBuffer(id);
+ b->setTopic(topic);
+ //if(!b->isActive()) {
+ // b->setActive(true);
+ // buffersUpdated();
+ //}
+}
+
+void MainWin::addNick(QString net, QString nick, VarMap props) {
+ if(!connected[net]) return;
+ nicks[net][nick] = props;
+ VarMap chans = props["Channels"].toMap();
+ QStringList c = chans.keys();
+ foreach(QString bufname, c) {
+ getBuffer(getBufferId(net, bufname))->addNick(nick, props);
+ }
+}
+
+void MainWin::renameNick(QString net, QString oldnick, QString newnick) {
+ if(!connected[net]) return;
+ QStringList chans = nicks[net][oldnick]["Channels"].toMap().keys();
+ foreach(QString c, chans) {
+ getBuffer(getBufferId(net, c))->renameNick(oldnick, newnick);
+ }
+ nicks[net][newnick] = nicks[net].take(oldnick);
+}
+
+void MainWin::updateNick(QString net, QString nick, VarMap props) {
+ if(!connected[net]) return;
+ QStringList oldchans = nicks[net][nick]["Channels"].toMap().keys();
+ QStringList newchans = props["Channels"].toMap().keys();
+ foreach(QString c, newchans) {
+ if(oldchans.contains(c)) getBuffer(getBufferId(net, c))->updateNick(nick, props);
+ else getBuffer(getBufferId(net, c))->addNick(nick, props);
+ }
+ foreach(QString c, oldchans) {
+ if(!newchans.contains(c)) getBuffer(getBufferId(net, c))->removeNick(nick);
+ }
+ nicks[net][nick] = props;
+}
+
+void MainWin::removeNick(QString net, QString nick) {
+ if(!connected[net]) return;
+ VarMap chans = nicks[net][nick]["Channels"].toMap();
+ foreach(QString bufname, chans.keys()) {
+ getBuffer(getBufferId(net, bufname))->removeNick(nick);
+ }
+ nicks[net].remove(nick);
+}
+
+void MainWin::setOwnNick(QString net, QString nick) {
+ if(!connected[net]) return;
+ ownNick[net] = nick;
+ foreach(BufferId id, buffers.keys()) {
+ if(id.network() == net) {
+ buffers[id]->setOwnNick(nick);
+ }
+ }
+}
+
+void MainWin::importBacklog() {
+ if(QMessageBox::warning(this, "Import old backlog?", "Do you want to import your old file-based backlog into new the backlog database?<br>"
+ "<b>This will permanently delete the contents of your database!</b>",
+ QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) {
+ emit importOldBacklog();
+ }
+}