Core.cc 51.3 KB
Newer Older
1 2 3 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
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  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 with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  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 LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
Jan Möbius's avatar
Jan Möbius committed
37
 *   $Revision$                                                       *
38 39 40 41
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59





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


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

// -------------------- mview
#include "Core.hh"
// -------------------- ACG
#include <ACG/Scenegraph/DrawModes.hh>
60
#include <ACG/Scenegraph/SceneGraph.hh>
Jan Möbius's avatar
 
Jan Möbius committed
61 62 63 64 65 66 67 68 69 70 71 72

#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
73
#include <QSettings>
Jan Möbius's avatar
 
Jan Möbius committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

#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
97
#include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
Jan Möbius's avatar
 
Jan Möbius committed
98

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

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

103 104
#include <OpenFlipper/common/BaseObjectCore.hh>
#include <OpenFlipper/common/TypesInternal.hh>
Jan Möbius's avatar
Jan Möbius committed
105

Jan Möbius's avatar
 
Jan Möbius committed
106 107 108
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

109
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
110 111

/** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2)
112
 *
Jan Möbius's avatar
 
Jan Möbius committed
113 114 115 116 117 118 119 120 121
 * 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(),
122
  capture_(false),
123
  processManager_(0),
Jan Möbius's avatar
 
Jan Möbius committed
124
  nextBackupId_(0),
125
  objectRoot_(0),
Jan Möbius's avatar
 
Jan Möbius committed
126 127
  coreWidget_(0)
{
128

Dirk Wilden's avatar
Dirk Wilden committed
129 130 131 132
  //init logFile
  logStream_ = 0;
  logFile_ = 0;

Dirk Wilden's avatar
Dirk Wilden committed
133 134
  //init nodes
  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
Jan Möbius's avatar
Jan Möbius committed
135
  
136 137 138
  // init global data node
  root_node_scenegraph_global_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_ , "SceneGraph Root Node");
  
Jan Möbius's avatar
Jan Möbius committed
139
  // This seperator will manage the cores nodes
140
  core_nodes_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Core Nodes");
Jan Möbius's avatar
Jan Möbius committed
141 142 143 144
  
  // 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
145
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
Jan Möbius's avatar
Jan Möbius committed
146 147
  
  // seperator handling the nodes for data
148
  dataSeparatorNode_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Data Separator Root Node");
Jan Möbius's avatar
Jan Möbius committed
149 150 151 152 153 154
  
  // seperator handling the nodes for data
  dataRootNode_      = new ACG::SceneGraph::SeparatorNode(dataSeparatorNode_, "Data Root Node");
  
  
//   gridNode_ = new ACG::SceneGraph::GridNode(core_nodes_,"Grid Node");
155
//   gridNode_->hide();
Dirk Wilden's avatar
Dirk Wilden committed
156

Jan Möbius's avatar
 
Jan Möbius committed
157 158 159
   // Add ViewMode All
  ViewMode* vm = new ViewMode();
  vm->name = "All";
Jan Möbius's avatar
Jan Möbius committed
160
  vm->icon = "viewmode_all.png";
Jan Möbius's avatar
 
Jan Möbius committed
161
  vm->custom = false;
Jan Möbius's avatar
Jan Möbius committed
162
  vm->visibleToolboxes = QStringList();
163

Jan Möbius's avatar
 
Jan Möbius committed
164 165
  viewModes_.push_front(vm);

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

169 170 171 172 173
  for (int i=0; i < 4; i++) {
    Viewer::ViewerProperties* viewerProperty = new Viewer::ViewerProperties();
    viewerProperty->snapshotBaseFileName("snap-Viewer-" + QString::number(i) + ".png");
    viewerProperties.push_back( viewerProperty );
  }
Dirk Wilden's avatar
Dirk Wilden committed
174 175 176

  PluginFunctions::setViewerProperties(viewerProperties);

177 178 179 180 181 182 183 184 185 186
  //set viewer defaults
  OpenFlipper::Options::defaultProjectionMode( 1, 0 );
  OpenFlipper::Options::defaultProjectionMode( 0, 1 );
  OpenFlipper::Options::defaultProjectionMode( 0, 2 );
  OpenFlipper::Options::defaultProjectionMode( 0, 3 );
  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
187 188
  // Get all relevant Paths and Options from option files
  setupOptions();
Jan Möbius's avatar
Jan Möbius committed
189

190 191
  // set discriptions for scriptable slots
  setDescriptions();
192 193 194
  
  // Initialize the build in dataTypes
  initializeTypes();
Dirk Wilden's avatar
Dirk Wilden committed
195 196 197
  
  // Initialize the build in updateTypes
  initializeUpdateTypes();
Jan Möbius's avatar
 
Jan Möbius committed
198 199
}

200 201 202
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
 
Jan Möbius committed
203 204 205 206 207 208
 * - 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
 */
