cleanups (WiP)
[quassel.git] / src / qtui / mainwin.cpp
index 6c8628a..caecd84 100644 (file)
 #include "channellistdlg.h"
 #include "chatlinemodel.h"
 #include "chatmonitorfilter.h"
+#include "chatmonitorview.h"
 #include "chatview.h"
+#include "chatviewsearchbar.h"
 #include "client.h"
 #include "clientbacklogmanager.h"
 #include "coreinfodlg.h"
 #include "coreconnectdlg.h"
 #include "msgprocessorstatuswidget.h"
 #include "qtuimessageprocessor.h"
+#include "qtuiapplication.h"
 #include "networkmodel.h"
 #include "buffermodel.h"
 #include "nicklistwidget.h"
@@ -45,9 +48,9 @@
 #include "irclistmodel.h"
 #include "verticaldock.h"
 #include "uisettings.h"
-#include "util.h"
 #include "qtuisettings.h"
 #include "jumpkeyhandler.h"
+#include "sessionsettings.h"
 
 #include "selectionmodelsynchronizer.h"
 #include "mappedselectionmodel.h"
 #include "settingspages/networkssettingspage.h"
 #include "settingspages/notificationssettingspage.h"
 
-#include "debugconsole.h"
 #include "global.h"
 #include "qtuistyle.h"
 
-MainWin::MainWin(QtUi *_gui, QWidget *parent)
+MainWin::MainWin(QWidget *parent)
   : QMainWindow(parent),
-    gui(_gui),
     coreLagLabel(new QLabel()),
     sslLabel(new QLabel()),
     msgProcessorStatusWidget(new MsgProcessorStatusWidget()),
+
     _titleSetter(this),
     systray(new QSystemTrayIcon(this)),
+
     activeTrayIcon(":/icons/quassel-icon-active.png"),
     onlineTrayIcon(":/icons/quassel-icon.png"),
     offlineTrayIcon(":/icons/quassel-icon-offline.png"),
     trayIconActive(false),
-    timer(new QTimer(this)),
-    channelListDlg(new ChannelListDlg(this)),
-    settingsDlg(new SettingsDlg(this)),
-    debugConsole(new DebugConsole(this))
+
+    timer(new QTimer(this))
 {
   UiSettings uiSettings;
-  loadTranslation(uiSettings.value("Locale", QLocale::system()).value<QLocale>());
-
   QString style = uiSettings.value("Style", QString("")).toString();
   if(style != "") {
     QApplication::setStyle(style);
@@ -112,6 +111,9 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent)
   connect(desktopNotifications, SIGNAL(NotificationClosed(uint, uint)), this, SLOT(desktopNotificationClosed(uint, uint)));
   connect(desktopNotifications, SIGNAL(ActionInvoked(uint, const QString&)), this, SLOT(desktopNotificationInvoked(uint, const QString&)));
 #endif
+  QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
+  connect(app, SIGNAL(saveStateToSession(const QString&)), this, SLOT(saveStateToSession(const QString&)));
+  connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), this, SLOT(saveStateToSessionSettings(SessionSettings&)));
 }
 
 void MainWin::init() {
@@ -121,8 +123,6 @@ void MainWin::init() {
   else
     resize(QSize(800, 500));
 
-  Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)));
-
   connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(saveLayout()));
 
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId)));
@@ -150,21 +150,19 @@ void MainWin::init() {
   setupStatusBar();
   setupSystray();
 
-  setupSettingsDlg();
-
   // restore mainwin state
   restoreState(s.value("MainWinState").toByteArray());
 
   // restore locked state of docks
   ui.actionLockDockPositions->setChecked(s.value("LockDocks", false).toBool());
 
-
   setDisconnectedState();  // Disable menus and stuff
   showCoreConnectionDlg(true); // autoconnect if appropriate
 
   // attach the BufferWidget to the BufferModel and the default selection
   ui.bufferWidget->setModel(Client::bufferModel());
   ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+  ui.menuViews->addAction(ui.bufferWidget->searchBar()->toggleViewAction());
 
   _titleSetter.setModel(Client::bufferModel());
   _titleSetter.setSelectionModel(Client::bufferModel()->standardSelectionModel());
@@ -183,7 +181,6 @@ void MainWin::setupMenus() {
   connect(ui.actionCoreInfo, SIGNAL(triggered()), this, SLOT(showCoreInfoDlg()));
   connect(ui.actionQuit, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit()));
   connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg()));
-  // connect(ui.actionDebug_Console, SIGNAL(triggered()), this, SLOT(showDebugConsole()));
   connect(ui.actionAboutQuassel, SIGNAL(triggered()), this, SLOT(showAboutDlg()));
   connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt()));
 }
@@ -237,22 +234,6 @@ void MainWin::removeBufferView(int bufferViewConfigId) {
   }
 }
 
