X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=gui%2Fmainwin.cpp;h=7c4eb51734ec187f880e8c8dfd36266f96554e8d;hp=5beefdf2db90ccf3877541348e6975dd85a8dbbe;hb=bb0bf17b61958e92529338596574f7a2a4f61d2a;hpb=2a068c11e76c7b34afb64d443dbb1afd2e208aaa diff --git a/gui/mainwin.cpp b/gui/mainwin.cpp index 5beefdf2..7c4eb517 100644 --- a/gui/mainwin.cpp +++ b/gui/mainwin.cpp @@ -29,7 +29,7 @@ #include "mainwin.h" #include "buffer.h" -#include "networkview.h" +#include "bufferview.h" #include "serverlist.h" #include "coreconnectdlg.h" #include "settingsdlg.h" @@ -42,9 +42,14 @@ MainWin::MainWin() : QMainWindow() { //widget = 0; qDebug() << "Available DB drivers: " << QSqlDatabase::drivers (); setWindowTitle("Quassel IRC"); + //setWindowTitle("Κυασελ Εγαρζη"); setWindowIcon(QIcon(":/qirc-icon.png")); setWindowIconText("Quassel IRC"); + layoutTimer = new QTimer(this); + layoutTimer->setInterval(0); + layoutTimer->setSingleShot(false); + connect(layoutTimer, SIGNAL(timeout()), this, SLOT(layoutMsg())); //workspace = new QWorkspace(this); //setCentralWidget(workspace); statusBar()->showMessage(tr("Waiting for core...")); @@ -55,20 +60,22 @@ void MainWin::init() { connect(guiProxy, SIGNAL(csServerState(QString, QVariant)), this, SLOT(recvNetworkState(QString, QVariant))); connect(guiProxy, SIGNAL(csServerConnected(QString)), this, SLOT(networkConnected(QString))); connect(guiProxy, SIGNAL(csServerDisconnected(QString)), this, SLOT(networkDisconnected(QString))); - connect(guiProxy, SIGNAL(csDisplayMsg(QString, Message)), this, SLOT(recvMessage(QString, Message))); + connect(guiProxy, SIGNAL(csDisplayMsg(Message)), this, SLOT(recvMessage(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(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(csNickRenamed(QString, QString, QString)), this, SLOT(renameNick(QString, 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))); - - layoutThread = new LayoutThread(); - layoutThread->start(); - while(!layoutThread->isRunning()) {}; + connect(guiProxy, SIGNAL(csBacklogData(BufferId, QList, bool)), this, SLOT(recvBacklogData(BufferId, QList, bool))); + connect(guiProxy, SIGNAL(csUpdateBufferId(BufferId)), this, SLOT(updateBufferId(BufferId))); + connect(this, SIGNAL(sendInput(BufferId, QString)), guiProxy, SLOT(gsUserInput(BufferId, QString))); + connect(this, SIGNAL(requestBacklog(BufferId, QVariant, QVariant)), guiProxy, SLOT(gsRequestBacklog(BufferId, QVariant, QVariant))); + + //layoutThread = new LayoutThread(); + //layoutThread->start(); + //while(!layoutThread->isRunning()) {}; ui.bufferWidget->init(); show(); @@ -83,12 +90,9 @@ void MainWin::init() { setupSettingsDlg(); - //Buffer::init(); setupMenus(); setupViews(); - //bufferWidget = 0; - QSettings s; s.beginGroup("Geometry"); //resize(s.value("MainWinSize", QSize(500, 400)).toSize()); @@ -96,47 +100,18 @@ void MainWin::init() { if(s.contains("MainWinState")) restoreState(s.value("MainWinState").toByteArray()); s.endGroup(); - // replay backlog - // FIXME do this right - QHash > hash; - Buffer *b; - - foreach(QString net, coreBackLog.keys()) { - //if(net != "MoepNet") continue; - while(coreBackLog[net].count()) { - //recvMessage(net, coreBackLog[net].takeFirst()); - Message msg = coreBackLog[net].takeLast(); - 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); - } - hash[b].prepend(msg); - if(hash[b].count() >= 5) { - ui.bufferWidget->prependMessages(b, hash.take(b)); - } - } - } - foreach(Buffer *buf, hash.keys()) { - ui.bufferWidget->prependMessages(buf, hash.take(buf)); - } - -/* - foreach(QString key, buffers.keys()) { - foreach(Buffer *b, buffers[key].values()) { - QWidget *widget = b->showWidget(this); - workspace->addWindow(widget); - widget->show(); - } + /* make lookups by id faster */ + foreach(BufferId id, coreBuffers) { + bufferIds[id.uid()] = id; // make lookups by id faster + getBuffer(id); // create all buffers, so we see them in the network views + emit requestBacklog(id, -1, -1); // TODO: use custom settings for backlog request } -*/ s.beginGroup("Buffers"); QString net = s.value("CurrentNetwork", "").toString(); QString buf = s.value("CurrentBuffer", "").toString(); s.endGroup(); + /* if(!net.isEmpty()) { if(buffers.contains(net)) { if(buffers[net].contains(buf)) { @@ -146,15 +121,17 @@ void MainWin::init() { } } } + */ } MainWin::~MainWin() { - typedef QHash BufHash; - foreach(BufHash h, buffers.values()) { - foreach(Buffer *b, h.values()) { - delete b; - } - } + //typedef QHash BufHash; + //foreach(BufHash h, buffers.values()) { + // foreach(Buffer *b, h.values()) { + // delete b; + // } + //} + foreach(Buffer *buf, buffers.values()) delete buf; } /* This is implemented in settingspages.cpp */ @@ -170,37 +147,35 @@ void MainWin::setupMenus() { connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg())); //ui.actionSettingsDlg->setEnabled(false); connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); + // for debugging + connect(ui.actionImportBacklog, SIGNAL(triggered()), this, SLOT(importBacklog())); + connect(this, SIGNAL(importOldBacklog()), guiProxy, SLOT(gsImportBacklog())); } void MainWin::setupViews() { - NetworkView *all = new NetworkView(tr("All Buffers"), NetworkView::AllNets); - registerNetView(all); + BufferView *all = new BufferView(tr("All Buffers"), BufferView::AllNets); + registerBufferView(all); addDockWidget(Qt::LeftDockWidgetArea, all); - NetworkView *allchans = new NetworkView(tr("All Channels"), NetworkView::AllNets|NetworkView::NoQueries|NetworkView::NoServers); - registerNetView(allchans); + BufferView *allchans = new BufferView(tr("All Channels"), BufferView::AllNets|BufferView::NoQueries|BufferView::NoServers); + registerBufferView(allchans); addDockWidget(Qt::LeftDockWidgetArea, allchans); - NetworkView *allqrys = new NetworkView(tr("All Queries"), NetworkView::AllNets|NetworkView::NoChannels|NetworkView::NoServers); - registerNetView(allqrys); + BufferView *allqrys = new BufferView(tr("All Queries"), BufferView::AllNets|BufferView::NoChannels|BufferView::NoServers); + registerBufferView(allqrys); addDockWidget(Qt::RightDockWidgetArea, allqrys); - NetworkView *allnets = new NetworkView(tr("All Networks"), NetworkView::AllNets|NetworkView::NoChannels|NetworkView::NoQueries); - registerNetView(allnets); + BufferView *allnets = new BufferView(tr("All Networks"), BufferView::AllNets|BufferView::NoChannels|BufferView::NoQueries); + registerBufferView(allnets); addDockWidget(Qt::RightDockWidgetArea, allnets); ui.menuViews->addSeparator(); } -void MainWin::registerNetView(NetworkView *view) { +void MainWin::registerBufferView(BufferView *view) { connect(this, SIGNAL(bufferSelected(Buffer *)), view, SLOT(selectBuffer(Buffer *))); connect(this, SIGNAL(bufferUpdated(Buffer *)), view, SLOT(bufferUpdated(Buffer *))); + connect(this, SIGNAL(bufferActivity(uint, Buffer *)), view, SLOT(bufferActivity(uint, Buffer *))); connect(this, SIGNAL(bufferDestroyed(Buffer *)), view, SLOT(bufferDestroyed(Buffer *))); connect(view, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *))); - QList bufs; - typedef QHash bufhash; - QList foo = buffers.values(); - foreach(bufhash h, foo) { - bufs += h.values(); - } - view->setBuffers(bufs); + view->setBuffers(buffers.values()); view->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); netViews.append(view); ui.menuViews->addAction(view->toggleViewAction()); @@ -211,6 +186,7 @@ void MainWin::showServerList() { // serverListDlg = new ServerListDlg(this); // } serverListDlg->show(); + serverListDlg->raise(); } void MainWin::showSettingsDlg() { @@ -228,7 +204,7 @@ void MainWin::closeEvent(QCloseEvent *event) s.setValue("MainWinState", saveState()); s.endGroup(); s.beginGroup("Buffers"); - s.setValue("CurrentNetwork", currentNetwork); + //s.setValue("CurrentNetwork", currentNetwork); s.setValue("CurrentBuffer", currentBuffer); s.endGroup(); delete systray; @@ -238,12 +214,12 @@ void MainWin::closeEvent(QCloseEvent *event) //} } -void MainWin::showBuffer(QString net, QString buf) { - showBuffer(getBuffer(net, buf)); +void MainWin::showBuffer(BufferId id) { + showBuffer(getBuffer(id)); } void MainWin::showBuffer(Buffer *b) { - currentBuffer = b->bufferName(); currentNetwork = b->networkName(); + currentBuffer = b->bufferId().groupId(); //emit bufferSelected(b); //qApp->processEvents(); ui.bufferWidget->setBuffer(b); @@ -252,44 +228,65 @@ void MainWin::showBuffer(Buffer *b) { void MainWin::networkConnected(QString net) { connected[net] = true; - Buffer *b = getBuffer(net, ""); - b->setActive(true); - b->displayMsg(Message::server("", tr("Connected."))); + //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(QString buf, buffers[net].keys()) { - Buffer *b = getBuffer(net, buf); - b->displayMsg(Message::server(buf, tr("Server disconnected."))); + 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; } -Buffer * MainWin::getBuffer(QString net, QString buf) { - if(!buffers[net].contains(buf)) { - Buffer *b = new Buffer(net, buf); - b->setOwnNick(ownNick[net]); - connect(b, SIGNAL(userInput(QString, QString, QString)), this, SLOT(userInput(QString, QString, QString))); +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[net][buf] = b; + buffers[id] = b; emit bufferUpdated(b); } - return buffers[net][buf]; + return buffers[id]; } void MainWin::recvNetworkState(QString net, QVariant state) { connected[net] = true; setOwnNick(net, state.toMap()["OwnNick"].toString()); - getBuffer(net, "")->setActive(true); + getBuffer(getStatusBufferId(net))->setActive(true); VarMap t = state.toMap()["Topics"].toMap(); VarMap n = state.toMap()["Nicks"].toMap(); - foreach(QString buf, t.keys()) { - getBuffer(net, buf)->setActive(true); + 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()) { @@ -297,7 +294,8 @@ void MainWin::recvNetworkState(QString net, QVariant state) { } } -void MainWin::recvMessage(QString net, Message msg) { +void MainWin::recvMessage(Message msg) { + /* Buffer *b; if(msg.flags & Message::PrivMsg) { // query @@ -306,21 +304,51 @@ void MainWin::recvMessage(QString net, Message msg) { } else { b = getBuffer(net, msg.target); } - b->displayMsg(msg); + */ + Buffer *b = getBuffer(msg.buffer); + + uint level = BufferView::OtherActivity; + if(msg.type == Message::Plain or msg.type == Message::Notice){ + level |= BufferView::NewMessage; + } + if(msg.flags & Message::Highlight){ + level |= BufferView::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))); + //recvMessage(net, Message::server("", QString("[STATUS] %1").arg(msg))); + +} + +void MainWin::recvBacklogData(BufferId id, QList msgs, bool done) { + foreach(QVariant v, msgs) { + layoutQueue.append(v.value()); + } + 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(QString net, QString buf, QString msg) { - emit sendInput(net, buf, msg); +void MainWin::userInput(BufferId id, QString msg) { + emit sendInput(id, msg); } void MainWin::setTopic(QString net, QString buf, QString topic) { - if(!connected[net]) return; - Buffer *b = getBuffer(net, buf); + BufferId id = getBufferId(net, buf); + if(!connected[id.network()]) return; + Buffer *b = getBuffer(id); b->setTopic(topic); //if(!b->isActive()) { // b->setActive(true); @@ -328,17 +356,13 @@ void MainWin::setTopic(QString net, QString buf, QString topic) { //} } -void MainWin::setNicks(QString net, QString buf, QStringList nicks) { - Q_ASSERT(false); -} - 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(net, bufname)->addNick(nick, props); + getBuffer(getBufferId(net, bufname))->addNick(nick, props); } } @@ -346,7 +370,7 @@ 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(net, c)->renameNick(oldnick, newnick); + getBuffer(getBufferId(net, c))->renameNick(oldnick, newnick); } nicks[net][newnick] = nicks[net].take(oldnick); } @@ -356,11 +380,11 @@ void MainWin::updateNick(QString net, QString nick, VarMap props) { QStringList oldchans = nicks[net][nick]["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); + 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(net, c)->removeNick(nick); + if(!newchans.contains(c)) getBuffer(getBufferId(net, c))->removeNick(nick); } nicks[net][nick] = props; } @@ -369,7 +393,7 @@ void MainWin::removeNick(QString net, QString nick) { if(!connected[net]) return; VarMap chans = nicks[net][nick]["Channels"].toMap(); foreach(QString bufname, chans.keys()) { - getBuffer(net, bufname)->removeNick(nick); + getBuffer(getBufferId(net, bufname))->removeNick(nick); } nicks[net].remove(nick); } @@ -377,8 +401,17 @@ void MainWin::removeNick(QString net, QString nick) { void MainWin::setOwnNick(QString net, QString nick) { if(!connected[net]) return; ownNick[net] = nick; - foreach(Buffer *b, buffers[net].values()) { - b->setOwnNick(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?
" + "This will permanently delete the contents of your database!", + QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) { + emit importOldBacklog(); + } +}