modernize: Migrate action-related things to PMF connects
[quassel.git] / src / qtui / mainwin.cpp
index 3ada47f..727e1f3 100644 (file)
 #include <QToolBar>
 #include <QInputDialog>
 
-#ifdef HAVE_KDE4
-#  include <KHelpMenu>
-#  include <KMenuBar>
-#  include <KShortcutsDialog>
-#  include <KStatusBar>
-#  include <KToggleFullScreenAction>
-#  include <KToolBar>
-#endif
-
 #ifdef HAVE_KF5
+#  include <kconfigwidgets_version.h>
 #  include <KConfigWidgets/KStandardAction>
 #  include <KXmlGui/KHelpMenu>
 #  include <KXmlGui/KShortcutsDialog>
@@ -79,7 +71,7 @@
 #include "coreinfodlg.h"
 #include "contextmenuactionprovider.h"
 #include "debugbufferviewoverlay.h"
-#include "debuglogwidget.h"
+#include "debuglogdlg.h"
 #include "debugmessagemodelfilter.h"
 #include "flatproxymodel.h"
 #include "icon.h"
@@ -95,6 +87,7 @@
 #include "qtuisettings.h"
 #include "qtuistyle.h"
 #include "receivefiledlg.h"
+#include "resourcetreedlg.h"
 #include "settingsdlg.h"
 #include "settingspagedlg.h"
 #include "statusnotifieritem.h"
 #  ifdef HAVE_QTMULTIMEDIA
 #    include "qtmultimedianotificationbackend.h"
 #  endif
-#  ifdef HAVE_PHONON
-#    include "phononnotificationbackend.h"
-#  endif
 #  include "systraynotificationbackend.h"
 #  include "taskbarnotificationbackend.h"
 #else /* HAVE_KDE */
 #  include "sslinfodlg.h"
 #endif
 
-#ifdef HAVE_INDICATEQT
-  #include "indicatornotificationbackend.h"
-#endif
-
 #ifdef HAVE_NOTIFICATION_CENTER
   #include "osxnotificationbackend.h"
 #endif
@@ -176,11 +162,7 @@ MainWin::MainWin(QWidget *parent)
 #endif
     _msgProcessorStatusWidget(new MsgProcessorStatusWidget(this)),
     _coreConnectionStatusWidget(new CoreConnectionStatusWidget(Client::coreConnection(), this)),
-    _titleSetter(this),
-    _awayLog(0),
-    _layoutLoaded(false),
-    _activeBufferViewIndex(-1),
-    _aboutToQuit(false)
+    _titleSetter(this)
 {
     setAttribute(Qt::WA_DeleteOnClose, false); // we delete the mainwin manually
 
@@ -202,29 +184,29 @@ MainWin::MainWin(QWidget *parent)
 
 void MainWin::init()
 {
-    connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId)));
-    connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId)));
-    connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)),
-        SLOT(messagesInserted(const QModelIndex &, int, int)));
+    connect(Client::instance(), &Client::networkCreated, this, &MainWin::clientNetworkCreated);
+    connect(Client::instance(), &Client::networkRemoved, this, &MainWin::clientNetworkRemoved);
+    connect(Client::messageModel(), &QAbstractItemModel::rowsInserted,
+        this, &MainWin::messagesInserted);
     connect(GraphicalUi::contextMenuActionProvider(),
-            SIGNAL(showChannelList(NetworkId,QString,bool)),
-            SLOT(showChannelList(NetworkId,QString,bool)));
+            &NetworkModelController::showChannelList,
+            this, &MainWin::showChannelList);
     connect(Client::instance(),
-            SIGNAL(showChannelList(NetworkId,QString,bool)),
-            SLOT(showChannelList(NetworkId,QString,bool)));
-    connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showNetworkConfig(NetworkId)), SLOT(showNetworkConfig(NetworkId)));
-    connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString)));
-    connect(Client::instance(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString)));
-    connect(Client::instance(), SIGNAL(dbUpgradeInProgress(bool)), SLOT(showMigrationWarning(bool)));
-    connect(Client::instance(), SIGNAL(exitRequested(QString)), SLOT(onExitRequested(QString)));
-
-    connect(Client::coreConnection(), SIGNAL(startCoreSetup(QVariantList, QVariantList)), SLOT(showCoreConfigWizard(QVariantList, QVariantList)));
-    connect(Client::coreConnection(), SIGNAL(connectionErrorPopup(QString)), SLOT(handleCoreConnectionError(QString)));
-    connect(Client::coreConnection(), SIGNAL(userAuthenticationRequired(CoreAccount *, bool *, QString)), SLOT(userAuthenticationRequired(CoreAccount *, bool *, QString)));
-    connect(Client::coreConnection(), SIGNAL(handleNoSslInClient(bool *)), SLOT(handleNoSslInClient(bool *)));
-    connect(Client::coreConnection(), SIGNAL(handleNoSslInCore(bool *)), SLOT(handleNoSslInCore(bool *)));
+            &Client::showChannelList,
+            this, &MainWin::showChannelList);
+    connect(GraphicalUi::contextMenuActionProvider(), &NetworkModelController::showNetworkConfig, this, &MainWin::showNetworkConfig);
+    connect(GraphicalUi::contextMenuActionProvider(), &NetworkModelController::showIgnoreList, this, &MainWin::showIgnoreList);
+    connect(Client::instance(), &Client::showIgnoreList, this, &MainWin::showIgnoreList);
+    connect(Client::instance(), &Client::dbUpgradeInProgress, this, &MainWin::showMigrationWarning);
+    connect(Client::instance(), &Client::exitRequested, this, &MainWin::onExitRequested);
+
+    connect(Client::coreConnection(), &CoreConnection::startCoreSetup, this, &MainWin::showCoreConfigWizard);
+    connect(Client::coreConnection(), &CoreConnection::connectionErrorPopup, this, &MainWin::handleCoreConnectionError);
+    connect(Client::coreConnection(), &CoreConnection::userAuthenticationRequired, this, &MainWin::userAuthenticationRequired);
+    connect(Client::coreConnection(), &CoreConnection::handleNoSslInClient, this, &MainWin::handleNoSslInClient);
+    connect(Client::coreConnection(), &CoreConnection::handleNoSslInCore, this, &MainWin::handleNoSslInCore);
 #ifdef HAVE_SSL
-    connect(Client::coreConnection(), SIGNAL(handleSslErrors(const QSslSocket *, bool *, bool *)), SLOT(handleSslErrors(const QSslSocket *, bool *, bool *)));
+    connect(Client::coreConnection(), &CoreConnection::handleSslErrors, this, &MainWin::handleSslErrors);
 #endif
 
     // Setup Dock Areas
@@ -256,9 +238,6 @@ void MainWin::init()
 #ifndef HAVE_KDE
 #  ifdef HAVE_QTMULTIMEDIA
     QtUi::registerNotificationBackend(new QtMultimediaNotificationBackend(this));
-#  endif
-#  ifdef HAVE_PHONON
-    QtUi::registerNotificationBackend(new PhononNotificationBackend(this));
 #  endif
     QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this));
 #else /* HAVE_KDE */
@@ -275,10 +254,6 @@ void MainWin::init()
     QtUi::registerNotificationBackend(new SystrayNotificationBackend(this));
 #endif
 
