Core.cc 79.7 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
67
68
69





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


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

// -------------------- mview
#include "Core.hh"
// -------------------- ACG

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

Jan Möbius's avatar
Jan Möbius committed
70
71
72
73
74
#if QT_VERSION >= 0x050000
#else
 #undef QT_NO_OPENGL
 #include <QGLFormat>
#endif
Jan Möbius's avatar
   
Jan Möbius committed
75
76
77
78
79
80
81
82
83
84

#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/INIInterface.hh"

#include <OpenFlipper/common/RecentFiles.hh>

Jan Möbius's avatar
   
Jan Möbius committed
85
#include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
Jan Möbius's avatar
   
Jan Möbius committed
86

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

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

91
92
#include <OpenFlipper/common/BaseObjectCore.hh>
#include <OpenFlipper/common/TypesInternal.hh>
Jan Möbius's avatar
Jan Möbius committed
93

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

Jan Möbius's avatar
   
Jan Möbius committed
96
97
98
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

99
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
   
Jan Möbius committed
100
101

/** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2)
102
 *
Jan Möbius's avatar
   
Jan Möbius committed
103
104
105
106
107
108
109
110
111
 * 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(),
112
  capture_(false),
113
  processManager_(0),
Jan Möbius's avatar
   
Jan Möbius committed
114
  nextBackupId_(0),
Dirk Wilden's avatar
Dirk Wilden committed
115
  nextBackupGroupId_(0),
116
  objectRoot_(0),
Jan Möbius's avatar
   
Jan Möbius committed
117
118
  coreWidget_(0)
{
119

Dirk Wilden's avatar
Dirk Wilden committed
120
121
122
123
  //init logFile
  logStream_ = 0;
  logFile_ = 0;

Dirk Wilden's avatar
Dirk Wilden committed
124
125
  //init nodes
  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
Jan Möbius's avatar
Jan Möbius committed
126
  
127
  // init global data node
Jan Möbius's avatar
Jan Möbius committed
128
  root_node_scenegraph_global_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_ , "SceneGraph Rendered Root Node");
129
  
Jan Möbius's avatar
Jan Möbius committed
130
  // This separator will manage the cores nodes
131
  core_nodes_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Core Nodes");
Jan Möbius's avatar
Jan Möbius committed
132
133
134
135
  
  // 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
136
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
Jan Möbius's avatar
Jan Möbius committed
137
  
Jan Möbius's avatar
Jan Möbius committed
138
  // Separator handling the nodes for data
139
  dataSeparatorNode_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_global_, "Data Separator Root Node");
Jan Möbius's avatar
Jan Möbius committed
140
  
Jan Möbius's avatar
Jan Möbius committed
141
  // Separator handling the nodes for data
Jan Möbius's avatar
Jan Möbius committed
142
  dataRootNode_      = new ACG::SceneGraph::SeparatorNode(dataSeparatorNode_, "Data Root Node");
Dirk Wilden's avatar
Dirk Wilden committed
143

Jan Möbius's avatar
   
Jan Möbius committed
144
145
146
   // Add ViewMode All
  ViewMode* vm = new ViewMode();
  vm->name = "All";
Jan Möbius's avatar
Jan Möbius committed
147
  vm->icon = "viewmode_all.png";
Jan Möbius's avatar
   
Jan Möbius committed
148
  vm->custom = false;
Jan Möbius's avatar
Jan Möbius committed
149
  vm->visibleToolboxes = QStringList();
150

Jan Möbius's avatar
   
Jan Möbius committed
151
152
  viewModes_.push_front(vm);

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

156
  for (int i=0; i < 4; i++) {
157
    Viewer::ViewerProperties* viewerProperty = new Viewer::ViewerProperties(i);
158
159
160
    viewerProperty->snapshotBaseFileName("snap-Viewer-" + QString::number(i) + ".png");
    viewerProperties.push_back( viewerProperty );
  }
Dirk Wilden's avatar
Dirk Wilden committed
161
162
163

  PluginFunctions::setViewerProperties(viewerProperties);

164
165
166
167
168
169
  //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
170
171
  // Get all relevant Paths and Options from option files
  setupOptions();
Jan Möbius's avatar
Jan Möbius committed
172

173
174
  // set discriptions for scriptable slots
  setDescriptions();
175
176
177
  
  // Initialize the build in dataTypes
  initializeTypes();
Dirk Wilden's avatar
Dirk Wilden committed
178
179
180
  
  // Initialize the build in updateTypes
  initializeUpdateTypes();
Jan Möbius's avatar
   
Jan Möbius committed
181
182
}

183
184
185
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
   
Jan Möbius committed
186
187
188
189
190
191
 * - 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
 */
