1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-09-15 06:52:34 +02:00

Move more code from main to app class to have easier unit tests later.

Fix activeProfilesTmp not reporing "We currently only support one profile!" when there is none.
Move setupLanguage into separate function to have a slimmer constructor.
Fix writing config:

 newConfiginsert(name, value.toJsonValue());
 newConfig.insert(name, value.toString());

where toJsonValue would write an nested wrong QJsonValues  and so aborting the insert method.

Fix checking steam path.
Move util before every other class to get info logs during the other class constructors.
This commit is contained in:
Elias Steurer 2019-10-28 18:28:53 +01:00
parent 0a9452c717
commit 187d7ed64a
6 changed files with 124 additions and 133 deletions

View File

@ -4,12 +4,20 @@ App::App()
: QObject(nullptr)
{
QGuiApplication::setWindowIcon(QIcon(":/assets/icons/favicon.ico"));
QGuiApplication::setOrganizationName("ScreenPlay");
QGuiApplication::setOrganizationDomain("screen-play.app");
QGuiApplication::setApplicationName("ScreenPlay");
QGuiApplication::setApplicationVersion("0.5.0");
QGuiApplication::setQuitOnLastWindowClosed(false);
QFontDatabase::addApplicationFont(":/assets/fonts/LibreBaskerville-Italic.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Light.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Regular.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Thin.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/RobotoMono-Light.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/RobotoMono-Thin.ttf");
QQuickWindow::setTextRenderType(QQuickWindow::TextRenderType::NativeTextRendering);
// Qt < 6.0 needs this init QtWebEngine
@ -27,6 +35,8 @@ App::App()
qRegisterMetaType<MonitorListModel*>();
qRegisterMetaType<ProfileListModel*>();
// Util should be created as first so we redirect qDebugs etc. into the log
m_util = make_unique<Util>(new QNetworkAccessManager(this));
m_globalVariables = make_shared<GlobalVariables>();
m_installedListModel = make_shared<InstalledListModel>(m_globalVariables);
m_installedListFilter = make_shared<InstalledListFilter>(m_installedListModel);
@ -36,14 +46,26 @@ App::App()
m_settings = make_shared<Settings>(m_globalVariables);
m_create = make_unique<Create>(m_globalVariables);
m_util = make_unique<Util>(new QNetworkAccessManager(this));
m_screenPlayManager = make_unique<ScreenPlayManager>(m_globalVariables, m_monitorListModel, m_sdkConnector);
// When the installed storage path changed
QObject::connect(m_settings.get(), &Settings::resetInstalledListmodel, m_installedListModel.get(), &InstalledListModel::reset);
QObject::connect(m_globalVariables.get(), &GlobalVariables::localStoragePathChanged, m_settings.get(), &Settings::resetInstalledListmodel);
QObject::connect(m_globalVariables.get(), &GlobalVariables::localStoragePathChanged, this, [this](QUrl localStoragePath) {
m_settings->resetInstalledListmodel();
m_settings->writeSingleSettingConfig("absoluteStoragePath", localStoragePath.toString());
});
QObject::connect(m_monitorListModel.get(), &MonitorListModel::monitorConfigurationChanged, m_sdkConnector.get(), &SDKConnector::closeAllWallpapers);
// Init after we have the paths from settings
m_installedListModel->init();
// Set visible if the -silent parameter was not set
if (!QGuiApplication::instance()->arguments().contains("-silent")) {
settings()->setSilentStart(true);
}
qmlRegisterSingletonInstance("ScreenPlay", 1, 0, "ScreenPlay", this);
m_mainWindowEngine = make_unique<QQmlApplicationEngine>();
m_mainWindowEngine->load(QUrl(QStringLiteral("qrc:/main.qml")));
}

View File