-#ifdef HAVE_INDICATEQT
-    QtUi::registerNotificationBackend(new IndicatorNotificationBackend(this));
-#endif
-
 #ifdef HAVE_NOTIFICATION_CENTER
     QtUi::registerNotificationBackend(new OSXNotificationBackend(this));
 #endif
@@ -290,7 +265,7 @@ void MainWin::init()
     // we assume that at this point, all configurable actions are defined!
     QtUi::loadShortcuts();
 
-    connect(bufferWidget(), SIGNAL(currentChanged(BufferId)), SLOT(currentBufferChanged(BufferId)));
+    connect(bufferWidget(), selectOverload<BufferId>(&AbstractBufferContainer::currentChanged), this, &MainWin::currentBufferChanged);
 
     setDisconnectedState(); // Disable menus and stuff
 
@@ -305,21 +280,17 @@ void MainWin::init()
     // restore locked state of docks
     QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
 
-    QTimer::singleShot(0, this, SLOT(doAutoConnect()));
-}
-
-
-MainWin::~MainWin()
-{
-}
-
+    Quassel::registerQuitHandler([this]() {
+        QtUiSettings s;
+        saveStateToSettings(s);
+        saveLayout();
+        // Close all open dialogs and the MainWin, so we can safely kill the Client instance afterwards
+        // Note: This does not quit the application, as quitOnLastWindowClosed is set to false.
+        //       We rely on another quit handler to be registered that actually quits the application.
+        qApp->closeAllWindows();
+    });
 
-void MainWin::quit()
-{
-    QtUiSettings s;
-    saveStateToSettings(s);
-    saveLayout();
-    QApplication::quit();
+    QTimer::singleShot(0, this, &MainWin::doAutoConnect);
 }
 
 
@@ -398,135 +369,108 @@ void MainWin::updateIcon()
 
 void MainWin::setupActions()
 {
+    QAction *action{nullptr};
     ActionCollection *coll = QtUi::actionCollection("General", tr("General"));
+
     // File
-    coll->addAction("ConnectCore", new Action(icon::get("connect-quassel"), tr("&Connect to Core..."), coll,
-            this, SLOT(showCoreConnectionDlg())));
-    coll->addAction("DisconnectCore", new Action(icon::get("disconnect-quassel"), tr("&Disconnect from Core"), coll,
-            Client::instance(), SLOT(disconnectFromCore())));
-    coll->addAction("ChangePassword", new Action(icon::get("dialog-password"), tr("Change &Password..."), coll,
-            this, SLOT(showPasswordChangeDlg())));
-    coll->addAction("CoreInfo", new Action(icon::get("help-about"), tr("Core &Info..."), coll,
-            this, SLOT(showCoreInfoDlg())));
-    coll->addAction("ConfigureNetworks", new Action(icon::get("configure"), tr("Configure &Networks..."), coll,
-            this, SLOT(on_actionConfigureNetworks_triggered())));
-    // QKeySequence::Quit was added in Qt 4.6, and could be used instead.  However, that key
-    // sequence is empty by default on Windows, which would remove Ctrl-Q to quit.  It may be best
-    // to just keep it this way.
-    //
-    // See https://doc.qt.io/qt-5/qkeysequence.html
-    coll->addAction("Quit", new Action(icon::get("application-exit"), tr("&Quit"), coll,
-            this, SLOT(quit()), Qt::CTRL + Qt::Key_Q));
+    coll->addActions({
+        {"ConnectCore", new Action(icon::get("connect-quassel"), tr("&Connect to Core..."), coll, this, &MainWin::showCoreConnectionDlg)},
+        {"DisconnectCore", new Action(icon::get("disconnect-quassel"), tr("&Disconnect from Core"), coll, Client::instance(), &Client::disconnectFromCore)},
+        {"ChangePassword", new Action(icon::get("dialog-password"), tr("Change &Password..."), coll, this, &MainWin::showPasswordChangeDlg)},
+        {"CoreInfo", new Action(icon::get("help-about"), tr("Core &Info..."), coll, this, &MainWin::showCoreInfoDlg)},
+        {"ConfigureNetworks", new Action(icon::get("configure"), tr("Configure &Networks..."), coll, this, &MainWin::on_actionConfigureNetworks_triggered)},
+        {"Quit", new Action(icon::get("application-exit"), tr("&Quit"), coll, Quassel::instance(), &Quassel::quit, Qt::CTRL + Qt::Key_Q)}
+    });
 
     // View
-    coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Chat Lists..."), coll,
-            this, SLOT(on_actionConfigureViews_triggered())));
+    coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Chat Lists..."), coll, this, &MainWin::on_actionConfigureViews_triggered));
 
-    QAction *lockAct = coll->addAction("LockLayout", new Action(tr("&Lock Layout"), coll));
-    lockAct->setCheckable(true);
-    connect(lockAct, SIGNAL(toggled(bool)), SLOT(on_actionLockLayout_toggled(bool)));
+    coll->addAction("ToggleSearchBar", new Action(icon::get("edit-find"), tr("Show &Search Bar"), coll, QKeySequence::Find))->setCheckable(true);
+    coll->addAction("ShowAwayLog", new Action(tr("Show Away Log"), coll, this, &MainWin::showAwayLog));
+    coll->addAction("ToggleMenuBar", new Action(icon::get("show-menu"), tr("Show &Menubar"), coll))->setCheckable(true);
+    coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll))->setCheckable(true);
 
-    coll->addAction("ToggleSearchBar", new Action(icon::get("edit-find"), tr("Show &Search Bar"), coll,
-            0, 0, QKeySequence::Find))->setCheckable(true);
-    coll->addAction("ShowAwayLog", new Action(tr("Show Away Log"), coll,
-            this, SLOT(showAwayLog())));
-    coll->addAction("ToggleMenuBar", new Action(icon::get("show-menu"), tr("Show &Menubar"), coll,
-            0, 0))->setCheckable(true);
-
-    coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll,
-            0, 0))->setCheckable(true);
+    action = coll->addAction("LockLayout", new Action(tr("&Lock Layout"), coll));
+    action->setCheckable(true);
+    connect(action, &QAction::toggled, this, &MainWin::on_actionLockLayout_toggled);
 
 #ifdef HAVE_KDE
+#if KCONFIGWIDGETS_VERSION < QT_VERSION_CHECK(5,23,0)
     _fullScreenAction = KStandardAction::fullScreen(this, SLOT(onFullScreenToggled()), this, coll);
 #else
-    _fullScreenAction = new Action(icon::get("view-fullscreen"), tr("&Full Screen Mode"), coll,
-        this, SLOT(onFullScreenToggled()), QKeySequence(Qt::Key_F11));
+    _fullScreenAction = KStandardAction::fullScreen(this, &MainWin::onFullScreenToggled, this, coll);
+#endif
+#else
+    _fullScreenAction = new Action(icon::get("view-fullscreen"), tr("&Full Screen Mode"), coll, this, &MainWin::onFullScreenToggled, QKeySequence::FullScreen);
     _fullScreenAction->setCheckable(true);
     coll->addAction("ToggleFullScreen", _fullScreenAction);
 #endif
 
     // Settings
