Core.cc 79.6 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40 41 42
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
43 44 45 46 47
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
48
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66





//=============================================================================
//
//  CLASS Core - IMPLEMENTATION
//
//=============================================================================


//== INCLUDES =================================================================

// -------------------- mview
#include "Core.hh"
// -------------------- ACG
#include <ACG/Scenegraph/DrawModes.hh>
67
#include <ACG/Scenegraph/SceneGraph.hh>
Jan Möbius's avatar
 
Jan Möbius committed
68 69 70 71 72 73 74 75 76 77 78 79

#include <ACG/QtWidgets/QtFileDialog.hh>
// -------------------- Qt

#include <QKeyEvent>
#include <QSplitter>
#include <QMenuBar>
#include <QToolBox>
#include <QApplication>
#include <QStatusBar>
#include <QMessageBox>
#include <QFile>
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
80
#include <QSettings>
Jan Möbius's avatar
Jan Möbius committed
81 82 83 84 85 86 87 88

#if QT_VERSION >= 0x050000
 #include <QOpenGLContext>
 #include <QSurfaceFormat>
#else
 #undef QT_NO_OPENGL
 #include <QGLFormat>
#endif
Jan Möbius's avatar
 
Jan Möbius committed
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

#include <QPluginLoader>
#include "OpenFlipper/BasePlugin/BaseInterface.hh"
#include "OpenFlipper/BasePlugin/KeyInterface.hh"
#include "OpenFlipper/BasePlugin/MouseInterface.hh"
#include "OpenFlipper/BasePlugin/PickingInterface.hh"
#include "OpenFlipper/BasePlugin/ToolboxInterface.hh"
#include "OpenFlipper/BasePlugin/TextureInterface.hh"
#include "OpenFlipper/BasePlugin/MenuInterface.hh"
#include "OpenFlipper/BasePlugin/INIInterface.hh"

#include "OpenFlipper/INIFile/INIFile.hh"

#include "OpenFlipper/common/GlobalOptions.hh"
#include <OpenFlipper/common/RecentFiles.hh>
#include <OpenFlipper/ACGHelper/DrawModeConverter.hh>

#include <QStringList>
#include <QtScript/QScriptValueIterator>

#include <ACG/Scenegraph/SeparatorNode.hh>

#include "OpenFlipper/BasePlugin/PluginFunctions.hh"
Jan Möbius's avatar
 
Jan Möbius committed
112
#include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
Jan Möbius's avatar
 
Jan Möbius committed
113

Jan Möbius's avatar
Jan Möbius committed
114 115
#include "OpenFlipper/BasePlugin/RPCWrappers.hh"

Jan Möbius's avatar
 
Jan Möbius committed
116 117
#include <OpenMesh/Core/System/omstream.hh>

118 119
#include <OpenFlipper/common/BaseObjectCore.hh>
#include <OpenFlipper/common/TypesInternal.hh>
Jan Möbius's avatar
Jan Möbius committed
120

121 122
#include <OpenFlipper/common/RendererInfo.hh>

Isaak Lim's avatar
Isaak Lim committed
123 124
#include <OpenFlipper/widgets/messageBox/StaysOnTopMessageBox.hh>

Jan Möbius's avatar
 
Jan Möbius committed
125 126 127
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

128
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
129 130

/** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2)
131
 *
Jan Möbius's avatar
 
Jan Möbius committed
132 133 134 135 136 137 138 139 140
 * 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
 * - Jump back ( Stage two is done by calling init from main ) so CALL init!!
 * - This Two stage system allows using commandline options which override Option Files
*/
Core::
Core() :
  QObject(),
141
  capture_(false),
142
  processManager_(0),
Jan Möbius's avatar
 
Jan Möbius committed
143
  nextBackupId_(0),
Dirk Wilden's avatar
Dirk Wilden committed
144
  nextBackupGroupId_(0),
145
  objectRoot_(0),
Jan Möbius's avatar
 
Jan Möbius committed
146 147
  coreWidget_(0)
{
148

Dirk Wilden's avatar
Dirk Wilden committed
149 150 151 152
  //init logFile
  logStream_ = 0;
  logFile_ = 0;

Dirk Wilden's avatar
Dirk Wilden committed
153 154
  //init nodes
  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
Jan Möbius's avatar
Jan Möbius committed
155
  
156
  // init global data node
Jan Möbius's avatar
Jan Möbius committed
157
  root_node_scenegraph_global_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_ , "SceneGraph Rendered Root Node");
158
  
Jan Möbius's avatar
Jan Möbius committed
159
  // This separator will manage the cores nodes
160
  core_nodes_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Core Nodes");
Jan Möbius's avatar
Jan Möbius committed
161 162 163 164
  
  // Coordsys rendering nodes
  coordsysMaterialNode_ = new ACG::SceneGraph::MaterialNode(core_nodes_,"Coordsys Material Node");
  coordsysNode_ = new ACG::SceneGraph::CoordsysNode(coordsysMaterialNode_,"Core Coordsys Node");  
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
165
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
Jan Möbius's avatar
Jan Möbius committed
166
  
Jan Möbius's avatar
Jan Möbius committed
167
  // Separator handling the nodes for data
168
  dataSeparatorNode_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Data Separator Root Node");
Jan Möbius's avatar
Jan Möbius committed
169
  
Jan Möbius's avatar
Jan Möbius committed
170
  // Separator handling the nodes for data
Jan Möbius's avatar
Jan Möbius committed
171
  dataRootNode_      = new ACG::SceneGraph::SeparatorNode(dataSeparatorNode_, "Data Root Node");
Dirk Wilden's avatar
Dirk Wilden committed
172

Jan Möbius's avatar
 
Jan Möbius committed
173 174 175
   // Add ViewMode All
  ViewMode* vm = new ViewMode();
  vm->name = "All";