209 210 211
void
Core::init() {

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

215
  // Topmost node of the scenegraph
Jan Möbius's avatar
 
Jan Möbius committed
216
  PluginFunctions::setSceneGraphRootNode( root_node_scenegraph_ );
217 218 219 220
  
  // 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
221

Jan Möbius's avatar
 
Jan Möbius committed
222
  // Initialize the first object as the root Object for the object tree
223
  objectRoot_ =  dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") );
Jan Möbius's avatar
 
Jan Möbius committed
224
  PluginFunctions::setDataRoot( objectRoot_ );
Jan Möbius's avatar
Jan Möbius committed
225 226 227
  
  // Bring up the object manager ( has to be done after the rootobject is created)
  connect(getObjectManager(),SIGNAL(newObject(int)), this ,SLOT(newObject(int)));
228 229
  
  connect(getObjectManager(),SIGNAL(deletedObject(int)), this ,SLOT(deletedObject(int)));
230

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

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

238 239 240 241 242 243 244 245
    // 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 ();
246

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

Jan Möbius's avatar
 
Jan Möbius committed
250 251
      splash_ = new QSplashScreen(splashPixmap);
      splash_->show();
252

253
      splash_->showMessage(tr("Initializing mainwindow") ,
Jan Möbius's avatar
 
Jan Möbius committed
254 255 256
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
257

Dirk Wilden's avatar
Dirk Wilden committed
258
    coreWidget_ = new CoreWidget(viewModes_ , plugins, coreSlots_);
259

Jan Möbius's avatar
 
Jan Möbius committed
260
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
261
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(loadObject()));
Jan Möbius's avatar
 
Jan Möbius committed
262
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
263 264 265 266
    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()));
267
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
268
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
269 270
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
271

272 273 274

    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
275 276
    connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
    connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
277
    connect( coreWidget_, SIGNAL( dragOpenFile(QString)), this, SLOT(loadObject(QString)));
278

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

Dirk Wilden's avatar
Dirk Wilden committed
281 282
    connect(coreWidget_, SIGNAL(call(QString,bool&)), this, SLOT(slotCall(QString,bool&)));

Jan Möbius's avatar
Jan Möbius committed
283 284 285 286 287 288 289 290 291 292 293 294
    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
295 296 297
#ifdef ARCH_DARWIN
    width = rect.width() - 300;
    height = rect.height() - 150;
Jan Möbius's avatar
Jan Möbius committed
298

Jan Möbius's avatar
Jan Möbius committed
299
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
300 301
#endif

Jan Möbius's avatar
Jan Möbius committed
302
    coreWidget_->resize(width,height);
303 304 305

    coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() );

Jan Möbius's avatar
 
Jan Möbius committed
306
  }
307

Jan Möbius's avatar
 
Jan Möbius committed
308 309 310 311
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
312

Jan Möbius's avatar
 
Jan Möbius committed
313 314
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
315 316
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

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

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

Dirk Wilden's avatar
Dirk Wilden committed
323 324
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
325 326 327 328 329 330 331

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

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

Dirk Wilden's avatar
Dirk Wilden committed
333 334
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
335 336
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
337 338 339
    // 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
340 341
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
342
  }
343

Jan Möbius's avatar
 
Jan Möbius committed
344 345 346 347 348 349
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
350