-void MainWin::setupSettingsDlg() {
-  //Category: Appearance
-  settingsDlg->registerSettingsPage(new ColorSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new FontsSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new AppearanceSettingsPage(settingsDlg)); //General
-  //Category: Behaviour
-  settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new HighlightSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new AliasesSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new NotificationsSettingsPage(settingsDlg));
-  //Category: General
-  settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg));
-  settingsDlg->registerSettingsPage(new BufferViewSettingsPage(settingsDlg));
-}
-
 void MainWin::on_actionEditNetworks_triggered() {
   SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
   dlg.exec();
@@ -295,7 +276,7 @@ void MainWin::setupChatMonitor() {
   dock->setObjectName("ChatMonitorDock");
 
   ChatMonitorFilter *filter = new ChatMonitorFilter(Client::messageModel(), this);
-  ChatView *chatView = new ChatView(filter, this);
+  ChatMonitorView *chatView = new ChatMonitorView(filter, this);
   chatView->show();
   dock->setWidget(chatView);
   dock->show();
@@ -325,7 +306,6 @@ void MainWin::setupTopicWidget() {
   VerticalDock *dock = new VerticalDock(tr("Topic"), this);
   dock->setObjectName("TopicDock");
   TopicWidget *topicwidget = new TopicWidget(dock);
-  connect(topicwidget, SIGNAL(topicChanged(const QString &)), this, SLOT(changeTopic(const QString &)));
 
   dock->setWidget(topicwidget);
 
@@ -410,23 +390,13 @@ void MainWin::changeEvent(QEvent *event) {
   }
 }
 
-// FIXME this should be made prettier...
-void MainWin::changeTopic(const QString &topic) {
-  BufferId id = ui.bufferWidget->currentBuffer();
-  if(!id.isValid()) return;
-  Buffer *buffer = Client::buffer(id);
-  if(buffer) Client::userInput(buffer->bufferInfo(), QString("/topic %1").arg(topic));
-}
-
 void MainWin::connectedToCore() {
   Q_CHECK_PTR(Client::bufferViewManager());
   connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int)));
   connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int)));
   connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout()));
 
-  foreach(BufferInfo id, Client::allBufferInfos()) {
-    Client::backlogManager()->requestBacklog(id.bufferId(), 500, -1);
-  }
+  Client::backlogManager()->requestInitialBacklog();
   setConnectedState();
 }
 
@@ -503,43 +473,49 @@ void MainWin::setDisconnectedState() {
 }
 
 void MainWin::showCoreConnectionDlg(bool autoConnect) {
-  coreConnectDlg = new CoreConnectDlg(this, autoConnect);
-  connect(coreConnectDlg, SIGNAL(finished(int)), this, SLOT(coreConnectionDlgFinished(int)));
-  coreConnectDlg->setModal(true);
-  coreConnectDlg->show();
-}
-
-void MainWin::coreConnectionDlgFinished(int /*code*/) {
-  coreConnectDlg->close();
-  //exit(1);
+  CoreConnectDlg(autoConnect, this).exec();
 }
 
 void MainWin::showChannelList(NetworkId netId) {
+  ChannelListDlg *channelListDlg = new ChannelListDlg();
+
   if(!netId.isValid()) {
     QAction *action = qobject_cast<QAction *>(sender());
     if(action)
       netId = action->data().value<NetworkId>();
   }
+
+  channelListDlg->setAttribute(Qt::WA_DeleteOnClose);
   channelListDlg->setNetwork(netId);
   channelListDlg->show();
 }
 
 void MainWin::showCoreInfoDlg() {
-  CoreInfoDlg dlg(this);
-  dlg.exec();
+  CoreInfoDlg(this).exec();
 }
 
 void MainWin::showSettingsDlg() {
-  settingsDlg->show();
-}
+  SettingsDlg *dlg = new SettingsDlg();
 
-void MainWin::showDebugConsole() {
-  debugConsole->show();
+  //Category: Appearance
+  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 HighlightSettingsPage(dlg));
+  dlg->registerSettingsPage(new AliasesSettingsPage(dlg));
+  dlg->registerSettingsPage(new NotificationsSettingsPage(dlg));
+  //Category: General
+  dlg->registerSettingsPage(new IdentitiesSettingsPage(dlg));
+  dlg->registerSettingsPage(new NetworksSettingsPage(dlg));
+  dlg->registerSettingsPage(new BufferViewSettingsPage(dlg));
+
+  dlg->show();
 }
 
 void MainWin::showAboutDlg() {
-  AboutDlg dlg(this);
-  dlg.exec();
+  AboutDlg(this).exec();
 }
 
 void MainWin::closeEvent(QCloseEvent *event) {
@@ -587,12 +563,10 @@ void MainWin::toggleVisibility() {
 
 void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) {
   Q_UNUSED(parent);
+
   if(QApplication::activeWindow() != 0)
     return;
 
-  // FIXME
-  return;
-
   for(int i = start; i <= end; i++) {
     QModelIndex idx = Client::messageModel()->index(i, ChatLineModel::ContentsColumn);
     if(!idx.isValid()) {
@@ -600,6 +574,10 @@ 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;
+    flags |= Message::Backlog;  // we only want to trigger a highlight once!
+    Client::messageModel()->setData(idx, (int)flags, ChatLineModel::FlagsRole);
+
     BufferId bufId = idx.data(ChatLineModel::BufferIdRole).value<BufferId>();
     BufferInfo::Type bufType = Client::networkModel()->bufferType(bufId);
 
@@ -788,3 +766,19 @@ void MainWin::on_actionDebugNetworkModel_triggered(bool) {
   view->resize(610, 300);
   view->show();
 }
+
+void MainWin::saveStateToSession(const QString &sessionId) {
+  return;
+  SessionSettings s(sessionId);
+
+  s.setValue("MainWinSize", size());
+  s.setValue("MainWinPos", pos());
+  s.setValue("MainWinState", saveState());
+}
+
+void MainWin::saveStateToSessionSettings(SessionSettings & s)
+{
+  s.setValue("MainWinSize", size());
+  s.setValue("MainWinPos", pos());
+  s.setValue("MainWinState", saveState());
+}