Jan Möbius's avatar
Jan Möbius committed
176
  vm->icon = "viewmode_all.png";
Jan Möbius's avatar
 
Jan Möbius committed
177
  vm->custom = false;
Jan Möbius's avatar
Jan Möbius committed
178
  vm->visibleToolboxes = QStringList();
179

Jan Möbius's avatar
 
Jan Möbius committed
180 181
  viewModes_.push_front(vm);

Dirk Wilden's avatar
Dirk Wilden committed
182 183 184
  //init ViewerProperties (always for 4 Viewers!)
  std::vector< Viewer::ViewerProperties* > viewerProperties;

185
  for (int i=0; i < 4; i++) {
186
    Viewer::ViewerProperties* viewerProperty = new Viewer::ViewerProperties(i);
187 188 189
    viewerProperty->snapshotBaseFileName("snap-Viewer-" + QString::number(i) + ".png");
    viewerProperties.push_back( viewerProperty );
  }
Dirk Wilden's avatar
Dirk Wilden committed
190 191 192

  PluginFunctions::setViewerProperties(viewerProperties);

193 194 195 196 197 198
  //set viewer defaults
  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_FREE,  0 );
  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_TOP,   1 );
  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_LEFT,  2 );
  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_FRONT, 3 );

Jan Möbius's avatar
 
Jan Möbius committed
199 200
  // Get all relevant Paths and Options from option files
  setupOptions();
Jan Möbius's avatar
Jan Möbius committed
201

202 203
  // set discriptions for scriptable slots
  setDescriptions();
204 205 206
  
  // Initialize the build in dataTypes
  initializeTypes();
Dirk Wilden's avatar
Dirk Wilden committed
207 208 209
  
  // Initialize the build in updateTypes
  initializeUpdateTypes();
Jan Möbius's avatar
 
Jan Möbius committed
210 211
}

212 213 214
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
 
Jan Möbius committed
215 216 217 218 219 220
 * - 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
 */
221 222
void
Core::init() {
Jan Möbius's avatar
Jan Möbius committed
223 224 225
  
  // Check library versions
  checkLibraryVersions();
226

Jan Möbius's avatar
 
Jan Möbius committed
227
  // Make root_node available to the plugins ( defined in PluginFunctions.hh)
Jan Möbius's avatar
Jan Möbius committed
228
  PluginFunctions::setDataSeparatorNodes( dataSeparatorNode_ );
229

230
  // Topmost node of the scenegraph
Jan Möbius's avatar
 
Jan Möbius committed
231
  PluginFunctions::setSceneGraphRootNode( root_node_scenegraph_ );
232 233 234 235
  
  // Node below the global status nodes. All nodes with global rendering
  // will be attached here.
  PluginFunctions::setSceneGraphRootNodeGlobal(root_node_scenegraph_global_);
Dirk Wilden's avatar
Dirk Wilden committed
236

Jan Möbius's avatar
 
Jan Möbius committed
237
  // Initialize the first object as the root Object for the object tree
238
  objectRoot_ =  dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") );
Jan Möbius's avatar
 
Jan Möbius committed
239
  PluginFunctions::setDataRoot( objectRoot_ );
Jan Möbius's avatar
Jan Möbius committed
240 241 242
  
  // Bring up the object manager ( has to be done after the rootobject is created)
  connect(getObjectManager(),SIGNAL(newObject(int)), this ,SLOT(newObject(int)));
243 244
  
  connect(getObjectManager(),SIGNAL(deletedObject(int)), this ,SLOT(deletedObject(int)));
245

Jan Möbius's avatar
 
Jan Möbius committed
246
  if ( OpenFlipper::Options::gui() ) {
247

Jan Möbius's avatar
Jan Möbius committed
248
    // Initialize redraw timer. Will be used to restrict the rendering framerate.
249 250 251 252
    redrawTimer_ = new QTimer();
    redrawTimer_->setSingleShot(true);
    connect(redrawTimer_, SIGNAL(timeout()), this, SLOT(updateView()),Qt::DirectConnection);

253 254 255 256 257 258 259 260
    // Initialice scenegraph check timer. Will be used to check for changes in the scenegraph
    scenegraphCheckTimer_ = new QTimer();
    scenegraphCheckTimer_->setSingleShot(false);
    connect(scenegraphCheckTimer_, SIGNAL(timeout()), this, SLOT(checkScenegraphDirty()),Qt::DirectConnection);

    // Will measure the time between redraws
    redrawTime_ = new QTime();
    redrawTime_->start ();
261

262
    if ( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
Jan Möbius's avatar
 
Jan Möbius committed
263
      QPixmap splashPixmap(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "splash.png");
264

265
      splash_ = new QSplashScreen(splashPixmap, Qt::SplashScreen | Qt::WindowStaysOnTopHint);
Jan Möbius's avatar
 
Jan Möbius committed
266
      splash_->show();
267

268
      splash_->showMessage(tr("Initializing mainwindow") ,
Jan Möbius's avatar
 
Jan Möbius committed
269 270
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
    }
271

Jan Möbius's avatar
Jan Möbius committed
272
    coreWidget_ = new CoreWidget(viewModes_ , plugins_, coreSlots_);
273

274 275 276 277
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxScrollArea());
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxArea());
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolbox());

Jan Möbius's avatar
 
Jan Möbius committed
278
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
279
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(loadObject()));
Jan Möbius's avatar
 
Jan Möbius committed
280
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
281 282 283 284
    connect(coreWidget_, SIGNAL(saveMenu())           , this, SLOT(saveAllObjects()));
    connect(coreWidget_, SIGNAL(saveToMenu())         , this, SLOT(saveAllObjectsTo()));
    connect(coreWidget_, SIGNAL(loadIniMenu())        , this, SLOT(loadSettings()));
    connect(coreWidget_, SIGNAL(saveIniMenu())        , this, SLOT(saveSettings()));
285
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
286
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
287 288
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
289

290 291 292

    connect( coreWidget_, SIGNAL( resizeViewers(int,int) ), this, SLOT( resizeViewers(int,int) ) );
    connect( coreWidget_, SIGNAL( resizeApplication(int,int) ), this, SLOT( resizeApplication(int,int) ) );
Dirk Wilden's avatar
Dirk Wilden committed
293 294
    connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
    connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
295
    connect( coreWidget_, SIGNAL( dragOpenFile(QString)), this, SLOT(loadObject(QString)));
296

Dirk Wilden's avatar
Dirk Wilden committed
297
    connect(coreWidget_, SIGNAL(showPlugins())       , this, SLOT(slotShowPlugins()));
298

Dirk Wilden's avatar
Dirk Wilden committed
299
    connect(coreWidget_, SIGNAL(call(QString,bool&)), this, SLOT(slotCall(QString,bool&)));
300 301
    
    connect( coreWidget_->logWidget_->openMeshFilterAction_,SIGNAL(toggled(bool)), this, SLOT(enableOpenMeshErrorLog(bool)) );
Dirk Wilden's avatar
Dirk Wilden committed
302

Jan Möbius's avatar
Jan Möbius committed
303 304 305 306 307 308 309 310 311 312 313 314
    QRect rect = QApplication::desktop()->screenGeometry();

    uint width = rect.width();
    if ( width > 1000 ) {
      width = 1000;
    }

    uint height = rect.height();
    if ( height > 1000 ) {
      height = 1000;
    }

Jan Möbius's avatar
Jan Möbius committed
315 316 317
#ifdef ARCH_DARWIN
    width = rect.width() - 300;
    height = rect.height() - 150;
Jan Möbius's avatar
Jan Möbius committed
318

Jan Möbius's avatar
Jan Möbius committed
319
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
320 321
#endif

Jan Möbius's avatar
Jan Möbius committed
322
    coreWidget_->resize(width,height);
323

Dirk Wilden's avatar
Dirk Wilden committed
324 325 326 327 328
    #ifdef DEBUG
      coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() + " [DEBUG]" );
    #else
      coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() );
    #endif
329

Jan Möbius's avatar
Jan Möbius committed
330 331 332
    // Sanity check for OpenGL capabilities!
    checkOpenGLCapabilities();

Jan Möbius's avatar
 
Jan Möbius committed
333
  }
334

Jan Möbius's avatar
 
Jan Möbius committed
335 336 337 338
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
339

Jan Möbius's avatar
 
Jan Möbius committed
340 341
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
342 343
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Jan Möbius's avatar
 
Jan Möbius committed
344 345 346
  // Connect it to the Master logger
  if ( OpenFlipper::Options::gui() )
    connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
347

Jan Möbius's avatar
 
Jan Möbius committed
348
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
349

Dirk Wilden's avatar
Dirk Wilden committed
350 351
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
352 353 354 355 356 357 358

  // ======================================================================
  // Create a logger class for CoreWidget
  // ======================================================================

  if ( OpenFlipper::Options::gui() ){
    PluginLogger* widgetlog = new PluginLogger("CoreWidget");
359

Dirk Wilden's avatar
Dirk Wilden committed
360 361
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
362 363
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
364 365 366
    // 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);
Dirk Wilden's avatar
Dirk Wilden committed
367 368
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
369
  }
370

Jan Möbius's avatar
 
Jan Möbius committed
371 372 373 374 375 376
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
377

Jan Möbius's avatar
 
Jan Möbius committed
378
  loggers_.push_back(newlog);
379

Jan Möbius's avatar
 
Jan Möbius committed
380 381 382
  // Connect it to the Master logger
  if ( OpenFlipper::Options::gui() )
    connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
383

Jan Möbius's avatar
 
Jan Möbius committed
384
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
385 386
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
387

Jan Möbius's avatar
 
Jan Möbius committed
388 389 390 391 392 393
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
394

Jan Möbius's avatar
 
Jan Möbius committed
395
  loggers_.push_back(newlog);
396

Jan Möbius's avatar
 
Jan Möbius committed
397 398 399
  // Connect it to the Master logger
  if ( OpenFlipper::Options::gui() )
    connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
400

Jan Möbius's avatar
 
Jan Möbius committed
401
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
402 403
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
404

Jan Möbius's avatar
 
Jan Möbius committed
405 406 407 408 409
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
410

Jan Möbius's avatar
 
Jan Möbius committed
411
  loggers_.push_back(newlog);
412

Jan Möbius's avatar
 
Jan Möbius committed
413 414 415
  // Connect it to the Master logger
  if ( OpenFlipper::Options::gui() )
    connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
416

Jan Möbius's avatar
 
Jan Möbius committed
417
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
418 419
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
420

Jan Möbius's avatar
 
Jan Möbius committed
421 422 423 424
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
425

Jan Möbius's avatar
 
Jan Möbius committed
426
  loggers_.push_back(newlog);
427

Jan Möbius's avatar
 
Jan Möbius committed
428 429 430
  // Connect it to the Master logger
  if ( OpenFlipper::Options::gui() )
    connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
431

Jan Möbius's avatar
 
Jan Möbius committed
432
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
433
  // connection to file logger
434
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
435

Jan Möbius's avatar
 
Jan Möbius committed
436
  // connect signal to logger