Jan Möbius's avatar
 
Jan Möbius committed
351
  loggers_.push_back(newlog);
352

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

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

Jan Möbius's avatar
 
Jan Möbius committed
361 362 363 364 365 366
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
367

Jan Möbius's avatar
 
Jan Möbius committed
368
  loggers_.push_back(newlog);
369

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

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

Jan Möbius's avatar
 
Jan Möbius committed
378 379 380 381 382
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
383

Jan Möbius's avatar
 
Jan Möbius committed
384
  loggers_.push_back(newlog);
385

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

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

Jan Möbius's avatar
 
Jan Möbius committed
394 395 396 397
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
398

Jan Möbius's avatar
 
Jan Möbius committed
399
  loggers_.push_back(newlog);
400

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

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

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

412
  
Jan Möbius's avatar
 
Jan Möbius committed
413
  // ======================================================================
414
  // Set up QtScript Environment
Jan Möbius's avatar
 
Jan Möbius committed
415
  // ======================================================================
416
  
Jan Möbius's avatar
Jan Möbius committed
417 418 419
  // Set a reference to the scriptengine for simple rpc calls
  RPC::setScriptEngine(&scriptEngine_);

Jan Möbius's avatar
 
Jan Möbius committed
420 421
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
422

Jan Möbius's avatar
 
Jan Möbius committed
423 424 425 426
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
427

428 429 430 431 432 433 434 435 436 437 438


  // 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 )
  //==========================================================================
439 440
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
441 442
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
443
                          
Jan Möbius's avatar
 
Jan Möbius committed
444 445 446
  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctor = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctor);
447 448 449 450
                          
  //==========================================================================
  // Register the DataType Class to the core
  //==========================================================================
451

452
  // Register DataType in QScriptEngine
453
  qScriptRegisterMetaType<DataType>(&scriptEngine_,
454 455 456 457 458
                          toScriptValueDataType,
                          fromScriptValueDataType,
                          scriptEngine_.newQObject(&DataTypePrototype_));
                          
  // set a constructor to allow creation via DataType(uint)
459 460 461 462 463 464
  QScriptValue dataTypector = scriptEngine_.newFunction(createDataType);
  scriptEngine_.globalObject().setProperty("DataType", dataTypector);     
  
  //==========================================================================
  // Register the Matrix Class to the core
  //==========================================================================
465

Jan Möbius's avatar
 
Jan Möbius committed
466
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
467 468
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
469 470
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
471

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

476 477 478 479
  //==========================================================================
  //  Collect Core scripting information
  //==========================================================================

Jan Möbius's avatar
 
Jan Möbius committed
480 481 482 483 484 485
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
486

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

Jan Möbius's avatar
 
Jan Möbius committed
489 490 491
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
492

Jan Möbius's avatar
 
Jan Möbius committed
493 494 495
    /// Skip all signals for function calls
    if ( checkSignal( this, it.name().toAscii() ) )
      continue;
496

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

Jan Möbius's avatar
 
Jan Möbius committed
499
  }
500

Jan Möbius's avatar
 
Jan Möbius committed
501
  loadPlugins();
502

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

Dirk Wilden's avatar
Dirk Wilden committed
505 506 507
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

508 509 510
    //get keyAssignments from config files
    restoreKeyBindings();

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
511 512
    if ( OpenFlipper::Options::currentViewMode( ) != "" )
      coreWidget_->setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
 
Jan Möbius committed
513 514
    else
      coreWidget_->setViewMode("All");
515

Jan Möbius's avatar
Jan Möbius committed
516 517 518 519 520 521 522
    for ( uint i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEvent(QMouseEvent*)),
              this                              , SLOT(slotMouseEvent(QMouseEvent*)));
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventIdentify(QMouseEvent*)),
              this                              , SLOT(slotMouseEventIdentify(QMouseEvent*)));
      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
523 524

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

527
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
528
               this, SIGNAL( pluginViewChanged() ) ,Qt::DirectConnection);
Jan Möbius's avatar
Jan Möbius committed
529
    }
530

Jan Möbius's avatar
 
