Core.cc 49.5 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),
Jan Möbius's avatar
 
Jan Möbius committed
123
  nextBackupId_(0),
124
  objectRoot_(0),
Jan Möbius's avatar
 
Jan Möbius committed
125
126
  coreWidget_(0)
{
127

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
160
161
  viewModes_.push_front(vm);

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

165
166
167
168
169
  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
170
171
172

  PluginFunctions::setViewerProperties(viewerProperties);

173
174
175
176
177
178
179
180
181
182
  //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
183
184
  // Get all relevant Paths and Options from option files
  setupOptions();
Jan Möbius's avatar
Jan Möbius committed
185

186
187
  // set discriptions for scriptable slots
  setDescriptions();
188
189
190
  
  // Initialize the build in dataTypes
  initializeTypes();
Jan Möbius's avatar
 
Jan Möbius committed
191
192
}

193
194
195
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
 
Jan Möbius committed
196
197
198
199
200
201
 * - 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
 */
202
203
204
void
Core::init() {

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

Jan Möbius's avatar
   
Jan Möbius committed
208
  PluginFunctions::setSceneGraphRootNode( root_node_scenegraph_ );
Dirk Wilden's avatar
Dirk Wilden committed
209

Jan Möbius's avatar
 
Jan Möbius committed
210
  // Initialize the first object as the root Object for the object tree
211
  objectRoot_ =  dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") );
Jan Möbius's avatar
 
Jan Möbius committed
212
  PluginFunctions::setDataRoot( objectRoot_ );
Jan Möbius's avatar
Jan Möbius committed
213
214
215
  
  // Bring up the object manager ( has to be done after the rootobject is created)
  connect(getObjectManager(),SIGNAL(newObject(int)), this ,SLOT(newObject(int)));
216

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

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

224
225
226
227
228
229
230
231
    // 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 ();
232

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

Jan Möbius's avatar
 
Jan Möbius committed
236
237
      splash_ = new QSplashScreen(splashPixmap);
      splash_->show();
238

239
      splash_->showMessage(tr("Initializing mainwindow") ,
Jan Möbius's avatar
 
Jan Möbius committed
240
241
242
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
243

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

Jan Möbius's avatar
 
Jan Möbius committed
246
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
247
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(loadObject()));
Jan Möbius's avatar
 
Jan Möbius committed
248
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
249
250
251
252
    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()));
253
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
254
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
255
256
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
257

258
259
260

    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
261
262
    connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
    connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
263
    connect( coreWidget_, SIGNAL( dragOpenFile(QString)), this, SLOT(loadObject(QString)));
264

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

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

Jan Möbius's avatar
Jan Möbius committed
269
270
271
272
273
274
275
276
277
278
279
280
    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
281
282
283
#ifdef ARCH_DARWIN
    width = rect.width() - 300;
    height = rect.height() - 150;
Jan Möbius's avatar
Jan Möbius committed
284

Jan Möbius's avatar
Jan Möbius committed
285
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
286
287
#endif

Jan Möbius's avatar
Jan Möbius committed
288
    coreWidget_->resize(width,height);
289
290
291

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

Jan Möbius's avatar
 
Jan Möbius committed
292
  }
293

Jan Möbius's avatar
 
Jan Möbius committed
294
295
296
297
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
298

Jan Möbius's avatar
 
Jan Möbius committed
299
300
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
301
302
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

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

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

Dirk Wilden's avatar
Dirk Wilden committed
309
310
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
311
312
313
314
315
316
317

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

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

Dirk Wilden's avatar
Dirk Wilden committed
319
320
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
321
322
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
323
324
325
    // 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
326
327
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
328
  }
329

Jan Möbius's avatar
 
Jan Möbius committed
330
331
332
333
334
335
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
336

Jan Möbius's avatar
 
Jan Möbius committed
337
  loggers_.push_back(newlog);
338

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

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

Jan Möbius's avatar
 
Jan Möbius committed
347
348
349
350
351
352
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
353

Jan Möbius's avatar
 
Jan Möbius committed
354
  loggers_.push_back(newlog);
355

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

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

Jan Möbius's avatar
 
Jan Möbius committed
364
365
366
367
368
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
369

Jan Möbius's avatar
 
Jan Möbius committed
370
  loggers_.push_back(newlog);
371

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

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

Jan Möbius's avatar
 
Jan Möbius committed
380
381
382
383
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
384

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

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

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

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

398
  
Jan Möbius's avatar
 
Jan Möbius committed
399
  // ======================================================================
400
  // Set up QtScript Environment
Jan Möbius's avatar
 
Jan Möbius committed
401
  // ======================================================================
402
  
Jan Möbius's avatar
Jan Möbius committed
403
404
405
  // Set a reference to the scriptengine for simple rpc calls
  RPC::setScriptEngine(&scriptEngine_);

Jan Möbius's avatar
 
Jan Möbius committed
406
407
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
408

Jan Möbius's avatar
 
Jan Möbius committed
409
410
411
412
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
413

Jan Möbius's avatar
 
Jan Möbius committed
414
  // Register Vector Type to ScriptEngine ( is Vec3d )
415
416
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
417
418
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
419

Jan Möbius's avatar
 
Jan Möbius committed
420
421
422
  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctor = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctor);
423
424


Jan Möbius's avatar
 
