#include "coreinfodlg.h"
#include "contextmenuactionprovider.h"
#include "debugbufferviewoverlay.h"
-#include "debuglogwidget.h"
+#include "debuglogdlg.h"
#include "debugmessagemodelfilter.h"
#include "flatproxymodel.h"
#include "icon.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
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(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId)));
- connect(Client::instance(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId)));
+ connect(GraphicalUi::contextMenuActionProvider(),
+ SIGNAL(showChannelList(NetworkId,QString,bool)),
+ SLOT(showChannelList(NetworkId,QString,bool)));
+ 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)));
#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 */
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
// restore locked state of docks
QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool());
- QTimer::singleShot(0, this, SLOT(doAutoConnect()));
-}
-
+ 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();
+ });
-MainWin::~MainWin()
-{
-}
-
-
-void MainWin::quit()
-{
- QtUiSettings s;
- saveStateToSettings(s);
- saveLayout();
- QApplication::quit();
+ QTimer::singleShot(0, this, SLOT(doAutoConnect()));
}
// 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", ":/pics/quassel-eye.png"), tr("&Disconnect from Core"), coll,
+ 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())));
//
// 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,
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();
}
}
+void MainWin::onExitRequested(const QString &reason)
+{
+ if (!reason.isEmpty()) {
+ 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();
+ }
+}
+
+
void MainWin::changeActiveBufferView(bool backwards)
{
if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) {
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();
}
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);
}
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;
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;
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));
box.exec();
role = box.buttonRole(box.clickedButton());
if (role == QMessageBox::HelpRole) {
- SslInfoDlg dlg(socket, this);
+ SslInfoDlg dlg(socket);
dlg.exec();
}
}
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();
void MainWin::showCoreConnectionDlg()
{
- CoreConnectDlg dlg(this);
+ CoreConnectDlg dlg;
if (dlg.exec() == QDialog::Accepted) {
AccountId accId = dlg.selectedAccount();
if (accId.isValid())
}
-void MainWin::showChannelList(NetworkId netId)
+void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bool listImmediately)
{
- ChannelListDlg *channelListDlg = new ChannelListDlg();
-
if (!netId.isValid()) {
QAction *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.
+ 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);
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<NetworksSettingsPage *>(dlg.currentPage())->bufferList_Open(netId);
dlg.exec();
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);
void MainWin::showCoreInfoDlg()
{
- CoreInfoDlg(this).exec();
+ CoreInfoDlg{}.exec();
}
void MainWin::showSettingsDlg()
{
- SettingsDlg *dlg = new SettingsDlg();
+ SettingsDlg *dlg = new SettingsDlg(this);
//Category: Interface
dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
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
}
else if(!_aboutToQuit) {
_aboutToQuit = true;
event->accept();
- quit();
+ Quassel::instance()->quit();
}
else {
event->ignore();
void MainWin::on_actionDebugLog_triggered()
{
- DebugLogWidget *logWidget = new DebugLogWidget(0);
- logWidget->show();
+ auto dlg = new DebugLogDlg(this);
+ dlg->show();
}