Jan Möbius committed
531
  }
532

Jan Möbius's avatar
Jan Möbius committed
533 534 535 536
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================

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

540
    if ( OpenFlipper::Options::gui() && OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
541
      splash_->showMessage(tr("Loading Configuration File ") + QString::number(i) + "/"  + QString::number(optionFiles.size()) ,
Jan Möbius's avatar
 
Jan Möbius committed
542 543 544
                           Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
545

Jan Möbius's avatar
Jan Möbius committed
546 547
    // Load global ini files. Use only plugin global options from these files as the
    // rest has been loaded at the beginning.
548 549 550 551
    readRecentFiles( optionFiles[i] );
    if ( OpenFlipper::Options::gui() )
      coreWidget_->updateRecent();

Jan Möbius's avatar
Jan Möbius committed
552
    openIniFile( optionFiles[i] ,false,true,false);
Jan Möbius's avatar
 
Jan Möbius committed
553 554
  }

Jan Möbius's avatar
Jan Möbius committed
555 556 557
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================
558

Jan Möbius's avatar
 
Jan Möbius committed
559
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
560
    emit log(LOGWARN,tr("UTF8-Locale used!"));
Jan Möbius's avatar
Jan Möbius committed
561 562 563 564
//     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.");
565
  }
Jan Möbius's avatar
 
Jan Möbius committed
566 567

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

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
569 570
    QSettings windowStates(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                           OpenFlipper::Options::dirSeparator() +  "WindowStates.dat", QSettings::IniFormat);
Dirk Wilden's avatar
Dirk Wilden committed
571

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
572 573
    //try to restore the windowState
    coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
574
    //try to restore the geometry
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
575
    coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
576

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
577 578
    coreWidget_->toolSplitter_->restoreState (windowStates.value("Core/ToolSplitter").toByteArray ());
    coreWidget_->splitter_->restoreState (windowStates.value("Core/LogSplitter").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
579

Jan Möbius's avatar
 
Jan Möbius committed
580
    coreWidget_->show();
581

582 583
    applyOptions();

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
584 585 586 587 588 589 590
    windowStates.beginGroup ("Core");
    windowStates.beginGroup ("LogSlider");
    coreWidget_->slidingLogger_->restoreState (windowStates);
    windowStates.endGroup ();
    coreWidget_->toolBox_->restoreState (windowStates);
    windowStates.endGroup ();

591
    if ( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
Jan Möbius's avatar
 
Jan Möbius committed
592 593
      splash_->finish(coreWidget_);
    }
594

595
    // start checking for scenegraph changes
596
    scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
597
    scenegraphCheckTimer_->start ();
Jan Möbius's avatar
 
Jan Möbius committed
598
  }
599

Jan Möbius's avatar
Jan Möbius committed
600 601

  QTimer::singleShot(100, this, SLOT(slotExecuteAfterStartup()));
Jan Möbius's avatar
 
Jan Möbius committed
602 603
}

604

Jan Möbius's avatar
 
Jan Möbius committed
605 606 607 608 609 610
//-----------------------------------------------------------------------------

Core::~Core()
{
   for ( uint i = 0 ; i < plugins.size() ; ++i ){
     BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins[i].plugin);
611

Jan Möbius's avatar
 
Jan Möbius committed
612 613 614 615 616
     // 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);
  }
617

618 619 620 621 622
  // Delete the objectRoot if it was constructed
  if ( objectRoot_ != 0 ) {
    objectRoot_->deleteSubtree();
    delete objectRoot_;
  }
623

Jan Möbius's avatar
 
Jan Möbius committed
624
  // Clean up loggers
625 626 627
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
 
Jan Möbius committed
628 629 630 631 632 633 634
}

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

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

Jan Möbius's avatar
Jan Möbius committed
639 640 641 642 643 644 645 646 647
  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;
648
        if ( OpenFlipper::Options::doSlotDebugging() )
649
              emit log(LOGINFO,tr("slotMouseEventIdentify from examiner ") + QString::number(i) );
Jan Möbius's avatar
Jan Möbius committed
650 651 652 653 654 655 656 657
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
658
  emit PluginMouseEventIdentify( _event );