437 438
  connect(this,SIGNAL(scriptLog(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

439
  
Jan Möbius's avatar
 
Jan Möbius committed
440
  // ======================================================================
441
  // Set up QtScript Environment
Jan Möbius's avatar
 
Jan Möbius committed
442
  // ======================================================================
443
  
Jan Möbius's avatar
Jan Möbius committed
444 445 446
  // Set a reference to the scriptengine for simple rpc calls
  RPC::setScriptEngine(&scriptEngine_);

Jan Möbius's avatar
Jan Möbius committed
447
  connect(&scriptEngine_, SIGNAL( signalHandlerException(const QScriptValue &) ), this, SLOT( slotScriptError(const QScriptValue &) ));
448

Jan Möbius's avatar
 
Jan Möbius committed
449 450
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
451

Jan Möbius's avatar
 
Jan Möbius committed
452 453 454 455
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
456

457 458 459
  // Register print to file function :
  QScriptValue printToFileFunc = scriptEngine_.newFunction(printToFileFunction);
  scriptEngine_.globalObject().setProperty("printToFile", printToFileFunc);
460
  scriptingFunctions_.push_back( "-.printToFile(QString,QString)" );
461

Jan Möbius's avatar
Jan Möbius committed
462 463 464 465 466 467
  // Register help function :
  QScriptValue helpFunc = scriptEngine_.newFunction(helpFunction);
  helpFunc.setProperty("core",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("help", helpFunc);
  scriptingFunctions_.push_back( "-.help(QString)" );

468 469 470 471 472 473 474 475 476
  // Register IdList Type to scripting Engine
  qScriptRegisterSequenceMetaType< IdList >(&scriptEngine_);
  
  // Register Vector of ints Type to scripting Engine
  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
  
  //==========================================================================
  // Register the 3d Vector Type to the core ( is Vec3d )
  //==========================================================================
477 478
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
479 480
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
481
                          
Jan Möbius's avatar
 
Jan Möbius committed
482
  // set a constructor to allow creation via Vector(x,y,z)
Jan Möbius's avatar
Jan Möbius committed
483 484 485 486 487 488 489
  QScriptValue ctorVec3 = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctorVec3);

  //==========================================================================
  // Register the 4d Vector Type to the core ( is Vec4d )
  //==========================================================================
  qScriptRegisterMetaType(&scriptEngine_,
490 491
                          toScriptValueVector4,
                          fromScriptValueVector4,
Jan Möbius's avatar
Jan Möbius committed
492 493 494 495 496
                          scriptEngine_.newQObject(&vec4dPrototype_));

  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctorVec4 = scriptEngine_.newFunction(createVector4);
  scriptEngine_.globalObject().setProperty("Vector4", ctorVec4);
497 498 499 500
                          
  //==========================================================================
  // Register the DataType Class to the core
  //==========================================================================
501

502
  // Register DataType in QScriptEngine
503
  qScriptRegisterMetaType<DataType>(&scriptEngine_,
504 505 506 507 508
                          toScriptValueDataType,
                          fromScriptValueDataType,
                          scriptEngine_.newQObject(&DataTypePrototype_));
                          
  // set a constructor to allow creation via DataType(uint)
509 510 511 512 513 514
  QScriptValue dataTypector = scriptEngine_.newFunction(createDataType);
  scriptEngine_.globalObject().setProperty("DataType", dataTypector);     
  
  //==========================================================================
  // Register the Matrix Class to the core
  //==========================================================================
515

Jan Möbius's avatar
 
Jan Möbius committed
516
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
517 518
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
519 520
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
521

Jan Möbius's avatar
 
Jan Möbius committed
522 523 524
  // set a constructor to allow creation via Matrix(x,y,z)
  QScriptValue matrix4x4ctor = scriptEngine_.newFunction(createMatrix4x4);
  scriptEngine_.globalObject().setProperty("Matrix4x4", matrix4x4ctor);
525

526 527 528 529
  //==========================================================================
  //  Collect Core scripting information
  //==========================================================================

Jan Möbius's avatar
 
Jan Möbius committed
530 531 532 533 534 535
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
536

Jan Möbius's avatar
 
Jan Möbius committed
537
  scriptEngine_.globalObject().setProperty("core", scriptInstance);
538

Jan Möbius's avatar
 
Jan Möbius committed
539 540 541
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
542

Jan Möbius's avatar
 
Jan Möbius committed
543
    /// Skip all signals for function calls
544
    if ( checkSignal( this, it.name().toLatin1() ) )
Jan Möbius's avatar
 
Jan Möbius committed
545
      continue;
546

Jan Möbius's avatar
 
Jan Möbius committed
547
    scriptingFunctions_.push_back( "core." + it.name() );
548

Jan Möbius's avatar
 
Jan Möbius committed
549
  }
550

Jan Möbius's avatar
 
Jan Möbius committed
551
  loadPlugins();
552

Jan Möbius's avatar
 
Jan Möbius committed
553
  if ( OpenFlipper::Options::gui() ) {
554

Dirk Wilden's avatar
Dirk Wilden committed
555 556 557
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

558 559 560
    //get keyAssignments from config files
    restoreKeyBindings();

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
561 562
    if ( OpenFlipper::Options::currentViewMode( ) != "" )
      coreWidget_->setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
 
Jan Möbius committed
563 564
    else
      coreWidget_->setViewMode("All");
565

566
    // Set the renderer to the one stored in the settings or to default
567
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
Jan Möbius's avatar
Jan Möbius committed
568 569 570 571
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEvent(QMouseEvent*)),
              this                              , SLOT(slotMouseEvent(QMouseEvent*)));
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventIdentify(QMouseEvent*)),
              this                              , SLOT(slotMouseEventIdentify(QMouseEvent*)));
Jan Möbius's avatar
Mike:  
Jan Möbius committed
572 573
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventLight(QMouseEvent*)),
              this                              , SLOT(slotMouseEventLight(QMouseEvent*)));
Jan Möbius's avatar
Jan Möbius committed
574 575
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalWheelEvent(QWheelEvent *, const std::string &)),
              this                              , SLOT(slotWheelEvent(QWheelEvent *, const std::string &)));
Jan Möbius's avatar
Jan Möbius committed
576 577

      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewUpdated() ),
578
               this, SLOT( viewUpdated()) ,Qt::DirectConnection);
579

