X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=e06d28bd24070c4a6c2e7561191ea4373d61df3e;hp=fd258838e5370b76d80f84f5fc016909fd022ea3;hb=d438145b28f34b7fdbc7e290aa001e5f3f922207;hpb=8e93326fd70af3c0accc599770796619ef3cee6e diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index fd258838..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" @@ -207,15 +207,16 @@ void MainWin::init() connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), SLOT(messagesInserted(const QModelIndex &, int, int))); connect(GraphicalUi::contextMenuActionProvider(), - SIGNAL(showChannelList(NetworkId, const QString &)), - SLOT(showChannelList(NetworkId, const QString &))); + SIGNAL(showChannelList(NetworkId,QString,bool)), + SLOT(showChannelList(NetworkId,QString,bool))); connect(Client::instance(), - SIGNAL(showChannelList(NetworkId, const QString &)), - SLOT(showChannelList(NetworkId, const QString &))); + 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))); @@ -304,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())); } @@ -415,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, @@ -822,13 +819,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("Your Quassel Core does not support this feature"), - 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(); } @@ -858,6 +854,19 @@ void MainWin::showMigrationWarning(bool show) } +void MainWin::onExitRequested(const QString &reason) +{ + if (!reason.isEmpty()) { + 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(); + } +} + + void MainWin::changeActiveBufferView(bool backwards) { if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) { @@ -928,22 +937,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(); } @@ -1379,7 +1385,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); } @@ -1387,7 +1393,7 @@ void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, cons void MainWin::handleNoSslInClient(bool *accepted) { QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("Your client does not support SSL encryption"), - 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; @@ -1397,7 +1403,7 @@ void MainWin::handleNoSslInClient(bool *accepted) void MainWin::handleNoSslInCore(bool *accepted) { QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("Your core does not support SSL encryption"), - 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; @@ -1416,7 +1422,7 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe 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, this); + QMessageBox::Cancel); box.setInformativeText(errorString); box.addButton(tr("Continue"), QMessageBox::AcceptRole); box.setDefaultButton(box.addButton(tr("Show Certificate"), QMessageBox::HelpRole)); @@ -1426,7 +1432,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(); } } @@ -1437,7 +1443,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(); @@ -1456,7 +1462,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()) @@ -1473,10 +1479,8 @@ void MainWin::showCoreConfigWizard(const QVariantList &backends, const QVariantL } -void MainWin::showChannelList(NetworkId netId, const QString &channelFilters) +void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bool listImmediately) { - ChannelListDlg *channelListDlg = new ChannelListDlg(); - if (!netId.isValid()) { QAction *action = qobject_cast(sender()); if (action) @@ -1486,26 +1490,29 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters) // on the client homescreen when no networks are connected. QMessageBox box(QMessageBox::Information, tr("No network selected"), QString("%1").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; } } - + ChannelListDlg *channelListDlg = new ChannelListDlg(this); channelListDlg->setAttribute(Qt::WA_DeleteOnClose); channelListDlg->setNetwork(netId); if (!channelFilters.isEmpty()) { channelListDlg->setChannelFilters(channelFilters); } + if (listImmediately) { + channelListDlg->requestSearch(); + } channelListDlg->show(); } void MainWin::showNetworkConfig(NetworkId netId) { - SettingsPageDlg dlg(new NetworksSettingsPage(this), this); + SettingsPageDlg dlg{new NetworksSettingsPage{}}; if (netId.isValid()) qobject_cast(dlg.currentPage())->bufferList_Open(netId); dlg.exec(); @@ -1514,7 +1521,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(dlg.currentPage())->editIgnoreRule(newRule); @@ -1524,7 +1531,7 @@ void MainWin::showIgnoreList(QString newRule) void MainWin::showCoreInfoDlg() { - CoreInfoDlg(this).exec(); + CoreInfoDlg{}.exec(); } @@ -1549,7 +1556,7 @@ void MainWin::awayLogDestroyed() void MainWin::showSettingsDlg() { - SettingsDlg *dlg = new SettingsDlg(); + SettingsDlg *dlg = new SettingsDlg(this); //Category: Interface dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); @@ -1588,20 +1595,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 } @@ -1692,7 +1698,7 @@ void MainWin::closeEvent(QCloseEvent *event) else if(!_aboutToQuit) { _aboutToQuit = true; event->accept(); - quit(); + Quassel::instance()->quit(); } else { event->ignore(); @@ -1992,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(); }