Jan Möbius's avatar
Jan Möbius committed
659 660


Jan Möbius's avatar
 
Jan Möbius committed
661 662 663 664 665 666 667 668
}

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


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

Jan Möbius's avatar
Jan Möbius committed
673 674 675 676 677 678 679 680 681
  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;
682
        if ( OpenFlipper::Options::doSlotDebugging() ) {
683
          QString message = tr("slotMouseEvent from examiner ") + QString::number(i) + " with ";
684 685 686 687 688 689 690 691 692 693

          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
694
            message += tr("unknown event type");
695 696 697 698

          emit log(LOGINFO,message );
        }

Jan Möbius's avatar
Jan Möbius committed
699
        break;
700

Jan Möbius's avatar
Jan Möbius committed
701 702 703 704 705 706 707
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
708 709 710 711 712 713 714 715
  emit PluginMouseEvent(_event );
}

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

void
Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
{
Jan Möbius's avatar
Jan Möbius committed
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
  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
733 734 735 736 737 738 739 740
  emit PluginWheelEvent(_event , _mode );
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
743 744 745 746 747 748
}

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
753 754 755 756 757 758 759
}

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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
760 761 762 763

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
764
        emit log(LOGINFO,tr("updateView() called by ") + QString( sender()->metaObject()->className() ) );
Jan Möbius's avatar
Jan Möbius committed
765 766 767 768
      }
    }
  }

Dirk Wilden's avatar
Dirk Wilden committed
769 770
  if ( !OpenFlipper::Options::gui() )
    return;
771 772
  
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/restrictFrameRate",false).toBool() ) {
773

774
    int elapsed = redrawTime_->elapsed ();
775

776
    if ( elapsed < 1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() )
777
    {
Jan Möbius's avatar
Jan Möbius committed
778 779 780
      // redraw time not reached ... waiting for timer event for next redraw
      if ( redrawTimer_->isActive() ) {
        if ( OpenFlipper::Options::doSlotDebugging() )
781
          emit log(LOGINFO,tr("Too early for redraw! Delaying request from ") +
Jan Möbius's avatar
Jan Möbius committed
782 783 784 785 786
                           QString( sender()->metaObject()->className() ) );
        return;
      }

      // Start the timer
787
      redrawTimer_->start( (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() ) - elapsed);
Jan Möbius's avatar
Jan Möbius committed
788
      return;
Jan Möbius's avatar
Jan Möbius committed
789
    }
790 791
    else if ( redrawTimer_->isActive() )
	redrawTimer_->stop ();
792 793 794

  }

795
  redrawTime_->restart ();
796

Dirk Wilden's avatar
Dirk Wilden committed
797
  if ( !OpenFlipper::Options::loadingSettings() && !OpenFlipper::Options::redrawDisabled() ) {
Jan Möbius's avatar
Jan Möbius committed
798

799
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
Jan Möbius committed
800
      coreWidget_->examiner_widgets_[i]->updateGL();
Jan Möbius's avatar
 
Jan Möbius committed
801 802 803
  }
}

Jan Möbius's avatar
Jan Möbius committed
804 805


806 807 808 809 810 811 812
//-----------------------------------------------------------------------------

 /** Check if scenegraph is dirty and initiate redraw
  */
void Core::checkScenegraphDirty() {
  if ( true )
  {
813
    // This is a single pass traversal as we only need to check if there is still one node dirty in the graph
814 815
    ACG::SceneGraph::CheckDirtyAction action;
    ACG::SceneGraph::traverse( root_node_scenegraph_, action );
816 817
    
    // If the scenegraph is dirty, we have to redraw
818 819 820 821 822
    if ( action.isDirty () )
      emit updateView ();
  }
}

Jan Möbius's avatar
 
Jan Möbius committed
823 824
//-----------------------------------------------------------------------------

825
void Core::restrictFrameRate( bool _enable ) {
826
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",_enable); 
827 828 829 830 831
}

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

