Switch over to CoreConnection
[quassel.git] / src / qtui / mainwin.cpp
index 98ecdd3..6e6b851 100644 (file)
@@ -27,6 +27,7 @@
 #  include <KShortcutsDialog>
 #  include <KStatusBar>
 #  include <KToolBar>
+#  include <KWindowSystem>
 #endif
 
 #ifdef Q_WS_X11
 #include "chatmonitorview.h"
 #include "chatview.h"
 #include "client.h"
-#include "clientsyncer.h"
 #include "clientbacklogmanager.h"
 #include "clientbufferviewconfig.h"
 #include "clientbufferviewmanager.h"
 #include "clientignorelistmanager.h"
+#include "coreconnection.h"
 #include "coreinfodlg.h"
-#include "coreconnectdlg.h"
 #include "contextmenuactionprovider.h"
 #include "debugbufferviewoverlay.h"
 #include "debuglogwidget.h"
 #  include "knotificationbackend.h"
 #endif /* HAVE_KDE */
 
+#ifdef HAVE_INDICATEQT
+  #include "indicatornotificationbackend.h"
+#endif
+
 #include "settingspages/aliasessettingspage.h"
 #include "settingspages/appearancesettingspage.h"
 #include "settingspages/backlogsettingspage.h"
 #include "settingspages/chatmonitorsettingspage.h"
 #include "settingspages/chatviewsettingspage.h"
 #include "settingspages/connectionsettingspage.h"
+#include "settingspages/coreaccountsettingspage.h"
 #include "settingspages/generalsettingspage.h"
 #include "settingspages/highlightsettingspage.h"
 #include "settingspages/identitiessettingspage.h"
@@ -121,7 +126,8 @@ MainWin::MainWin(QWidget *parent)
     sslLabel(new QLabel()),
     msgProcessorStatusWidget(new MsgProcessorStatusWidget()),
     _titleSetter(this),
-    _awayLog(0)
+    _awayLog(0),
+    _layoutLoaded(false)
 {
 #ifdef Q_WS_WIN
   dwTickCount = 0;
@@ -185,6 +191,10 @@ void MainWin::init() {
   QtUi::registerNotificationBackend(new KNotificationBackend(this));
 #endif /* HAVE_KDE */
 
+#ifdef HAVE_INDICATEQT
+  QtUi::registerNotificationBackend(new IndicatorNotificationBackend(this));
+#endif
+
   connect(bufferWidget(), SIGNAL(currentChanged(BufferId)), SLOT(currentBufferChanged(BufferId)));
 
   setDisconnectedState();  // Disable menus and stuff
@@ -201,10 +211,11 @@ void MainWin::init() {
   QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
 
   if(Quassel::runMode() != Quassel::Monolithic) {
-    showCoreConnectionDlg(true); // autoconnect if appropriate
+    //showCoreConnectionDlg(true); // autoconnect if appropriate
   } else {
     startInternalCore();
   }
+  Client::coreConnection()->start();
 }
 
 MainWin::~MainWin() {
@@ -301,9 +312,9 @@ void MainWin::setupActions() {
   connect(lockAct, SIGNAL(toggled(bool)), SLOT(on_actionLockLayout_toggled(bool)));
 
   coll->addAction("ToggleSearchBar", new Action(SmallIcon("edit-find"), tr("Show &Search Bar"), coll,
-                                               0, 0, QKeySequence::Find))->setCheckable(true);
+                                                0, 0, QKeySequence::Find))->setCheckable(true);
   coll->addAction("ShowAwayLog", new Action(tr("Show Away Log"), coll,
-                                           this, SLOT(showAwayLog())));
+                                            this, SLOT(showAwayLog())));
   coll->addAction("ToggleMenuBar", new Action(SmallIcon("show-menu"), tr("Show &Menubar"), coll,
                                                 0, 0, tr("Ctrl+M")))->setCheckable(true);
 
