fixes #484 - issues with ssl status indicator
[quassel.git] / src / qtui / mainwin.cpp
index 7aa3055..78f8d38 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -41,6 +41,7 @@
 #include "chatmonitorview.h"
 #include "chatview.h"
 #include "client.h"
+#include "clientsyncer.h"
 #include "clientbacklogmanager.h"
 #include "coreinfodlg.h"
 #include "coreconnectdlg.h"
@@ -91,7 +92,7 @@
 MainWin::MainWin(QWidget *parent)
 #ifdef HAVE_KDE
   : KMainWindow(parent),
-  _kHelpMenu(new KHelpMenu(this)),
+  _kHelpMenu(new KHelpMenu(this, KGlobal::mainComponent().aboutData())),
 #else
   : QMainWindow(parent),
 #endif
@@ -115,20 +116,6 @@ MainWin::MainWin(QWidget *parent)
 
   installEventFilter(new JumpKeyHandler(this));
 
-#ifndef HAVE_KDE
-    QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this));
-    QtUi::registerNotificationBackend(new SystrayNotificationBackend(this));
-#  ifdef HAVE_PHONON
-    QtUi::registerNotificationBackend(new PhononNotificationBackend(this));
-#  endif
-#  ifdef HAVE_DBUS
-    QtUi::registerNotificationBackend(new DesktopNotificationBackend(this));
-#  endif
-
-#else /* HAVE_KDE */
-    QtUi::registerNotificationBackend(new KNotificationBackend(this));
-#endif /* HAVE_KDE */
-
   QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
   connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&)));
   connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&)));
@@ -157,7 +144,6 @@ void MainWin::init() {
   setupActions();
   setupBufferWidget();
   setupMenus();
-  setupViews();
   setupTopicWidget();
   setupChatMonitor();
   setupNickWidget();
@@ -166,6 +152,20 @@ void MainWin::init() {
   setupSystray();
   setupTitleSetter();
 
+#ifndef HAVE_KDE
+  QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this));
+  QtUi::registerNotificationBackend(new SystrayNotificationBackend(this));
+#  ifdef HAVE_PHONON
+  QtUi::registerNotificationBackend(new PhononNotificationBackend(this));
+#  endif
+#  ifdef HAVE_DBUS
+  QtUi::registerNotificationBackend(new DesktopNotificationBackend(this));
+#  endif
+
+#else /* HAVE_KDE */
+  QtUi::registerNotificationBackend(new KNotificationBackend(this));
+#endif /* HAVE_KDE */
+
   // restore mainwin state
   restoreState(s.value("MainWinState").toByteArray());
 
@@ -175,7 +175,11 @@ void MainWin::init() {
   setDisconnectedState();  // Disable menus and stuff
 
   show();
-  showCoreConnectionDlg(true); // autoconnect if appropriate
+  if(Quassel::runMode() != Quassel::Monolithic) {
+    showCoreConnectionDlg(true); // autoconnect if appropriate
+  } else {
+    startInternalCore();
+  }
 }
 
 MainWin::~MainWin() {
@@ -243,10 +247,18 @@ void MainWin::setupMenus() {
   ActionCollection *coll = QtUi::actionCollection("General");
 
   _fileMenu = menuBar()->addMenu(tr("&File"));
-  _fileMenu->addAction(coll->action("ConnectCore"));
-  _fileMenu->addAction(coll->action("DisconnectCore"));
-  _fileMenu->addAction(coll->action("CoreInfo"));
-  _fileMenu->addSeparator();
+
+  static const QStringList coreActions = QStringList()
+    << "ConnectCore" << "DisconnectCore" << "CoreInfo";
+
+  QAction *coreAction;
+  foreach(QString actionName, coreActions) {
+    coreAction = coll->action(actionName);
+    _fileMenu->addAction(coreAction);
+    flagRemoteCoreOnly(coreAction);
+  }
+  flagRemoteCoreOnly(_fileMenu->addSeparator());
+
   _networksMenu = _fileMenu->addMenu(tr("&Networks"));
   _networksMenu->addAction(coll->action("ConfigureNetworks"));
   _networksMenu->addSeparator();
@@ -290,24 +302,20 @@ void MainWin::setupBufferWidget() {
   setCentralWidget(_bufferWidget);
 }
 
-void MainWin::setupViews() {
-  addBufferView();
-}
-
 void MainWin::addBufferView(int bufferViewConfigId) {
   addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewConfigId));
 }
 
 void MainWin::addBufferView(BufferViewConfig *config) {
-  BufferViewDock *dock;
-  if(config)
-    dock = new BufferViewDock(config, this);
-  else
-    dock = new BufferViewDock(this);
+  if(!config)
+    return;
+
+  BufferViewDock *dock = new BufferViewDock(config, this);
 
   //create the view and initialize it's filter
   BufferView *view = new BufferView(dock);
   view->setFilteredModel(Client::bufferModel(), config);
+  view->installEventFilter(_inputWidget->inputLine()); // for key presses
   view->show();
 
   Client::bufferModel()->synchronizeView(view);
@@ -407,20 +415,20 @@ void MainWin::setupInputWidget() {
   VerticalDock *dock = new VerticalDock(tr("Inputline"), this);
   dock->setObjectName("InputDock");
 
-  InputWidget *inputWidget = new InputWidget(dock);
-  dock->setWidget(inputWidget);
+  _inputWidget = new InputWidget(dock);
+  dock->setWidget(_inputWidget);
 
   addDockWidget(Qt::BottomDockWidgetArea, dock);
 
   _viewMenu->addAction(dock->toggleViewAction());
   dock->toggleViewAction()->setText(tr("Show Input Line"));
 
-  inputWidget->setModel(Client::bufferModel());
-  inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+  _inputWidget->setModel(Client::bufferModel());
+  _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
 
-  _bufferWidget->setFocusProxy(inputWidget);
+  _bufferWidget->setFocusProxy(_inputWidget);
 
-  inputWidget->inputLine()->installEventFilter(_bufferWidget);
+  _inputWidget->inputLine()->installEventFilter(_bufferWidget);
 }
 
 void MainWin::setupTopicWidget() {
@@ -450,14 +458,15 @@ void MainWin::setupStatusBar() {
   connect(Client::messageProcessor(), SIGNAL(progressUpdated(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int)));
 
   // Core Lag:
-  updateLagIndicator(0);
+  updateLagIndicator();
   statusBar()->addPermanentWidget(coreLagLabel);
+  coreLagLabel->hide();
   connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int)));
 
   // SSL indicator