void Core::setMaxFrameRate( int _rate ) {
832 833
  OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate",_rate);
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",true); 
834 835

  // update Timer to new framerate
836
  scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
837 838 839 840
}

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

841 842
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
843
{
844 845 846

  slotDeleteAllObjects();

Jan Möbius's avatar
Jan Möbius committed
847
  emit allCleared();
848

Jan Möbius's avatar
 
Jan Möbius committed
849 850 851 852 853
  slotScriptInfo( "core" , "clearAll()"  );
}

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

854 855
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
856 857 858 859
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
860

Jan Möbius's avatar
 
Jan Möbius committed
861 862 863 864 865
  QApplication::quit();
}

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

866 867 868 869 870 871 872
void Core::fullscreen( bool _state ) {
  if ( OpenFlipper::Options::gui() )
    coreWidget_->setFullscreen(_state);
}

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

Jan Möbius's avatar
Jan Möbius committed
873 874
void Core::loggerState(int _state) {
  OpenFlipper::Options::LoggerState state = static_cast<OpenFlipper::Options::LoggerState> (_state);
875
  if ( OpenFlipper::Options::gui() &&
Jan Möbius's avatar
Jan Möbius committed
876 877 878 879
       (state == OpenFlipper::Options::Hidden ||
        state == OpenFlipper::Options::InScene ||
        state == OpenFlipper::Options::Normal))
    coreWidget_->showLogger(state);
Jan Möbius's avatar
 
Jan Möbius committed
880 881 882 883
}

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

884
void Core::showToolbox( bool _state ) {
885
  if ( OpenFlipper::Options::gui() )
886
    coreWidget_->showToolbox(_state);
Jan Möbius's avatar
 
Jan Möbius committed
887
}
888

889
void Core::multiViewMode( int _mode ) {
Jan Möbius's avatar
Jan Möbius committed
890
  if ( !OpenFlipper::Options::gui() || !OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() )
891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
    return;

  switch (_mode)
  {
    case 0:
      coreWidget_->baseLayout_->setMode (QtMultiViewLayout::SingleView);
      PluginFunctions::setActiveExaminer(0);
      break;
    case 1:
      coreWidget_->baseLayout_->setMode (QtMultiViewLayout::Grid);
      break;
    case 2:
      coreWidget_->baseLayout_->setMode (QtMultiViewLayout::HSplit);
      break;

    default:
907
      emit log(LOGERR,tr("Requested illegal multiview mode!"));
908 909 910 911 912 913
  }

}



Jan Möbius's avatar
 
Jan Möbius committed
914 915 916

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

917 918
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
919
{
920 921 922
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles").toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes").toStringList();
  
Jan Möbius's avatar
 
Jan Möbius committed
923
  for (int i = 0 ; i < recentFiles.size() ; ++i )
924
    if ( recentFiles[i] == _action->text() ){
Dirk Wilden's avatar
Dirk Wilden committed
925
        OpenFlipper::Options::loadingRecentFile(true);
926
        loadObject(typeId(recentTypes[i]), recentFiles[i]);
927
        coreWidget_->addRecent(recentFiles[i],typeId(recentTypes[i]) );
Dirk Wilden's avatar
Dirk Wilden committed
928
        OpenFlipper::Options::loadingRecentFile(false);
Dirk Wilden's avatar
Dirk Wilden committed
929
        return;
Jan Möbius's avatar
 
Jan Möbius committed
930 931 932 933
    }
}


934
void
Jan Möbius's avatar
 
