X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=e06d28bd24070c4a6c2e7561191ea4373d61df3e;hp=801fab8b70e2fa9824cd981322f8167723c1a853;hb=d438145b28f34b7fdbc7e290aa001e5f3f922207;hpb=4e452ee828fdb411e6b1db07c18e02681a30ff27 diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 801fab8b..e06d28bd 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -79,7 +79,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" @@ -305,21 +305,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 +412,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, @@ -823,17 +819,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("Your Quassel Core does not support this feature"), - 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("Your Quassel Core does not support this feature"), + 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(); } } @@ -864,13 +857,12 @@ void MainWin::showMigrationWarning(bool show) void MainWin::onExitRequested(const QString &reason) { if (!reason.isEmpty()) { - auto box = new QMessageBox(QMessageBox::Critical, - tr("Fatal error"), - "" + tr("Quassel encountered a fatal error and is terminated.") + "", - QMessageBox::Ok, this); - box->setInformativeText("

" + tr("Reason:") + " " + reason + ""); - box->setAttribute(Qt::WA_DeleteOnClose); - box->exec(); + QMessageBox box(QMessageBox::Critical, + tr("Fatal error"), + "" + tr("Quassel encountered a fatal error and is terminated.") + "", + QMessageBox::Ok); + box.setInformativeText("

" + tr("Reason:") + " " + reason + ""); + box.exec(); } } @@ -945,25 +937,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(); } @@ -1399,31 +1385,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("Your client does not support SSL encryption"), - 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("Your client does not support SSL encryption"), + 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("Your core does not support SSL encryption"), - 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("Your core does not support SSL encryption"), + 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; } @@ -1436,38 +1419,35 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe errorString += QString("

  • %1
  • ").arg(error.errorString()); errorString += ""; - auto box = new QMessageBox(QMessageBox::Warning, - tr("Untrusted Security Certificate"), - tr("The SSL certificate provided by the core at %1 is untrusted for the following reasons:").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("The SSL certificate provided by the core at %1 is untrusted for the following reasons:").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; } } @@ -1482,10 +1462,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); } @@ -1509,12 +1488,11 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo 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("%1").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("%1").arg(tr("No network selected")), + QMessageBox::Ok); + box.setInformativeText(tr("Select a network before trying to view the channel list.")); + box.exec(); return; } } @@ -1534,30 +1512,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(dlg->currentPage())->bufferList_Open(netId); - dlg->exec(); + qobject_cast(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(dlg->currentPage())->editIgnoreRule(newRule); - dlg->exec(); + qobject_cast(dlg.currentPage())->editIgnoreRule(newRule); + dlg.exec(); } void MainWin::showCoreInfoDlg() { - auto dlg = new CoreInfoDlg(this); - dlg->setAttribute(Qt::WA_DeleteOnClose); - dlg->exec(); + CoreInfoDlg{}.exec(); } @@ -1582,8 +1556,7 @@ void MainWin::awayLogDestroyed() void MainWin::showSettingsDlg() { - SettingsDlg *dlg = new SettingsDlg(); - dlg->setAttribute(Qt::WA_DeleteOnClose); + SettingsDlg *dlg = new SettingsDlg(this); //Category: Interface dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); @@ -1622,25 +1595,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 } @@ -1731,7 +1698,7 @@ void MainWin::closeEvent(QCloseEvent *event) else if(!_aboutToQuit) { _aboutToQuit = true; event->accept(); - quit(); + Quassel::instance()->quit(); } else { event->ignore(); @@ -2031,8 +1998,8 @@ 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); + dlg->show(); }