@ -1,14 +1,17 @@
#pragma once
#include <QDir>
#include <QGuiApplication>
#include <QIcon>
#include <QObject>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QQmlEngine>
#include <QQuickWindow>
#include <QStringList>
#include <QUrl>
#include <qqml.h>
#include <QtWebEngine>
#include <memory>
@ -56,12 +59,6 @@ class App : public QObject {
public:
explicit App();
static App* instance()
{
static App app;
return &app;
}
GlobalVariables* globalVariables() const
{
return m_globalVariables.get();
@ -214,6 +211,8 @@ public slots:
}
private:
unique_ptr<QQmlApplicationEngine> m_mainWindowEngine;
unique_ptr<Create> m_create;
unique_ptr<ScreenPlayManager> m_screenPlayManager;
unique_ptr<Util> m_util;

View File

@ -1,30 +1,13 @@
#include <QGuiApplication>
#include <QQuickWindow>
#include <qqml.h>
#include "app.h"
#include <QGuiApplication>
int main(int argc, char* argv[])
{
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QGuiApplication qtGuiApp(argc, argv);
QGuiApplication::setWindowIcon(QIcon(":/assets/icons/favicon.ico"));
qmlRegisterSingletonType<App>("ScreenPlay", 1, 0, "ScreenPlay", [](QQmlEngine* engine, QJSEngine*) -> QObject* {
engine->setObjectOwnership(App::instance(), QQmlEngine::ObjectOwnership::CppOwnership);
return App::instance();
});
QQmlApplicationEngine m_mainWindowEngine;
m_mainWindowEngine.load(QUrl(QStringLiteral("qrc:/main.qml")));
// Set visible if the -silent parameter was not set
if (!QGuiApplication::instance()->arguments().contains("-silent")) {
App::instance()->settings()->setMainWindowVisible(true);
}
App app;
return qtGuiApp.exec();
}

View File

@ -256,7 +256,7 @@ void ScreenPlayManager::loadWallpaperProfiles()
QJsonArray activeProfilesTmp = configObj.value().value("profiles").toArray();
if (activeProfilesTmp.size() != 1) {
if (activeProfilesTmp.size() >= 1) {
qWarning() << "We currently only support one profile!";
return;
}

View File

@ -18,7 +18,6 @@ Settings::Settings(const shared_ptr<GlobalVariables>& globalVariables,
, m_version { QVersionNumber(1, 0, 0) }
, m_globalVariables { globalVariables }
{
auto* app = static_cast<QGuiApplication*>(QGuiApplication::instance());
setGitBuildHash(GIT_VERSION);
@ -26,33 +25,7 @@ Settings::Settings(const shared_ptr<GlobalVariables>& globalVariables,
qInfo() << "ScreenPlay git hash: " << gitBuildHash();
#endif
QFontDatabase::addApplicationFont(":/assets/fonts/LibreBaskerville-Italic.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Light.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Regular.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/Roboto-Thin.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/RobotoMono-Light.ttf");
QFontDatabase::addApplicationFont(":/assets/fonts/RobotoMono-Thin.ttf");
if (m_qSettings.value("language").isNull()) {
auto locale = QLocale::system().uiLanguages();
auto localeSplits = locale.at(0).split("-");
// Only install a translator if one exsists
QFile tsFile;
qDebug() << ":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm";
if (tsFile.exists(":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm")) {
m_translator.load(":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm");
m_qSettings.setValue("language", QVariant(localeSplits.at(0)));
m_qSettings.sync();
app->installTranslator(&m_translator);
}
} else {
QFile tsFile;
if (tsFile.exists(":/translations/ScreenPlay_" + m_qSettings.value("language").toString() + ".qm")) {
m_translator.load(":/translations/ScreenPlay_" + m_qSettings.value("language").toString() + ".qm");
app->installTranslator(&m_translator);
}
}
setupLanguage();
if (m_qSettings.value("ScreenPlayExecutable").isNull()) {
m_qSettings.setValue("ScreenPlayExecutable", QDir::toNativeSeparators(QCoreApplication::applicationFilePath()));
@ -70,37 +43,21 @@ Settings::Settings(const shared_ptr<GlobalVariables>& globalVariables,
}
// App settings
QFile settingsFile;
settingsFile.setFileName(appConfigLocation + "/settings.json");
QFile settingsFile(appConfigLocation + "/settings.json");
if (!settingsFile.exists()) {
qWarning("No Settings found, creating default settings");
createDefaultConfig();
qInfo("No Settings found, creating default settings");
writeJsonFileFromResource("settings");
}
// Wallpaper and Widgets config
QFile profilesFile;
profilesFile.setFileName(appConfigLocation + "/profiles.json");
QFile profilesFile(appConfigLocation + "/profiles.json");
if (!profilesFile.exists()) {
qWarning("No profiles.json found, creating default settings");
createDefaultProfiles();
qInfo("No profiles.json found, creating default settings");
writeJsonFileFromResource("profiles");
}
QJsonDocument configJsonDocument;
QJsonParseError parseError {};
QJsonObject configObj;
settingsFile.open(QIODevice::ReadOnly | QIODevice::Text);
QString config = settingsFile.readAll();
configJsonDocument = QJsonDocument::fromJson(config.toUtf8(), &parseError);
if (!(parseError.error == QJsonParseError::NoError)) {
qWarning("Settings Json Parse Error ");
return;
}
configObj = configJsonDocument.object();
std::optional<QVersionNumber> version = Util::getVersionNumberFromString(configObj.value("version").toString());
std::optional<QJsonObject> configObj = Util::openJsonFileToObject(appConfigLocation + "/settings.json");
std::optional<QVersionNumber> version = Util::getVersionNumberFromString(configObj.value().value("version").toString());
//Checks if the settings file has the same version as ScreenPlay
if (version.has_value() && version.value() != m_version) {
@ -110,76 +67,61 @@ Settings::Settings(const shared_ptr<GlobalVariables>& globalVariables,
}
//If empty use steam workshop location
if (QString(configObj.value("absoluteStoragePath").toString()).isEmpty()) {
QDir steamTmpUrl = QDir::toNativeSeparators(QCoreApplication::applicationFilePath());
steamTmpUrl.cdUp();
steamTmpUrl.cdUp();
steamTmpUrl.cdUp();
steamTmpUrl.cd("workshop");
steamTmpUrl.cd("content");
steamTmpUrl.cd("672870");
if (QString(configObj.value().value("absoluteStoragePath").toString()).isEmpty()) {
qDebug() << QCoreApplication::applicationDirPath();
QDir steamWorkshopContentPath(QCoreApplication::applicationDirPath());
steamWorkshopContentPath.cdUp();
steamWorkshopContentPath.cdUp();
if (!steamWorkshopContentPath.cd("workshop")) {
qWarning() << "Steam workshop folder not found!";
} else {
steamWorkshopContentPath.cd("content");
steamWorkshopContentPath.cd("672870");
m_globalVariables->setLocalStoragePath("file:///" + steamWorkshopContentPath.absolutePath());
if(!writeSingleSettingConfig("absoluteStoragePath", m_globalVariables->localStoragePath())){
qWarning() << "Could not write settings file. Setup steam workshop folder at: " << m_globalVariables->localStoragePath();
}
}
m_globalVariables->setLocalStoragePath("file:///" + steamTmpUrl.path());
} else {
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(configObj.value("absoluteStoragePath").toString()));
qInfo() << "setLocalStoragePath" << m_globalVariables->localStoragePath();
m_globalVariables->setLocalStoragePath(QUrl::fromUserInput(configObj.value().value("absoluteStoragePath").toString()));
}
if (m_qSettings.value("ScreenPlayContentPath").toUrl() != m_globalVariables->localStoragePath()) {
if (m_qSettings.value("ScreenPlayContentPath").toUrl() != QUrl::fromLocalFile(m_globalVariables->localStoragePath().toString())) {
m_qSettings.setValue("ScreenPlayContentPath", QDir::toNativeSeparators(m_globalVariables->localStoragePath().toString().remove("file:///")));
m_qSettings.sync();
}
m_autostart = configObj.value("autostart").toBool();
m_highPriorityStart = configObj.value("highPriorityStart").toBool();
m_sendStatistics = configObj.value("sendStatistics").toBool();
m_autostart = configObj.value().value("autostart").toBool();
m_highPriorityStart = configObj.value().value("highPriorityStart").toBool();
m_sendStatistics = configObj.value().value("sendStatistics").toBool();
setupWidgetAndWindowPaths();
}
void Settings::writeSingleSettingConfig(QString name, QVariant value)
bool Settings::writeSingleSettingConfig(QString name, QVariant value)
{
QString filename = m_globalVariables->localSettingsPath().toLocalFile() + "/settings.json";
auto obj = Util::openJsonFileToObject(filename);
if (!obj.has_value()) {
qWarning("Settings Json Parse Error ");
return;
return false;
}
obj.value().insert(name, value.toJsonValue());
QJsonObject newConfig = obj.value();
newConfig.insert(name, value.toString());
Util::writeJsonObjectToFile(filename, obj.value());
return Util::writeJsonObjectToFile(filename, newConfig);
}
void Settings::setqSetting(const QString& key, const QString& value)
void Settings::writeJsonFileFromResource(const QString& filename)
{
m_qSettings.setValue(key, value);
m_qSettings.sync();
}
void Settings::createDefaultConfig()
{
QFile file(m_globalVariables->localSettingsPath().toLocalFile() + "/settings.json");
QFile defaultSettings(":/settings.json");
file.open(QIODevice::WriteOnly | QIODevice::Text);
defaultSettings.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream out(&file);
QTextStream defaultOut(&defaultSettings);
out << defaultOut.readAll();
file.close();
defaultSettings.close();
}
void Settings::createDefaultProfiles()
{
QFile file(m_globalVariables->localSettingsPath().toLocalFile() + "/profiles.json");
QFile defaultSettings(":/profiles.json");
QFile file(m_globalVariables->localSettingsPath().toLocalFile() + "/" + filename + ".json");
QFile defaultSettings(":/" + filename + ".json");
file.open(QIODevice::WriteOnly | QIODevice::Text);
defaultSettings.open(QIODevice::ReadOnly | QIODevice::Text);
@ -246,4 +188,29 @@ void Settings::setupWidgetAndWindowPaths()
#endif
}
void Settings::setupLanguage()
{
auto* app = static_cast<QGuiApplication*>(QGuiApplication::instance());
if (m_qSettings.value("language").isNull()) {
auto locale = QLocale::system().uiLanguages();
auto localeSplits = locale.at(0).split("-");
// Only install a translator if one exsists
QFile tsFile;
qDebug() << ":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm";
if (tsFile.exists(":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm")) {
m_translator.load(":/translations/ScreenPlay_" + localeSplits.at(0) + ".qm");
m_qSettings.setValue("language", QVariant(localeSplits.at(0)));
m_qSettings.sync();
app->installTranslator(&m_translator);
}
} else {
QFile tsFile;
if (tsFile.exists(":/translations/ScreenPlay_" + m_qSettings.value("language").toString() + ".qm")) {
m_translator.load(":/translations/ScreenPlay_" + m_qSettings.value("language").toString() + ".qm");
app->installTranslator(&m_translator);
}
}
}
}

View File

@ -45,6 +45,7 @@ class Settings : public QObject {
Q_OBJECT
Q_PROPERTY(QVersionNumber version READ version)
Q_PROPERTY(bool silentStart READ silentStart WRITE setSilentStart NOTIFY silentStartChanged)
Q_PROPERTY(bool autostart READ autostart WRITE setAutostart NOTIFY autostartChanged)
Q_PROPERTY(bool highPriorityStart READ highPriorityStart WRITE setHighPriorityStart NOTIFY highPriorityStartChanged)
Q_PROPERTY(bool sendStatistics READ sendStatistics WRITE setSendStatistics NOTIFY sendStatisticsChanged)
@ -57,7 +58,6 @@ public:
explicit Settings(
const shared_ptr<GlobalVariables>& globalVariables,
QObject* parent = nullptr);
~Settings() {}
QVersionNumber version() const
{
@ -104,6 +104,11 @@ public:
return m_gitBuildHash;
}
bool silentStart() const
{
return m_silentStart;
}
signals:
void autostartChanged(bool autostart);
void highPriorityStartChanged(bool highPriorityStart);
@ -115,10 +120,15 @@ signals:
void offlineModeChanged(bool offlineMode);
void gitBuildHashChanged(QString gitBuildHash);
void resetInstalledListmodel();
void silentStartChanged(bool silentStart);
public slots:
void writeSingleSettingConfig(QString name, QVariant value);
void setqSetting(const QString& key, const QString& value);
bool writeSingleSettingConfig(QString name, QVariant value);
void setqSetting(const QString& key, const QString& value)
{
m_qSettings.setValue(key, value);
m_qSettings.sync();
}
void setAutostart(bool autostart)
{
@ -214,10 +224,19 @@ public slots:
emit gitBuildHashChanged(m_gitBuildHash);
}
void setSilentStart(bool silentStart)
{
if (m_silentStart == silentStart)
return;
m_silentStart = silentStart;
emit silentStartChanged(m_silentStart);
}
private:
void createDefaultConfig();
void writeJsonFileFromResource(const QString& filename);
void setupWidgetAndWindowPaths();
void createDefaultProfiles();
void setupLanguage();
private:
QVersionNumber m_version;
@ -234,5 +253,6 @@ private:
QString m_decoder { "" };
QString m_gitBuildHash;
bool m_silentStart { false };
};
}