Fix initial backlock fetch with >= qt-4.6.0-rc1
[quassel.git] / src / qtui / mainwin.cpp
index d14ebec..1191d88 100644 (file)
@@ -27,6 +27,7 @@
 #  include <KShortcutsDialog>
 #  include <KStatusBar>
 #  include <KToolBar>
+#  include <KWindowSystem>
 #endif
 
 #ifdef Q_WS_X11
 #  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/itemviewsettingspage.h"
 #include "settingspages/networkssettingspage.h"
 #include "settingspages/notificationssettingspage.h"
+#include "settingspages/topicwidgetsettingspage.h"
 
 MainWin::MainWin(QWidget *parent)
 #ifdef HAVE_KDE
@@ -120,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;
@@ -147,6 +154,7 @@ void MainWin::init() {
   connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
            SLOT(messagesInserted(const QModelIndex &, int, int)));
   connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId)));
+  connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString)));
 
   // Setup Dock Areas
   setDockNestingEnabled(true);
@@ -183,6 +191,12 @@ 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
 
 #ifdef HAVE_KDE
@@ -430,12 +444,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());
@@ -455,6 +468,7 @@ void MainWin::removeBufferView(int bufferViewConfigId) {
     dock = qobject_cast<BufferViewDock *>(action->parent());
     if(dock && actionData.toInt() == bufferViewConfigId) {
       removeAction(action);
+      _bufferViews.removeAll(dock);
       dock->deleteLater();
     }
   }
@@ -728,6 +742,7 @@ void MainWin::loadLayout() {
   QtUiSettings s;
   int accountId = Client::currentCoreAccount().toInt();
   restoreState(s.value(QString("MainWinState-%1").arg(accountId)).toByteArray(), accountId);
+  _layoutLoaded = true;
 }
 
 void MainWin::saveLayout() {
@@ -748,6 +763,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()) {
@@ -758,9 +775,11 @@ void MainWin::disconnectedFromCore() {
     dock = qobject_cast<BufferViewDock *>(action->parent());
     if(dock && actionData.toInt() != -1) {
       removeAction(action);
+      _bufferViews.removeAll(dock);
       dock->deleteLater();
     }
   }
+
   QtUiSettings s;
   restoreState(s.value("MainWinState").toByteArray());
   setDisconnectedState();
@@ -809,6 +828,14 @@ void MainWin::showChannelList(NetworkId netId) {
   channelListDlg->show();
 }
 
+void MainWin::showIgnoreList(QString newRule) {
+  SettingsPageDlg dlg(new IgnoreListSettingsPage(this), this);
+  // prepare config dialog for new rule
+  if(!newRule.isEmpty())
+    qobject_cast<IgnoreListSettingsPage *>(dlg.currentPage())->editIgnoreRule(newRule);
+  dlg.exec();
+}
+
 void MainWin::showCoreInfoDlg() {
   CoreInfoDlg(this).exec();
 }
@@ -836,6 +863,7 @@ void MainWin::showSettingsDlg() {
   dlg->registerSettingsPage(new ChatViewSettingsPage(dlg));
   dlg->registerSettingsPage(new ItemViewSettingsPage(dlg));
   dlg->registerSettingsPage(new InputWidgetSettingsPage(dlg));
+  dlg->registerSettingsPage(new TopicWidgetSettingsPage(dlg));
   dlg->registerSettingsPage(new HighlightSettingsPage(dlg));
   dlg->registerSettingsPage(new NotificationsSettingsPage(dlg));
   dlg->registerSettingsPage(new BacklogSettingsPage(dlg));
@@ -866,8 +894,11 @@ void MainWin::showShortcutsDlg() {
 /********************************************************************************************************/
 
 bool MainWin::event(QEvent *event) {
-  if(event->type() == QEvent::WindowActivate)
-    QtUi::closeNotifications();
+  if(event->type() == QEvent::WindowActivate) {
+    BufferId buffer = Client::bufferModel()->currentBuffer();
+    if(buffer.isValid())
+      QtUi::closeNotifications(buffer);
+  }
   return QMainWindow::event(event);
 }
 
@@ -940,6 +971,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());
@@ -955,6 +991,7 @@ void MainWin::forceActivated() {
   show();
   raise();
   activateWindow();
+#endif /* HAVE_KDE */
 }
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
@@ -975,7 +1012,7 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
     BufferId bufId = idx.data(ChatLineModel::BufferIdRole).value<BufferId>();
     BufferInfo::Type bufType = Client::networkModel()->bufferType(bufId);
 
-    if(hasFocus && bufId == _bufferWidget->currentBuffer())
+    if(hasFocus && bufId == Client::bufferModel()->currentBuffer())
       continue;
 
     if((flags & Message::Highlight || bufType == BufferInfo::QueryBuffer)
@@ -1001,6 +1038,11 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
   }
 }
 
+void MainWin::currentBufferChanged(BufferId buffer) {
+  if(buffer.isValid())
+    QtUi::closeNotifications(buffer);
+}
+
 void MainWin::clientNetworkCreated(NetworkId id) {
   const Network *net = Client::network(id);
   QAction *act = new QAction(net->networkName(), this);