vnote/src/main.cpp
Le Tan 52702a32e9 hard days for VNoteX project
Never say "refactor" again!!!
2020-11-28 23:10:43 +08:00

180 lines
5.8 KiB
C++

#include <QApplication>
#include <QDebug>
#include <QTextCodec>
#include <QSslSocket>
#include <QLocale>
#include <QTranslator>
#include <QScopedPointer>
#include <QOpenGLContext>
#include <QDateTime>
#include <QSysInfo>
#include <core/configmgr.h>
#include <core/mainconfig.h>
#include <core/coreconfig.h>
#include <core/sessionconfig.h>
#include <core/singleinstanceguard.h>
#include <core/vnotex.h>
#include <core/logger.h>
#include <widgets/mainwindow.h>
#include <QWebEngineSettings>
#include <core/exception.h>
#include <widgets/messageboxhelper.h>
using namespace vnotex;
void loadTranslators(QApplication &p_app);
void initWebEngineSettings();
int main(int argc, char *argv[])
{
SingleInstanceGuard guard;
bool canRun = guard.tryRun();
if (!canRun) {
return 0;
}
QTextCodec *codec = QTextCodec::codecForName("UTF8");
if (codec) {
QTextCodec::setCodecForLocale(codec);
}
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
// This only takes effect on Win, X11 and Android.
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
// Set OpenGL option on Windows.
// Set environment QT_OPENGL to "angle/desktop/software".
#if defined(Q_OS_WIN)
{
auto option = SessionConfig::getOpenGLAtBootstrap();
qInfo() << "OpenGL option" << SessionConfig::openGLToString(option);
switch (option) {
case SessionConfig::OpenGL::Desktop:
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
break;
case SessionConfig::OpenGL::Angle:
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
break;
case SessionConfig::OpenGL::Software:
QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
break;
default:
break;
}
}
#endif
QApplication app(argc, argv);
initWebEngineSettings();
const QString iconPath = ":/vnotex/data/core/icons/vnote.ico";
// Make sense only on Windows.
app.setWindowIcon(QIcon(iconPath));
app.setApplicationName(ConfigMgr::c_appName);
app.setOrganizationName(ConfigMgr::c_orgName);
try {
app.setApplicationVersion(ConfigMgr::getInst().getConfig().getVersion());
} catch (Exception &e) {
MessageBoxHelper::notify(MessageBoxHelper::Critical,
QApplication::tr("%1 failed to start.").arg(ConfigMgr::c_appName),
QApplication::tr("Failed to initialize configuration manager. "
"Please check if all the files are intact or reinstall the application."),
e.what());
return -1;
}
// Init logger after app info is set.
Logger::init(false);
qInfo() << QString("%1 (v%2) started at %3 (%4)").arg(ConfigMgr::c_appName,
app.applicationVersion(),
QDateTime::currentDateTime().toString(),
QSysInfo::productType());
qInfo() << "OpenSSL build version:" << QSslSocket::sslLibraryBuildVersionString()
<< "link version:" << QSslSocket::sslLibraryVersionString();
if (QSslSocket::sslLibraryBuildVersionNumber() != QSslSocket::sslLibraryVersionNumber()) {
qWarning() << "versions of the built and linked OpenSSL mismatch, network may not work";
}
// TODO: parse command line options.
if (app.styleSheet().isEmpty()) {
auto style = VNoteX::getInst().getThemeMgr().fetchQtStyleSheet();
if (!style.isEmpty()) {
app.setStyleSheet(style);
}
}
loadTranslators(app);
MainWindow window;
window.show();
VNoteX::getInst().getThemeMgr().setBaseBackground(window.palette().color(QPalette::Base));
window.kickOffOnStart();
int ret = app.exec();
return ret;
}
void loadTranslators(QApplication &p_app)
{
auto localeName = ConfigMgr::getInst().getCoreConfig().getLocale();
if (!localeName.isEmpty()) {
QLocale::setDefault(QLocale(localeName));
}
QLocale locale;
qInfo() << "locale:" << locale.name();
const QString resourceTranslationFolder(QStringLiteral(":/translations"));
const QString envTranslationFolder(QStringLiteral("translations"));
// Load missing translation for Qt (QTextEdit/QPlainTextEdit/QTextBrowser).
QScopedPointer<QTranslator> widgetsTranslator(new QTranslator(&p_app));
if (widgetsTranslator->load(locale, "widgets", "_", resourceTranslationFolder)) {
p_app.installTranslator(widgetsTranslator.take());
}
QScopedPointer<QTranslator> dialogButtonBoxTranslator(new QTranslator(&p_app));
if (dialogButtonBoxTranslator->load(locale, "qdialogbuttonbox", "_", resourceTranslationFolder)) {
p_app.installTranslator(dialogButtonBoxTranslator.take());
}
QScopedPointer<QTranslator> webengineTranslator(new QTranslator(&p_app));
if (webengineTranslator->load(locale, "qwebengine", "_", resourceTranslationFolder)) {
p_app.installTranslator(webengineTranslator.take());
}
// Load translation for Qt from resource.
QScopedPointer<QTranslator> qtTranslator(new QTranslator(&p_app));
if (qtTranslator->load(locale, "qt", "_", resourceTranslationFolder)) {
p_app.installTranslator(qtTranslator.take());
}
// Load translation for Qt from env.
QScopedPointer<QTranslator> qtEnvTranslator(new QTranslator(&p_app));
if (qtEnvTranslator->load(locale, "qt", "_", envTranslationFolder)) {
p_app.installTranslator(qtEnvTranslator.take());
}
}
void initWebEngineSettings()
{
auto settings = QWebEngineSettings::defaultSettings();
settings->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true);
}