@@ -434,12 +445,11 @@ void MainWin::addBufferView(ClientBufferViewConfig *config) {
   BufferView *view = new BufferView(dock);
   view->setFilteredModel(Client::bufferModel(), config);
   view->installEventFilter(_inputWidget); // for key presses
-  view->show();
 
   Client::bufferModel()->synchronizeView(view);
 
   dock->setWidget(view);
-  dock->show();
+  dock->setVisible(_layoutLoaded); // don't show before state has been restored
 
   addDockWidget(Qt::LeftDockWidgetArea, dock);
   _bufferViewsMenu->addAction(dock->toggleViewAction());
@@ -459,6 +469,8 @@ void MainWin::removeBufferView(int bufferViewConfigId) {
     dock = qobject_cast<BufferViewDock *>(action->parent());
     if(dock && actionData.toInt() == bufferViewConfigId) {
       removeAction(action);
+      _bufferViews.removeAll(dock);
+      Client::bufferViewOverlay()->removeView(dock->bufferViewId());
       dock->deleteLater();
     }
   }
@@ -469,6 +481,11 @@ void MainWin::bufferViewToggled(bool enabled) {
   Q_ASSERT(action);
   BufferViewDock *dock = qobject_cast<BufferViewDock *>(action->parent());
   Q_ASSERT(dock);
+
+  // Make sure we don't toggle backlog fetch for a view we've already removed
+  if(!_bufferViews.contains(dock))
+    return;
+
   if(enabled) {
     Client::bufferViewOverlay()->addView(dock->bufferViewId());
     BufferViewConfig *config = dock->config();
@@ -630,6 +647,8 @@ void MainWin::setupStatusBar() {
 
   connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool)));
   connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool)));
+
+  connect(Client::coreConnection(), SIGNAL(connectionMsg(QString)), statusBar(), SLOT(showMessage(QString)));
 }
 
 void MainWin::setupHotList() {
@@ -730,13 +749,22 @@ void MainWin::setConnectedState() {
 
 void MainWin::loadLayout() {
   QtUiSettings s;
-  int accountId = Client::currentCoreAccount().toInt();
-  restoreState(s.value(QString("MainWinState-%1").arg(accountId)).toByteArray(), accountId);
+  int accountId = Client::currentCoreAccount().accountId().toInt();
+  QByteArray state = s.value(QString("MainWinState-%1").arg(accountId)).toByteArray();
+  if(state.isEmpty()) {
+    // Make sure that the default bufferview is shown
+    if(_bufferViews.count())
+      _bufferViews.at(0)->show();
+    return;
+  }
+
+  restoreState(state, accountId);
+  _layoutLoaded = true;
 }
 
 void MainWin::saveLayout() {
   QtUiSettings s;
-  int accountId = Client::currentCoreAccount().toInt();
+  int accountId = Client::currentCoreAccount().accountId().toInt();
   if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId));
 }
 
@@ -752,6 +780,8 @@ void MainWin::updateLagIndicator(int lag) {
 void MainWin::disconnectedFromCore() {
   // save core specific layout and remove bufferviews;
   saveLayout();
+  _layoutLoaded = false;
+
   QVariant actionData;
   BufferViewDock *dock;
   foreach(QAction *action, _bufferViewsMenu->actions()) {
@@ -762,9 +792,12 @@ void MainWin::disconnectedFromCore() {
     dock = qobject_cast<BufferViewDock *>(action->parent());
     if(dock && actionData.toInt() != -1) {
       removeAction(action);
+      _bufferViews.removeAll(dock);
+      Client::bufferViewOverlay()->removeView(dock->bufferViewId());
       dock->deleteLater();
     }
   }
+
   QtUiSettings s;
   restoreState(s.value("MainWinState").toByteArray());
   setDisconnectedState();
@@ -795,10 +828,6 @@ void MainWin::startInternalCore() {
   syncer->useInternalCore();
 }
 
-void MainWin::showCoreConnectionDlg(bool autoConnect) {
-  CoreConnectDlg(autoConnect, this).exec();
-}
-
 void MainWin::showChannelList(NetworkId netId) {
   ChannelListDlg *channelListDlg = new ChannelListDlg();
 
@@ -863,6 +892,10 @@ void MainWin::showSettingsDlg() {
   dlg->registerSettingsPage(new AliasesSettingsPage(dlg));
   dlg->registerSettingsPage(new IgnoreListSettingsPage(dlg));
 
+  if(Quassel::runMode() != Quassel::Monolithic) {
+    dlg->registerSettingsPage(new CoreAccountSettingsPage(dlg));
+  }
+
   dlg->show();
 }
 
@@ -956,6 +989,11 @@ void MainWin::toggleMinimizedToTray() {
 }
 
 void MainWin::forceActivated() {
+#ifdef HAVE_KDE
+  show();
+  KWindowSystem::forceActiveWindow(winId());
+#else
+
 #ifdef Q_WS_X11
   // Bypass focus stealing prevention
   QX11Info::setAppUserTime(QX11Info::appTime());
@@ -971,6 +1009,7 @@ void MainWin::forceActivated() {
   show();
   raise();
   activateWindow();
+#endif /* HAVE_KDE */
 }
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {