From 444edfc994af12e8755cab0677613bf80500ba6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Thu, 18 Sep 2008 12:20:11 +0000 Subject: [PATCH] Added an automatic redraw blocker for core git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@2882 383ad7c9-94d9-4d36-a494-682f7c89f535 --- Core/Core.cc | 302 +++++++++++++++++++++++++++------------------------ Core/Core.hh | 5 +- 2 files changed, 166 insertions(+), 141 deletions(-) diff --git a/Core/Core.cc b/Core/Core.cc index af4af7f2..8fa1f789 100644 --- a/Core/Core.cc +++ b/Core/Core.cc @@ -12,12 +12,12 @@ // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// +// // OpenFlipper 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 Lesser General Public License for more details. -// +// // You should have received a copy of the GNU Lesser General Public License // along with OpenFlipper. If not, see . // @@ -88,10 +88,10 @@ #define WIDGET_HEIGHT 800 #define WIDGET_WIDTH 800 -//== IMPLEMENTATION ========================================================== +//== IMPLEMENTATION ========================================================== /** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2) - * + * * Initialization is working the following way:\n * - Setup basic paths \n * - Get Options from Option files ( While skipping the OpenFiles Sections as Core is not running )\n @@ -120,50 +120,55 @@ Core() : vm->name = "All"; vm->custom = false; vm->visibleWidgets = QStringList(); - + viewModes_.push_front(vm); // Get all relevant Paths and Options from option files setupOptions(); } -/** \brief Second initialization stage - * - * This Stage does the following :\n +/** \brief Second initialization stage + * + * This Stage does the following :\n * - Create the Core GUI Elements (Examiner, Toolbox,...)\n * - Create the MenuBar \n * - load the Plugins \n * - connect the Mouse slots \n * - Load all ini files (This includes the Global Option files) \n */ -void -Core::init() { - +void +Core::init() { + // Make root_node available to the plugins ( defined in PluginFunctions.hh) - PluginFunctions::set_rootNode( root_node_ ); + PluginFunctions::set_rootNode( root_node_ ); + + PluginFunctions::set_sceneGraphRootNode( root_node_scenegraph_ ); - PluginFunctions::set_sceneGraphRootNode( root_node_scenegraph_ ); - // Initialize the first object as the root Object for the object tree - objectRoot_ = dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") ); + objectRoot_ = dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") ); PluginFunctions::setDataRoot( objectRoot_ ); - + if ( OpenFlipper::Options::gui() ) { - + + redrawTimer_ = new QTimer(); + redrawTimer_->setSingleShot(true); + connect(redrawTimer_, SIGNAL(timeout()), this, SLOT(updateView()),Qt::DirectConnection); + + if ( OpenFlipper::Options::splash() ) { QPixmap splashPixmap(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "splash.png"); - + splash_ = new QSplashScreen(splashPixmap); splash_->show(); - - splash_->showMessage("Initializing mainwindow" , + + splash_->showMessage("Initializing mainwindow" , Qt::AlignBottom | Qt::AlignLeft , Qt::white); QApplication::processEvents(); } - + coreWidget_ = new CoreWidget(viewModes_ , plugins); - + connect(coreWidget_, SIGNAL(clearAll()) , this, SLOT(clearAll())); connect(coreWidget_, SIGNAL(loadMenu()) , this, SLOT(slotLoadMenu())); connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu())); @@ -175,33 +180,33 @@ Core::init() { connect(coreWidget_, SIGNAL(saveOptions()) , this, SLOT(saveOptions())); connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*))); connect(coreWidget_, SIGNAL(exit()) , this, SLOT(slotExit())); - + connect(coreWidget_, SIGNAL(loadPlugin()) , this, SLOT(slotLoadPlugin())); connect(coreWidget_, SIGNAL(unloadPlugin()) , this, SLOT(slotUnloadPlugin())); - + coreWidget_->resize(1000,1000); - - coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() ); - + + coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() ); + // Make examiner available to the plugins ( defined in PluginFunctions.hh) PluginFunctions::set_examiner( coreWidget_->examiner_widget_ ); - - + + } - + // ====================================================================== // Create intermediate logger class for Core which will mangle the output // ====================================================================== PluginLogger* newlog = new PluginLogger("Core"); - + loggers_.push_back(newlog); connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection); - + connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection); + // Connect it to the Master logger if ( OpenFlipper::Options::gui() ) connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger @@ -213,137 +218,137 @@ Core::init() { if ( OpenFlipper::Options::gui() ){ PluginLogger* widgetlog = new PluginLogger("CoreWidget"); - + loggers_.push_back(widgetlog); connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection); - + connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection); + // Connect it to the Master logger connect(widgetlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); } - + // ====================================================================== // Catch OpenMesh Error logs with an own Logger // ====================================================================== newlog = new PluginLogger("Core ( OpenMesh )",LOGERR); omerr().connect(*newlog); omerr().disconnect(std::cerr); - + loggers_.push_back(newlog); - + // Connect it to the Master logger if ( OpenFlipper::Options::gui() ) connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); - + // ====================================================================== // Catch OpenMesh omout logs with an own Logger // ====================================================================== newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO); omout().connect(*newlog); omout().disconnect(std::cout); - + loggers_.push_back(newlog); - + // Connect it to the Master logger if ( OpenFlipper::Options::gui() ) connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); - + // ====================================================================== // Catch OpenMesh omlog logs with an own Logger // ====================================================================== newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT); omlog().connect(*newlog); - + loggers_.push_back(newlog); - + // Connect it to the Master logger if ( OpenFlipper::Options::gui() ) connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); - + // ====================================================================== // Log Scripting stuff through a separate logger // ====================================================================== newlog = new PluginLogger("Scripting",LOGOUT); - + loggers_.push_back(newlog); - + // Connect it to the Master logger if ( OpenFlipper::Options::gui() ) connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); - + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection); // connection to file logger - connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); + connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection); // connect signal to logger - connect(this,SIGNAL(scriptLog(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection); - + connect(this,SIGNAL(scriptLog(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection); + // ====================================================================== // This connection will tell the plugins, when their Toolbox is active // ====================================================================== ///@todo reimplement // connect(module_list,SIGNAL(currentChanged(int)),this,SLOT(slotToolboxSwitched(int))); - + // process Events every 500 msecs during script execution scriptEngine_.setProcessEventsInterval( 500 ); - + // Register own print function : QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction); printFunction.setProperty("textedit",scriptEngine_.newQObject(this)); scriptEngine_.globalObject().setProperty("print", printFunction); - + // Register Vector Type to ScriptEngine ( is Vec3d ) - qScriptRegisterMetaType(&scriptEngine_, - toScriptValueVector, + qScriptRegisterMetaType(&scriptEngine_, + toScriptValueVector, fromScriptValueVector, scriptEngine_.newQObject(&vec3dPrototype_)); - + // set a constructor to allow creation via Vector(x,y,z) QScriptValue ctor = scriptEngine_.newFunction(createVector); scriptEngine_.globalObject().setProperty("Vector", ctor); - - + + // // Register ObjectId Type to ScriptEngine ( is int ) -// qScriptRegisterMetaType(&scriptEngine_, -// toScriptValueObjectId, +// qScriptRegisterMetaType(&scriptEngine_, +// toScriptValueObjectId, // fromScriptValueObjectId); -// +// // // set a constructor to allow creation via Vector(x,y,z) // ctor = scriptEngine_.newFunction(createObjectId); // scriptEngine_.globalObject().setProperty("ObjectId", ctor); - - + + // Register idList Type to scripting Engine qScriptRegisterSequenceMetaType< idList >(&scriptEngine_); qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_); - - + + // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d ) - qScriptRegisterMetaType(&scriptEngine_, - toScriptValueMatrix4x4 , + qScriptRegisterMetaType(&scriptEngine_, + toScriptValueMatrix4x4 , fromScriptValueMatrix4x4, scriptEngine_.newQObject(&matrix4x4Prototype_)); - + // set a constructor to allow creation via Matrix(x,y,z) QScriptValue matrix4x4ctor = scriptEngine_.newFunction(createMatrix4x4); scriptEngine_.globalObject().setProperty("Matrix4x4", matrix4x4ctor); - + // Collect Core scripting information QScriptValue scriptInstance = scriptEngine_.newQObject(this, QScriptEngine::QtOwnership, @@ -351,77 +356,77 @@ Core::init() { QScriptEngine::ExcludeSuperClassMethods | QScriptEngine::ExcludeSuperClassProperties ); - + scriptEngine_.globalObject().setProperty("core", scriptInstance); emit log(LOGOUT,"Core Scripting initialized with Name : core "); - + emit log(LOGOUT,"Available scripting functions :"); - + QScriptValueIterator it(scriptInstance); while (it.hasNext()) { it.next(); - + /// Skip all signals for function calls if ( checkSignal( this, it.name().toAscii() ) ) continue; - + scriptingFunctions_.push_back( "core." + it.name() ); - + emit log(LOGOUT,"\t" + it.name()); } - + emit log(LOGOUT,"============================================================================================="); - + loadPlugins(); - + if ( OpenFlipper::Options::gui() ) { - - if ( OpenFlipper::Options::defaultToolboxMode( ) != "" ) + + if ( OpenFlipper::Options::defaultToolboxMode( ) != "" ) coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() ); else coreWidget_->setViewMode("All"); - - connect( coreWidget_->examiner_widget_, SIGNAL(signalMouseEvent(QMouseEvent*)), + + connect( coreWidget_->examiner_widget_, SIGNAL(signalMouseEvent(QMouseEvent*)), this,SLOT(slotMouseEvent(QMouseEvent*))); connect( coreWidget_->examiner_widget_, SIGNAL(signalMouseEventIdentify(QMouseEvent*)), this,SLOT(slotMouseEventIdentify(QMouseEvent*))); connect( coreWidget_->examiner_widget_, SIGNAL(signalWheelEvent(QWheelEvent *, const std::string &)), this, SLOT(slotWheelEvent(QWheelEvent *, const std::string &))); - + } - + QStringList optionFiles = OpenFlipper::Options::optionFiles(); for ( int i = 0 ; i < (int)optionFiles.size(); ++i) { - + if ( OpenFlipper::Options::gui() && OpenFlipper::Options::splash() ) { - splash_->showMessage("Loading Configuration File " + QString::number(i) + "/" + QString::number(optionFiles.size()) , + splash_->showMessage("Loading Configuration File " + QString::number(i) + "/" + QString::number(optionFiles.size()) , Qt::AlignBottom | Qt::AlignLeft , Qt::white); QApplication::processEvents(); } - + openIniFile( optionFiles[i] ); } - + if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) { emit log(LOGWARN,"Warning, OpenFlipper detected that you are using an utf-8 locale!"); emit log(LOGWARN,"Only OFF files are fully supported with UTF8. Others might fail."); emit log(LOGWARN,"You can change your locale by :"); emit log(LOGWARN,"export LANG=C"); emit log(LOGWARN,"Work is in progress to resolve this issue."); - } + } applyOptions(); - + if ( OpenFlipper::Options::gui() ) { coreWidget_->show(); - + if ( OpenFlipper::Options::splash() ) { splash_->finish(coreWidget_); } - + } - + } //----------------------------------------------------------------------------- @@ -430,20 +435,20 @@ Core::~Core() { for ( uint i = 0 ; i < plugins.size() ; ++i ){ BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins[i].plugin); - + // Dont call exit if we cannot get the Plugin if ( basePlugin ) if ( checkSlot( plugins[i].plugin , "exit()" ) ) QMetaObject::invokeMethod(plugins[i].plugin, "exit", Qt::DirectConnection); } - + objectRoot_->deleteSubtree(); delete objectRoot_; - + // Clean up loggers - for ( uint i = 0 ; i < loggers_.size(); ++i ) - delete loggers_[i]; - + for ( uint i = 0 ; i < loggers_.size(); ++i ) + delete loggers_[i]; + } //----------------------------------------------------------------------------- @@ -454,7 +459,7 @@ Core::slotMouseEventIdentify( QMouseEvent* _event ) // Dont do anything as a context Menu will popup on right button click if ( _event->button() == Qt::RightButton ) return; - + emit PluginMouseEventIdentify( _event ); } @@ -467,7 +472,7 @@ Core::slotMouseEvent( QMouseEvent* _event ) // Dont do anything as a context Menu will popup on right button click if ( _event->button() == Qt::RightButton ) return; - + emit PluginMouseEvent(_event ); } @@ -484,7 +489,7 @@ Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode) void Core::slotAddPickMode( const std::string _mode ) { if ( OpenFlipper::Options::gui() ) - coreWidget_->examiner_widget_->addPickMode(_mode); + coreWidget_->examiner_widget_->addPickMode(_mode); } //----------------------------------------------------------------------------- @@ -492,7 +497,7 @@ Core::slotAddPickMode( const std::string _mode ) { void Core::slotAddHiddenPickMode( const std::string _mode ) { if ( OpenFlipper::Options::gui() ) - coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false); + coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false); } //----------------------------------------------------------------------------- @@ -500,7 +505,7 @@ Core::slotAddHiddenPickMode( const std::string _mode ) { void Core::slotAddPickMode( const std::string _mode , QCursor _cursor) { if ( OpenFlipper::Options::gui() ) - coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,true,_cursor); + coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,true,_cursor); } //----------------------------------------------------------------------------- @@ -508,7 +513,7 @@ Core::slotAddPickMode( const std::string _mode , QCursor _cursor) { void Core::slotAddHiddenPickMode( const std::string _mode , QCursor _cursor) { if ( OpenFlipper::Options::gui() ) - coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false, _cursor); + coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false, _cursor); } @@ -518,6 +523,23 @@ Core::slotAddHiddenPickMode( const std::string _mode , QCursor _cursor) { /** Update the view in the examiner widget */ void Core::updateView() { + if ( true ) { + + // redraw time not reached ... waiting for timer event for next redraw + if ( redrawTimer_->isActive() ) { + std::cerr << "Too early for redraw!" << std::endl; + return; + } + + std::cerr << "Redraw" << std::endl; + + // Start the timer if we are not called by the timer + if ( sender() != redrawTimer_ ) + redrawTimer_->start(35); + + } + + if ( OpenFlipper::Options::gui() && !OpenFlipper::Options::openingIni() ) { coreWidget_->examiner_widget_->sceneGraph(root_node_scenegraph_); coreWidget_->examiner_widget_->updateGL(); @@ -526,43 +548,43 @@ void Core::updateView() { //----------------------------------------------------------------------------- -void -Core::clearAll() +void +Core::clearAll() { objectRoot_->deleteSubtree(); emit allCleared(); emit ObjectListUpdated(-1); - + slotScriptInfo( "core" , "clearAll()" ); } //----------------------------------------------------------------------------- -void -Core::exitApplication() +void +Core::exitApplication() { QTimer* timer = new QTimer(); connect(timer, SIGNAL(timeout()), this, SLOT(slotExit())); timer->start(100); - + QApplication::quit(); } //----------------------------------------------------------------------------- -void -Core::setDrawMode(QString _mode) +void +Core::setDrawMode(QString _mode) { - + QStringList list = _mode.split(';'); std::vector< QString > drawModeList; - + for ( int i = 0 ; i < list.size() ; ++i ) drawModeList.push_back(list[i]); - + unsigned int mode = ListToDrawMode(drawModeList); - + PluginFunctions::setDrawMode( mode ); emit updateView(); } @@ -571,13 +593,13 @@ Core::setDrawMode(QString _mode) //----------------------------------------------------------------------------- void Core::translate( Vector _vec ) { - PluginFunctions::translate( _vec ); + PluginFunctions::translate( _vec ); } //----------------------------------------------------------------------------- void Core::rotate( Vector _axis, double _angle, Vector _center ) { - PluginFunctions::rotate( _axis, _angle, _center ); + PluginFunctions::rotate( _axis, _angle, _center ); } //----------------------------------------------------------------------------- @@ -589,29 +611,29 @@ void Core::setViewingDirection( Vector _direction, Vector _upvector ) { //----------------------------------------------------------------------------- void Core::fullscreen() { - if ( OpenFlipper::Options::gui() ) + if ( OpenFlipper::Options::gui() ) coreWidget_->toggleFullscreen(); } //----------------------------------------------------------------------------- void Core::logger() { - if ( OpenFlipper::Options::gui() ) + if ( OpenFlipper::Options::gui() ) coreWidget_->toggleLogger(); } //----------------------------------------------------------------------------- void Core::toolbox() { - if ( OpenFlipper::Options::gui() ) + if ( OpenFlipper::Options::gui() ) coreWidget_->toggleToolbox(); } - + //----------------------------------------------------------------------------- -void -Core::slotRecentOpen(QAction* _action) +void +Core::slotRecentOpen(QAction* _action) { QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles(); for (int i = 0 ; i < recentFiles.size() ; ++i ) @@ -622,15 +644,15 @@ Core::slotRecentOpen(QAction* _action) } -void +void Core::writeOnExit() { - QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" + + QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" + OpenFlipper::Options::dirSeparator() + "OpenFlipper.ini"; INIFile ini; if ( ! ini.connect( inifile ,false) ) { emit log(LOGERR,"Failed to connect to users ini file"); - + if ( ! ini.connect( inifile,true) ) { emit log(LOGERR,"Can not create user ini file"); } else { @@ -640,8 +662,8 @@ Core::writeOnExit() { } else { writeApplicationOptions(ini); ini.disconnect(); - } - + } + // Call exit for all plugins for (uint i = 0 ; i < plugins.size() ; ++i) { BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins[i].plugin); @@ -658,7 +680,7 @@ void Core::slotExit() { logFile_->close(); qApp->quit(); -} +} /// Synchronise two viewers bool Core::add_sync_host(const QString& _name) @@ -666,7 +688,7 @@ bool Core::add_sync_host(const QString& _name) if ( OpenFlipper::Options::gui() ) { emit log(LOGINFO,"Adding SyncHost"); bool ok = coreWidget_->examiner_widget_->add_sync_host(_name); - if (ok) + if (ok) coreWidget_->examiner_widget_->setSynchronization(true); else emit log(LOGERR,"Sync failed! "); @@ -684,7 +706,7 @@ void Core::slotLogToFile(Logtype _type, QString _message){ if (logStream_ == 0){ //check if a logfile has been specified if (OpenFlipper::Options::logFile() == "") - OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" + + OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" + OpenFlipper::Options::dirSeparator() + "OpenFlipper.log"); logFile_ = new QFile( OpenFlipper::Options::logFile() ); @@ -708,7 +730,7 @@ void Core::slotLogToFile(Logtype _type, QString _message){ } (*logStream_) << _message << "\n" << flush; - + } diff --git a/Core/Core.hh b/Core/Core.hh index b590fbc8..f94e65e4 100644 --- a/Core/Core.hh +++ b/Core/Core.hh @@ -134,7 +134,7 @@ protected: signals: /// Signal send to plugins when whole scene is cleared void allCleared(); - + /// When this Signal is emitted all Plugins are informed that the object list changed void ObjectListUpdated(int); @@ -650,6 +650,9 @@ private: /// List of available draw modes QVector viewModes_; + + /// If enabled, this timer will block screen refresh if done more then 30 times per second. + QTimer* redrawTimer_; }; /// Special print function for core logger -- GitLab