-    QAction *configureShortcutsAct = new Action(icon::get("configure-shortcuts"), tr("Configure &Shortcuts..."), coll,
-        this, SLOT(showShortcutsDlg()));
-    configureShortcutsAct->setMenuRole(QAction::NoRole);
-    coll->addAction("ConfigureShortcuts", configureShortcutsAct);
-
-#ifdef Q_OS_MAC
-    QAction *configureQuasselAct = new Action(icon::get("configure"), tr("&Configure Quassel..."), coll,
-        this, SLOT(showSettingsDlg()));
-    configureQuasselAct->setMenuRole(QAction::PreferencesRole);
-#else
-    QAction *configureQuasselAct = new Action(icon::get("configure"), tr("&Configure Quassel..."), coll,
-        this, SLOT(showSettingsDlg()), QKeySequence(Qt::Key_F7));
-#endif
-    coll->addAction("ConfigureQuassel", configureQuasselAct);
+    coll->addAction("ConfigureShortcuts", new Action(icon::get("configure-shortcuts"), tr("Configure &Shortcuts..."), coll,
+                                                     this, &MainWin::showShortcutsDlg))->setMenuRole(QAction::NoRole);
+    coll->addAction("ConfigureQuassel", new Action(icon::get("configure"), tr("&Configure Quassel..."), coll,
+                                                   this, &MainWin::showSettingsDlg, QKeySequence(Qt::Key_F7)))->setMenuRole(QAction::PreferencesRole);
 
     // Help
-    QAction *aboutQuasselAct = new Action(icon::get("quassel"), tr("&About Quassel"), coll,
-        this, SLOT(showAboutDlg()));
-    aboutQuasselAct->setMenuRole(QAction::AboutRole);
-    coll->addAction("AboutQuassel", aboutQuasselAct);
-
-    QAction *aboutQtAct = new Action(QIcon(":/pics/qt-logo.png"), tr("About &Qt"), coll,
-        qApp, SLOT(aboutQt()));
-    aboutQtAct->setMenuRole(QAction::AboutQtRole);
-    coll->addAction("AboutQt", aboutQtAct);
-    coll->addAction("DebugNetworkModel", new Action(icon::get("tools-report-bug"), tr("Debug &NetworkModel"), coll,
-            this, SLOT(on_actionDebugNetworkModel_triggered())));
-    coll->addAction("DebugBufferViewOverlay", new Action(icon::get("tools-report-bug"), tr("Debug &BufferViewOverlay"), coll,
-            this, SLOT(on_actionDebugBufferViewOverlay_triggered())));
-    coll->addAction("DebugMessageModel", new Action(icon::get("tools-report-bug"), tr("Debug &MessageModel"), coll,
-            this, SLOT(on_actionDebugMessageModel_triggered())));
-    coll->addAction("DebugHotList", new Action(icon::get("tools-report-bug"), tr("Debug &HotList"), coll,
-            this, SLOT(on_actionDebugHotList_triggered())));
-    coll->addAction("DebugLog", new Action(icon::get("tools-report-bug"), tr("Debug &Log"), coll,
-            this, SLOT(on_actionDebugLog_triggered())));
-    coll->addAction("ReloadStyle", new Action(icon::get("view-refresh"), tr("Reload Stylesheet"), coll,
-            QtUi::style(), SLOT(reload()), QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_R)));
-
-    coll->addAction("HideCurrentBuffer", new Action(tr("Hide Current Buffer"), coll,
-            this, SLOT(hideCurrentBuffer()), QKeySequence::Close));
+    coll->addAction("AboutQuassel", new Action(icon::get("quassel"), tr("&About Quassel"), coll, this, &MainWin::showAboutDlg))->setMenuRole(QAction::AboutRole);
+    coll->addAction("AboutQt", new Action(QIcon(":/pics/qt-logo.png"), tr("About &Qt"), coll, qApp, &QApplication::aboutQt))->setMenuRole(QAction::AboutQtRole);
+    coll->addActions({
+        {"DebugNetworkModel", new Action(icon::get("tools-report-bug"), tr("Debug &NetworkModel"), coll, this, &MainWin::on_actionDebugNetworkModel_triggered)},
+        {"DebugBufferViewOverlay", new Action(icon::get("tools-report-bug"), tr("Debug &BufferViewOverlay"), coll, this, &MainWin::on_actionDebugBufferViewOverlay_triggered)},
+        {"DebugMessageModel", new Action(icon::get("tools-report-bug"), tr("Debug &MessageModel"), coll, this, &MainWin::on_actionDebugMessageModel_triggered)},
+        {"DebugHotList", new Action(icon::get("tools-report-bug"), tr("Debug &HotList"), coll, this, &MainWin::on_actionDebugHotList_triggered)},
+        {"DebugLog", new Action(icon::get("tools-report-bug"), tr("Debug &Log"), coll, this, &MainWin::on_actionDebugLog_triggered)},
+        {"ShowResourceTree", new Action(icon::get("tools-report-bug"), tr("Show &Resource Tree"), coll, this, &MainWin::on_actionShowResourceTree_triggered)},
+        {"ReloadStyle", new Action(icon::get("view-refresh"), tr("Reload Stylesheet"), coll, QtUi::style(), &UiStyle::reload, QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_R))}
+    });
+
+    // Other
+    coll->addAction("HideCurrentBuffer", new Action(tr("Hide Current Buffer"), coll, this, &MainWin::hideCurrentBuffer, QKeySequence::Close));
 
     // Text formatting
     coll = QtUi::actionCollection("TextFormat", tr("Text formatting"));
 
-    coll->addAction("FormatApplyColor", new Action(
-                        icon::get("format-text-color"), tr("Apply foreground color"), coll,
-                        this, SLOT(on_inputFormatApplyColor_triggered()),
-                        QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_G)));
-
-    coll->addAction("FormatApplyColorFill", new Action(
-                        icon::get("format-fill-color"), tr("Apply background color"), coll,
-                        this, SLOT(on_inputFormatApplyColorFill_triggered()),
-                        QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_B)));
-
-    coll->addAction("FormatClear", new Action(
-                        icon::get("edit-clear"), tr("Clear formatting"), coll,
-                        this, SLOT(on_inputFormatClear_triggered()),
-                        QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_C)));
-
-    coll->addAction("FormatBold", new Action(
-                        icon::get("format-text-bold"), tr("Toggle bold"), coll,
-                        this, SLOT(on_inputFormatBold_triggered()),
-                        QKeySequence::Bold));
-
-    coll->addAction("FormatItalic", new Action(
-                        icon::get("format-text-italic"), tr("Toggle italics"), coll,
-                        this, SLOT(on_inputFormatItalic_triggered()),
-                        QKeySequence::Italic));
-
-    coll->addAction("FormatUnderline", new Action(
-                        icon::get("format-text-underline"), tr("Toggle underline"), coll,
-                        this, SLOT(on_inputFormatUnderline_triggered()), QKeySequence::Underline));
+    coll->addActions({
+        {"FormatApplyColor", new Action(
+            icon::get("format-text-color"), tr("Apply foreground color"), coll,
+            this, &MainWin::on_inputFormatApplyColor_triggered,
+            QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_G))
+        },
+        {"FormatApplyColorFill", new Action(
+            icon::get("format-fill-color"), tr("Apply background color"), coll,
+            this, &MainWin::on_inputFormatApplyColorFill_triggered,
+            QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_B))
+        },
+        {"FormatClear", new Action(
+            icon::get("edit-clear"), tr("Clear formatting"), coll,
+            this, &MainWin::on_inputFormatClear_triggered,
+            QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_C))
+        },
+        {"FormatBold", new Action(
+            icon::get("format-text-bold"), tr("Toggle bold"), coll,
+            this, &MainWin::on_inputFormatBold_triggered,
+            QKeySequence::Bold)
+        },
+        {"FormatItalic", new Action(
+            icon::get("format-text-italic"), tr("Toggle italics"), coll,
+            this, &MainWin::on_inputFormatItalic_triggered,
+            QKeySequence::Italic)
+        },
+        {"FormatUnderline", new Action(
+            icon::get("format-text-underline"), tr("Toggle underline"), coll,
+            this, &MainWin::on_inputFormatUnderline_triggered,
+            QKeySequence::Underline)
+        }
+    });
 
     // Navigation
     coll = QtUi::actionCollection("Navigation", tr("Navigation"));
 
