improved minimize to tray behavior with win versions of quasselclient
[quassel.git] / src / qtui / mainwin.cpp
index 2d980dc..d1d3fdf 100644 (file)
@@ -30,6 +30,7 @@
 #include "buffermodel.h"
 #include "nicklistwidget.h"
 #include "settingsdlg.h"
+#include "settingspagedlg.h"
 #include "signalproxy.h"
 #include "topicwidget.h"
 #include "inputwidget.h"
@@ -118,8 +119,8 @@ void MainWin::setupMenus() {
   connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt()));
 
   actionEditNetworks = new QAction(QIcon(":/22x22/actions/configure"), tr("Edit &Networks..."), this);
-  actionEditNetworks->setEnabled(false); // FIXME
   ui.menuNetworks->addAction(actionEditNetworks);
+  connect(actionEditNetworks, SIGNAL(triggered()), this, SLOT(showNetworkDlg()));
 }
 
 void MainWin::setupViews() {
@@ -253,6 +254,7 @@ void MainWin::setupSystray() {
   systrayMenu->addAction(ui.actionQuit);
 
   systray->setContextMenu(systrayMenu);
+  // systray->setContextMenuPolicy();
 
   systray->show();
   connect(systray, SIGNAL(activated( QSystemTrayIcon::ActivationReason )),
@@ -323,13 +325,28 @@ void MainWin::closeEvent(QCloseEvent *event)
 
 void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReason) {
   if (activationReason == QSystemTrayIcon::Trigger) {
-    if (isHidden())
+    if(isHidden()) {
       show();
-    else
+      if(isMinimized()) {
+        if(isMaximized()) {
+          showMaximized();
+        } else {
+          showNormal();
+        }
+      }
+      raise();
+      activateWindow();
+    } else {
       hide();
+    }
   }
 }
 
+void MainWin::showNetworkDlg() {
+  SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
+  dlg.exec();
+}
+
 void MainWin::clientNetworkCreated(NetworkId id) {
   const Network *net = Client::network(id);
   QAction *act = new QAction(net->networkName(), this);
@@ -377,9 +394,10 @@ void MainWin::clientNetworkRemoved(NetworkId id) {
   QAction *action;
   while(actionIter != networkActions.end()) {
     action = *actionIter;
-    if(action->data().value<NetworkId>() == id)
+    if(action->data().value<NetworkId>() == id) {
+      action->deleteLater();
       actionIter = networkActions.erase(actionIter);
-    else
+    else
       actionIter++;
   }
 }
@@ -392,3 +410,38 @@ void MainWin::connectOrDisconnectFromNet() {
   if(net->connectionState() == Network::Disconnected) net->requestConnect();
   else net->requestDisconnect();
 }
+
+void MainWin::keyPressEvent(QKeyEvent *event) {
+#ifdef Q_WS_MAC
+  int bindModifier = Qt::ControlModifier | Qt::AltModifier;
+  int jumpModifier = Qt::ControlModifier;
+#else
+  int bindModifier = Qt::ControlModifier;
+  int jumpModifier = Qt::AltModifier;
+#endif
+
+  if(Qt::Key_0 <= event->key() && event->key() <= Qt::Key_9) {
+    if(event->modifiers() ==  bindModifier) {
+      QModelIndex bufferIdx = Client::bufferModel()->standardSelectionModel()->currentIndex();
+      NetworkId netId = bufferIdx.data(NetworkModel::NetworkIdRole).value<NetworkId>();
+      const Network *net = Client::network(netId);
+      if(!net)
+       return;
+      QString bufferName = bufferIdx.sibling(bufferIdx.row(), 0).data().toString();
+
+      _keyboardJump[event->key()] = bufferIdx;
+      statusBar()->showMessage(tr("Bound Buffer %1::%2 to Key %3").arg(net->networkName()).arg(bufferName).arg(event->key() - Qt::Key_0), 10000);
+      event->accept();
+    }
+    
+    else if(event->modifiers() == jumpModifier && _keyboardJump.contains(event->key())) {
+      Client::bufferModel()->standardSelectionModel()->setCurrentIndex(_keyboardJump[event->key()], QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+      event->accept();
+    }
+    
+    else {
+      event->ignore();
+    }
+  }
+  event->ignore();
+}