Jan Möbius committed
425
//    // Register ObjectId Type to ScriptEngine ( is int )
426
427
//   qScriptRegisterMetaType(&scriptEngine_,
//                           toScriptValueObjectId,
Jan Möbius's avatar
 
Jan Möbius committed
428
//                           fromScriptValueObjectId);
429
//
Jan Möbius's avatar
 
Jan Möbius committed
430
431
432
//   // set a constructor to allow creation via Vector(x,y,z)
//   ctor = scriptEngine_.newFunction(createObjectId);
//   scriptEngine_.globalObject().setProperty("ObjectId", ctor);
433
434


Jan Möbius's avatar
Jan Möbius committed
435
436
  // Register IdList Type to scripting Engine
  qScriptRegisterSequenceMetaType< IdList >(&scriptEngine_);
Jan Möbius's avatar
 
Jan Möbius committed
437
438

  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
439
440


Jan Möbius's avatar
 
Jan Möbius committed
441
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
442
443
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
444
445
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
446

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

Jan Möbius's avatar
 
Jan Möbius committed
451
452
453
454
455
456
457
  // Collect Core scripting information
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
458

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

Jan Möbius's avatar
 
Jan Möbius committed
461
462
463
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
464

Jan Möbius's avatar
 
Jan Möbius committed
465
466
467
    /// Skip all signals for function calls
    if ( checkSignal( this, it.name().toAscii() ) )
      continue;
468

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

Jan Möbius's avatar
 
Jan Möbius committed
471
  }
472

Jan Möbius's avatar
 
Jan Möbius committed
473
  loadPlugins();
474

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

Dirk Wilden's avatar
Dirk Wilden committed
477
478
479
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

480
481
482
    //get keyAssignments from config files
    restoreKeyBindings();

483
    if ( OpenFlipper::Options::defaultToolboxMode( ) != "" )
Jan Möbius's avatar
 
Jan Möbius committed
484
485
486
      coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() );
    else
      coreWidget_->setViewMode("All");
487

Jan Möbius's avatar
Jan Möbius committed
488
489
490
491
492
493
494
    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
495
496

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

499
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
500
               this, SIGNAL( pluginViewChanged() ) ,Qt::DirectConnection);
Jan Möbius's avatar
Jan Möbius committed
501
    }
502

Jan Möbius's avatar
 
Jan Möbius committed
503
  }
504

Jan Möbius's avatar
Jan Möbius committed
505
506
507
508
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================

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

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

Jan Möbius's avatar
Jan Möbius committed
518
519
    // Load global ini files. Use only plugin global options from these files as the
    // rest has been loaded at the beginning.
520
521
522
523
    readRecentFiles( optionFiles[i] );
    if ( OpenFlipper::Options::gui() )
      coreWidget_->updateRecent();

Jan Möbius's avatar
Jan Möbius committed
524
    openIniFile( optionFiles[i] ,false,true,false);
Jan Möbius's avatar
 
Jan Möbius committed
525
526
  }

Jan Möbius's avatar
Jan Möbius committed
527
528
529
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================
530

Jan Möbius's avatar
 
Jan Möbius committed
531
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
532
    emit log(LOGWARN,tr("UTF8-Locale used!"));
Jan Möbius's avatar
Jan Möbius committed
533
534
535
536
//     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.");
537
  }
Jan Möbius's avatar
 
Jan Möbius committed
538
539

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

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

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
544
545
    //try to restore the windowState
    coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
546
    //try to restore the geometry
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
547
    coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
548

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

Jan Möbius's avatar
 
Jan Möbius committed
552
    coreWidget_->show();
553

554
555
    applyOptions();

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
556
557
558
559
560
561
562
    windowStates.beginGroup ("Core");
    windowStates.beginGroup ("LogSlider");
    coreWidget_->slidingLogger_->restoreState (windowStates);
    windowStates.endGroup ();
    coreWidget_->toolBox_->restoreState (windowStates);
    windowStates.endGroup ();

563
    if ( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
Jan Möbius's avatar
 
Jan Möbius committed
564
565
      splash_->finish(coreWidget_);
    }
566

567
568
569
    // start checking for scenegraph changes
    scenegraphCheckTimer_->setInterval (1000 / OpenFlipper::Options::maxFrameRate());
    scenegraphCheckTimer_->start ();
Jan Möbius's avatar
 
Jan Möbius committed
570
  }
571

Jan Möbius's avatar
Jan Möbius committed
572
573

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

576

Jan Möbius's avatar
 
Jan Möbius committed
577
578
579
580
581
582
//-----------------------------------------------------------------------------

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

Jan Möbius's avatar
 
Jan Möbius committed
584
585
586
587
588
     // 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);
  }
589

590
591
592
593
594
  // Delete the objectRoot if it was constructed
  if ( objectRoot_ != 0 ) {
    objectRoot_->deleteSubtree();
    delete objectRoot_;
  }
595

Jan Möbius's avatar
 
Jan Möbius committed
596
  // Clean up loggers
597
598
599
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
 
Jan Möbius committed
600
601
602
603
604
605
606
}

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

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

Jan Möbius's avatar
Jan Möbius committed
611
612
613
614
615
616
617
618
619
  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;
620
        if ( OpenFlipper::Options::doSlotDebugging() )
621
              emit log(LOGINFO,tr("slotMouseEventIdentify from examiner ") + QString::number(i) );
Jan Möbius's avatar
Jan Möbius committed
622
623
624
625
626
627
628
629