modernize: Use auto where the type is clear from context
[quassel.git] / src / qtui / mainwin.cpp
index 8d122f3..6330e2c 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
@@ -176,11 +161,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
 
@@ -256,9 +237,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 +253,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
@@ -423,14 +397,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);
@@ -477,6 +451,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)));
 
@@ -652,6 +628,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"));
 
@@ -689,10 +666,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
 
@@ -749,9 +726,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
@@ -768,7 +745,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();
@@ -780,16 +757,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;
 }
 
 
@@ -819,17 +796,14 @@ void MainWin::changeActiveBufferView(int bufferViewId)
 void MainWin::showPasswordChangeDlg()
 {
     if(Client::isCoreFeatureEnabled(Quassel::Feature::PasswordChange)) {
-        auto dlg = new PasswordChangeDlg(this);
-        dlg->setAttribute(Qt::WA_DeleteOnClose);
-        dlg->exec();
+        PasswordChangeDlg{}.exec();
     }
     else {
-        auto box = new QMessageBox(QMessageBox::Warning, tr("Feature Not Supported"),
-                                   tr("<b>Your Quassel Core does not support this feature</b>"),
-                                   QMessageBox::Ok, this);
-        box->setInformativeText(tr("You need a Quassel Core v0.12.0 or newer in order to be able to remotely change your password."));
-        box->setAttribute(Qt::WA_DeleteOnClose);
-        box->exec();
+        QMessageBox box(QMessageBox::Warning, tr("Feature Not Supported"),
+                        tr("<b>Your Quassel Core does not support this feature</b>"),
+                        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();
     }
 }
 
@@ -860,13 +834,12 @@ void MainWin::showMigrationWarning(bool show)
 void MainWin::onExitRequested(const QString &reason)
 {
     if (!reason.isEmpty()) {
-        auto box = new QMessageBox(QMessageBox::Critical,
-                                   tr("Fatal error"),
-                                   "<b>" + tr("Quassel encountered a fatal error and is terminated.") + "</b>",
-                                   QMessageBox::Ok, this);
-        box->setInformativeText("<p>" + tr("Reason:<em>") + " " + reason + "</em>");
-        box->setAttribute(Qt::WA_DeleteOnClose);
-        box->exec();
+        QMessageBox box(QMessageBox::Critical,
+                        tr("Fatal error"),
+                        "<b>" + tr("Quassel encountered a fatal error and is terminated.") + "</b>",
+                        QMessageBox::Ok);
+        box.setInformativeText("<p>" + tr("Reason:<em>") + " " + reason + "</em>");
+        box.exec();
     }
 }
 
@@ -941,25 +914,19 @@ void MainWin::hideCurrentBuffer()
 
 void MainWin::showNotificationsDlg()
 {
-    auto dlg = new SettingsPageDlg(new NotificationsSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg{new NotificationsSettingsPage{}}.exec();
 }
 
 
 void MainWin::on_actionConfigureNetworks_triggered()
 {
-    auto dlg = new SettingsPageDlg(new NetworksSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg{new NetworksSettingsPage{}}.exec();
 }
 
 
 void MainWin::on_actionConfigureViews_triggered()
 {
-    auto dlg = new SettingsPageDlg(new BufferViewSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg{new BufferViewSettingsPage{}}.exec();
 }
 
 
@@ -1024,7 +991,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);
@@ -1137,7 +1104,7 @@ void MainWin::setupStatusBar()
 
 void MainWin::setupHotList()
 {
-    FlatProxyModel *flatProxy = new FlatProxyModel(this);
+    auto *flatProxy = new FlatProxyModel(this);
     flatProxy->setSourceModel(Client::bufferModel());
     _bufferHotList = new BufferHotListFilter(flatProxy);
 }
@@ -1395,31 +1362,28 @@ void MainWin::setDisconnectedState()
 void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage)
 {
     Q_UNUSED(errorMessage)
-    auto dlg = new CoreConnectAuthDlg(account, this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    *valid = (dlg->exec() == QDialog::Accepted);
+    CoreConnectAuthDlg dlg(account);
+    *valid = (dlg.exec() == QDialog::Accepted);
 }
 
 
 void MainWin::handleNoSslInClient(bool *accepted)
 {
-    auto box = new QMessageBox(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your client does not support SSL encryption</b>"),
-                               QMessageBox::Ignore|QMessageBox::Cancel, this);
-    box->setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
-    box->setDefaultButton(QMessageBox::Ignore);
-    box->setAttribute(Qt::WA_DeleteOnClose);
-    *accepted = (box->exec() == QMessageBox::Ignore);
+    QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your client does not support SSL encryption</b>"),
+        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;
 }
 
 
 void MainWin::handleNoSslInCore(bool *accepted)
 {
-    auto box = new QMessageBox(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your core does not support SSL encryption</b>"),
-                               QMessageBox::Ignore|QMessageBox::Cancel, this);
-    box->setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
-    box->setDefaultButton(QMessageBox::Ignore);
-    box->setAttribute(Qt::WA_DeleteOnClose);
-    *accepted = (box->exec() == QMessageBox::Ignore);
+    QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your core does not support SSL encryption</b>"),
+        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;
 }
 
 
@@ -1432,38 +1396,35 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe
     errorString += QString("<li>%1</li>").arg(error.errorString());
     errorString += "</ul>";
 
-    auto box = new QMessageBox(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);
-    box->setInformativeText(errorString);
-    box->addButton(tr("Continue"), QMessageBox::AcceptRole);
-    box->setDefaultButton(box->addButton(tr("Show Certificate"), QMessageBox::HelpRole));
-    box->setAttribute(Qt::WA_DeleteOnClose);
+    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);
+    box.setInformativeText(errorString);
+    box.addButton(tr("Continue"), QMessageBox::AcceptRole);
+    box.setDefaultButton(box.addButton(tr("Show Certificate"), QMessageBox::HelpRole));
 
     QMessageBox::ButtonRole role;
     do {
-        box->exec();
-        role = box->buttonRole(box->clickedButton());
+        box.exec();
+        role = box.buttonRole(box.clickedButton());
         if (role == QMessageBox::HelpRole) {
-            auto dlg = new SslInfoDlg(socket, this);
-            dlg->setAttribute(Qt::WA_DeleteOnClose);
-            dlg->exec();
+            SslInfoDlg dlg(socket);
+            dlg.exec();
         }
     }
     while (role == QMessageBox::HelpRole);
 
     *accepted = role == QMessageBox::AcceptRole;
     if (*accepted) {
-        auto box2 = new QMessageBox(QMessageBox::Warning,
-                                    tr("Untrusted Security Certificate"),
-                                    tr("Would you like to accept this certificate forever without being prompted?"),
-                                    nullptr, this);
-        box2->setDefaultButton(box2->addButton(tr("Current Session Only"), QMessageBox::NoRole));
-        box2->addButton(tr("Forever"), QMessageBox::YesRole);
-        box2->setAttribute(Qt::WA_DeleteOnClose);
-        box2->exec();
-        *permanently = (box2->buttonRole(box2->clickedButton()) == QMessageBox::YesRole);
+        QMessageBox box2(QMessageBox::Warning,
+            tr("Untrusted Security Certificate"),
+            tr("Would you like to accept this certificate forever without being prompted?"),
+            0);
+        box2.setDefaultButton(box2.addButton(tr("Current Session Only"), QMessageBox::NoRole));
+        box2.addButton(tr("Forever"), QMessageBox::YesRole);
+        box2.exec();
+        *permanently =  box2.buttonRole(box2.clickedButton()) == QMessageBox::YesRole;
     }
 }
 
@@ -1478,10 +1439,9 @@ void MainWin::handleCoreConnectionError(const QString &error)
 
 void MainWin::showCoreConnectionDlg()
 {
-    auto dlg = new CoreConnectDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    if (dlg->exec() == QDialog::Accepted) {
-        AccountId accId = dlg->selectedAccount();
+    CoreConnectDlg dlg;
+    if (dlg.exec() == QDialog::Accepted) {
+        AccountId accId = dlg.selectedAccount();
         if (accId.isValid())
             Client::coreConnection()->connectToCore(accId);
     }
@@ -1490,7 +1450,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();
 }
@@ -1499,23 +1459,22 @@ void MainWin::showCoreConfigWizard(const QVariantList &backends, const QVariantL
 void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bool listImmediately)
 {
     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()) {
             // We still haven't found a valid network, probably no network selected, e.g. "/list"
             // on the client homescreen when no networks are connected.
-            auto box = new QMessageBox(QMessageBox::Information, tr("No network selected"),
-                                       QString("<b>%1</b>").arg(tr("No network selected")),
-                                       QMessageBox::Ok, this);
-            box->setInformativeText(tr("Select a network before trying to view the channel list."));
-            box->setAttribute(Qt::WA_DeleteOnClose);
-            box->exec();
+            QMessageBox box(QMessageBox::Information, tr("No network selected"),
+                            QString("<b>%1</b>").arg(tr("No network selected")),
+                            QMessageBox::Ok);
+            box.setInformativeText(tr("Select a network before trying to view the channel list."));
+            box.exec();
             return;
         }
     }
 
-    ChannelListDlg *channelListDlg = new ChannelListDlg(this);
+    auto *channelListDlg = new ChannelListDlg(this);
     channelListDlg->setAttribute(Qt::WA_DeleteOnClose);
     channelListDlg->setNetwork(netId);
     if (!channelFilters.isEmpty()) {
@@ -1530,30 +1489,26 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo
 
 void MainWin::showNetworkConfig(NetworkId netId)
 {
-    auto dlg = new SettingsPageDlg(new NetworksSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
+    SettingsPageDlg dlg{new NetworksSettingsPage{}};
     if (netId.isValid())
-        qobject_cast<NetworksSettingsPage *>(dlg->currentPage())->bufferList_Open(netId);
-    dlg->exec();
+        qobject_cast<NetworksSettingsPage *>(dlg.currentPage())->bufferList_Open(netId);
+    dlg.exec();
 }
 
 
 void MainWin::showIgnoreList(QString newRule)
 {
-    auto dlg = new SettingsPageDlg(new IgnoreListSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
+    SettingsPageDlg dlg{new IgnoreListSettingsPage{}};
     // prepare config dialog for new rule
     if (!newRule.isEmpty())
-        qobject_cast<IgnoreListSettingsPage *>(dlg->currentPage())->editIgnoreRule(newRule);
-    dlg->exec();
+        qobject_cast<IgnoreListSettingsPage *>(dlg.currentPage())->editIgnoreRule(newRule);
+    dlg.exec();
 }
 
 
 void MainWin::showCoreInfoDlg()
 {
-    auto dlg = new CoreInfoDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    CoreInfoDlg{}.exec();
 }
 
 
@@ -1561,8 +1516,8 @@ 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()));
     _awayLog->setAttribute(Qt::WA_DeleteOnClose);
@@ -1572,14 +1527,13 @@ void MainWin::showAwayLog()
 
 void MainWin::awayLogDestroyed()
 {
-    _awayLog = 0;
+    _awayLog = nullptr;
 }
 
 
 void MainWin::showSettingsDlg()
 {
-    SettingsDlg *dlg = new SettingsDlg();
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
+    auto *dlg = new SettingsDlg();
 
     //Category: Interface
     dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
@@ -1618,25 +1572,19 @@ void MainWin::showSettingsDlg()
 
 void MainWin::showAboutDlg()
 {
-    auto dlg = new AboutDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    AboutDlg{}.exec();
 }
 
 
 void MainWin::showShortcutsDlg()
 {
 #ifdef HAVE_KDE
-    auto dlg = new KShortcutsDialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed, this);
-    foreach(KActionCollection *coll, QtUi::actionCollections()) {
-        dlg->addCollection(coll, coll->property("Category").toString());
-    }
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->configure(true);
+    KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed);
+    foreach(KActionCollection *coll, QtUi::actionCollections())
+    dlg.addCollection(coll, coll->property("Category").toString());
+    dlg.configure(true);
 #else
-    auto dlg = new SettingsPageDlg(new ShortcutsSettingsPage(QtUi::actionCollections(), this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg{new ShortcutsSettingsPage{QtUi::actionCollections()}}.exec();
 #endif
 }
 
@@ -1646,7 +1594,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();
         }
     }
@@ -1715,7 +1663,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.
@@ -1739,7 +1687,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);
@@ -1801,13 +1749,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()));
 
-    QAction *beforeAction = 0;
+    QAction *beforeAction = nullptr;
     foreach(QAction *action, _networksMenu->actions()) {
         if (!action->data().isValid()) // ignore stock actions
             continue;
@@ -1822,11 +1770,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;
 
@@ -1855,7 +1803,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;
 
@@ -1865,7 +1813,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;
@@ -1949,7 +1897,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();
@@ -1968,7 +1916,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();
@@ -1980,7 +1928,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());
@@ -1997,7 +1945,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();
@@ -2006,7 +1954,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();
 }
@@ -2014,8 +1962,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);
@@ -2027,10 +1975,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)
 {