192
193
void
Core::init() {
Jan Möbius's avatar
Jan Möbius committed
194
195
196
  
  // Check library versions
  checkLibraryVersions();
197

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

201
  // Topmost node of the scenegraph
Jan Möbius's avatar
   
Jan Möbius committed
202
  PluginFunctions::setSceneGraphRootNode( root_node_scenegraph_ );
203
204
205
206
  
  // 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
207

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

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

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

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

245
246
247
248
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxScrollArea());
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxArea());
    spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolbox());

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

261
262
263

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

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

Dirk Wilden's avatar
Dirk Wilden committed
270
    connect(coreWidget_, SIGNAL(call(QString,bool&)), this, SLOT(slotCall(QString,bool&)));
271
272
    
    connect( coreWidget_->logWidget_->openMeshFilterAction_,SIGNAL(toggled(bool)), this, SLOT(enableOpenMeshErrorLog(bool)) );
Dirk Wilden's avatar
Dirk Wilden committed
273

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

Jan Möbius's avatar
Jan Möbius committed
290
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
291
292
#endif

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

Dirk Wilden's avatar
Dirk Wilden committed
295
296
297
298
299
    #ifdef DEBUG
      coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() + " [DEBUG]" );
    #else
      coreWidget_->setWindowTitle( OpenFlipper::Options::windowTitle() );
    #endif
300

Jan Möbius's avatar
Jan Möbius committed
301
302
303
    // Sanity check for OpenGL capabilities!
    checkOpenGLCapabilities();

Jan Möbius's avatar
   
Jan Möbius committed
304
  }
305

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

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

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

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

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

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

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

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

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

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

Jan Möbius's avatar
   
Jan Möbius committed
349
  loggers_.push_back(newlog);
350

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

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

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

Jan Möbius's avatar
   
Jan Möbius committed
366
  loggers_.push_back(newlog);
367

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

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

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

Jan Möbius's avatar
   
Jan Möbius committed
382
  loggers_.push_back(newlog);
383

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

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

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

Jan Möbius's avatar
   
Jan Möbius committed
397
  loggers_.push_back(newlog);
398

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

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

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

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

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

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
  // Register print to file function :
  QScriptValue printToFileFunc = scriptEngine_.newFunction(printToFileFunction);
  scriptEngine_.globalObject().setProperty("printToFile", printToFileFunc);
431
  scriptingFunctions_.push_back( "-.printToFile(QString,QString)" );
432