-  connect(Client::instance(), SIGNAL(securedConnection()), this, SLOT(securedConnection()));
   sslLabel->setPixmap(QPixmap());
   statusBar()->addPermanentWidget(sslLabel);
+  sslLabel->hide();
 
   _viewMenu->addSeparator();
   QAction *showStatusbar = QtUi::actionCollection("General")->action("ToggleStatusBar");
@@ -486,10 +495,9 @@ void MainWin::setupSystray() {
 
   ActionCollection *coll = QtUi::actionCollection("General");
   systrayMenu = new QMenu(this);
-  systrayMenu->addAction(coll->action("AboutQuassel"));
-  systrayMenu->addSeparator();
   systrayMenu->addAction(coll->action("ConnectCore"));
   systrayMenu->addAction(coll->action("DisconnectCore"));
+  systrayMenu->addAction(coll->action("CoreInfo"));
   systrayMenu->addSeparator();
   systrayMenu->addAction(coll->action("Quit"));
 
@@ -530,14 +538,28 @@ void MainWin::connectedToCore() {
 
 void MainWin::setConnectedState() {
   ActionCollection *coll = QtUi::actionCollection("General");
-  //ui.menuCore->setEnabled(true);
+
   coll->action("ConnectCore")->setEnabled(false);
   coll->action("DisconnectCore")->setEnabled(true);
   coll->action("CoreInfo")->setEnabled(true);
+
+  foreach(QAction *action, _fileMenu->actions()) {
+    if(isRemoteCoreOnly(action))
+      action->setVisible(!Client::internalCore());
+  }
+
   // _viewMenu->setEnabled(true);
-  statusBar()->showMessage(tr("Connected to core."));
-  if(sslLabel->width() == 0)
+  if(!Client::internalCore())
+    statusBar()->showMessage(tr("Connected to core."));
+
+  if(Client::signalProxy()->isSecure()) {
+    sslLabel->setPixmap(SmallIcon("security-high"));
+  } else {
     sslLabel->setPixmap(SmallIcon("security-low"));
+  }
+
+  sslLabel->setVisible(!Client::internalCore());
+  coreLagLabel->setVisible(!Client::internalCore());
   updateIcon();
 }
 
@@ -554,13 +576,12 @@ void MainWin::saveLayout() {
 }
 
 void MainWin::updateLagIndicator(int lag) {
-  coreLagLabel->setText(QString(tr("Core Lag: %1 msec")).arg(lag));
-}
-
-
-void MainWin::securedConnection() {
-  // todo: make status bar entry
-  sslLabel->setPixmap(SmallIcon("security-high"));
+  QString text = tr("Core Lag: %1");
+  if(lag == -1)
+    text = text.arg('-');
+  else
+    text = text.arg("%1 msec").arg(lag);
+  coreLagLabel->setText(text);
 }
 
 void MainWin::disconnectedFromCore() {
@@ -593,9 +614,19 @@ void MainWin::setDisconnectedState() {
   //_viewMenu->setEnabled(false);
   statusBar()->showMessage(tr("Not connected to core."));
   sslLabel->setPixmap(QPixmap());
+  sslLabel->hide();
+  updateLagIndicator();
+  coreLagLabel->hide();
   updateIcon();
 }
 
+void MainWin::startInternalCore() {
+  ClientSyncer *syncer = new ClientSyncer();
+  Client::registerClientSyncer(syncer);
+  connect(syncer, SIGNAL(syncFinished()), syncer, SLOT(deleteLater()), Qt::QueuedConnection);
+  syncer->useInternalCore();
+}
+
 void MainWin::showCoreConnectionDlg(bool autoConnect) {
   CoreConnectDlg(autoConnect, this).exec();
 }
@@ -836,3 +867,4 @@ void MainWin::saveStateToSessionSettings(SessionSettings & s)
 void MainWin::showStatusBarMessage(const QString &message) {
   statusBar()->showMessage(message, 10000);
 }
+