Categories in the settings dialog are now clickable
[quassel.git] / src / qtui / mainwin.cpp
index b6a21ea..53324dd 100644 (file)
@@ -35,7 +35,6 @@
 #include "actioncollection.h"
 #include "buffermodel.h"
 #include "bufferview.h"
-#include "bufferviewmanager.h"
 #include "bufferwidget.h"
 #include "channellistdlg.h"
 #include "chatlinemodel.h"
 #include "client.h"
 #include "clientsyncer.h"
 #include "clientbacklogmanager.h"
+#include "clientbufferviewconfig.h"
+#include "clientbufferviewmanager.h"
 #include "coreinfodlg.h"
 #include "coreconnectdlg.h"
+#include "contextmenuactionprovider.h"
 #include "debuglogwidget.h"
 #include "debugmessagemodelfilter.h"
 #include "iconloader.h"
 #include "inputwidget.h"
 #include "inputline.h"
 #include "irclistmodel.h"
+#include "ircconnectionwizard.h"
 #include "jumpkeyhandler.h"
 #include "msgprocessorstatuswidget.h"
 #include "nicklistwidget.h"
@@ -62,6 +65,8 @@
 #include "sessionsettings.h"
 #include "settingsdlg.h"
 #include "settingspagedlg.h"
+#include "systemtray.h"
+#include "toolbaractionprovider.h"
 #include "topicwidget.h"
 #include "verticaldock.h"
 
@@ -102,7 +107,6 @@ MainWin::MainWin(QWidget *parent)
     sslLabel(new QLabel()),
     msgProcessorStatusWidget(new MsgProcessorStatusWidget()),
     _titleSetter(this),
-    _trayIcon(new QSystemTrayIcon(this)),
     _awayLog(0)
 {
   QtUiSettings uiSettings;
@@ -134,7 +138,9 @@ void MainWin::init() {
   connect(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout()));
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId)));
   connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId)));
-  connect(Client::mainUi()->actionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId)));
+  connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
+           SLOT(messagesInserted(const QModelIndex &, int, int)));
+  connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId)));
 
   // Setup Dock Areas
   setDockNestingEnabled(true);
