modernize: Migrate action-related things to PMF connects
[quassel.git] / src / qtui / qtuiapplication.cpp
index b59899e..2438d9c 100644 (file)
 #include <QFile>
 #include <QStringList>
 
-#ifdef HAVE_KDE4
-#  include <KStandardDirs>
-#endif
-
 #include "chatviewsettings.h"
-#include "client.h"
-#include "cliparser.h"
+#include "logmessage.h"
 #include "mainwin.h"
 #include "qtui.h"
 #include "qtuisettings.h"
 #include "types.h"
 
 QtUiApplication::QtUiApplication(int &argc, char **argv)
-#ifdef HAVE_KDE4
-    : KApplication()  // KApplication is deprecated in KF5
-#else
     : QApplication(argc, argv)
-#endif
 {
-#ifdef HAVE_KDE4
-    Q_UNUSED(argc); Q_UNUSED(argv);
-
-    // Setup KDE's data dirs
-    // Because we can't use KDE stuff in (the class) Quassel directly, we need to do this here...
-    QStringList dataDirs = KGlobal::dirs()->findDirs("data", "");
-
-    // Just in case, also check our install prefix
-    dataDirs << QCoreApplication::applicationDirPath() + "/../share/apps/";
-
-    // Normalize and append our application name
-    for (int i = 0; i < dataDirs.count(); i++)
-        dataDirs[i] = QDir::cleanPath(dataDirs.at(i)) + "/quassel/";
-
-    // Add resource path and just in case.
-    // Workdir should have precedence
-    dataDirs.prepend(QCoreApplication::applicationDirPath() + "/data/");
-    dataDirs.append(":/data/");
-
-    // Append trailing '/' and check for existence
-    auto iter = dataDirs.begin();
-    while (iter != dataDirs.end()) {
-        if (!iter->endsWith(QDir::separator()) && !iter->endsWith('/'))
-            iter->append(QDir::separator());
-        if (!QFile::exists(*iter))
-            iter = dataDirs.erase(iter);
-        else
-            ++iter;
-    }
-
-    dataDirs.removeDuplicates();
-    Quassel::setDataDirPaths(dataDirs);
-
-#else /* HAVE_KDE4 */
-
-    Quassel::setDataDirPaths(Quassel::findDataDirPaths());
-
-#endif /* HAVE_KDE4 */
-
-#if defined(HAVE_KDE4) || defined(Q_OS_MAC)
-    Quassel::disableCrashHandler();
-#endif /* HAVE_KDE4 || Q_OS_MAC */
-
-    Quassel::setRunMode(Quassel::ClientOnly);
-
-#if QT_VERSION >= 0x050000
-    connect(this, &QGuiApplication::commitDataRequest, this, &QtUiApplication::commitData, Qt::DirectConnection);
-    connect(this, &QGuiApplication::saveStateRequest, this, &QtUiApplication::saveState, Qt::DirectConnection);
-#endif
-
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
+#if QT_VERSION >= 0x050600
     QGuiApplication::setFallbackSessionManagementEnabled(false);
 #endif
 }
@@ -101,38 +42,35 @@ QtUiApplication::QtUiApplication(int &argc, char **argv)
 
 void QtUiApplication::init()
 {
-    if (!Quassel::init()) {
-        throw ExitException{EXIT_FAILURE, tr("Could not initialize Quassel!")};
-    }
-
     // Settings upgrade/downgrade handling
     if (!migrateSettings()) {
         throw ExitException{EXIT_FAILURE, tr("Could not load or upgrade client settings!")};
     }
 
-    Client::init(QtUi::instance());
+    _client = std::make_unique<Client>(std::make_unique<QtUi>());
 
     // Init UI only after the event loop has started
-    // TODO Qt5: Make this a lambda
-    QTimer::singleShot(0, this, SLOT(initUi()));
-
-    Quassel::registerQuitHandler([]() {
-        QtUi::mainWindow()->quit();
-    });
-}
+    QTimer::singleShot(0, this, [this]() {
+        QtUi::instance()->init();
+        connect(this, &QGuiApplication::commitDataRequest, this, &QtUiApplication::commitData, Qt::DirectConnection);
+        connect(this, &QGuiApplication::saveStateRequest, this, &QtUiApplication::saveState, Qt::DirectConnection);
 
+        // Needs to happen after UI init, so the MainWin quit handler is registered first
+        Quassel::registerQuitHandler(quitHandler());
 
-QtUiApplication::~QtUiApplication()
-{
-    Client::destroy();
-    Quassel::destroy();
+        resumeSessionIfPossible();
+    });
 }
 
 
-void QtUiApplication::initUi()
+Quassel::QuitHandler QtUiApplication::quitHandler()
 {
-    QtUi::instance()->init();
-    resumeSessionIfPossible();
+    // Wait until the Client instance is destroyed before quitting the event loop
+    return [this]() {
+        quInfo() << "Client shutting down...";
+        connect(_client.get(), &QObject::destroyed, QCoreApplication::instance(), &QCoreApplication::quit);
+        _client.release()->deleteLater();
+    };
 }