// Object Viewer Qt - MMORPG Framework // Copyright (C) 2010 Dzmitry KAMIAHIN (dnk-88) // // This source file has been modified by the following contributors: // Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2014-2015 Jan BOON (Kaetemi) // Copyright (C) 2014-2015 Laszlo KIS-ADAM (dfighter) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // Project includes #include "extension_system/iplugin_spec.h" #include "extension_system/plugin_manager.h" // NeL includes #include #include #include #include #include #include #include #include // Qt includes #include #include #include #include #include #include #include //#include #include #include #include "startup_settings_dlg.h" #include "splash_screen.h" #include "pm_watcher.h" #ifdef HAVE_OVQT_CONFIG_H #include "ovqt_config.h" #endif static const char *appNameC = "RyzomCoreStudio"; // nel_qt log file name #define NLQT_LOG_FILE "nel_qt.log" // clear nel_qt log before use #define NLQT_ERASE_LOG true #if !defined (NLQT_USE_LOG_LOG) # define NLQT_USE_LOG_LOG true #endif #if !defined (NLQT_USE_LOG) # define NLQT_USE_LOG 1 #endif namespace NLQT { namespace { NLMISC::CFileDisplayer *s_FileDisplayer = NULL; } /* anonymous namespace */ } /* namespace NLQT */ #ifndef DATA_DIR # define DATA_DIR "." #endif #ifdef NL_OS_WINDOWS # ifdef _UNICODE # define tstring wstring # else # define tstring string # endif #endif #ifdef Q_OS_WIN static void displayError(const QString &t) // No console on Windows. { QMessageBox::critical(0, QLatin1String(appNameC), t); } #else static void displayError(const QString &t) { qCritical("%s", qPrintable(t)); } #endif static inline QString msgCoreLoadFailure(const QString &why) { return QCoreApplication::translate("Application", "Failed to load Core plugin: %1").arg(why); } #ifdef NL_OS_WINDOWS int __stdcall WinMain(void *hInstance, void *hPrevInstance, void *lpCmdLine, int nShowCmd) #else // NL_OS_WINDOWS int main(int argc, char **argv) #endif // NL_OS_WINDOWS { // go nel! new NLMISC::CApplicationContext; { // use log.log if NEL_LOG_IN_FILE and NLQT_USE_LOG_LOG defined as 1 NLMISC::createDebug(NULL, NLQT_USE_LOG_LOG, false); NLMISC::INelContext::getInstance().setWindowedApplication(true); #if NLQT_USE_LOG // create NLQT_LOG_FILE // filedisplayer only deletes the 001 etc if (NLQT_ERASE_LOG && NLMISC::CFile::isExists(NLQT_LOG_FILE)) NLMISC::CFile::deleteFile(NLQT_LOG_FILE); // initialize the log file NLQT::s_FileDisplayer = new NLMISC::CFileDisplayer(); NLQT::s_FileDisplayer->setParam(NLQT_LOG_FILE, NLQT_ERASE_LOG); NLMISC::DebugLog->addDisplayer(NLQT::s_FileDisplayer); NLMISC::InfoLog->addDisplayer(NLQT::s_FileDisplayer); NLMISC::WarningLog->addDisplayer(NLQT::s_FileDisplayer); NLMISC::AssertLog->addDisplayer(NLQT::s_FileDisplayer); NLMISC::ErrorLog->addDisplayer(NLQT::s_FileDisplayer); #endif nlinfo("Welcome to NeL Object Viewer Qt!"); } QApplication::setGraphicsSystem("raster"); #ifdef NL_OS_WINDOWS QApplication app(__argc, __argv); #else // NL_OS_WINDOWS QApplication app(argc, argv); #endif // NL_OS_WINDOWS SplashScreen *splash = new SplashScreen(); splash->setPixmap(QPixmap(":/images/studio_splash.png")); splash->setProgressBarEnabled( true ); splash->setText( "Starting up..." ); splash->setProgress( 0 ); splash->show(); QSettings::setDefaultFormat(QSettings::IniFormat); QSettings *settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, QLatin1String("RyzomCore"), QLatin1String(appNameC)); bool firstRun = settings->value( "FirstRun", true ).toBool(); if( firstRun ) { settings->setValue( "FirstRun", false ); StartupSettingsDlg sd; sd.setSettings( settings ); sd.load(); sd.exec(); } QTranslator translator; QTranslator qtTranslator; QString locale = settings->value("Language", QLocale::system().name()).toString(); QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); // translator.load("object_viewer_qt_" + locale, ":/"); qtTranslator.load("qt_" + locale, qtTrPath); app.installTranslator(&translator); app.installTranslator(&qtTranslator); splash->setText( "Loading plugins..." ); splash->setProgress( 20 ); #if defined(NL_OS_MAC) QDir::setCurrent(qApp->applicationDirPath() + QString("/../Resources")); NLMISC::CLibrary::addLibPath((qApp->applicationDirPath() + QString("/../PlugIns/nel")).toUtf8().constData()); #endif ExtensionSystem::PluginManager pluginManager; pluginManager.setSettings(settings); QStringList pluginPaths; #if defined(NL_OS_MAC) pluginPaths << settings->value("PluginPath", qApp->applicationDirPath() + QString("/../PlugIns/studio")).toString(); #else pluginPaths << settings->value("PluginPath", QString("%1/plugins").arg(DATA_DIR)).toString(); #endif pluginManager.setPluginPaths(pluginPaths); PluginManagerWatcher watcher; watcher.setPluginManager( &pluginManager ); watcher.setSplashScreen( splash ); watcher.connect(); pluginManager.loadPlugins(); watcher.disconnect(); splash->hide(); ExtensionSystem::IPluginSpec *corePlugin = pluginManager.pluginByName("Core"); if (!corePlugin) { QDir absolutePluginPaths(pluginPaths.join(QLatin1String(","))); QString absolutePaths = absolutePluginPaths.absolutePath(); const QString reason = QCoreApplication::translate("Application", "Could not find studio_plugin_core in %1").arg(absolutePaths); displayError(msgCoreLoadFailure(reason)); QString newPath = QFileDialog::getExistingDirectory(0, QCoreApplication::translate("Application", "Change the plugins path"), QDir::homePath()); bool ok; QString text = QInputDialog::getText(0, QCoreApplication::translate("Application", "Enter the plugins path"), QCoreApplication::translate("Application", "Plugin path:"), QLineEdit::Normal, newPath, &ok); if (ok && !text.isEmpty()) settings->setValue("PluginPath", text); settings->sync(); return 1; } if (corePlugin->hasError()) { displayError(msgCoreLoadFailure(corePlugin->errorString())); return 1; } QStringList errors; Q_FOREACH (ExtensionSystem::IPluginSpec *spec, pluginManager.plugins()) if (spec->hasError()) errors.append(spec->fileName() + " : " + spec->errorString()); if (!errors.isEmpty()) QMessageBox::warning(0, QCoreApplication::translate("Application", "Studio - Plugin loader messages"), errors.join(QString::fromLatin1("\n\n"))); int result = app.exec(); return result; }