int main(int argc, char *argv[]) { QApplication a(argc, argv); QSplashScreen *splash = new QSplashScreen; splash->setPixmap(QPixmap(":/images/splash.jpg")); splash->show(); splash->showMessage(QApplication::tr("Setting up the main window..."), Qt::AlignRight | Qt::AlignTop); MainWindow w; w.show(); splash->finish(&w); splash->close(); delete splash; return a.exec(); }
int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator t; QDate today = QDate::currentDate(); if ( today.month() == 4 && today.day() == 1 ) { t.load(":/translations/koi7.qm"); } else { t.load(":/translations/ru.qm"); } QApplication::installTranslator(&t); Settings::instance(); Logger::logger(); QPixmap logo(":/resources/logo.png"); QSplashScreen *splash = new QSplashScreen(logo, Qt::FramelessWindowHint | Qt::SplashScreen); splash->setMask( logo.mask() ); splash->show(); Settings::instance()->updateLocalData(); splash->close(); delete splash; LauncherWindow w; w.show(); return a.exec(); }
int main(int argc, char **argv) { //See http://doc.qt.io/qt-5/qopenglwidget.html#opengl-function-calls-headers-and-qopenglfunctions /** Calling QSurfaceFormat::setDefaultFormat() before constructing the QApplication instance is mandatory on some platforms (for example, OS X) when an OpenGL core profile context is requested. This is to ensure that resource sharing between contexts stays functional as all internal contexts are created using the correct version and profile. **/ { QSurfaceFormat format = QSurfaceFormat::defaultFormat(); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); format.setOption(QSurfaceFormat::StereoBuffers, true); format.setStencilBufferSize(0); #ifdef CC_GL_WINDOW_USE_QWINDOW format.setStereo(true); #endif #ifdef Q_OS_MAC format.setStereo(false); format.setVersion( 2, 1 ); format.setProfile( QSurfaceFormat::CoreProfile ); #endif #ifdef QT_DEBUG format.setOption(QSurfaceFormat::DebugContext, true); #endif QSurfaceFormat::setDefaultFormat(format); } //The 'AA_ShareOpenGLContexts' attribute must be defined BEFORE the creation of the Q(Gui)Application //DGM: this is mandatory to enable exclusive full screen for ccGLWidget (at least on Windows) QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); //QT initialiation qccApplication app(argc, argv); //Locale management { //Force 'english' locale so as to get a consistent behavior everywhere QLocale locale = QLocale(QLocale::English); locale.setNumberOptions(QLocale::c().numberOptions()); QLocale::setDefault(locale); #ifdef Q_OS_UNIX //We reset the numeric locale for POSIX functions //See http://qt-project.org/doc/qt-5/qcoreapplication.html#locale-settings setlocale(LC_NUMERIC, "C"); #endif } #ifdef USE_VLD VLDEnable(); #endif #ifdef Q_OS_MAC // This makes sure that our "working directory" is not within the application bundle QDir appDir = QCoreApplication::applicationDirPath(); if ( appDir.dirName() == "MacOS" ) { appDir.cdUp(); appDir.cdUp(); appDir.cdUp(); QDir::setCurrent( appDir.absolutePath() ); } #endif //splash screen QSplashScreen* splash = 0; QTime splashStartTime; //restore some global parameters { QSettings settings; settings.beginGroup(ccPS::GlobalShift()); double maxAbsCoord = settings.value(ccPS::MaxAbsCoord(), ccGlobalShiftManager::MaxCoordinateAbsValue()).toDouble(); double maxAbsDiag = settings.value(ccPS::MaxAbsDiag(), ccGlobalShiftManager::MaxBoundgBoxDiagonal()).toDouble(); settings.endGroup(); ccLog::Print(QString("[Global Shift] Max abs. coord = %1 / max abs. diag = %2").arg(maxAbsCoord, 0, 'e', 0).arg(maxAbsDiag, 0, 'e', 0)); ccGlobalShiftManager::SetMaxCoordinateAbsValue(maxAbsCoord); ccGlobalShiftManager::SetMaxBoundgBoxDiagonal(maxAbsDiag); } //Command line mode? bool commandLine = (argc > 1 && argv[1][0] == '-'); //specific case: translation file selection int lastArgumentIndex = 1; QTranslator translator; if (commandLine && QString(argv[1]).toUpper() == "-LANG") { QString langFilename = QString(argv[2]); //Load translation file if (translator.load(langFilename, QCoreApplication::applicationDirPath())) { qApp->installTranslator(&translator); } else { QMessageBox::warning(0, QObject::tr("Translation"), QObject::tr("Failed to load language file '%1'").arg(langFilename)); } commandLine = false; lastArgumentIndex = 3; } //command line mode if (!commandLine) { if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_1) == 0) { QMessageBox::critical(0, "Error", "This application needs OpenGL 2.1 at least to run!"); return EXIT_FAILURE; } //splash screen splashStartTime.start(); QPixmap pixmap(QString::fromUtf8(":/CC/images/imLogoV2Qt.png")); splash = new QSplashScreen(pixmap, Qt::WindowStaysOnTopHint); splash->show(); QApplication::processEvents(); } //global structures initialization ccTimer::Init(); FileIOFilter::InitInternalFilters(); //load all known I/O filters (plugins will come later!) ccNormalVectors::GetUniqueInstance(); //force pre-computed normals array initialization ccColorScalesManager::GetUniqueInstance(); //force pre-computed color tables initialization int result = 0; if (commandLine) { //command line processing (no GUI) result = ccCommandLineParser::Parse(argc, argv); } else { //main window init. MainWindow* mainWindow = MainWindow::TheInstance(); if (!mainWindow) { QMessageBox::critical(0, "Error", "Failed to initialize the main application window?!"); return EXIT_FAILURE; } mainWindow->show(); QApplication::processEvents(); //show current Global Shift parameters in Console { ccLog::Print(QString("[Global Shift] Max abs. coord = %1 / max abs. diag = %2") .arg(ccGlobalShiftManager::MaxCoordinateAbsValue(), 0, 'e', 0) .arg(ccGlobalShiftManager::MaxBoundgBoxDiagonal(), 0, 'e', 0)); } if (argc > lastArgumentIndex) { if (splash) splash->close(); //any additional argument is assumed to be a filename --> we try to load it/them QStringList filenames; for (int i = lastArgumentIndex; i<argc; ++i) filenames << QString(argv[i]); mainWindow->addToDB(filenames); } if (splash) { //we want the splash screen to be visible a minimum amount of time (1000 ms.) while (splashStartTime.elapsed() < 1000) { splash->raise(); QApplication::processEvents(); //to let the system breath! } splash->close(); QApplication::processEvents(); delete splash; splash = 0; } //let's rock! try { result = app.exec(); } catch(...) { QMessageBox::warning(0, "CC crashed!","Hum, it seems that CC has crashed... Sorry about that :)"); } } //release global structures MainWindow::DestroyInstance(); FileIOFilter::UnregisterAll(); #ifdef CC_TRACK_ALIVE_SHARED_OBJECTS //for debug purposes unsigned alive = CCShareable::GetAliveCount(); if (alive > 1) { printf("Error: some shared objects (%u) have not been released on program end!",alive); system("PAUSE"); } #endif return result; }
int main(int argc, char *argv[]) { QtilitiesApplication a(argc, argv); QtilitiesApplication::setOrganizationName("Jaco Naude"); QtilitiesApplication::setOrganizationDomain("Qtilities"); QtilitiesApplication::setApplicationName("Main Window Example"); QtilitiesApplication::setApplicationVersion(QtilitiesApplication::qtilitiesVersionString()); // Create a QtilitiesMainWindow to show our different modes: QtilitiesMainWindow exampleMainWindow(QtilitiesMainWindow::ModesBottom); QtilitiesApplication::setMainWindow(&exampleMainWindow); // Create the configuration widget: ConfigurationWidget config_widget; config_widget.setCategorizedTabDisplay(true); QtilitiesApplication::setConfigWidget(&config_widget); // Initialize the logger: Log->setLoggerSessionConfigPath(QtilitiesApplication::applicationSessionPath()); LOG_INITIALIZE(); Log->setIsQtMessageHandler(false); // Add a formatting hint to the RichText formatting engine. AbstractFormattingEngine* rich_text_engine = Log->formattingEngineReference(qti_def_FORMATTING_ENGINE_RICH_TEXT); if (rich_text_engine) { QRegExp reg_exp_success_color = QRegExp(QObject::tr("Successfully") + "*",Qt::CaseInsensitive,QRegExp::Wildcard); CustomFormattingHint success_message_hint(reg_exp_success_color,"green",Logger::Info); rich_text_engine->addColorFormattingHint(success_message_hint); } // Speed up application launching a bit... ACTION_MANAGER->commandObserver()->startProcessingCycle(); ACTION_MANAGER->actionContainerObserver()->startProcessingCycle(); OBJECT_MANAGER->objectPool()->startProcessingCycle(); // We show a splash screen in this example: #ifdef QT_NO_DEBUG QPixmap pixmap(QTILITIES_LOGO_BT_300x300); QSplashScreen *splash = new QSplashScreen(pixmap); splash->setWindowFlags(Qt::SplashScreen | Qt::WindowStaysOnTopHint); splash->show(); QObject::connect(EXTENSION_SYSTEM,SIGNAL(newProgressMessage(QString)),splash,SLOT(showMessage(QString))); a.processEvents(); #endif // Initialize the clipboard manager: CLIPBOARD_MANAGER->initialize(); // Create menu related things. bool existed; ActionContainer* menu_bar = ACTION_MANAGER->createMenuBar(qti_action_MENUBAR_STANDARD,existed); exampleMainWindow.setMenuBar(menu_bar->menuBar()); ActionContainer* file_menu = ACTION_MANAGER->createMenu(qti_action_FILE,existed); ActionContainer* edit_menu = ACTION_MANAGER->createMenu(qti_action_EDIT,existed); ActionContainer* view_menu = ACTION_MANAGER->createMenu(qti_action_VIEW,existed); ActionContainer* about_menu = ACTION_MANAGER->createMenu(qti_action_ABOUT,existed); menu_bar->addMenu(file_menu); menu_bar->addMenu(edit_menu); menu_bar->addMenu(view_menu); menu_bar->addMenu(about_menu); // Get the standard context. QList<int> std_context; std_context.push_front(CONTEXT_MANAGER->contextID(qti_def_CONTEXT_STANDARD)); // Register action place holders for this application. This allows control of your menu structure. // File Menu Command* command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_FILE_SETTINGS,QObject::tr("Settings"),QKeySequence(),std_context); QObject::connect(command->action(),SIGNAL(triggered()),&config_widget,SLOT(show())); file_menu->addAction(command); // Edit Menu command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_UNDO,QObject::tr("Undo"),QKeySequence(QKeySequence::Undo)); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_REDO,QObject::tr("Redo"),QKeySequence(QKeySequence::Redo)); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); edit_menu->addSeperator(); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_COPY,QObject::tr("Copy"),QKeySequence(QKeySequence::Copy)); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_CUT,QObject::tr("Cut"),QKeySequence(QKeySequence::Cut)); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); command = ACTION_MANAGER->command(qti_action_EDIT_PASTE); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); edit_menu->addSeperator(); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_SELECT_ALL,QObject::tr("Select All"),QKeySequence(QKeySequence::SelectAll)); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_CLEAR,QObject::tr("Clear")); command->setCategory(QtilitiesCategory("Editing")); edit_menu->addAction(command); edit_menu->addSeperator(); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_EDIT_FIND,QObject::tr("Find"),QKeySequence(QKeySequence::Find)); edit_menu->addAction(command); // Add the code editor config widget: CodeEditorWidgetConfig code_editor_config; OBJECT_MANAGER->registerObject(&code_editor_config,QtilitiesCategory("GUI::Configuration Pages (IConfigPage)","::")); // Create the Example before plugin loading since it registers a project items: ExampleMode* example_mode = new ExampleMode; file_menu->addSeperator(); command = ACTION_MANAGER->registerActionPlaceHolder("File.ToggleModeIcon",QObject::tr("Toggle Mode Icon"),QKeySequence(),std_context); QObject::connect(command->action(),SIGNAL(triggered()),example_mode,SLOT(toggleModeIcon())); file_menu->addAction(command); OBJECT_MANAGER->registerObject(example_mode); file_menu->addSeperator(); command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_FILE_EXIT,QObject::tr("Exit"),QKeySequence(QKeySequence::Close),std_context); QObject::connect(command->action(),SIGNAL(triggered()),QCoreApplication::instance(),SLOT(quit())); file_menu->addAction(command); // About Menu command = ACTION_MANAGER->registerActionPlaceHolder(qti_action_ABOUT_QTILITIES,QObject::tr("About Qtilities"),QKeySequence(),std_context); QObject::connect(command->action(),SIGNAL(triggered()),QtilitiesApplication::instance(),SLOT(aboutQtilities())); about_menu->addAction(command); command = ACTION_MANAGER->registerActionPlaceHolder("General.AboutQt","About Qt",QKeySequence(),std_context); about_menu->addAction(command); QObject::connect(command->action(),SIGNAL(triggered()),QApplication::instance(),SLOT(aboutQt())); // Load plugins using the extension system: Log->toggleQtMsgEngine(true); EXTENSION_SYSTEM->enablePluginActivityControl(); EXTENSION_SYSTEM->addPluginPath("../../plugins/"); EXTENSION_SYSTEM->initialize(); Log->toggleQtMsgEngine(false); #ifdef QT_NO_DEBUG splash->clearMessage(); #endif // Create the example file system side widget and add it to the global object pool QList<int> modes; modes << MODE_EXAMPLE_ID; SideViewerWidgetFactory* file_system_side_widget_helper = new SideViewerWidgetFactory(&SideWidgetFileSystem::factory,"File System",modes,modes); OBJECT_MANAGER->registerObject(file_system_side_widget_helper,QtilitiesCategory("GUI::Side Viewer Widgets (ISideViewerWidget)","::")); QObject::connect(file_system_side_widget_helper,SIGNAL(newWidgetCreated(QWidget*,QString)),example_mode,SLOT(handleNewFileSystemWidget(QWidget*))); SideViewerWidgetFactory* object_scope_side_widget_helper = new SideViewerWidgetFactory(&ObjectScopeWidget::factory,"Object Scope",modes,modes); OBJECT_MANAGER->registerObject(object_scope_side_widget_helper,QtilitiesCategory("GUI::Side Viewer Widgets (ISideViewerWidget)","::")); #ifdef QTILITIES_PROPERTY_BROWSER SideViewerWidgetFactory* property_editor_side_widget_helper = new SideViewerWidgetFactory(&ObjectPropertyBrowser::factory,"Property Browser",modes,modes); OBJECT_MANAGER->registerObject(property_editor_side_widget_helper,QtilitiesCategory("GUI::Side Viewer Widgets (ISideViewerWidget)","::")); #endif exampleMainWindow.modeManager()->initialize(); // Register command editor config page. OBJECT_MANAGER->registerObject(ACTION_MANAGER->commandEditor(),QtilitiesCategory("GUI::Configuration Pages (IConfigPage)","::")); // Register extension system config page. OBJECT_MANAGER->registerObject(EXTENSION_SYSTEM->configWidget(),QtilitiesCategory("GUI::Configuration Pages (IConfigPage)","::")); // Report on the number of config pages found. QList<QObject*> registered_config_pages = OBJECT_MANAGER->registeredInterfaces("IConfigPage"); LOG_INFO(QString("%1 configuration page(s) found in set of loaded plugins.").arg(registered_config_pages.count())); config_widget.initialize(registered_config_pages); // Report on the number of side widgets found. QList<QObject*> registered_side_widgets = OBJECT_MANAGER->registeredInterfaces("ISideViewerWidget"); LOG_INFO(QString("%1 side viewer widget(s) found in set of loaded plugins.").arg(registered_side_widgets.count())); // Load the previous session's keyboard mapping file. QString shortcut_mapping_file = QString("%1/%2").arg(QtilitiesApplication::applicationSessionPath()).arg(qti_def_PATH_SHORTCUTS_FILE); ACTION_MANAGER->loadShortcutMapping(shortcut_mapping_file); // Show the main window: exampleMainWindow.readSettings(); exampleMainWindow.show(); #ifdef QT_NO_DEBUG splash->close(); #endif LOG_INFO("< > < >"); // Initialize the project manager: // PROJECT_MANAGER->setAllowedProjectTypes(IExportable::XML); PROJECT_MANAGER_INITIALIZE(); ACTION_MANAGER->commandObserver()->endProcessingCycle(false); ACTION_MANAGER->actionContainerObserver()->endProcessingCycle(false); OBJECT_MANAGER->objectPool()->endProcessingCycle(false); #ifndef QTILITIES_NO_HELP HELP_MANAGER->initialize(); #endif int result = a.exec(); exampleMainWindow.writeSettings(); // Finalize the project manager: PROJECT_MANAGER_FINALIZE(); // Save the current keyboard mapping for the next session. ACTION_MANAGER->saveShortcutMapping(shortcut_mapping_file); LOG_FINALIZE(); return result; }
int runSingleSession(int argc, char *argv[]){ //QTime clock; //clock.start(); Backend::checkLocalDirs(); // Create and fill "/usr/local/share/PCDM" if needed Backend::openLogFile("/var/log/PCDM.log"); //qDebug() << "Backend Checks Finished:" << QString::number(clock.elapsed())+" ms"; //Check for the flag to try and auto-login bool ALtriggered = FALSE; if(QFile::exists(TMPAUTOLOGINFILE)){ ALtriggered=TRUE; QFile::remove(TMPAUTOLOGINFILE); } QString changeLang; // Load the configuration file QString confFile = "/usr/local/etc/pcdm.conf"; if(!QFile::exists(confFile)){ qDebug() << "PCDM: Configuration file missing:"<<confFile<<"\n - Using default configuration"; confFile = ":samples/pcdm.conf"; } Config::loadConfigFile(confFile); //qDebug() << "Config File Loaded:" << QString::number(clock.elapsed())+" ms"; // Startup the main application QApplication a(argc,argv); // Show our splash screen, so the user doesn't freak that that it takes a few seconds to show up QSplashScreen splash; if(!Config::splashscreen().isEmpty()){ splash.setPixmap( QPixmap(Config::splashscreen()) ); //load the splashscreen file } splash.show(); QCoreApplication::processEvents(); //Process the splash screen event immediately //qDebug() << "SplashScreen Started:" << QString::number(clock.elapsed())+" ms"; //Initialize the xprocess XProcess desktop; //*** STARTUP THE PROGRAM *** bool goodAL = FALSE; //Flag for whether the autologin was successful // Start the autologin procedure if applicable if( ALtriggered && Config::useAutoLogin() ){ //Setup the Auto Login QString user = Backend::getALUsername(); QString pwd = Backend::getALPassword(); QString dsk = Backend::getLastDE(user); if( user.isEmpty() || dsk.isEmpty() ){ goodAL=FALSE; }else{ desktop.loginToXSession(user,pwd, dsk); splash.close(); if(desktop.isRunning()){ goodAL=TRUE; //flag this as a good login to skip the GUI } } } //qDebug() << "AutoLogin Finished:" << QString::number(clock.elapsed())+" ms"; if(!goodAL){ // ------START THE PCDM GUI------- // Check what directory our app is in QString appDir = "/usr/local/share/PCDM"; // Load the translator QTranslator translator; QLocale mylocale; QString langCode = mylocale.name(); //Check for a language change detected if ( ! changeLang.isEmpty() ) langCode = changeLang; //Load the proper locale for the translator if ( QFile::exists(appDir + "/i18n/PCDM_" + langCode + ".qm" ) ) { translator.load( QString("PCDM_") + langCode, appDir + "/i18n/" ); a.installTranslator(&translator); Backend::log("Loaded Translation:" + appDir + "/i18n/PCDM_" + langCode + ".qm"); } else { Backend::log("Could not find: " + appDir + "/i18n/PCDM_" + langCode + ".qm"); langCode = ""; } //qDebug() << "Translation Finished:" << QString::number(clock.elapsed())+" ms"; Backend::log("Starting up PCDM interface"); PCDMgui w; //qDebug() << "Main GUI Created:" << QString::number(clock.elapsed())+" ms"; splash.finish(&w); //close the splash when the GUI starts up // Set full-screen dimensions QRect dimensions = QApplication::desktop()->screenGeometry(); int wid = dimensions.width(); // returns desktop width int hig = dimensions.height(); // returns desktop height w.setGeometry(0, 0, wid, hig); //Set the proper size on the Application w.setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnBottomHint); w.setWindowState(Qt::WindowMaximized); //Qt::WindowFullScreen); //Setup the signals/slots to startup the desktop session if(USECLIBS){ QObject::connect( &w,SIGNAL(xLoginAttempt(QString,QString,QString)), &desktop,SLOT(setupDesktop(QString,QString,QString))); } else{ QObject::connect( &w,SIGNAL(xLoginAttempt(QString,QString,QString)), &desktop,SLOT(loginToXSession(QString,QString,QString)) ); } //Setup the signals/slots for return information for the GUI QObject::connect( &desktop, SIGNAL(InvalidLogin()), &w, SLOT(slotLoginFailure()) ); QObject::connect( &desktop, SIGNAL(started()), &w, SLOT(slotLoginSuccess()) ); QObject::connect( &desktop, SIGNAL(ValidLogin()), &w, SLOT(slotLoginSuccess()) ); //qDebug() << "Showing GUI:" << QString::number(clock.elapsed())+" ms"; w.show(); a.exec(); } // end of PCDM GUI running int retcode = 0; //Wait for the desktop session to finish before exiting if(USECLIBS){ desktop.startDesktop(); } else{ desktop.waitForSessionClosed(); } splash.show(); //show the splash screen again splash.showMessage(QObject::tr("System Shutting Down"), Qt::AlignHCenter | Qt::AlignBottom, Qt::white); //check for shutdown process if(QFile::exists("/var/run/nologin")){ //Pause for a few seconds to prevent starting a new session during a shutdown QTime wTime = QTime::currentTime().addSecs(30); while( QTime::currentTime() < wTime ){ //Keep processing events during the wait (for splashscreen) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } //set the return code for a shutdown retcode = -1; //make sure it does not start a new session } //Clean up Code delete &desktop; delete &a; delete &splash; return retcode; }
int main(int argc, char **argv) { //QT initialiation qccApplication app(argc, argv); //Force 'english' local so as to get a consistent behavior everywhere QLocale::setDefault(QLocale::English); #ifdef Q_OS_LINUX // we reset the numeric locale. As suggested in documetation // see http://qt-project.org/doc/qt-5/qcoreapplication.html#locale-settings // Basically - from doc: - "On Unix/Linux Qt is configured to use the system locale settings by default. // This can cause a conflict when using POSIX functions, for instance, // when converting between data types such as floats and strings" setlocale(LC_NUMERIC,"C"); #endif #ifdef USE_VLD VLDEnable(); #endif //splash screen QSplashScreen* splash = 0; QTime splashStartTime; //Command line mode? bool commandLine = (argc > 1 && argv[1][0] == '-'); if (!commandLine) { //OpenGL? if (!QGLFormat::hasOpenGL()) { QMessageBox::critical(0, "Error", "This application needs OpenGL to run!"); return EXIT_FAILURE; } //splash screen splashStartTime.start(); QPixmap pixmap(QString::fromUtf8(":/CC/images/imLogoV2Qt.png")); splash = new QSplashScreen(pixmap,Qt::WindowStaysOnTopHint); splash->show(); QApplication::processEvents(); } //global structures initialization ccTimer::Init(); FileIOFilter::InitInternalFilters(); //load all known I/O filters (plugins will come later!) ccNormalVectors::GetUniqueInstance(); //force pre-computed normals array initialization ccColorScalesManager::GetUniqueInstance(); //force pre-computed color tables initialization int result = 0; if (commandLine) { //command line processing (no GUI) result = ccCommandLineParser::Parse(argc,argv); } else { //main window init. MainWindow* mainWindow = MainWindow::TheInstance(); if (!mainWindow) { QMessageBox::critical(0, "Error", "Failed to initialize the main application window?!"); return EXIT_FAILURE; } mainWindow->show(); QApplication::processEvents(); if (argc > 1) { if (splash) splash->close(); //any additional argument is assumed to be a filename --> we try to load it/them QStringList filenames; for (int i=1; i<argc; ++i) filenames << QString(argv[i]); mainWindow->addToDB(filenames); } if (splash) { //we want the splash screen to be visible a minimum amount of time (1000 ms.) while (splashStartTime.elapsed() < 1000) { splash->raise(); QApplication::processEvents(); //to let the system breath! } splash->close(); QApplication::processEvents(); delete splash; splash = 0; } //let's rock! try { result = app.exec(); } catch(...) { QMessageBox::warning(0, "CC crashed!","Hum, it seems that CC has crashed... Sorry about that :)"); } } //release global structures MainWindow::DestroyInstance(); FileIOFilter::UnregisterAll(); #ifdef CC_TRACK_ALIVE_SHARED_OBJECTS //for debug purposes unsigned alive = CCShareable::GetAliveCount(); if (alive > 1) { printf("Error: some shared objects (%u) have not been released on program end!",alive); system("PAUSE"); } #endif return result; }
int main(int argc, char **argv) { //See http://doc.qt.io/qt-5/qopenglwidget.html#opengl-function-calls-headers-and-qopenglfunctions /** Calling QSurfaceFormat::setDefaultFormat() before constructing the QApplication instance is mandatory on some platforms (for example, OS X) when an OpenGL core profile context is requested. This is to ensure that resource sharing between contexts stays functional as all internal contexts are created using the correct version and profile. **/ { QSurfaceFormat format = QSurfaceFormat::defaultFormat(); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); format.setOption(QSurfaceFormat::StereoBuffers, true); format.setStencilBufferSize(0); #ifdef CC_GL_WINDOW_USE_QWINDOW format.setStereo(true); #endif #ifdef Q_OS_MAC format.setStereo(false); format.setVersion( 2, 1 ); format.setProfile( QSurfaceFormat::CoreProfile ); #endif #ifdef QT_DEBUG format.setOption(QSurfaceFormat::DebugContext, true); #endif QSurfaceFormat::setDefaultFormat(format); } //The 'AA_ShareOpenGLContexts' attribute must be defined BEFORE the creation of the Q(Gui)Application //DGM: this is mandatory to enable exclusive full screen for ccGLWidget (at least on Windows) QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); //QT initialiation qccApplication app(argc, argv); //Locale management { //Force 'english' locale so as to get a consistent behavior everywhere QLocale locale = QLocale(QLocale::English); locale.setNumberOptions(QLocale::c().numberOptions()); QLocale::setDefault(locale); #ifdef Q_OS_UNIX //We reset the numeric locale for POSIX functions //See http://qt-project.org/doc/qt-5/qcoreapplication.html#locale-settings setlocale(LC_NUMERIC, "C"); #endif } #ifdef USE_VLD VLDEnable(); #endif #ifdef Q_OS_MAC // This makes sure that our "working directory" is not within the application bundle QDir appDir = QCoreApplication::applicationDirPath(); if ( appDir.dirName() == "MacOS" ) { appDir.cdUp(); appDir.cdUp(); appDir.cdUp(); QDir::setCurrent( appDir.absolutePath() ); } #endif //store the log message until a valid logging instance is registered ccLog::EnableMessageBackup(true); //restore some global parameters { QSettings settings; settings.beginGroup(ccPS::GlobalShift()); double maxAbsCoord = settings.value(ccPS::MaxAbsCoord(), ccGlobalShiftManager::MaxCoordinateAbsValue()).toDouble(); double maxAbsDiag = settings.value(ccPS::MaxAbsDiag(), ccGlobalShiftManager::MaxBoundgBoxDiagonal()).toDouble(); settings.endGroup(); ccLog::Print(QString("[Global Shift] Max abs. coord = %1 / max abs. diag = %2").arg(maxAbsCoord, 0, 'e', 0).arg(maxAbsDiag, 0, 'e', 0)); ccGlobalShiftManager::SetMaxCoordinateAbsValue(maxAbsCoord); ccGlobalShiftManager::SetMaxBoundgBoxDiagonal(maxAbsDiag); } //Command line mode? bool commandLine = (argc > 1 && argv[1][0] == '-'); //specific commands int lastArgumentIndex = 1; QTranslator translator; if (commandLine) { //translation file selection if (QString(argv[lastArgumentIndex]).toUpper() == "-LANG") { QString langFilename = QString(argv[2]); //Load translation file if (translator.load(langFilename, QCoreApplication::applicationDirPath())) { qApp->installTranslator(&translator); } else { QMessageBox::warning(0, QObject::tr("Translation"), QObject::tr("Failed to load language file '%1'").arg(langFilename)); } commandLine = false; lastArgumentIndex += 2; } } //splash screen QSplashScreen* splash = 0; QTime splashStartTime; //standard mode if (!commandLine) { if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_1) == 0) { QMessageBox::critical(0, "Error", "This application needs OpenGL 2.1 at least to run!"); return EXIT_FAILURE; } //splash screen splashStartTime.start(); QPixmap pixmap(QString::fromUtf8(":/CC/images/imLogoV2Qt.png")); splash = new QSplashScreen(pixmap, Qt::WindowStaysOnTopHint); splash->show(); QApplication::processEvents(); } //global structures initialization FileIOFilter::InitInternalFilters(); //load all known I/O filters (plugins will come later!) ccNormalVectors::GetUniqueInstance(); //force pre-computed normals array initialization ccColorScalesManager::GetUniqueInstance(); //force pre-computed color tables initialization //load the plugins tPluginInfoList plugins; QStringList dirFilters; QStringList pluginPaths; { QString appPath = QCoreApplication::applicationDirPath(); #if defined(Q_OS_MAC) dirFilters << "*.dylib"; // plugins are in the bundle appPath.remove("MacOS"); pluginPaths += (appPath + "Plugins/ccPlugins"); #if defined(CC_MAC_DEV_PATHS) // used for development only - this is the path where the plugins are built // this avoids having to install into the application bundle when developing pluginPaths += (appPath + "../../../ccPlugins"); #endif #elif defined(Q_OS_WIN) dirFilters << "*.dll"; //plugins are in bin/plugins pluginPaths << (appPath + "/plugins"); #elif defined(Q_OS_LINUX) dirFilters << "*.so"; // Plugins are relative to the bin directory where the executable is found QDir binDir(appPath); if (binDir.dirName() == "bin") { binDir.cdUp(); pluginPaths << (binDir.absolutePath() + "/lib/cloudcompare/plugins"); } else { // Choose a reasonable default to look in pluginPaths << "/usr/lib/cloudcompare/plugins"; } #else #warning Need to specify the plugin path for this OS. #endif #ifdef Q_OS_MAC // Add any app data paths // Plugins in these directories take precendence over the included ones QStringList appDataPaths = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); for (const QString &appDataPath : appDataPaths) { pluginPaths << (appDataPath + "/plugins"); } #endif } ccPlugins::LoadPlugins(plugins, pluginPaths, dirFilters); int result = 0; //command line mode if (commandLine) { //command line processing (no GUI) result = ccCommandLineParser::Parse(argc, argv); } else { //main window init. MainWindow* mainWindow = MainWindow::TheInstance(); if (!mainWindow) { QMessageBox::critical(0, "Error", "Failed to initialize the main application window?!"); return EXIT_FAILURE; } mainWindow->dispatchPlugins(plugins, pluginPaths); mainWindow->show(); QApplication::processEvents(); //show current Global Shift parameters in Console { ccLog::Print(QString("[Global Shift] Max abs. coord = %1 / max abs. diag = %2") .arg(ccGlobalShiftManager::MaxCoordinateAbsValue(), 0, 'e', 0) .arg(ccGlobalShiftManager::MaxBoundgBoxDiagonal(), 0, 'e', 0)); } if (argc > lastArgumentIndex) { if (splash) splash->close(); //any additional argument is assumed to be a filename --> we try to load it/them QStringList filenames; for (int i = lastArgumentIndex; i < argc; ++i) { QString arg(argv[i]); //special command: auto start a plugin if (arg.startsWith(":start-plugin:")) { QString pluginName = arg.mid(14); QString pluginNameUpper = pluginName.toUpper(); //look for this plugin bool found = false; for (const tPluginInfo &plugin : plugins) { if (plugin.object->getName().replace(' ', '_').toUpper() == pluginNameUpper) { found = true; bool success = plugin.object->start(); if (!success) { ccLog::Error(QString("Failed to start the plugin '%1'").arg(plugin.object->getName())); } break; } } if (!found) { ccLog::Error(QString("Couldn't find the plugin '%1'").arg(pluginName.replace('_', ' '))); } } else { filenames << arg; } } mainWindow->addToDB(filenames); } if (splash) { //we want the splash screen to be visible a minimum amount of time (1000 ms.) while (splashStartTime.elapsed() < 1000) { splash->raise(); QApplication::processEvents(); //to let the system breath! } splash->close(); QApplication::processEvents(); delete splash; splash = 0; } //let's rock! try { result = app.exec(); } catch (...) { QMessageBox::warning(0, "CC crashed!", "Hum, it seems that CC has crashed... Sorry about that :)"); } //release the plugins for (tPluginInfo &plugin : plugins) { plugin.object->stop(); //just in case if (!plugin.qObject->parent()) { delete plugin.object; plugin.object = 0; plugin.qObject = 0; } } } //release global structures MainWindow::DestroyInstance(); FileIOFilter::UnregisterAll(); #ifdef CC_TRACK_ALIVE_SHARED_OBJECTS //for debug purposes unsigned alive = CCShareable::GetAliveCount(); if (alive > 1) { printf("Error: some shared objects (%u) have not been released on program end!",alive); system("PAUSE"); } #endif return result; }
int run_wallet (QApplication & application, int argc, char * const * argv, boost::filesystem::path const & data_path) { rai_qt::eventloop_processor processor; boost::filesystem::create_directories (data_path); QPixmap pixmap (":/logo.png"); QSplashScreen * splash = new QSplashScreen (pixmap); splash->show (); application.processEvents (); splash->showMessage (QSplashScreen::tr ("Remember - Back Up Your Wallet Seed"), Qt::AlignBottom | Qt::AlignHCenter, Qt::darkGray); application.processEvents (); qt_wallet_config config (data_path); auto config_path ((data_path / "config.json")); int result (0); std::fstream config_file; auto error (rai::fetch_object (config, config_path, config_file)); config_file.close (); if (!error) { boost::asio::io_service service; config.node.logging.init (data_path); std::shared_ptr<rai::node> node; std::shared_ptr<rai_qt::wallet> gui; rai::set_application_icon (application); auto opencl (rai::opencl_work::create (config.opencl_enable, config.opencl, config.node.logging)); rai::work_pool work (config.node.work_threads, opencl ? [&opencl](rai::uint256_union const & root_a) { return opencl->generate_work (root_a); } : std::function<boost::optional<uint64_t> (rai::uint256_union const &)> (nullptr)); rai::alarm alarm (service); rai::node_init init; node = std::make_shared<rai::node> (init, service, data_path, alarm, config.node, work); if (!init.error ()) { auto wallet (node->wallets.open (config.wallet)); if (wallet == nullptr) { auto existing (node->wallets.items.begin ()); if (existing != node->wallets.items.end ()) { wallet = existing->second; config.wallet = existing->first; } else { wallet = node->wallets.create (config.wallet); } } if (config.account.is_zero () || !wallet->exists (config.account)) { rai::transaction transaction (wallet->store.environment, nullptr, true); auto existing (wallet->store.begin (transaction)); if (existing != wallet->store.end ()) { rai::uint256_union account (existing->first.uint256 ()); config.account = account; } else { config.account = wallet->deterministic_insert (transaction); } } assert (wallet->exists (config.account)); update_config (config, config_path, config_file); node->start (); std::unique_ptr<rai::rpc> rpc = get_rpc (service, *node, config.rpc); if (rpc && config.rpc_enable) { rpc->start (); } rai::thread_runner runner (service, node->config.io_threads); QObject::connect (&application, &QApplication::aboutToQuit, [&]() { rpc->stop (); node->stop (); }); application.postEvent (&processor, new rai_qt::eventloop_event ([&]() { gui = std::make_shared<rai_qt::wallet> (application, processor, *node, wallet, config.account); splash->close (); gui->start (); gui->client_window->show (); })); result = application.exec (); runner.join (); } else { show_error ("Error initializing node"); } update_config (config, config_path, config_file); } else { show_error ("Error deserializing config"); } return result; }
/* * @brief Constructor of the main class * The Constructor initializes all needed variables and one instance of every used dialog. */ CReaderTool::CReaderTool(QWidget *parent) : QMainWindow(parent) , QrfeTraceModule("Reader_Tool") { m_updateThread = NULL; int alignment = Qt::AlignHCenter | Qt::AlignBottom; //Mod by yingwei tseng for hiding AMS code, 2010/03/10 #if 0 QPixmap logo(":/ams logos/amsStartupLogo"); #endif QPixmap logo(":/ams logos/mtiRfidLogo"); //End by yingwei tseng for hiding AMS code, 2010/03/10 //clark 2011.12.15 //logo.setMask(logo.createHeuristicMask()); QSplashScreen *splash = new QSplashScreen(logo); splash->setMask(logo.mask()); splash->setWindowOpacity(0); splash->show(); for(double i = 0; i < 1; i += 0.05) { splash->setWindowOpacity(i); Sleep(50); } /* Init variables */ m_scanActive = false; splash->showMessage(tr("Initialize GUI..."), alignment); /* Setup the ui */ ui.setupUi(this); this->setWindowTitle(QString(APPLICATION_NAME)); splash->showMessage(tr("Create Handlers..."), alignment); /* Create Action Handler */ m_actionHandler = new CActionHandler(&m_dataHandler, this); /* Create Read Rate Calculator */ m_readRateCalc = new CReadRateCalc(this); /* Create Tag Manager */ m_tagManager = new CTagManager(this); m_amsComWrapper = new USBHIDWrapper(0x0); splash->showMessage(tr("Create Dialogs..."), alignment); /* Create Dialogs */ m_aboutDialog = new QrfeAboutDialog(this); m_keyDialog = new QrfeKeyWindow(this); m_tagListDialog = new CTagListView(m_tagManager, this); m_settingsDialog = new CSettingsDialog(this); m_tagSettingsDialog = new CTagSettingsDialog(&m_dataHandler, this); m_gen2SettingsDialog = new CGen2TagDialog(this); /* Create the view manager */ m_tagViewManager = new CTagViewManager(ui.readerTreeWidget, &m_dataHandler, m_readRateCalc, this); m_tagViewManager->setUp( m_settingsDialog->showAlias(), m_settingsDialog->useTtl(), m_settingsDialog->msecsToShowInactive(), m_settingsDialog->msecsToShowOutOfRange(), m_settingsDialog->msecsToDelete()); QObject::connect(m_tagViewManager, SIGNAL(requestTagSettings(QString)), this, SLOT(requestTagSettingsDialog(QString))); QObject::connect(m_tagViewManager, SIGNAL(requestTagAdvancedSettings(QString, QString)), this, SLOT(requestTagAdvancedSettingsDialog(QString, QString))); QObject::connect(m_tagViewManager, SIGNAL(requestReaderAdvancedSettings(QString)), this, SLOT(requestReaderAdvancedSettingsDialog(QString))); QObject::connect(m_tagViewManager, SIGNAL(requestReaderRegisterMap(QString)), this, SLOT(requestReaderRegisterMap(QString))); QObject::connect(m_tagViewManager, SIGNAL(newTagCount(int)), ui.tagCountNumber, SLOT(display(int))); QObject::connect(m_tagViewManager, SIGNAL(newDifferentTagCount(int)), ui.differentTagCountNumber, SLOT(display(int))); QObject::connect(m_tagViewManager, SIGNAL(newOverallDifferentTagCount(int)), ui.overallDifferentTagCountNumber, SLOT(display(int))); QObject::connect(m_tagViewManager, SIGNAL(oldTagEntryRemoved(QString,QString)), m_tagManager, SLOT(oldTagEntryRemoved(QString,QString))); QObject::connect(m_tagViewManager, SIGNAL(currentReaderChanged(QString)), this, SLOT(currentReaderChanged(QString))); QObject::connect(m_tagViewManager, SIGNAL(countTotalTags(QString)), this, SLOT(countTotalTags(QString))); splash->showMessage(tr("Connect..."), alignment); /* Connect the signals of the gui to the right slots */ QObject::connect(QrfeTrace::getInstance(), SIGNAL(traceSignal(QString)), ui.traceBrowser, SLOT(append(QString))); QObject::connect(ui.actionAboutReaderTool, SIGNAL(triggered (bool)), m_aboutDialog, SLOT(exec())); QObject::connect(ui.actionShow_TagList, SIGNAL(triggered (bool)), m_tagListDialog, SLOT(exec())); QObject::connect(ui.readerTabWidget, SIGNAL(currentChanged(int)), this, SLOT(selectReader(int))); QObject::connect(ui.startScanButton, SIGNAL(toggled (bool)), this, SLOT(startScan(bool))); QObject::connect(ui.handleActionPushButton, SIGNAL(toggled(bool)), this, SLOT(handleActionsToggled(bool))); QObject::connect(ui.actionAdd_Serial_Reader, SIGNAL(triggered(bool)), this, SLOT(addSerialReader())); //Del by yingwei tseng for hiding AMS code, 2010/03/10 //QObject::connect(ui.actionAdd_Tcp_Reader, SIGNAL(triggered(bool)), this, SLOT(addTcpReader())); //End by yingwei tseng for hiding AMS code, 2010/03/10 QObject::connect(ui.actionHandle_Actions, SIGNAL(triggered(bool)), this, SLOT(handleActionsToggled(bool))); QObject::connect(ui.actionShow_Alias_Names, SIGNAL(triggered ( bool)), this, SLOT(showAliasNames(bool))); QObject::connect(ui.actionUse_Time_To_Live, SIGNAL(triggered ( bool)), this, SLOT(useTimeToLive(bool))); QObject::connect(ui.actionPreferences, SIGNAL(triggered ( bool)), this, SLOT(showSettings())); QObject::connect(ui.actionOpen_Register_Map, SIGNAL(triggered ( bool)), this, SLOT(showRegisterMap())); QObject::connect(ui.clearButton, SIGNAL(clicked()), m_readRateCalc, SLOT(clearResults())); QObject::connect(ui.actionClear_Tags, SIGNAL(triggered (bool)), m_readRateCalc, SLOT(clearResults())); QObject::connect(ui.clearButton, SIGNAL(clicked()), m_tagViewManager, SLOT(clearTags())); QObject::connect(ui.actionClear_Tags, SIGNAL(triggered (bool)), m_tagViewManager, SLOT(clearTags())); QObject::connect(ui.clearOfflineReaderButton, SIGNAL(clicked()), m_tagViewManager, SLOT(clearOfflineReader())); QObject::connect(ui.clearOfflineReaderButton, SIGNAL(clicked()), this, SLOT(clearOfflineReader())); QObject::connect(ui.actionClear_Offline_Reader, SIGNAL(triggered(bool)), m_tagViewManager, SLOT(clearOfflineReader())); QObject::connect(m_gen2SettingsDialog, SIGNAL(easterKeyUnlocked()), this, SLOT(easterKeyUnlocked())); /* Create the scan timer to get the end of the scan */ m_scanTimer = new QTimer(this); m_scanTimer->setSingleShot(true); QObject::connect(m_scanTimer, SIGNAL(timeout()), this, SLOT(stopScan())); /* Create timer for the scan progress bar */ m_scanProgressTimer = new QTimer(this); m_scanProgressTimer->setSingleShot(false); m_scanProgressTimer->setInterval(1000); m_regMapWindow = NULL; /* Connect to the Reader Manager */ QObject::connect(this, SIGNAL(currentReaderChanged(QrfeReaderInterface*)), m_amsComWrapper, SLOT(gotReader(QrfeReaderInterface*))); QObject::connect(&m_readerManager, SIGNAL(lostReader(QrfeReaderInterface*)), m_amsComWrapper, SLOT(lostReader(QrfeReaderInterface*))); QObject::connect(&m_readerManager, SIGNAL(gotReader(QrfeReaderInterface*)), this, SLOT(gotReader(QrfeReaderInterface*))); QObject::connect(&m_readerManager, SIGNAL(lostReader(QrfeReaderInterface*)), this, SLOT(lostReader(QrfeReaderInterface*))); //Add by yingwei tseng for using bar to set power, 2010/07/09 QObject::connect(ui.powerSlider, SIGNAL(valueChanged(int)), this, SLOT(powerSliderChange(int))); //End by yingwei tseng for using bar to set power, 2010/07/09 /* Create the timer for the multiplexer control */ m_multiplexTimer = new QTimer(this); m_multiplexTimer->setSingleShot(true); m_multiplexTimer->setInterval(m_settingsDialog->multiplexTime()); QObject::connect(m_multiplexTimer, SIGNAL(timeout()), this, SLOT(multiplexISR())); /* Finally set up the gui */ ui.traceDockWidget->setVisible(false); ui.informationBox->setVisible(false); ui.actionShow_Alias_Names->setChecked(m_settingsDialog->showAlias()); ui.actionUse_Time_To_Live->setChecked(m_settingsDialog->useTtl()); splash->showMessage(tr("Starting up..."), alignment); ActivateSettings(); Sleep(1000); splash->close(); //Add by yingwei tseng for hiding AMS code, 2010/03/10 ui.handleActionPushButton->hide(); ui.clearOfflineReaderButton->hide(); //ui.actionAdd_Serial_Reader->setVisible(false); ui.actionAdd_USB->setVisible(false); ui.actionAdd_Tcp_Reader->setVisible(false); ui.actionHandle_Actions->setVisible(false); ui.actionClear_Offline_Reader->setVisible(false); //End by yingwei tseng for hiding AMS code, 2010/03/10 //Add by yingwei tseng for hiding items, 2010/12/08 ui.actionShow_Alias_Names->setVisible(false); ui.actionUse_Time_To_Live->setVisible(false); ui.actionShow_Trace_Browser->setVisible(false); ui.actionShow_TagList->setVisible(false); //End by yingwei tseng for hiding items, 2010/12/08 ui.groupBox_3->hide(); }