580
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
581
               coreWidget_->examiner_widgets_[i], SLOT( updateGL() ) ,Qt::DirectConnection);
582

Jan Möbius's avatar
Jan Möbius committed
583 584 585
      // Set post processor
      PostProcessorDialog::loadSavedPostProcessors(i);

586 587 588 589 590
      // ====================================================
      // Set renderer
      // ====================================================

      QString defaultRendererKey  = "Viewer" + QString::number(i)+"/DefaultRenderer";
591
      QString defaultRendererName = OpenFlipperSettings().value(defaultRendererKey,"Default Classical Renderer Plugin").toString();
592 593 594 595 596 597 598 599

      // Check if the renderer is there
      int defaultRendererId = renderManager().getRendererId(defaultRendererName);

      if ( defaultRendererId == -1 ) {
        emit log(LOGERR,tr("Stored default renderer \"") + defaultRendererName + tr("\" is not available, trying Classical!"));

        // Check if the renderer is there
600
        defaultRendererId = renderManager().getRendererId("Default Classical Renderer Plugin");
601 602 603 604 605 606

        // Classical available?
        if ( defaultRendererId != -1 ) {
          renderManager().setActive(defaultRendererId,i);
        } else {
          emit log(LOGERR,tr("Default classical renderer is also not available. Trying to use any other renderer i can find!"));
607 608 609 610 611 612

          // debug information for this case, print renderer count and their names
          const unsigned int rendererCount = renderManager().available();
          emit log(LOGERR,tr("Currently ") + QString::number(rendererCount) + tr(" renderers are available:") );
          for (unsigned int i = 0 ; i < rendererCount ; ++i )
            emit log(LOGERR, tr("Renderer ") + QString::number(i) + ": " + renderManager()[i]->name );
613 614 615 616 617 618 619 620 621 622
        }

      } else {
        renderManager().setActive(defaultRendererId,i);
      }

    }

    // Warn the user in the log and via messagebox, that he is using the build in renderer only
    if ( renderManager().available() == 1 ) {
623
      finishSplash();
624 625 626 627
      emit log(LOGERR,tr("No external plugin renderers available!"));
      emit log(LOGERR,tr("The build in renderer is only a very limited one and is missing many features!"));
      emit log(LOGERR,tr("You should build and use the other renderers!"));

Isaak Lim's avatar
Isaak Lim committed
628
      StaysOnTopMessageBox::warning(0,tr( "No external plugin renderers available!"),tr("The build in renderer is only a very limited one and is missing many features.\nYou should build and use the other free renderers shipped with OpenFlipper."));
Jan Möbius's avatar
Jan Möbius committed
629
    }
630

Jan Möbius's avatar
 
Jan Möbius committed
631
  }
632

Jan Möbius's avatar
Jan Möbius committed
633 634 635 636
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================

Jan Möbius's avatar
 
Jan Möbius committed
637 638
  QStringList optionFiles = OpenFlipper::Options::optionFiles();
  for ( int i = 0 ; i < (int)optionFiles.size(); ++i) {
639

640
    if ( OpenFlipper::Options::gui() && OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
641
      splash_->showMessage(tr("Loading Configuration File %1/%2").arg(i+1).arg(optionFiles.size()),
Jan Möbius's avatar
 
Jan Möbius committed
642 643
                           Qt::AlignBottom | Qt::AlignLeft , Qt::white);
    }
644

Jan Möbius's avatar
Jan Möbius committed
645 646
    // Load global ini files. Use only plugin global options from these files as the
    // rest has been loaded at the beginning.
647 648 649
    if ( OpenFlipper::Options::gui() )
      coreWidget_->updateRecent();

Jan Möbius's avatar
Jan Möbius committed
650
    openIniFile( optionFiles[i] ,false,true,false);
Jan Möbius's avatar
 
Jan Möbius committed
651 652
  }

Hans-Christian Ebke's avatar
Hans-Christian Ebke committed
653 654
  if ( OpenFlipper::Options::gui() && OpenFlipperSettings().value("Core/Gui/splash",true).toBool() )
      splash_->clearMessage();
655

Jan Möbius's avatar
Jan Möbius committed
656 657 658
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================
659

Jan Möbius's avatar
 
Jan Möbius committed
660
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
661
    emit log(LOGWARN,tr("UTF8-Locale used!"));
Jan Möbius's avatar
Jan Möbius committed
662 663 664 665
//     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.");
666
  }
Jan Möbius's avatar
 
Jan Möbius committed
667 668

  if ( OpenFlipper::Options::gui() ) {
Dirk Wilden's avatar
Dirk Wilden committed
669

670
    QFile statesFile(OpenFlipper::Options::configDirStr()  + OpenFlipper::Options::dirSeparator() + "WindowStates.dat");
Dirk Wilden's avatar
Dirk Wilden committed
671

672 673
    if (statesFile.exists() ) {
      QSettings windowStates(OpenFlipper::Options::configDirStr()  + OpenFlipper::Options::dirSeparator() + "WindowStates.dat", QSettings::IniFormat);
674

675 676 677 678
      //try to restore the windowState
      coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
      //try to restore the geometry
      coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
679

680 681
      coreWidget_->toolSplitter_->restoreState (windowStates.value("Core/ToolSplitter").toByteArray ());
      coreWidget_->splitter_->restoreState (windowStates.value("Core/LogSplitter").toByteArray ());
682

683
      coreWidget_->show();
684

685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
      applyOptions();

      windowStates.beginGroup ("Core");
      windowStates.beginGroup ("LogSlider");
      coreWidget_->slidingLogger_->restoreState (windowStates);
      windowStates.endGroup ();
      coreWidget_->toolBox_->restoreState (windowStates);
      windowStates.endGroup ();

    } else {

      coreWidget_->show();
      applyOptions();

    }
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
700

701
    if ( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
Jan Möbius's avatar
Jan Möbius committed
702
        splash_->raise();
703
        splash_->showMessage(tr("Ready."), Qt::AlignBottom | Qt::AlignLeft , Qt::white);
704
        finishSplash();
Jan Möbius's avatar
 
Jan Möbius committed
705
    }
706

707
    // start checking for scenegraph changes
708
    scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
709
    scenegraphCheckTimer_->start ();
Jan Möbius's avatar
 
Jan Möbius committed
710
  }
