modernize: Use nullptr
[quassel.git] / src / qtui / mainwin.cpp
index d87026c..fc0e061 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/KStandardAction>
 #  include <KXmlGui/KHelpMenu>
@@ -79,7 +70,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 +86,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
@@ -177,7 +162,7 @@ MainWin::MainWin(QWidget *parent)
     _msgProcessorStatusWidget(new MsgProcessorStatusWidget(this)),
     _coreConnectionStatusWidget(new CoreConnectionStatusWidget(Client::coreConnection(), this)),
     _titleSetter(this),
-    _awayLog(0),
+    _awayLog(nullptr),
     _layoutLoaded(false),
     _activeBufferViewIndex(-1),
     _aboutToQuit(false)
@@ -256,9 +241,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 +257,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
@@ -305,21 +283,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, SLOT(doAutoConnect()));
 }
 
 
@@ -416,7 +390,7 @@ void MainWin::setupActions()
     //
     // 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));
+            Quassel::instance(), SLOT(quit()), Qt::CTRL + Qt::Key_Q));
 
     // View
     coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Chat Lists..."), coll,
@@ -427,14 +401,14 @@ void MainWin::setupActions()
     connect(lockAct, SIGNAL(toggled(bool)), SLOT(on_actionLockLayout_toggled(bool)));
 
     coll->addAction("ToggleSearchBar", new Action(icon::get("edit-find"), tr("Show &Search Bar"), coll,
-            0, 0, QKeySequence::Find))->setCheckable(true);
+            nullptr, nullptr, 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);
+            nullptr, nullptr))->setCheckable(true);
 
     coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll,
-            0, 0))->setCheckable(true);
+            nullptr, nullptr))->setCheckable(true);
 
 #ifdef HAVE_KDE
     _fullScreenAction = KStandardAction::fullScreen(this, SLOT(onFullScreenToggled()), this, coll);
@@ -481,6 +455,8 @@ void MainWin::setupActions()
             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("ShowResourceTree", new Action(icon::get("tools-report-bug"), tr("Show &Resource Tree"), coll,
+            this, SLOT(on_actionShowResourceTree_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)));
 
@@ -656,6 +632,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"));
 
@@ -784,16 +761,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 +800,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 +841,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 +918,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();
 }
 
 
@@ -1393,7 +1366,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 +1374,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 +1384,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 +1403,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 +1413,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 +1424,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 +1443,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())
@@ -1498,7 +1471,7 @@ 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;
@@ -1520,7 +1493,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();
@@ -1529,7 +1502,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);
@@ -1539,7 +1512,7 @@ void MainWin::showIgnoreList(QString newRule)
 
 void MainWin::showCoreInfoDlg()
 {
-    CoreInfoDlg(this).exec();
+    CoreInfoDlg{}.exec();
 }
 
 
@@ -1548,7 +1521,7 @@ void MainWin::showAwayLog()
     if (_awayLog)
         return;
     AwayLogFilter *filter = new AwayLogFilter(Client::messageModel());
-    _awayLog = new AwayLogView(filter, 0);
+    _awayLog = new AwayLogView(filter, nullptr);
     filter->setParent(_awayLog);
     connect(_awayLog, SIGNAL(destroyed()), this, SLOT(awayLogDestroyed()));
     _awayLog->setAttribute(Qt::WA_DeleteOnClose);
@@ -1558,13 +1531,13 @@ void MainWin::showAwayLog()
 
 void MainWin::awayLogDestroyed()
 {
-    _awayLog = 0;
+    _awayLog = nullptr;
 }
 
 
 void MainWin::showSettingsDlg()
 {
-    SettingsDlg *dlg = new SettingsDlg();
+    SettingsDlg *dlg = new SettingsDlg(this);
 
     //Category: Interface
     dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
@@ -1603,20 +1576,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
 }
 
@@ -1707,7 +1679,7 @@ void MainWin::closeEvent(QCloseEvent *event)
     else if(!_aboutToQuit) {
         _aboutToQuit = true;
         event->accept();
-        quit();
+        Quassel::instance()->quit();
     }
     else {
         event->ignore();
@@ -1719,7 +1691,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);
@@ -1787,7 +1759,7 @@ void MainWin::clientNetworkCreated(NetworkId id)
     connect(net, SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated()));
     connect(act, SIGNAL(triggered()), this, SLOT(connectOrDisconnectFromNet()));
 
-    QAction *beforeAction = 0;
+    QAction *beforeAction = nullptr;
     foreach(QAction *action, _networksMenu->actions()) {
         if (!action->data().isValid()) // ignore stock actions
             continue;
@@ -1986,7 +1958,7 @@ void MainWin::on_actionDebugHotList_triggered()
 
 void MainWin::on_actionDebugBufferViewOverlay_triggered()
 {
-    DebugBufferViewOverlay *overlay = new DebugBufferViewOverlay(0);
+    DebugBufferViewOverlay *overlay = new DebugBufferViewOverlay(nullptr);
     overlay->setAttribute(Qt::WA_DeleteOnClose);
     overlay->show();
 }
@@ -1994,7 +1966,7 @@ void MainWin::on_actionDebugBufferViewOverlay_triggered()
 
 void MainWin::on_actionDebugMessageModel_triggered()
 {
-    QTableView *view = new QTableView(0);
+    QTableView *view = new QTableView(nullptr);
     DebugMessageModelFilter *filter = new DebugMessageModelFilter(view);
     filter->setSourceModel(Client::messageModel());
     view->setModel(filter);
@@ -2007,10 +1979,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)
 {