Jan Möbius's avatar
Jan Möbius committed
433
434
435
436
437
438
  // Register help function :
  QScriptValue helpFunc = scriptEngine_.newFunction(helpFunction);
  helpFunc.setProperty("core",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("help", helpFunc);
  scriptingFunctions_.push_back( "-.help(QString)" );

439
440
441
442
443
444
445
446
447
  // 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 )
  //==========================================================================
448
449
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
   
Jan Möbius committed
450
451
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
452
                          
Jan Möbius's avatar
   
Jan Möbius committed
453
  // set a constructor to allow creation via Vector(x,y,z)
Jan Möbius's avatar
Jan Möbius committed
454
455
456
457
458
459
460
  QScriptValue ctorVec3 = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctorVec3);

  //==========================================================================
  // Register the 4d Vector Type to the core ( is Vec4d )
  //==========================================================================
  qScriptRegisterMetaType(&scriptEngine_,
461
462
                          toScriptValueVector4,
                          fromScriptValueVector4,
Jan Möbius's avatar
Jan Möbius committed
463
464
465
466
467
                          scriptEngine_.newQObject(&vec4dPrototype_));

  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctorVec4 = scriptEngine_.newFunction(createVector4);
  scriptEngine_.globalObject().setProperty("Vector4", ctorVec4);
468
469
470
471
                          
  //==========================================================================
  // Register the DataType Class to the core
  //==========================================================================
472

473
  // Register DataType in QScriptEngine
474
  qScriptRegisterMetaType<DataType>(&scriptEngine_,
475
476
477
478
479
                          toScriptValueDataType,
                          fromScriptValueDataType,
                          scriptEngine_.newQObject(&DataTypePrototype_));
                          
  // set a constructor to allow creation via DataType(uint)
480
481
482
483
484
485
  QScriptValue dataTypector = scriptEngine_.newFunction(createDataType);
  scriptEngine_.globalObject().setProperty("DataType", dataTypector);     
  
  //==========================================================================
  // Register the Matrix Class to the core
  //==========================================================================
486

Jan Möbius's avatar
   
Jan Möbius committed
487
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
488
489
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
   
Jan Möbius committed
490
491
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
492

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

497
498
499
500
  //==========================================================================
  //  Collect Core scripting information
  //==========================================================================

Jan Möbius's avatar
   
Jan Möbius committed
501
502
503
504
505
506
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
507

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

Jan Möbius's avatar
   
Jan Möbius committed
510
511
512
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
513

Jan Möbius's avatar
   
Jan Möbius committed
514
    /// Skip all signals for function calls
515
    if ( checkSignal( this, it.name().toLatin1() ) )
Jan Möbius's avatar
   
Jan Möbius committed
516
      continue;
517

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

Jan Möbius's avatar
   
Jan Möbius committed
520
  }
521

Jan Möbius's avatar
   
Jan Möbius committed
522
  loadPlugins();
523

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

Dirk Wilden's avatar
Dirk Wilden committed
526
527
528
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

529
530
531
    //get keyAssignments from config files
    restoreKeyBindings();

Jan Möbius's avatar
Marlin:    
Jan Möbius committed
532
533
    if ( OpenFlipper::Options::currentViewMode( ) != "" )
      coreWidget_->setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
   
Jan Möbius committed
534
535
    else
      coreWidget_->setViewMode("All");
536

537
    // Set the renderer to the one stored in the settings or to default
538
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
Jan Möbius's avatar
Jan Möbius committed
539
540
541
542
      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
543
544
      connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventLight(QMouseEvent*)),
              this                              , SLOT(slotMouseEventLight(QMouseEvent*)));
Jan Möbius's avatar
Jan Möbius committed
545
546
      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
547
548

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

551
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
552
               coreWidget_->examiner_widgets_[i], SLOT( updateGL() ) ,Qt::DirectConnection);
553

Jan Möbius's avatar
Jan Möbius committed
554
555
556
      // Set post processor
      PostProcessorDialog::loadSavedPostProcessors(i);

557
558
559
560
561
      // ====================================================
      // Set renderer
      // ====================================================

      QString defaultRendererKey  = "Viewer" + QString::number(i)+"/DefaultRenderer";
562
      QString defaultRendererName = OpenFlipperSettings().value(defaultRendererKey,"Default Classical Renderer Plugin").toString();
563
564
565
566
567
568
569
570

      // 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
571
        defaultRendererId = renderManager().getRendererId("Default Classical Renderer Plugin");
572
573
574
575
576
577

        // 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!"));
578