711

712 713 714
  // System is ready now.
  OpenFlipper::Options::finishedStartup();
  
Jan Möbius's avatar
Jan Möbius committed
715
  QTimer::singleShot(100, this, SLOT(slotExecuteAfterStartup()));
Jan Möbius's avatar
 
Jan Möbius committed
716 717
}

718

Jan Möbius's avatar
 
Jan Möbius committed
719 720 721 722
//-----------------------------------------------------------------------------

Core::~Core()
{
723

724 725 726 727 728
  // Delete the objectRoot if it was constructed
  if ( objectRoot_ != 0 ) {
    objectRoot_->deleteSubtree();
    delete objectRoot_;
  }
729

Jan Möbius's avatar
 
Jan Möbius committed
730
  // Clean up loggers
731 732 733
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
Jan Möbius committed
734
  delete coreWidget_;
Jan Möbius's avatar
 
Jan Möbius committed
735 736 737 738 739 740 741
}

//-----------------------------------------------------------------------------

void
Core::slotMouseEventIdentify( QMouseEvent* _event )
{
Dirk Wilden's avatar
Dirk Wilden committed
742 743 744
//   // Dont do anything as a context Menu will popup on right button click
//   if ( _event->button() == Qt::RightButton )
//     return;
745

746 747 748
  // Only catch left-button clicks
  if(_event->button() != Qt::LeftButton) return;

Jan Möbius's avatar
Jan Möbius committed
749 750 751 752 753 754 755 756 757
  const QObject* senderPointer = sender();
  unsigned int examinerId = 0;

  if ( senderPointer == 0 ) {
    std::cerr << "Error : slotMouseEventIdentify directly called! This should only be called by an examiner" << std::endl;
  } else {
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
      if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
        examinerId = i;
758
        if ( OpenFlipper::Options::doSlotDebugging() )
759
              emit log(LOGINFO,tr("slotMouseEventIdentify from examiner ") + QString::number(i) );
Jan Möbius's avatar
Jan Möbius committed
760 761 762 763 764 765 766 767
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

768 769 770 771 772
  // Do picking
  unsigned int   node_idx, target_idx;
  ACG::Vec3d     hit_point;

  if(PluginFunctions::scenegraphPick(ACG::SceneGraph::PICK_ANYTHING, _event->pos(), node_idx, target_idx, &hit_point)) {
Jan Möbius's avatar
Jan Möbius committed
773

774
    BaseObjectData* object = 0;
Jan Möbius's avatar
Jan Möbius committed
775

776 777 778 779 780 781 782 783
    if(PluginFunctions::getPickedObject(node_idx, object)) {
      // Request type information widget
      InformationInterface* infoPlugin = 0;
      infoPlugin = getInfoPlugin(object->dataType());
      if(infoPlugin != 0)
          infoPlugin->slotInformationRequested(_event->pos(), object->dataType());
    }
  }
Jan Möbius's avatar
 
Jan Möbius committed
784 785 786
}

//-----------------------------------------------------------------------------
Jan Möbius's avatar
Mike:  
Jan Möbius committed
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815

void
Core::slotMouseEventLight( QMouseEvent* _event )
{
  const QObject* senderPointer = sender();
  unsigned int examinerId = 0;

  if ( senderPointer == 0 ) {
    std::cerr << "Error : slotMouseEventLight directly called! This should only be called by an examiner" << std::endl;
  } else {
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
      if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
        examinerId = i;
        if ( OpenFlipper::Options::doSlotDebugging() )
              emit log(LOGINFO,tr("slotMouseEventLight from examiner ") + QString::number(i) );
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

  emit PluginMouseEventLight( _event );


}

//-----------------------------------------------------------------------------
Jan Möbius's avatar
 
Jan Möbius committed
816 817 818 819 820


void
Core::slotMouseEvent( QMouseEvent* _event )
{
Dirk Wilden's avatar
Dirk Wilden committed
821 822 823
//   // Dont do anything as a context Menu will popup on right button click
//   if ( _event->button() == Qt::RightButton )
//     return;
824

Jan Möbius's avatar
Jan Möbius committed
825 826 827 828 829 830 831 832 833
  const QObject* senderPointer = sender();
  unsigned int examinerId = 0;

  if ( senderPointer == 0 ) {
    std::cerr << "Error : slotMouseEvent directly called! This should only be called by an examiner" << std::endl;
  } else {
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
      if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
        examinerId = i;
834
        if ( OpenFlipper::Options::doSlotDebugging() ) {
835
          QString message = tr("slotMouseEvent from examiner ") + QString::number(i) + " with ";
836 837 838 839 840 841 842 843 844 845

          if ( _event->type() == QEvent::MouseButtonRelease )
            message += " MouseButtonRelease";
          else if ( _event->type() == QEvent::MouseButtonPress )
            message += " MouseButtonRelease";
          else if ( _event->type() == QEvent::MouseButtonDblClick )
            message += " MouseButtonDblClick";
          else if ( _event->type() == QEvent::MouseMove )
            message += " MouseMove";
          else
846
            message += tr("unknown event type");
847 848 849 850

          emit log(LOGINFO,message );
        }

Jan Möbius's avatar
Jan Möbius committed
851
        break;
852

Jan Möbius's avatar
Jan Möbius committed
853 854 855 856 857 858 859
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
860 861 862 863 864 865 866 867
  emit PluginMouseEvent(_event );
}

//-----------------------------------------------------------------------------

void
Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
{
Jan Möbius's avatar
Jan Möbius committed
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
  const QObject* senderPointer = sender();
  unsigned int examinerId = 0;

  if ( senderPointer == 0 ) {
    std::cerr << "Error : slotWheelEvent directly called! This should only be called by an examiner" << std::endl;
  } else {
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
      if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
        examinerId = i;
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
885 886 887 888 889 890
  emit PluginWheelEvent(_event , _mode );
}

//-----------------------------------------------------------------------------

void
Jan Möbius's avatar
Jan Möbius committed
891
Core::slotAddPickMode( const std::string& _mode ) {
Jan Möbius's avatar
 
Jan Möbius committed
892
  if ( OpenFlipper::Options::gui() )
893
    coreWidget_->addPickMode(_mode);
Jan Möbius's avatar
Jan Möbius committed
894

Jan Möbius's avatar
 
Jan Möbius committed
895 896 897 898 899
}

//-----------------------------------------------------------------------------

void
Jan Möbius's avatar
Jan Möbius committed
900
Core::slotAddHiddenPickMode( const std::string& _mode ) {
Jan Möbius's avatar
Jan Möbius committed
901

Jan Möbius's avatar
 
Jan Möbius committed
902
  if ( OpenFlipper::Options::gui() )
903
    coreWidget_->addPickMode(_mode,false,1000,false);
Jan Möbius's avatar
Jan Möbius committed
904

Jan Möbius's avatar
 
Jan Möbius committed
905 906 907 908 909 910
}

//-----------------------------------------------------------------------------

 /** Update the view in the examiner widget
  */
Jan Möbius's avatar
Jan Möbius committed
911 912
void Core::updateView()
{
Jan Möbius's avatar
Jan Möbius committed
913

Jan Möbius's avatar
Jan Möbius committed
914 915 916 917
  if (OpenFlipper::Options::doSlotDebugging()) {
    if (sender() != 0) {
      if (sender()->metaObject() != 0) {
        emit log(LOGINFO, tr("updateView() called by ") + QString(sender()->metaObject()->className()));
Jan Möbius's avatar
Jan Möbius committed
918 919 920 921
      }
    }
  }

Jan Möbius's avatar
Jan Möbius committed
922
  if (!OpenFlipper::Options::gui())
Dirk Wilden's avatar
Dirk Wilden committed
923
    return;
924

Jan Möbius's avatar
Jan Möbius committed
925 926 927
  if (OpenFlipperSettings().value("Core/Gui/glViewer/restrictFrameRate", false).toBool()) {

    int elapsed = redrawTime_->elapsed();
928

Jan Möbius's avatar
Jan Möbius committed
929
    if (elapsed < 1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate", 35).toInt()) {
Jan Möbius's avatar
Jan Möbius committed
930
      // redraw time not reached ... waiting for timer event for next redraw
Jan Möbius's avatar
Jan Möbius committed
931 932 933 934
      if (redrawTimer_->isActive()) {
        if (OpenFlipper::Options::doSlotDebugging())
          emit log(LOGINFO,
              tr("Too early for redraw! Delaying request from ") + QString(sender()->metaObject()->className()));
Jan Möbius's avatar
Jan Möbius committed
935 936 937 938
        return;
      }

      // Start the timer
Jan Möbius's avatar
Jan Möbius committed
939
      redrawTimer_->start((1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate", 35).toInt()) - elapsed);
Jan Möbius's avatar
Jan Möbius committed
940
      return;
Jan Möbius's avatar
Jan Möbius committed
941 942
    } else if (redrawTimer_->isActive())
      redrawTimer_->stop();
943 944 945

  }

Jan Möbius's avatar
Jan Möbius committed
946
  redrawTime_->restart();
947

948
  if (!OpenFlipper::Options::sceneGraphUpdatesBlocked() && !OpenFlipper::Options::redrawDisabled()) {
Jan Möbius's avatar
Jan Möbius committed
949

Jan Möbius's avatar
Jan Möbius committed
950
    for (unsigned int i = 0; i < OpenFlipper::Options::examinerWidgets(); ++i)
Jan Möbius's avatar
Jan Möbius committed
951
      coreWidget_->examiner_widgets_[i]->updateGL();
952 953 954

    // Inform plugins of the scene update
    emit pluginSceneDrawn();
Jan Möbius's avatar
 
Jan Möbius committed
955
  }
956 957


Jan Möbius's avatar
 
Jan Möbius committed
958 959
}

960 961 962 963 964 965
//-----------------------------------------------------------------------------

void Core::updateUI() {
  QApplication::processEvents();
}

Jan Möbius's avatar
Jan Möbius committed
966 967


968 969 970 971 972 973 974
//-----------------------------------------------------------------------------

 /** Check if scenegraph is dirty and initiate redraw
  */
void Core::checkScenegraphDirty() {
  if ( true )
  {
975
    // This is a single pass traversal as we only need to check if there is still one node dirty in the graph
976 977
    ACG::SceneGraph::CheckDirtyAction action;
    ACG::SceneGraph::traverse( root_node_scenegraph_, action );
978 979
    
    // If the scenegraph is dirty, we have to redraw
980 981 982 983 984
    if ( action.isDirty () )
      emit updateView ();
  }
}

Jan Möbius's avatar
 
Jan Möbius committed
985 986
//-----------------------------------------------------------------------------

987
void Core::restrictFrameRate( bool _enable ) {
988
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",_enable); 
989 990 991 992 993
}

//-----------------------------------------------------------------------------

void Core::setMaxFrameRate( int _rate ) {
994 995
  OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate",_rate);
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",true); 
996 997

  // update Timer to new framerate
998
  scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
999 1000 1001 1002
}

//-----------------------------------------------------------------------------

1003 1004
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
1005
{
1006 1007 1008

  slotDeleteAllObjects();

Jan Möbius's avatar
Jan Möbius committed
1009
  emit allCleared();
1010

Jan Möbius's avatar
 
Jan Möbius committed
1011 1012 1013 1014 1015
  slotScriptInfo( "core" , "clearAll()"  );
}

//-----------------------------------------------------------------------------

1016 1017
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
1018 1019 1020 1021
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
Jan Möbius's avatar
Jan Möbius committed
1022
  
1023

Jan Möbius's avatar
 
Jan Möbius committed
1024 1025 1026 1027 1028
  QApplication::quit();
}

//-----------------------------------------------------------------------------

1029 1030 1031 1032 1033 1034 1035
void Core::fullscreen( bool _state ) {
  if ( OpenFlipper::Options::gui() )
    coreWidget_->setFullscreen(_state);
}

//-----------------------------------------------------------------------------

1036 1037 1038 1039 1040 1041 1042 1043
void Core::showViewModeControls( bool _show ) {
  if ( OpenFlipper::Options::gui() ) {
    coreWidget_->showViewModeControls(_show);
  }
}

//-----------------------------------------------------------------------------

Jan Möbius's avatar
Jan Möbius committed
1044 1045
void Core::loggerState(int _state) {
  OpenFlipper::Options::LoggerState state = static_cast<OpenFlipper::Options::LoggerState> (_state);
1046
  if ( OpenFlipper::Options::gui() &&
Jan Möbius's avatar
Jan Möbius committed
1047 1048 1049 1050
       (state == OpenFlipper::Options::Hidden ||
        state == OpenFlipper::Options::InScene ||
        state == OpenFlipper::Options::Normal))
    coreWidget_->showLogger(state);
Jan Möbius's avatar
 
Jan Möbius committed
1051 1052 1053 1054
}

//-----------------------------------------------------------------------------

1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
void Core::enableOpenMeshErrorLog(bool _state) {
  std::cerr << "Script" << std::endl;
  
  // Set the state on openmesh stream
  if ( _state ) {
    omerr().enable();
  } else {
    omerr().disable();
  }
  
  if ( OpenFlipper::Options::gui() ) {
    // store in application settings
    OpenFlipperSettings().setValue("Core/Gui/LogWindow/OpenMeshErrors",_state);
    
    coreWidget_->logWidget_->openMeshFilterAction_->blockSignals(true);
    coreWidget_->logWidget_->openMeshFilterAction_->setChecked(_state);
    coreWidget_->logWidget_->openMeshFilterAction_->blockSignals(false);
  }
  
}

//-----------------------------------------------------------------------------

1078
void Core::showToolbox( bool _state ) {
1079
  if ( OpenFlipper::Options::gui() )
1080
    coreWidget_->showToolbox(_state);
Jan Möbius's avatar
 
Jan Möbius committed
1081
}
1082

1083 1084 1085 1086 1087 1088 1089 1090 1091
//-----------------------------------------------------------------------------

void Core::showStatusBar( bool _state ) {
  if ( OpenFlipper::Options::gui() )
    coreWidget_->showStatusBar(_state);
}

//-----------------------------------------------------------------------------

1092
void Core::multiViewMode( int _mode ) {
Jan Möbius's avatar
Jan Möbius committed
1093
  if ( !OpenFlipper::Options::gui() || !OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() )
1094 1095
    return;

1096
  coreWidget_->setViewerLayout(_mode);
1097 1098 1099 1100 1101

}



Jan Möbius's avatar
 
Jan Möbius committed
1102 1103 1104

//-----------------------------------------------------------------------------

1105 1106
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
1107
{
Jan Möbius's avatar
Jan Möbius committed
1108
  // Get the recent files lists and datatypes
1109 1110
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
1111 1112

  // The type of the file to open is attached to the action as a string.
Jan Möbius's avatar
Jan Möbius committed
1113
  // the name is the actions text
1114 1115 1116
  QString actionTypeName = _action->data().toString();

  // Iterate over all recent files
Jan Möbius's avatar
 
Jan Möbius committed
1117
  for (int i = 0 ; i < recentFiles.size() ; ++i )
1118 1119 1120 1121

    // If the name matches and also the type, we open it.
    if ( (recentFiles[i] == _action->text()) && ( actionTypeName ==  recentTypes[i] ) ){

Dirk Wilden's avatar
Dirk Wilden committed
1122
        OpenFlipper::Options::loadingRecentFile(true);
1123
        loadObject(typeId(recentTypes[i]), recentFiles[i]);
1124
        coreWidget_->addRecent(recentFiles[i],typeId(recentTypes[i]) );
Dirk Wilden's avatar
Dirk Wilden committed
1125
        OpenFlipper::Options::loadingRecentFile(false);
1126

Dirk Wilden's avatar
Dirk Wilden committed
1127
        return;
Jan Möbius's avatar
 
Jan Möbius committed
1128
    }
1129 1130 1131

  emit log(LOGERR, tr("Unable to open recent. Unable to find %1 with datatype %2 in recent files list.").arg(_action->text()).arg(actionTypeName) );

Jan Möbius's avatar
 
Jan Möbius committed
1132 1133
}

1134
//-----------------------------------------------------------------------------
Jan Möbius's avatar
 
Jan Möbius committed
1135

1136
void
Jan Möbius's avatar
 
Jan Möbius committed
1137
Core::writeOnExit() {
Jan Möbius's avatar
Jan Möbius committed
1138
  QString inifile = OpenFlipper::Options::configDirStr()  + OpenFlipper::Options::dirSeparator() + "OpenFlipper.ini";
Jan Möbius's avatar
 
Jan Möbius committed
1139 1140

  INIFile ini;
1141 1142 1143

  if ( ! ini.connect( inifile,true) ) {
    emit log(LOGERR,tr("Can not create user ini file"));
Jan Möbius's avatar
 
Jan Möbius committed
1144
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
1145
    writeApplicationOptions(ini);