-    coll->addAction("JumpHotBuffer", new Action(tr("Jump to hot chat"), coll,
-            this, SLOT(on_jumpHotBuffer_triggered()), QKeySequence(Qt::META + Qt::Key_A)));
-
-    coll->addAction("ActivateBufferFilter", new Action(tr("Activate the buffer search"), coll,
-            this, SLOT(on_bufferSearch_triggered()), QKeySequence(Qt::CTRL + Qt::Key_S)));
+    coll->addActions({
+        {"JumpHotBuffer", new Action(tr("Jump to hot chat"), coll, this, &MainWin::on_jumpHotBuffer_triggered, QKeySequence(Qt::META + Qt::Key_A))},
+        {"ActivateBufferFilter", new Action(tr("Activate the buffer search"), coll, this, &MainWin::on_bufferSearch_triggered, QKeySequence(Qt::CTRL + Qt::Key_S))}
+    });
 
     // Jump keys
 #ifdef Q_OS_MAC
@@ -537,57 +481,57 @@ void MainWin::setupActions()
     const int jumpModifier = Qt::AltModifier;
 #endif
 
-    coll->addAction("BindJumpKey0", new Action(tr("Set Quick Access #0"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey0", new Action(tr("Set Quick Access #0"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_0)))->setProperty("Index", 0);
-    coll->addAction("BindJumpKey1", new Action(tr("Set Quick Access #1"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey1", new Action(tr("Set Quick Access #1"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_1)))->setProperty("Index", 1);
-    coll->addAction("BindJumpKey2", new Action(tr("Set Quick Access #2"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey2", new Action(tr("Set Quick Access #2"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_2)))->setProperty("Index", 2);
-    coll->addAction("BindJumpKey3", new Action(tr("Set Quick Access #3"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey3", new Action(tr("Set Quick Access #3"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_3)))->setProperty("Index", 3);
-    coll->addAction("BindJumpKey4", new Action(tr("Set Quick Access #4"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey4", new Action(tr("Set Quick Access #4"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_4)))->setProperty("Index", 4);
-    coll->addAction("BindJumpKey5", new Action(tr("Set Quick Access #5"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey5", new Action(tr("Set Quick Access #5"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_5)))->setProperty("Index", 5);
-    coll->addAction("BindJumpKey6", new Action(tr("Set Quick Access #6"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey6", new Action(tr("Set Quick Access #6"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_6)))->setProperty("Index", 6);
-    coll->addAction("BindJumpKey7", new Action(tr("Set Quick Access #7"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey7", new Action(tr("Set Quick Access #7"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_7)))->setProperty("Index", 7);
-    coll->addAction("BindJumpKey8", new Action(tr("Set Quick Access #8"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey8", new Action(tr("Set Quick Access #8"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_8)))->setProperty("Index", 8);
-    coll->addAction("BindJumpKey9", new Action(tr("Set Quick Access #9"), coll, this, SLOT(bindJumpKey()),
+    coll->addAction("BindJumpKey9", new Action(tr("Set Quick Access #9"), coll, this, &MainWin::bindJumpKey,
             QKeySequence(bindModifier + Qt::Key_9)))->setProperty("Index", 9);
 
-    coll->addAction("JumpKey0", new Action(tr("Quick Access #0"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey0", new Action(tr("Quick Access #0"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_0)))->setProperty("Index", 0);
-    coll->addAction("JumpKey1", new Action(tr("Quick Access #1"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey1", new Action(tr("Quick Access #1"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_1)))->setProperty("Index", 1);
-    coll->addAction("JumpKey2", new Action(tr("Quick Access #2"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey2", new Action(tr("Quick Access #2"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_2)))->setProperty("Index", 2);
-    coll->addAction("JumpKey3", new Action(tr("Quick Access #3"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey3", new Action(tr("Quick Access #3"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_3)))->setProperty("Index", 3);
-    coll->addAction("JumpKey4", new Action(tr("Quick Access #4"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey4", new Action(tr("Quick Access #4"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_4)))->setProperty("Index", 4);
-    coll->addAction("JumpKey5", new Action(tr("Quick Access #5"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey5", new Action(tr("Quick Access #5"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_5)))->setProperty("Index", 5);
-    coll->addAction("JumpKey6", new Action(tr("Quick Access #6"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey6", new Action(tr("Quick Access #6"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_6)))->setProperty("Index", 6);
-    coll->addAction("JumpKey7", new Action(tr("Quick Access #7"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey7", new Action(tr("Quick Access #7"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_7)))->setProperty("Index", 7);
-    coll->addAction("JumpKey8", new Action(tr("Quick Access #8"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey8", new Action(tr("Quick Access #8"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_8)))->setProperty("Index", 8);
-    coll->addAction("JumpKey9", new Action(tr("Quick Access #9"), coll, this, SLOT(onJumpKey()),
+    coll->addAction("JumpKey9", new Action(tr("Quick Access #9"), coll, this, &MainWin::onJumpKey,
             QKeySequence(jumpModifier + Qt::Key_9)))->setProperty("Index", 9);
 
     // Buffer navigation
     coll->addAction("NextBufferView", new Action(icon::get("go-next-view"), tr("Activate Next Chat List"), coll,
-            this, SLOT(nextBufferView()), QKeySequence(QKeySequence::Forward)));
+            this, &MainWin::nextBufferView, QKeySequence(QKeySequence::Forward)));
     coll->addAction("PreviousBufferView", new Action(icon::get("go-previous-view"), tr("Activate Previous Chat List"), coll,
-            this, SLOT(previousBufferView()), QKeySequence::Back));
+            this, &MainWin::previousBufferView, QKeySequence::Back));
     coll->addAction("NextBuffer", new Action(icon::get("go-down"), tr("Go to Next Chat"), coll,
-            this, SLOT(nextBuffer()), QKeySequence(Qt::ALT + Qt::Key_Down)));
+            this, &MainWin::nextBuffer, QKeySequence(Qt::ALT + Qt::Key_Down)));
     coll->addAction("PreviousBuffer", new Action(icon::get("go-up"), tr("Go to Previous Chat"), coll,
-            this, SLOT(previousBuffer()), QKeySequence(Qt::ALT + Qt::Key_Up)));
+            this, &MainWin::previousBuffer, QKeySequence(Qt::ALT + Qt::Key_Up)));
 }
 
 
@@ -633,8 +577,13 @@ void MainWin::setupMenus()
 
     _settingsMenu = menuBar()->addMenu(tr("&Settings"));
 #ifdef HAVE_KDE
+#if KCONFIGWIDGETS_VERSION < QT_VERSION_CHECK(5,23,0)
     _settingsMenu->addAction(KStandardAction::configureNotifications(this, SLOT(showNotificationsDlg()), this));
     _settingsMenu->addAction(KStandardAction::keyBindings(this, SLOT(showShortcutsDlg()), this));
+#else
+    _settingsMenu->addAction(KStandardAction::configureNotifications(this, &MainWin::showNotificationsDlg, this));
+    _settingsMenu->addAction(KStandardAction::keyBindings(this, &MainWin::showShortcutsDlg, this));
+#endif
 #else
     _settingsMenu->addAction(coll->action("ConfigureShortcuts"));
 #endif
@@ -647,7 +596,11 @@ void MainWin::setupMenus()
 #ifndef HAVE_KDE
     _helpMenu->addAction(coll->action("AboutQt"));
 #else
+#if KCONFIGWIDGETS_VERSION < QT_VERSION_CHECK(5,23,0)
     _helpMenu->addAction(KStandardAction::aboutKDE(_kHelpMenu, SLOT(aboutKDE()), this));
+#else
+    _helpMenu->addAction(KStandardAction::aboutKDE(_kHelpMenu, &KHelpMenu::aboutKDE, this));
+#endif
 #endif
     _helpMenu->addSeparator();
     _helpDebugMenu = _helpMenu->addMenu(icon::get("tools-report-bug"), tr("Debug"));
@@ -656,6 +609,7 @@ void MainWin::setupMenus()
     _helpDebugMenu->addAction(coll->action("DebugMessageModel"));
     _helpDebugMenu->addAction(coll->action("DebugHotList"));
     _helpDebugMenu->addAction(coll->action("DebugLog"));
+    _helpDebugMenu->addAction(coll->action("ShowResourceTree"));
     _helpDebugMenu->addSeparator();
     _helpDebugMenu->addAction(coll->action("ReloadStyle"));
 
@@ -667,8 +621,8 @@ void MainWin::setupMenus()
     showMenuBar->setChecked(enabled);
     enabled ? menuBar()->show() : menuBar()->hide();
 
-    connect(showMenuBar, SIGNAL(toggled(bool)), menuBar(), SLOT(setVisible(bool)));
-    connect(showMenuBar, SIGNAL(toggled(bool)), this, SLOT(saveMenuBarStatus(bool)));
+    connect(showMenuBar, &QAction::toggled, menuBar(), &QMenuBar::setVisible);
+    connect(showMenuBar, &QAction::toggled, this, &MainWin::saveMenuBarStatus);
 }
 
 
@@ -693,10 +647,10 @@ void MainWin::addBufferView(ClientBufferViewConfig *config)
         return;
 
     config->setLocked(QtUiSettings().value("LockLayout", false).toBool());
-    BufferViewDock *dock = new BufferViewDock(config, this);
+    auto *dock = new BufferViewDock(config, this);
 
     //create the view and initialize it's filter
-    BufferView *view = new BufferView(dock);
+    auto *view = new BufferView(dock);
     view->setFilteredModel(Client::bufferModel(), config);
     view->installEventFilter(_inputWidget); // for key presses
 
@@ -710,8 +664,8 @@ void MainWin::addBufferView(ClientBufferViewConfig *config)
     addDockWidget(Qt::LeftDockWidgetArea, dock);
     _bufferViewsMenu->addAction(dock->toggleViewAction());
 
-    connect(dock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(bufferViewToggled(bool)));
-    connect(dock, SIGNAL(visibilityChanged(bool)), SLOT(bufferViewVisibilityChanged(bool)));
+    connect(dock->toggleViewAction(), &QAction::toggled, this, &MainWin::bufferViewToggled);
+    connect(dock, &QDockWidget::visibilityChanged, this, &MainWin::bufferViewVisibilityChanged);
     _bufferViews.append(dock);
 
     if (!activeBufferView())
@@ -753,9 +707,9 @@ void MainWin::bufferViewToggled(bool enabled)
         // since this isn't our fault and we can't do anything about it, we suppress the resulting calls
         return;
     }
-    QAction *action = qobject_cast<QAction *>(sender());
+    auto *action = qobject_cast<QAction *>(sender());
     Q_ASSERT(action);
-    BufferViewDock *dock = qobject_cast<BufferViewDock *>(action->parent());
+    auto *dock = qobject_cast<BufferViewDock *>(action->parent());
     Q_ASSERT(dock);
 
     // Make sure we don't toggle backlog fetch for a view we've already removed
@@ -772,7 +726,7 @@ void MainWin::bufferViewToggled(bool enabled)
 void MainWin::bufferViewVisibilityChanged(bool visible)
 {
     Q_UNUSED(visible);
-    BufferViewDock *dock = qobject_cast<BufferViewDock *>(sender());
+    auto *dock = qobject_cast<BufferViewDock *>(sender());
     Q_ASSERT(dock);
     if ((!dock->isHidden() && !activeBufferView()) || (dock->isHidden() && dock->isActive()))
         nextBufferView();
@@ -784,16 +738,16 @@ BufferView *MainWin::allBuffersView() const
     // "All Buffers" is always the first dock created
     if (_bufferViews.count() > 0)
         return _bufferViews[0]->bufferView();
-    return 0;
+    return nullptr;
 }
 
 
 BufferView *MainWin::activeBufferView() const
 {
     if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count())
-        return 0;
+        return nullptr;
     BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex);
-    return dock->isActive() ? dock->bufferView() : 0;
+    return dock->isActive() ? dock->bufferView() : nullptr;
 }
 
 
@@ -823,13 +777,12 @@ void MainWin::changeActiveBufferView(int bufferViewId)
 void MainWin::showPasswordChangeDlg()
 {
     if(Client::isCoreFeatureEnabled(Quassel::Feature::PasswordChange)) {
-        PasswordChangeDlg dlg(this);
-        dlg.exec();
+        PasswordChangeDlg{}.exec();
     }
     else {
         QMessageBox box(QMessageBox::Warning, tr("Feature Not Supported"),
                         tr("<b>Your Quassel Core does not support this feature</b>"),
-                        QMessageBox::Ok, this);
+                        QMessageBox::Ok);
         box.setInformativeText(tr("You need a Quassel Core v0.12.0 or newer in order to be able to remotely change your password."));
         box.exec();
     }
@@ -865,7 +818,7 @@ void MainWin::onExitRequested(const QString &reason)
         QMessageBox box(QMessageBox::Critical,
                         tr("Fatal error"),
                         "<b>" + tr("Quassel encountered a fatal error and is terminated.") + "</b>",
-                        QMessageBox::Ok, this);
+                        QMessageBox::Ok);
         box.setInformativeText("<p>" + tr("Reason:<em>") + " " + reason + "</em>");
         box.exec();
     }
@@ -942,22 +895,19 @@ void MainWin::hideCurrentBuffer()
 
 void MainWin::showNotificationsDlg()
 {
-    SettingsPageDlg dlg(new NotificationsSettingsPage(this), this);
-    dlg.exec();
+    SettingsPageDlg{new NotificationsSettingsPage{}}.exec();
 }
 
 
 void MainWin::on_actionConfigureNetworks_triggered()
 {
-    SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
-    dlg.exec();
+    SettingsPageDlg{new NetworksSettingsPage{}}.exec();
 }
 
 
 void MainWin::on_actionConfigureViews_triggered()
 {
-    SettingsPageDlg dlg(new BufferViewSettingsPage(this), this);
-    dlg.exec();
+    SettingsPageDlg{new BufferViewSettingsPage{}}.exec();
 }
 
 
@@ -1007,7 +957,7 @@ void MainWin::setupNickWidget()
     nickDock->toggleViewAction()->setText(tr("Show Nick List"));
 
     // See NickListDock::NickListDock();
-    // connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool)));
+    // connect(nickDock->toggleViewAction(), &NickListDock::triggered, nickListWidget, &QWidget::showWidget);
 
     // attach the NickListWidget to the BufferModel and the default selection
     _nickListWidget->setModel(Client::bufferModel());
@@ -1022,7 +972,7 @@ void MainWin::setupChatMonitor()
     VerticalDock *dock = new VerticalDock(tr("Chat Monitor"), this);
     dock->setObjectName("ChatMonitorDock");
 
-    ChatMonitorFilter *filter = new ChatMonitorFilter(Client::messageModel(), this);
+    auto *filter = new ChatMonitorFilter(Client::messageModel(), this);
     _chatMonitorView = new ChatMonitorView(filter, this);
     _chatMonitorView->show();
     dock->setWidget(_chatMonitorView);
@@ -1051,8 +1001,6 @@ void MainWin::setupInputWidget()
     _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
 
     _inputWidget->inputLine()->installEventFilter(_bufferWidget);
-
-    connect(_topicWidget, SIGNAL(switchedPlain()), _bufferWidget, SLOT(setFocus()));
 }
 
 
@@ -1067,6 +1015,8 @@ void MainWin::setupTopicWidget()
     _topicWidget->setModel(Client::bufferModel());
     _topicWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
 
+    connect(_topicWidget, &TopicWidget::switchedPlain, _bufferWidget, selectOverload<>(&QWidget::setFocus));
+
     addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical);
 
     _viewMenu->addAction(dock->toggleViewAction());
@@ -1126,16 +1076,18 @@ void MainWin::setupStatusBar()
     showStatusbar->setChecked(enabled);
     enabled ? statusBar()->show() : statusBar()->hide();
 
-    connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool)));
-    connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool)));
+    connect(showStatusbar, &QAction::toggled, statusBar(), &QWidget::setVisible);
+    connect(showStatusbar, &QAction::toggled, this, &MainWin::saveStatusBarStatus);
 
-    connect(Client::coreConnection(), SIGNAL(connectionMsg(QString)), statusBar(), SLOT(showMessage(QString)));
+    connect(Client::coreConnection(), &CoreConnection::connectionMsg, statusBar(), [statusBar = statusBar()](auto &&message) {
+        statusBar->showMessage(message);
+    });
 }
 
 
 void MainWin::setupHotList()
 {
-    FlatProxyModel *flatProxy = new FlatProxyModel(this);
+    auto *flatProxy = new FlatProxyModel(this);
     flatProxy->setSourceModel(Client::bufferModel());
     _bufferHotList = new BufferHotListFilter(flatProxy);
 }
@@ -1169,10 +1121,10 @@ void MainWin::setupSystray()
 
 void MainWin::setupToolBars()
 {
-    connect(_bufferWidget, SIGNAL(currentChanged(QModelIndex)),
-        QtUi::toolBarActionProvider(), SLOT(currentBufferChanged(QModelIndex)));
-    connect(_nickListWidget, SIGNAL(nickSelectionChanged(QModelIndexList)),
-        QtUi::toolBarActionProvider(), SLOT(nickSelectionChanged(QModelIndexList)));
+    connect(_bufferWidget, selectOverload<const QModelIndex&>(&AbstractBufferContainer::currentChanged),
+        QtUi::toolBarActionProvider(), &ToolBarActionProvider::onCurrentBufferChanged);
+    connect(_nickListWidget, &NickListWidget::nickSelectionChanged,
+        QtUi::toolBarActionProvider(), &ToolBarActionProvider::onNickSelectionChanged);
 
 #ifdef Q_OS_MAC
     setUnifiedTitleAndToolBarOnMac(true);
@@ -1217,7 +1169,7 @@ void MainWin::setupToolBars()
 
     bool visible = uiSettings.value("ShowMainToolBar", QVariant(true)).toBool();
     _mainToolBar->setVisible(visible);
-    connect(_mainToolBar, SIGNAL(visibilityChanged(bool)), this, SLOT(saveMainToolBarStatus(bool)));
+    connect(_mainToolBar, &QToolBar::visibilityChanged, this, &MainWin::saveMainToolBarStatus);
 #endif
 }
 
@@ -1244,12 +1196,12 @@ void MainWin::doAutoConnect()
 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()));
+    connect(Client::bufferViewManager(), &BufferViewManager::bufferViewConfigAdded, this, selectOverload<int>(&MainWin::addBufferView));
+    connect(Client::bufferViewManager(), &BufferViewManager::bufferViewConfigDeleted, this, &MainWin::removeBufferView);
+    connect(Client::bufferViewManager(), &SyncableObject::initDone, this, &MainWin::loadLayout);
 
     if (Client::transferManager()) {
-        connect(Client::transferManager(), SIGNAL(transferAdded(QUuid)), SLOT(showNewTransferDlg(QUuid)));
+        connect(Client::transferManager(), &TransferManager::transferAdded, this, &MainWin::showNewTransferDlg);
     }
 
     setConnectedState();
@@ -1270,13 +1222,13 @@ void MainWin::setConnectedState()
             action->setVisible(!Client::internalCore());
     }
 
-    disconnect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), _msgProcessorStatusWidget, SLOT(setProgress(int, int)));
-    disconnect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &)));
-    disconnect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &)));
+    disconnect(Client::backlogManager(), &ClientBacklogManager::updateProgress, _msgProcessorStatusWidget, &MsgProcessorStatusWidget::setProgress);
+    disconnect(Client::backlogManager(), &ClientBacklogManager::messagesRequested, this, &MainWin::showStatusBarMessage);
+    disconnect(Client::backlogManager(), &ClientBacklogManager::messagesProcessed, this, &MainWin::showStatusBarMessage);
     if (!Client::internalCore()) {
-        connect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), _msgProcessorStatusWidget, SLOT(setProgress(int, int)));
-        connect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &)));
-        connect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &)));
+        connect(Client::backlogManager(), &ClientBacklogManager::updateProgress, _msgProcessorStatusWidget, &MsgProcessorStatusWidget::setProgress);
+        connect(Client::backlogManager(), &ClientBacklogManager::messagesRequested, this, &MainWin::showStatusBarMessage);
+        connect(Client::backlogManager(), &ClientBacklogManager::messagesProcessed, this, &MainWin::showStatusBarMessage);
     }
 
     // _viewMenu->setEnabled(true);
@@ -1393,7 +1345,7 @@ void MainWin::setDisconnectedState()
 void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage)
 {
     Q_UNUSED(errorMessage)
-    CoreConnectAuthDlg dlg(account, this);
+    CoreConnectAuthDlg dlg(account);
     *valid = (dlg.exec() == QDialog::Accepted);
 }
 
@@ -1401,7 +1353,7 @@ void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, cons
 void MainWin::handleNoSslInClient(bool *accepted)
 {
     QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your client does not support SSL encryption</b>"),
-        QMessageBox::Ignore|QMessageBox::Cancel, this);
+        QMessageBox::Ignore|QMessageBox::Cancel);
     box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
     box.setDefaultButton(QMessageBox::Ignore);
     *accepted = box.exec() == QMessageBox::Ignore;
@@ -1411,7 +1363,7 @@ void MainWin::handleNoSslInClient(bool *accepted)
 void MainWin::handleNoSslInCore(bool *accepted)
 {
     QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your core does not support SSL encryption</b>"),
-        QMessageBox::Ignore|QMessageBox::Cancel, this);
+        QMessageBox::Ignore|QMessageBox::Cancel);
     box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
     box.setDefaultButton(QMessageBox::Ignore);
     *accepted = box.exec() == QMessageBox::Ignore;
@@ -1430,7 +1382,7 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe
     QMessageBox box(QMessageBox::Warning,
         tr("Untrusted Security Certificate"),
         tr("<b>The SSL certificate provided by the core at %1 is untrusted for the following reasons:</b>").arg(socket->peerName()),
-        QMessageBox::Cancel, this);
+        QMessageBox::Cancel);
     box.setInformativeText(errorString);
     box.addButton(tr("Continue"), QMessageBox::AcceptRole);
     box.setDefaultButton(box.addButton(tr("Show Certificate"), QMessageBox::HelpRole));
@@ -1440,7 +1392,7 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe
         box.exec();
         role = box.buttonRole(box.clickedButton());
         if (role == QMessageBox::HelpRole) {
-            SslInfoDlg dlg(socket, this);
+            SslInfoDlg dlg(socket);
             dlg.exec();
         }
     }
@@ -1451,7 +1403,7 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe
         QMessageBox box2(QMessageBox::Warning,
             tr("Untrusted Security Certificate"),
             tr("Would you like to accept this certificate forever without being prompted?"),
-            0, this);
+            0);
         box2.setDefaultButton(box2.addButton(tr("Current Session Only"), QMessageBox::NoRole));
         box2.addButton(tr("Forever"), QMessageBox::YesRole);
         box2.exec();
@@ -1470,7 +1422,7 @@ void MainWin::handleCoreConnectionError(const QString &error)
 
 void MainWin::showCoreConnectionDlg()
 {
-    CoreConnectDlg dlg(this);
+    CoreConnectDlg dlg;
     if (dlg.exec() == QDialog::Accepted) {
         AccountId accId = dlg.selectedAccount();
         if (accId.isValid())
@@ -1481,7 +1433,7 @@ void MainWin::showCoreConnectionDlg()
 
 void MainWin::showCoreConfigWizard(const QVariantList &backends, const QVariantList &authenticators)
 {
-    CoreConfigWizard *wizard = new CoreConfigWizard(Client::coreConnection(), backends, authenticators, this);
+    auto *wizard = new CoreConfigWizard(Client::coreConnection(), backends, authenticators, this);
 
     wizard->show();
 }
@@ -1489,10 +1441,8 @@ void MainWin::showCoreConfigWizard(const QVariantList &backends, const QVariantL
 
 void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bool listImmediately)
 {
-    ChannelListDlg *channelListDlg = new ChannelListDlg();
-
     if (!netId.isValid()) {
-        QAction *action = qobject_cast<QAction *>(sender());
+        auto *action = qobject_cast<QAction *>(sender());
         if (action)
             netId = action->data().value<NetworkId>();
         if (!netId.isValid()) {
@@ -1500,14 +1450,14 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo
             // on the client homescreen when no networks are connected.
             QMessageBox box(QMessageBox::Information, tr("No network selected"),
                             QString("<b>%1</b>").arg(tr("No network selected")),
-                            QMessageBox::Ok, this);
+                            QMessageBox::Ok);
             box.setInformativeText(tr("Select a network before trying to view the channel list."));
             box.exec();
             return;
         }
     }
 
-
+    auto *channelListDlg = new ChannelListDlg(this);
     channelListDlg->setAttribute(Qt::WA_DeleteOnClose);
     channelListDlg->setNetwork(netId);
     if (!channelFilters.isEmpty()) {
@@ -1522,7 +1472,7 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo
 
 void MainWin::showNetworkConfig(NetworkId netId)
 {
-    SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
+    SettingsPageDlg dlg{new NetworksSettingsPage{}};
     if (netId.isValid())
         qobject_cast<NetworksSettingsPage *>(dlg.currentPage())->bufferList_Open(netId);
     dlg.exec();
@@ -1531,7 +1481,7 @@ void MainWin::showNetworkConfig(NetworkId netId)
 
 void MainWin::showIgnoreList(QString newRule)
 {
-    SettingsPageDlg dlg(new IgnoreListSettingsPage(this), this);
+    SettingsPageDlg dlg{new IgnoreListSettingsPage{}};
     // prepare config dialog for new rule
     if (!newRule.isEmpty())
         qobject_cast<IgnoreListSettingsPage *>(dlg.currentPage())->editIgnoreRule(newRule);
@@ -1541,7 +1491,7 @@ void MainWin::showIgnoreList(QString newRule)
 
 void MainWin::showCoreInfoDlg()
 {
-    CoreInfoDlg(this).exec();
+    CoreInfoDlg{}.exec();
 }
 
 
@@ -1549,10 +1499,10 @@ void MainWin::showAwayLog()
 {
     if (_awayLog)
         return;
-    AwayLogFilter *filter = new AwayLogFilter(Client::messageModel());
-    _awayLog = new AwayLogView(filter, 0);
+    auto *filter = new AwayLogFilter(Client::messageModel());
+    _awayLog = new AwayLogView(filter, nullptr);
     filter->setParent(_awayLog);
-    connect(_awayLog, SIGNAL(destroyed()), this, SLOT(awayLogDestroyed()));
+    connect(_awayLog, &QObject::destroyed, this, &MainWin::awayLogDestroyed);
     _awayLog->setAttribute(Qt::WA_DeleteOnClose);
     _awayLog->show();
 }
@@ -1560,13 +1510,13 @@ void MainWin::showAwayLog()
 
 void MainWin::awayLogDestroyed()
 {
-    _awayLog = 0;
+    _awayLog = nullptr;
 }
 
 
 void MainWin::showSettingsDlg()
 {
-    SettingsDlg *dlg = new SettingsDlg();
+    auto *dlg = new SettingsDlg();
 
     //Category: Interface
     dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
@@ -1605,20 +1555,19 @@ void MainWin::showSettingsDlg()
 
 void MainWin::showAboutDlg()
 {
-    AboutDlg(this).exec();
+    AboutDlg{}.exec();
 }
 
 
 void MainWin::showShortcutsDlg()
 {
 #ifdef HAVE_KDE
-    KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed, this);
+    KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed);
     foreach(KActionCollection *coll, QtUi::actionCollections())
     dlg.addCollection(coll, coll->property("Category").toString());
     dlg.configure(true);
 #else
-    SettingsPageDlg dlg(new ShortcutsSettingsPage(QtUi::actionCollections(), this), this);
-    dlg.exec();
+    SettingsPageDlg{new ShortcutsSettingsPage{QtUi::actionCollections()}}.exec();
 #endif
 }
 
@@ -1628,7 +1577,7 @@ void MainWin::showNewTransferDlg(const QUuid &transferId)
     auto transfer = Client::transferManager()->transfer(transferId);
     if (transfer) {
         if (transfer->status() == Transfer::Status::New) {
-            ReceiveFileDlg *dlg = new ReceiveFileDlg(transfer, this);
+            auto *dlg = new ReceiveFileDlg(transfer, this);
             dlg->show();
         }
     }
@@ -1697,7 +1646,7 @@ void MainWin::resizeEvent(QResizeEvent *event)
 void MainWin::closeEvent(QCloseEvent *event)
 {
     QtUiSettings s;
-    QtUiApplication *app = qobject_cast<QtUiApplication *> qApp;
+    auto *app = qobject_cast<QtUiApplication *> qApp;
     Q_ASSERT(app);
     // On OSX it can happen that the closeEvent occurs twice. (Especially if packaged with Frameworks)
     // This messes up MainWinState/MainWinHidden save/restore.
@@ -1709,7 +1658,7 @@ void MainWin::closeEvent(QCloseEvent *event)
     else if(!_aboutToQuit) {
         _aboutToQuit = true;
         event->accept();
-        quit();
+        Quassel::instance()->quit();
     }
     else {
         event->ignore();
@@ -1721,7 +1670,7 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end)
 {
     Q_UNUSED(parent);
 
-    bool hasFocus = QApplication::activeWindow() != 0;
+    bool hasFocus = QApplication::activeWindow() != nullptr;
 
     for (int i = start; i <= end; i++) {
         QModelIndex idx = Client::messageModel()->index(i, ChatLineModel::ContentsColumn);
@@ -1783,13 +1732,13 @@ void MainWin::currentBufferChanged(BufferId buffer)
 void MainWin::clientNetworkCreated(NetworkId id)
 {
     const Network *net = Client::network(id);
-    QAction *act = new QAction(net->networkName(), this);
+    auto *act = new QAction(net->networkName(), this);
     act->setObjectName(QString("NetworkAction-%1").arg(id.toInt()));
     act->setData(QVariant::fromValue<NetworkId>(id));
-    connect(net, SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated()));
-    connect(act, SIGNAL(triggered()), this, SLOT(connectOrDisconnectFromNet()));
+    connect(net, &SyncableObject::updatedRemotely, this, &MainWin::clientNetworkUpdated);
+    connect(act, &QAction::triggered, this, &MainWin::connectOrDisconnectFromNet);
 
-    QAction *beforeAction = 0;
+    QAction *beforeAction = nullptr;
     foreach(QAction *action, _networksMenu->actions()) {
         if (!action->data().isValid()) // ignore stock actions
             continue;
@@ -1804,11 +1753,11 @@ void MainWin::clientNetworkCreated(NetworkId id)
 
 void MainWin::clientNetworkUpdated()
 {
-    const Network *net = qobject_cast<const Network *>(sender());
+    const auto *net = qobject_cast<const Network *>(sender());
     if (!net)
         return;
 
-    QAction *action = findChild<QAction *>(QString("NetworkAction-%1").arg(net->networkId().toInt()));
+    auto *action = findChild<QAction *>(QString("NetworkAction-%1").arg(net->networkId().toInt()));
     if (!action)
         return;
 
@@ -1837,7 +1786,7 @@ void MainWin::clientNetworkUpdated()
 
 void MainWin::clientNetworkRemoved(NetworkId id)
 {
-    QAction *action = findChild<QAction *>(QString("NetworkAction-%1").arg(id.toInt()));
+    auto *action = findChild<QAction *>(QString("NetworkAction-%1").arg(id.toInt()));
     if (!action)
         return;
 
@@ -1847,7 +1796,7 @@ void MainWin::clientNetworkRemoved(NetworkId id)
 
 void MainWin::connectOrDisconnectFromNet()
 {
-    QAction *act = qobject_cast<QAction *>(sender());
+    auto *act = qobject_cast<QAction *>(sender());
     if (!act) return;
     const Network *net = Client::network(act->data().value<NetworkId>());
     if (!net) return;
@@ -1931,7 +1880,7 @@ void MainWin::on_bufferSearch_triggered()
 
 void MainWin::onJumpKey()
 {
-    QAction *action = qobject_cast<QAction *>(sender());
+    auto *action = qobject_cast<QAction *>(sender());
     if (!action || !Client::bufferModel())
         return;
     int idx = action->property("Index").toInt();
@@ -1950,7 +1899,7 @@ void MainWin::onJumpKey()
 
 void MainWin::bindJumpKey()
 {
-    QAction *action = qobject_cast<QAction *>(sender());
+    auto *action = qobject_cast<QAction *>(sender());
     if (!action || !Client::bufferModel())
         return;
     int idx = action->property("Index").toInt();
@@ -1962,7 +1911,7 @@ void MainWin::bindJumpKey()
 
 void MainWin::on_actionDebugNetworkModel_triggered()
 {
-    QTreeView *view = new QTreeView;
+    auto *view = new QTreeView;
     view->setAttribute(Qt::WA_DeleteOnClose);
     view->setWindowTitle("Debug NetworkModel View");
     view->setModel(Client::networkModel());
@@ -1979,7 +1928,7 @@ void MainWin::on_actionDebugHotList_triggered()
     _bufferHotList->invalidate();
     _bufferHotList->sort(0, Qt::DescendingOrder);
 
-    QTreeView *view = new QTreeView;
+    auto *view = new QTreeView;
     view->setAttribute(Qt::WA_DeleteOnClose);
     view->setModel(_bufferHotList);
     view->show();
@@ -1988,7 +1937,7 @@ void MainWin::on_actionDebugHotList_triggered()
 
 void MainWin::on_actionDebugBufferViewOverlay_triggered()
 {
-    DebugBufferViewOverlay *overlay = new DebugBufferViewOverlay(0);
+    auto *overlay = new DebugBufferViewOverlay(nullptr);
     overlay->setAttribute(Qt::WA_DeleteOnClose);
     overlay->show();
 }
@@ -1996,8 +1945,8 @@ void MainWin::on_actionDebugBufferViewOverlay_triggered()
 
 void MainWin::on_actionDebugMessageModel_triggered()
 {
-    QTableView *view = new QTableView(0);
-    DebugMessageModelFilter *filter = new DebugMessageModelFilter(view);
+    auto *view = new QTableView(nullptr);
+    auto *filter = new DebugMessageModelFilter(view);
     filter->setSourceModel(Client::messageModel());
     view->setModel(filter);
     view->setAttribute(Qt::WA_DeleteOnClose, true);
@@ -2009,10 +1958,15 @@ void MainWin::on_actionDebugMessageModel_triggered()
 
 void MainWin::on_actionDebugLog_triggered()
 {
-    DebugLogWidget *logWidget = new DebugLogWidget(nullptr);  // will be deleted on close
-    logWidget->show();
+    auto dlg = new DebugLogDlg(this);  // will be deleted on close
+    dlg->show();
 }
 
+void MainWin::on_actionShowResourceTree_triggered()
+{
+    auto dlg = new ResourceTreeDlg(this);  // will be deleted on close
+    dlg->show();
+}
 
 void MainWin::showStatusBarMessage(const QString &message)
 {