@@ -152,6 +158,7 @@ void MainWin::init() {
   setupNickWidget();
   setupInputWidget();
   setupStatusBar();
+  setupToolBars();
   setupSystray();
   setupTitleSetter();
 
@@ -173,11 +180,12 @@ void MainWin::init() {
   restoreState(s.value("MainWinState").toByteArray());
 
   // restore locked state of docks
-  QtUi::actionCollection("General")->action("LockDockPositions")->setChecked(s.value("LockDocks", false).toBool());
+  QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
 
   setDisconnectedState();  // Disable menus and stuff
 
   show();
+
   if(Quassel::runMode() != Quassel::Monolithic) {
     showCoreConnectionDlg(true); // autoconnect if appropriate
   } else {
@@ -193,14 +201,19 @@ MainWin::~MainWin() {
 }
 
 void MainWin::updateIcon() {
+#ifdef Q_WS_MAC
+  const int size = 128;
+#else
+  const int size = 48;
+#endif
+
   QPixmap icon;
   if(Client::isConnected())
-    icon = DesktopIcon("quassel", IconLoader::SizeEnormous);
+    icon = DesktopIcon("quassel", size);
   else
-    icon = DesktopIcon("quassel_disconnected", IconLoader::SizeEnormous);
+    icon = DesktopIcon("quassel_inactive", size);
   setWindowIcon(icon);
   qApp->setWindowIcon(icon);
-  systemTrayIcon()->setIcon(icon);
 }
 
 void MainWin::setupActions() {
@@ -220,9 +233,10 @@ void MainWin::setupActions() {
   // View
   coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Buffer Views..."), coll,
                                              this, SLOT(on_actionConfigureViews_triggered())));
-  QAction *lockAct = coll->addAction("LockDockPositions", new Action(tr("&Lock Dock Positions"), coll));
+
+  QAction *lockAct = coll->addAction("LockLayout", new Action(tr("&Lock Layout"), coll));
   lockAct->setCheckable(true);
-  connect(lockAct, SIGNAL(toggled(bool)), SLOT(on_actionLockDockPositions_toggled(bool)));
+  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, tr("Ctrl+F")))->setCheckable(true);
@@ -273,6 +287,7 @@ void MainWin::setupMenus() {
   _viewMenu = menuBar()->addMenu(tr("&View"));
   _bufferViewsMenu = _viewMenu->addMenu(tr("&Buffer Views"));
   _bufferViewsMenu->addAction(coll->action("ConfigureBufferViews"));
+  _toolbarMenu = _viewMenu->addMenu(tr("&Toolbars"));
   _viewMenu->addSeparator();
   _viewMenu->addAction(coll->action("ToggleSearchBar"));
 
@@ -282,7 +297,7 @@ void MainWin::setupMenus() {
 
   _viewMenu->addAction(coll->action("ToggleStatusBar"));
   _viewMenu->addSeparator();
-  _viewMenu->addAction(coll->action("LockDockPositions"));
+  _viewMenu->addAction(coll->action("LockLayout"));
 
   _settingsMenu = menuBar()->addMenu(tr("&Settings"));
 #ifdef HAVE_KDE
@@ -313,13 +328,14 @@ void MainWin::setupBufferWidget() {
 }
 
 void MainWin::addBufferView(int bufferViewConfigId) {
-  addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewConfigId));
+  addBufferView(Client::bufferViewManager()->clientBufferViewConfig(bufferViewConfigId));
 }
 
-void MainWin::addBufferView(BufferViewConfig *config) {
+void MainWin::addBufferView(ClientBufferViewConfig *config) {
   if(!config)
     return;
 
+  config->setLocked(QtUiSettings().value("LockLayout", false).toBool());
   BufferViewDock *dock = new BufferViewDock(config, this);
 
   //create the view and initialize it's filter
@@ -377,12 +393,17 @@ void MainWin::on_actionConfigureViews_triggered() {
   dlg.exec();
 }
 
-void MainWin::on_actionLockDockPositions_toggled(bool lock) {
+void MainWin::on_actionLockLayout_toggled(bool lock) {
   QList<VerticalDock *> docks = findChildren<VerticalDock *>();
   foreach(VerticalDock *dock, docks) {
     dock->showTitle(!lock);
   }
-  QtUiSettings().setValue("LockDocks", lock);
+  if(Client::bufferViewManager()) {
+    foreach(ClientBufferViewConfig *config, Client::bufferViewManager()->clientBufferViewConfigs()) {
+      config->setLocked(lock);
+    }
+  }
+  QtUiSettings().setValue("LockLayout", lock);
 }
 
 void MainWin::setupNickWidget() {
@@ -397,7 +418,7 @@ void MainWin::setupNickWidget() {
   addDockWidget(Qt::RightDockWidgetArea, nickDock);
   _viewMenu->addAction(nickDock->toggleViewAction());
   nickDock->toggleViewAction()->setText(tr("Show Nick List"));
-  nickDock->toggleViewAction()->setIcon(SmallIcon("view-sidetree"));
+
   // See NickListDock::NickListDock();
   // connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool)));
 
@@ -414,7 +435,7 @@ void MainWin::setupChatMonitor() {
   ChatMonitorView *chatView = new ChatMonitorView(filter, this);
   chatView->show();
   dock->setWidget(chatView);
-  dock->show();
+  dock->hide();
 
   addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical);
   _viewMenu->addAction(dock->toggleViewAction());
@@ -477,7 +498,6 @@ void MainWin::setupStatusBar() {
   statusBar()->addPermanentWidget(sslLabel);
   sslLabel->hide();
 
-  _viewMenu->addSeparator();
   QAction *showStatusbar = QtUi::actionCollection("General")->action("ToggleStatusBar");
 
   QtUiSettings uiSettings;
@@ -496,26 +516,36 @@ void MainWin::saveStatusBarStatus(bool enabled) {
 }
 
 void MainWin::setupSystray() {
-  connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
-                                  SLOT(messagesInserted(const QModelIndex &, int, int)));
+  _systemTray = new SystemTray(this);
 
-  ActionCollection *coll = QtUi::actionCollection("General");
-  systrayMenu = new QMenu(this);
-  systrayMenu->addAction(coll->action("ConnectCore"));
-  systrayMenu->addAction(coll->action("DisconnectCore"));
-  systrayMenu->addAction(coll->action("CoreInfo"));
-  systrayMenu->addSeparator();
-  systrayMenu->addAction(coll->action("Quit"));
+#ifndef Q_WS_MAC
+  connect(systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systrayActivated(QSystemTrayIcon::ActivationReason)));
+#endif
 
-  systemTrayIcon()->setContextMenu(systrayMenu);
+}
 
-  QtUiSettings s;
-  if(s.value("UseSystemTrayIcon", QVariant(true)).toBool()) {
-    systemTrayIcon()->show();
-  }
+void MainWin::setupToolBars() {
+  connect(_bufferWidget, SIGNAL(currentChanged(QModelIndex)),
+          QtUi::toolBarActionProvider(), SLOT(currentBufferChanged(QModelIndex)));
+  connect(_nickListWidget, SIGNAL(nickSelectionChanged(QModelIndexList)),
+          QtUi::toolBarActionProvider(), SLOT(nickSelectionChanged(QModelIndexList)));
 
-#ifndef Q_WS_MAC
-  connect(systemTrayIcon(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systrayActivated(QSystemTrayIcon::ActivationReason)));
+#ifdef Q_WS_MAC
+  setUnifiedTitleAndToolBarOnMac(true);
+#endif
+  _mainToolBar = addToolBar("Main Toolbar");
+  _mainToolBar->setObjectName("MainToolBar");
+
+  QtUi::toolBarActionProvider()->addActions(_mainToolBar, ToolBarActionProvider::MainToolBar);
+  _toolbarMenu->addAction(_mainToolBar->toggleViewAction());
+
+  //_nickToolBar = addToolBar("User");
+  //_nickToolBar->setObjectName("NickToolBar");
+  //QtUi::toolBarActionProvider()->addActions(_nickToolBar, ToolBarActionProvider::NickToolBar);
+
+#ifdef HAVE_KDE
+  _mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+  //_nickToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
 #endif
 }
 
@@ -564,6 +594,8 @@ void MainWin::setConnectedState() {
   // _viewMenu->setEnabled(true);
   if(!Client::internalCore())
     statusBar()->showMessage(tr("Connected to core."));
+  else
+    statusBar()->clearMessage();
 
   if(Client::signalProxy()->isSecure()) {
     sslLabel->setPixmap(SmallIcon("security-high"));
@@ -574,6 +606,12 @@ void MainWin::setConnectedState() {
   sslLabel->setVisible(!Client::internalCore());
   coreLagLabel->setVisible(!Client::internalCore());
   updateIcon();
+  systemTray()->setState(SystemTray::Active);
+
+  if(Client::networkIds().isEmpty()) {
+    IrcConnectionWizard *wizard = new IrcConnectionWizard(this, Qt::Sheet);
+    wizard->show();
+  }
 }
 
 void MainWin::loadLayout() {
@@ -630,7 +668,10 @@ void MainWin::setDisconnectedState() {
   sslLabel->hide();
   updateLagIndicator();
   coreLagLabel->hide();
+  if(msgProcessorStatusWidget)
+    msgProcessorStatusWidget->setProgress(0, 0);
   updateIcon();
+  systemTray()->setState(SystemTray::Inactive);
 }
 
 void MainWin::startInternalCore() {
@@ -681,20 +722,20 @@ void MainWin::showSettingsDlg() {
   SettingsDlg *dlg = new SettingsDlg();
 
   //Category: Appearance
+  dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); //General
   dlg->registerSettingsPage(new ColorSettingsPage(dlg));
   dlg->registerSettingsPage(new FontsSettingsPage(dlg));
-  dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); //General
-  //Category: Behaviour
-  dlg->registerSettingsPage(new GeneralSettingsPage(dlg));
-  dlg->registerSettingsPage(new BacklogSettingsPage(dlg));
   dlg->registerSettingsPage(new HighlightSettingsPage(dlg));
-  dlg->registerSettingsPage(new AliasesSettingsPage(dlg));
   dlg->registerSettingsPage(new NotificationsSettingsPage(dlg));
+  dlg->registerSettingsPage(new BacklogSettingsPage(dlg));
+  dlg->registerSettingsPage(new BufferViewSettingsPage(dlg));
   dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg));
-  //Category: General
+
+  //Category: Misc
+  dlg->registerSettingsPage(new GeneralSettingsPage(dlg));
   dlg->registerSettingsPage(new IdentitiesSettingsPage(dlg));
   dlg->registerSettingsPage(new NetworksSettingsPage(dlg));
-  dlg->registerSettingsPage(new BufferViewSettingsPage(dlg));
+  dlg->registerSettingsPage(new AliasesSettingsPage(dlg));
 
   dlg->show();
 }
@@ -729,14 +770,13 @@ void MainWin::systrayActivated(QSystemTrayIcon::ActivationReason activationReaso
 }
 
 void MainWin::hideToTray() {
-  if(!systemTrayIcon()->isSystemTrayAvailable()) {
+  if(!systemTray()->isSystemTrayAvailable()) {
     qWarning() << Q_FUNC_INFO << "was called with no SystemTray available!";
     return;
   }
-
   clearFocus();
   hide();
-  systemTrayIcon()->show();
+  systemTray()->setIconVisible();
 }
 
 void MainWin::toggleMinimizedToTray() {
@@ -744,6 +784,7 @@ void MainWin::toggleMinimizedToTray() {
     // restore
     setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
     show();
+    activateWindow();
     raise();
   } else {
     setWindowState((windowState() & ~Qt::WindowActive) | Qt::WindowMinimized);
@@ -764,7 +805,7 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
       continue;
     }
     Message::Flags flags = (Message::Flags)idx.data(ChatLineModel::FlagsRole).toInt();
-    if(flags.testFlag(Message::Backlog)) continue;
+    if(flags.testFlag(Message::Backlog) || flags.testFlag(Message::Self)) continue;
     flags |= Message::Backlog;  // we only want to trigger a highlight once!
     Client::messageModel()->setData(idx, (int)flags, ChatLineModel::FlagsRole);