X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=gui%2Fmainwin.cpp;h=3d2df39be616f12b7febe2d5a422a7829f1151f9;hp=e9fe9e45a1d19e2af9ead2fdb6da17cd2b53e981;hb=26586e615ffe42bb2b1b307ed1324a6e3051f5da;hpb=12369966345e76e3bba92f64c84c940ef4d8d916 diff --git a/gui/mainwin.cpp b/gui/mainwin.cpp index e9fe9e45..3d2df39b 100644 --- a/gui/mainwin.cpp +++ b/gui/mainwin.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 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,87 +20,89 @@ #include #include +#include +#include "gui.h" +#include "util.h" #include "global.h" #include "message.h" #include "guiproxy.h" #include "mainwin.h" #include "buffer.h" -#include "networkview.h" +#include "bufferviewwidget.h" #include "serverlist.h" #include "coreconnectdlg.h" -#include "settings.h" +#include "settingsdlg.h" +#include "settingspages.h" + +LayoutThread *layoutThread; MainWin::MainWin() : QMainWindow() { ui.setupUi(this); - widget = 0; - + //widget = 0; + //qDebug() << "Available DB drivers: " << QSqlDatabase::drivers (); setWindowTitle("Quassel IRC"); + //setWindowTitle("Κυασελ Εγαρζη"); setWindowIcon(QIcon(":/qirc-icon.png")); setWindowIconText("Quassel IRC"); - QSettings s; - s.beginGroup("Geometry"); - resize(s.value("MainWinSize", QSize(500, 400)).toSize()); - move(s.value("MainWinPos", QPoint(50, 50)).toPoint()); - s.endGroup(); - //workspace = new QWorkspace(this); //setCentralWidget(workspace); statusBar()->showMessage(tr("Waiting for core...")); +} - netView = new NetworkView("", this); - netView->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); - addDockWidget(Qt::LeftDockWidgetArea, netView); - connect(netView, SIGNAL(bufferSelected(QString, QString)), this, SLOT(showBuffer(QString, QString))); - connect(this, SIGNAL(bufferSelected(QString, QString)), netView, SLOT(selectBuffer(QString, QString))); - +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))); + 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(); - syncToCore(); + //syncToCore(); statusBar()->showMessage(tr("Ready.")); - - buffersUpdated(); + systray = new QSystemTrayIcon(this); + systray->setIcon(QIcon(":/qirc-icon.png")); + systray->show(); serverListDlg = new ServerListDlg(this); serverListDlg->setVisible(serverListDlg->showOnStartup()); - settingsDlg = new SettingsDlg(this); - settingsDlg->setVisible(false); + + setupSettingsDlg(); + setupMenus(); + setupViews(); + + QSettings s; + s.beginGroup("Geometry"); + //resize(s.value("MainWinSize", QSize(500, 400)).toSize()); + //move(s.value("MainWinPos", QPoint(50, 50)).toPoint()); + if(s.contains("MainWinState")) restoreState(s.value("MainWinState").toByteArray()); + s.endGroup(); - // replay backlog - foreach(QString net, coreBackLog.keys()) { - while(coreBackLog[net].count()) { - recvMessage(net, coreBackLog[net].takeFirst()); - } - } - /* - foreach(QString key, buffers.keys()) { - foreach(Buffer *b, buffers[key].values()) { - QWidget *widget = b->showWidget(this); - workspace->addWindow(widget); - widget->show(); - } - } - */ 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)) { @@ -110,13 +112,73 @@ MainWin::MainWin() : QMainWindow() { } } } + */ +} + +MainWin::~MainWin() { + //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 */ +/* +void MainWin::setupSettingsDlg() { + +} +*/ + void MainWin::setupMenus() { connect(ui.actionNetworkList, SIGNAL(triggered()), this, SLOT(showServerList())); connect(ui.actionEditIdentities, SIGNAL(triggered()), serverListDlg, SLOT(editIdentities())); connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg())); - ui.actionSettingsDlg->setEnabled(false); + //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()), ClientProxy::instance(), SLOT(gsImportBacklog())); +} + +void MainWin::setupViews() { + BufferTreeModel *model = Client::bufferModel(); // FIXME Where is the delete for that? :p + connect(model, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *))); + //connect(this, SIGNAL(bufferSelected(Buffer *)), model, SLOT(selectBuffer(Buffer *))); + //connect(this, SIGNAL(bufferUpdated(Buffer *)), model, SLOT(bufferUpdated(Buffer *))); + //connect(this, SIGNAL(bufferActivity(Buffer::ActivityLevel, Buffer *)), model, SLOT(bufferActivity(Buffer::ActivityLevel, Buffer *))); + + BufferViewDock *all = new BufferViewDock(model, tr("All Buffers"), BufferViewFilter::AllNets); + registerBufferViewDock(all); + + BufferViewDock *allchans = new BufferViewDock(model, tr("All Channels"), BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers); + registerBufferViewDock(allchans); + + BufferViewDock *allqrys = new BufferViewDock(model, tr("All Queries"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers); + registerBufferViewDock(allqrys); + + + BufferViewDock *allnets = new BufferViewDock(model, tr("All Networks"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries); + registerBufferViewDock(allnets); + + + ui.menuViews->addSeparator(); +} + +void MainWin::registerBufferViewDock(BufferViewDock *dock) { + addDockWidget(Qt::LeftDockWidgetArea, dock); + dock->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); + netViews.append(dock); + ui.menuViews->addAction(dock->toggleViewAction()); + + /* + connect(this, SIGNAL(bufferSelected(Buffer *)), view, SLOT(selectBuffer(Buffer *))); + connect(this, SIGNAL(bufferDestroyed(Buffer *)), view, SLOT(bufferDestroyed(Buffer *))); + connect(view, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *))); + view->setBuffers(buffers.values()); + */ } void MainWin::showServerList() { @@ -124,6 +186,7 @@ void MainWin::showServerList() { // serverListDlg = new ServerListDlg(this); // } serverListDlg->show(); + serverListDlg->raise(); } void MainWin::showSettingsDlg() { @@ -133,170 +196,40 @@ void MainWin::showSettingsDlg() { void MainWin::closeEvent(QCloseEvent *event) { //if (userReallyWantsToQuit()) { + ui.bufferWidget->saveState(); QSettings s; s.beginGroup("Geometry"); s.setValue("MainWinSize", size()); s.setValue("MainWinPos", pos()); + 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; event->accept(); //} else { //event->ignore(); //} } -void MainWin::showBuffer(QString net, QString buf) { - currentBuffer = buf; currentNetwork = net; - Buffer *b = getBuffer(net, buf); - QWidget *old = widget; - widget = b->showWidget(this); - if(widget == old) return; - //workspace->addWindow(widget); - //widget->show(); - setCentralWidget(widget); - widget->show(); - //workspace->setActiveWindow(widget); - widget->setFocus(); - //workspace->setFocus(); - widget->activateWindow(); - widget->setFocus(Qt::MouseFocusReason); - focusNextChild(); - //workspace->tile(); - emit bufferSelected(net, buf); -} - -void MainWin::networkConnected(QString net) { - connected[net] = true; - Buffer *b = getBuffer(net, ""); - b->setActive(true); - b->displayMsg(Message::server("", tr("Connected."))); - 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."))); - 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))); - buffers[net][buf] = b; - buffersUpdated(); - } - return buffers[net][buf]; -} - -void MainWin::buffersUpdated() { - netView->buffersUpdated(buffers); -} - -void MainWin::recvNetworkState(QString net, QVariant state) { - connected[net] = true; - setOwnNick(net, state.toMap()["OwnNick"].toString()); - getBuffer(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); - setTopic(net, buf, t[buf].toString()); - } - foreach(QString nick, n.keys()) { - addNick(net, nick, n[nick].toMap()); - } - buffersUpdated(); -} - -void MainWin::recvMessage(QString net, Message msg) { - Buffer *b = getBuffer(net, msg.target); - b->displayMsg(msg); -} - -void MainWin::recvStatusMsg(QString net, QString msg) { - recvMessage(net, Message::server("", QString("[STATUS] %1").arg(msg))); - -} - -void MainWin::userInput(QString net, QString buf, QString msg) { - emit sendInput(net, buf, msg); -} - -void MainWin::setTopic(QString net, QString buf, QString topic) { - if(!connected[net]) return; - Buffer *b = getBuffer(net, buf); - b->setTopic(topic); - buffersUpdated(); - //if(!b->isActive()) { - // b->setActive(true); - // buffersUpdated(); - //} -} - -void MainWin::setNicks(QString net, QString buf, QStringList nicks) { - Q_ASSERT(false); +void MainWin::showBuffer(BufferId id) { + showBuffer(Client::buffer(id)); } -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); - } - buffersUpdated(); +void MainWin::showBuffer(Buffer *b) { + currentBuffer = b->bufferId().groupId(); + //emit bufferSelected(b); + //qApp->processEvents(); + ui.bufferWidget->setBuffer(b); + //emit bufferSelected(b); // FIXME do we need this? } -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); +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(); } - 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(net, c)->updateNick(nick, props); - else getBuffer(net, c)->addNick(nick, props); - } - foreach(QString c, oldchans) { - if(!newchans.contains(c)) getBuffer(net, c)->removeNick(nick); - } - nicks[net][nick] = props; - buffersUpdated(); -} - -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); - } - nicks[net].remove(nick); - buffersUpdated(); -} - -void MainWin::setOwnNick(QString net, QString nick) { - if(!connected[net]) return; - ownNick[net] = nick; - foreach(Buffer *b, buffers[net].values()) { - b->setOwnNick(nick); - } -} -