... and now even when Quassel is QApplication::quit()
[quassel.git] / src / qtui / mainwin.cpp
index 2d980dc..e9bb551 100644 (file)
 #include "buffermodel.h"
 #include "nicklistwidget.h"
 #include "settingsdlg.h"
+#include "settingspagedlg.h"
 #include "signalproxy.h"
 #include "topicwidget.h"
 #include "inputwidget.h"
 #include "verticaldock.h"
 #include "uisettings.h"
+#include "qtuisettings.h"
 
 #include "selectionmodelsynchronizer.h"
 #include "mappedselectionmodel.h"
@@ -42,6 +44,7 @@
 #include "settingspages/fontssettingspage.h"
 #include "settingspages/identitiessettingspage.h"
 #include "settingspages/networkssettingspage.h"
+#include "settingspages/generalsettingspage.h"
 
 #include "debugconsole.h"
 
@@ -57,7 +60,7 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui) {
 }
 
 void MainWin::init() {
-  UiSettings s;
+  QtUiSettings s;
   resize(s.value("MainWinSize").toSize());
 
   Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)));
@@ -65,7 +68,7 @@ void MainWin::init() {
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId)));
   connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId)));
   ui.bufferWidget->init();
-
+  
   show();
 
   statusBar()->showMessage(tr("Not connected to core."));
@@ -87,6 +90,7 @@ void MainWin::init() {
   setupTopicWidget();
   setupSystray();
 
+  
   setupSettingsDlg();
 
   // restore mainwin state
@@ -106,20 +110,24 @@ void MainWin::init() {
 }
 
 MainWin::~MainWin() {
-
+  QtUiSettings s;
+  s.setValue("MainWinSize", size());
+  s.setValue("MainWinPos", pos());
+  s.setValue("MainWinState", saveState());
 }
 
 void MainWin::setupMenus() {
   connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg()));
   connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore()));
+  connect(ui.actionQuit, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit()));
   //connect(ui.actionNetworkList, SIGNAL(triggered()), this, SLOT(showServerList()));
   connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg()));
   connect(ui.actionDebug_Console, SIGNAL(triggered()), this, SLOT(showDebugConsole()));
   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() {
@@ -159,7 +167,8 @@ void MainWin::setupSettingsDlg() {
   settingsDlg->registerSettingsPage(new FontsSettingsPage(settingsDlg));
   settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg));
   settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg));
-
+  settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg));
+  
 #ifdef SPUTDEV
   connect(settingsDlg, SIGNAL(finished(int)), QApplication::instance(), SLOT(quit()));  // FIXME
 #endif
@@ -244,7 +253,7 @@ void MainWin::setupSystray() {
   QString toolTip("left click to minimize the quassel client to tray");
   systray->setToolTip(toolTip);
 
-  QMenu *systrayMenu = new QMenu(this);
+  systrayMenu = new QMenu(this);
   systrayMenu->addAction(ui.actionAboutQuassel);
   systrayMenu->addSeparator();
   systrayMenu->addAction(ui.actionConnectCore);
@@ -254,9 +263,27 @@ void MainWin::setupSystray() {
 
   systray->setContextMenu(systrayMenu);
 
-  systray->show();
+  QtUiSettings s;
+  if(s.value("UseSystemTrayIcon").toBool()) {
+    systray->show();
+  }
+  
+  #ifndef Q_WS_MAC
   connect(systray, SIGNAL(activated( QSystemTrayIcon::ActivationReason )),
           this, SLOT(systrayActivated( QSystemTrayIcon::ActivationReason )));
+  #endif
+
+}
+
+void MainWin::changeEvent(QEvent *event) {
+  if(event->type() == QEvent::WindowStateChange) {
+    if(windowState() & Qt::WindowMinimized) {
+      QtUiSettings s;
+      if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnMinimize").toBool()) {
+        toggleVisibility();
+      }
+    }
+  }
 }
 
 void MainWin::connectedToCore() {
@@ -308,28 +335,44 @@ void MainWin::showDebugConsole() {
   debugConsole->show();
 }
 
-void MainWin::closeEvent(QCloseEvent *event)
-{
-  //if (userReallyWantsToQuit()) {
-    UiSettings s;
-    s.setValue("MainWinSize", size());
-    s.setValue("MainWinPos", pos());
-    s.setValue("MainWinState", saveState());
+void MainWin::closeEvent(QCloseEvent *event) {
+  QtUiSettings s;
+  if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) {
+    toggleVisibility();
+    event->ignore();
+  } else {
     event->accept();
-  //} else {
-    //event->ignore();
-  //}
+  }
 }
 
 void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReason) {
   if (activationReason == QSystemTrayIcon::Trigger) {
-    if (isHidden())
-      show();
-    else
-      hide();
+    toggleVisibility();
+  }
+}
+
+void MainWin::toggleVisibility() {
+  if(isHidden()) {
+    show();
+    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 +420,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 +436,61 @@ 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(event->modifiers() ==  bindModifier) {
+    event->accept();
+    return bindKey(event->key());
+  }
+  
+  if(event->modifiers() == jumpModifier) {
+    event->accept();
+    return jumpKey(event->key());
+  }
+  
+  event->ignore();
+}
+
+void MainWin::bindKey(int key) {
+  if(key < Qt::Key_0 || Qt::Key_9 < key)
+    return;
+  
+  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();
+  BufferId bufferId = bufferIdx.data(NetworkModel::BufferIdRole).value<BufferId>();
+  
+  _keyboardJump[key] = bufferId;
+  CoreAccountSettings().setJumpKeyMap(_keyboardJump);
+  statusBar()->showMessage(tr("Bound Buffer %1::%2 to Key %3").arg(net->networkName()).arg(bufferName).arg(key - Qt::Key_0), 10000);
+}
+
+void MainWin::jumpKey(int key) {
+  if(key < Qt::Key_0 || Qt::Key_9 < key)
+    return;
+
+  if(_keyboardJump.isEmpty())
+    _keyboardJump = CoreAccountSettings().jumpKeyMap();
+
+  if(!_keyboardJump.contains(key))
+    return;
+
+  QModelIndex source_bufferIdx = Client::networkModel()->bufferIndex(_keyboardJump[key]);
+  QModelIndex bufferIdx = Client::bufferModel()->mapFromSource(source_bufferIdx);
+
+  if(bufferIdx.isValid())
+    Client::bufferModel()->standardSelectionModel()->setCurrentIndex(bufferIdx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+  
+}