Jan Möbius committed
935
Core::writeOnExit() {
936
  QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Jan Möbius's avatar
 
Jan Möbius committed
937 938 939 940
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.ini";

  INIFile ini;
  if ( ! ini.connect( inifile ,false) ) {
941
    emit log(LOGERR,tr("Failed to connect to users ini file"));
942

Jan Möbius's avatar
 
Jan Möbius committed
943
    if ( ! ini.connect( inifile,true) ) {
944
      emit log(LOGERR,tr("Can not create user ini file"));
Jan Möbius's avatar
 
Jan Möbius committed
945
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
946
      writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
947 948 949
      ini.disconnect();
    }
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
950
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
951
    ini.disconnect();
952 953
  }

Dirk Wilden's avatar
Dirk Wilden committed
954 955
  //store the windowState
  if ( OpenFlipper::Options::gui() ) {
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971

    QSettings windowStates(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                           OpenFlipper::Options::dirSeparator() +  "WindowStates.dat", QSettings::IniFormat);

    windowStates.setValue("Core/Window/State", coreWidget_->saveState ());
    windowStates.setValue("Core/Window/Geometry", coreWidget_->saveGeometry ());

    windowStates.setValue ("Core/ToolSplitter", coreWidget_->toolSplitter_->saveState ());
    windowStates.setValue ("Core/LogSplitter", coreWidget_->splitter_->saveState ());

    windowStates.beginGroup ("Core");
    windowStates.beginGroup ("LogSlider");
    coreWidget_->slidingLogger_->saveState (windowStates);
    windowStates.endGroup ();
    coreWidget_->toolBox_->saveState (windowStates);
    windowStates.endGroup ();
Dirk Wilden's avatar
Dirk Wilden committed
972 973
  }

Jan Möbius's avatar
 
Jan Möbius committed
974 975 976 977 978 979 980 981 982 983 984
  // Call exit for all plugins
   for (uint i = 0 ; i < plugins.size() ; ++i) {
      BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins[i].plugin);
      if ( basePlugin )
          if ( checkSlot( plugins[i].plugin , "exit()" ) )
            QMetaObject::invokeMethod(plugins[i].plugin, "exit",  Qt::DirectConnection);
   }
}

void Core::slotExit() {
  writeOnExit();
Dirk Wilden's avatar
Dirk Wilden committed
985 986 987 988

  if (logFile_)
    logFile_->close();

989
  OpenFlipper::Options::closeSettings();
Jan Möbius's avatar
 
Jan Möbius committed
990
  qApp->quit();
991
}
Jan Möbius's avatar
 
Jan Möbius committed
992

Dirk Wilden's avatar
Dirk Wilden committed
993 994 995
/// log to file
void Core::slotLogToFile(Logtype _type, QString _message){

Jan Möbius's avatar
Jan Möbius committed
996
  if (!OpenFlipperSettings().value("Core/Log/logFileEnabled",true).toBool() )
Dirk Wilden's avatar
Dirk Wilden committed
997 998 999
    return;

  if (logStream_ == 0){
1000 1001
    //check if a logfile has been specified and if the path is valid

Jan Möbius's avatar
Jan Möbius committed
1002 1003
    QString fileName = OpenFlipperSettings().value("Core/Log/logFile","").toString();
    QFileInfo fi( fileName );
1004

Jan Möbius's avatar
Jan Möbius committed
1005 1006 1007 1008
    if ( fileName == "" || !fi.dir().exists() ) {
      OpenFlipperSettings().setValue("Core/Log/logFile", QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                                                         OpenFlipper::Options::dirSeparator() +  "OpenFlipper.log");
    }
Dirk Wilden's avatar
Dirk Wilden committed
1009

Jan Möbius's avatar
Jan Möbius committed
1010
    logFile_ = new QFile( OpenFlipperSettings().value("Core/Log/logFile").toString() );
Dirk Wilden's avatar
Dirk Wilden committed
1011 1012
    if ( logFile_->open(QFile::WriteOnly) ) {
        logStream_ = new QTextStream (logFile_);
Jan Möbius's avatar
Jan Möbius committed
1013
    } else {
1014
      emit log(LOGERR, tr("Unable to open logfile!"));
Dirk Wilden's avatar
Dirk Wilden committed
1015 1016 1017
      return;
    }
  }
Jan Möbius's avatar
 
Jan Möbius committed
1018

Dirk Wilden's avatar
Dirk Wilden committed
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
  switch (_type) {
    case LOGINFO:
      (*logStream_) << "INFO:"; break;
    case LOGOUT:
      (*logStream_) << "OUT :"; break;
    case LOGWARN:
      (*logStream_) << "WARN:"; break;
    case LOGERR:
      (*logStream_) << "E