Core.cc 48.8 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
103
104
105
#include <OpenMesh/Core/System/omstream.hh>

#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

106
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
107
108

/** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2)
109
 *
Jan Möbius's avatar
 
Jan Möbius committed
110
111
112
113
114
115
116
117
118
 * 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(),
119
  capture_(false),
Jan Möbius's avatar
 
Jan Möbius committed
120
121
122
  nextBackupId_(0),
  coreWidget_(0)
{
Dirk Wilden's avatar
Dirk Wilden committed
123
124
125
126
127
  //init logFile
  logStream_ = 0;
  logFile_ = 0;
  OpenFlipper::Options::logFileEnabled(true);

Dirk Wilden's avatar
Dirk Wilden committed
128
129
  //init nodes
  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
Jan Möbius's avatar
Jan Möbius committed
130
131
132
133
134
135
136
  
  // 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
137
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
Jan Möbius's avatar
Jan Möbius committed
138
139
140
141
142
143
144
145
146
  
  // 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");
147
//   gridNode_->hide();
Dirk Wilden's avatar
Dirk Wilden committed
148

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

Jan Möbius's avatar
 
Jan Möbius committed
156
157
  viewModes_.push_front(vm);

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

161
162
163
164
165
  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
166
167
168

  PluginFunctions::setViewerProperties(viewerProperties);

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

182
183
  // set discriptions for scriptable slots
  setDescriptions();
184
185
186
  
  // Initialize the build in dataTypes
  initializeTypes();
Jan Möbius's avatar
 
Jan Möbius committed
187
188
}

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
206
  // Initialize the first object as the root Object for the object tree
207
  objectRoot_ =  dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") );
Jan Möbius's avatar
 
Jan Möbius committed
208
209
  PluginFunctions::setDataRoot( objectRoot_ );

210

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

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

218
219
220
221
222
223
224
225
    // 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 ();
226

Jan Möbius's avatar
 
Jan Möbius committed
227
228
    if ( OpenFlipper::Options::splash() ) {
      QPixmap splashPixmap(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "splash.png");
229

Jan Möbius's avatar
 
Jan Möbius committed
230
231
      splash_ = new QSplashScreen(splashPixmap);
      splash_->show();
232

233
      splash_->showMessage(tr("Initializing mainwindow") ,
Jan Möbius's avatar
 
Jan Möbius committed
234
235
236
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
237

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

Jan Möbius's avatar
 
Jan Möbius committed
240
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
241
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(loadObject()));
Jan Möbius's avatar
 
Jan Möbius committed
242
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
243
244
245
246
    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()));
247
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
248
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
249
250
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
251

252
253
254

    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
255
256
    connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
    connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
257

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

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

Jan Möbius's avatar
Jan Möbius committed
262
263
264
265
266
267
268
269
270
271
272
273
    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
274
275
276
#ifdef ARCH_DARWIN
    width = rect.width() - 300;
    height = rect.height() - 150;
Jan Möbius's avatar
Jan Möbius committed
277

Jan Möbius's avatar
Jan Möbius committed
278
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
279
280
#endif

Jan Möbius's avatar
Jan Möbius committed
281
    coreWidget_->resize(width,height);
282
283
284

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

Jan Möbius's avatar
 
Jan Möbius committed
285
  }
286

Jan Möbius's avatar
 
Jan Möbius committed
287
288
289
290
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
291

Jan Möbius's avatar
 
Jan Möbius committed
292
293
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
294
295
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

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

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

Dirk Wilden's avatar
Dirk Wilden committed
302
303
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
304
305
306
307
308
309
310

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

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

Dirk Wilden's avatar
Dirk Wilden committed
312
313
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
314
315
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
316
317
318
    // 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
319
320
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
321
  }
322

Jan Möbius's avatar
 
Jan Möbius committed
323
324
325
326
327
328
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
329

Jan Möbius's avatar
 
Jan Möbius committed
330
  loggers_.push_back(newlog);
331

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

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

Jan Möbius's avatar
 
Jan Möbius committed
340
341
342
343
344
345
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
346

Jan Möbius's avatar
 
Jan Möbius committed
347
  loggers_.push_back(newlog);
348

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

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

Jan Möbius's avatar
 
Jan Möbius committed
357
358
359
360
361
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
362

Jan Möbius's avatar
 
Jan Möbius committed
363
  loggers_.push_back(newlog);
364

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

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

Jan Möbius's avatar
 
Jan Möbius committed
373
374
375
376
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
377

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

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

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

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

391
  
Jan Möbius's avatar
 
Jan Möbius committed
392
  // ======================================================================
393
  // Set up QtScript Environment
Jan Möbius's avatar
 
Jan Möbius committed
394
  // ======================================================================
395
  
Jan Möbius's avatar
Jan Möbius committed
396
397
398
  // Set a reference to the scriptengine for simple rpc calls
  RPC::setScriptEngine(&scriptEngine_);

Jan Möbius's avatar
 
Jan Möbius committed
399
400
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
401

Jan Möbius's avatar
 
Jan Möbius committed
402
403
404
405
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
406

Jan Möbius's avatar
 
Jan Möbius committed
407
  // Register Vector Type to ScriptEngine ( is Vec3d )
408
409
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
410
411
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
412

Jan Möbius's avatar
 
Jan Möbius committed
413
414
415
  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctor = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctor);
416
417


Jan Möbius's avatar
 
Jan Möbius committed
418
//    // Register ObjectId Type to ScriptEngine ( is int )
419
420
//   qScriptRegisterMetaType(&scriptEngine_,
//                           toScriptValueObjectId,
Jan Möbius's avatar
 
Jan Möbius committed
421
//                           fromScriptValueObjectId);
422
//
Jan Möbius's avatar
 
Jan Möbius committed
423
424
425
//   // set a constructor to allow creation via Vector(x,y,z)
//   ctor = scriptEngine_.newFunction(createObjectId);
//   scriptEngine_.globalObject().setProperty("ObjectId", ctor);
426
427


Jan Möbius's avatar
 
Jan Möbius committed
428
429
430
431
  // Register idList Type to scripting Engine
  qScriptRegisterSequenceMetaType< idList >(&scriptEngine_);

  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
432
433


Jan Möbius's avatar
 
Jan Möbius committed
434
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
435
436
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
437
438
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
439

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

Jan Möbius's avatar
 
Jan Möbius committed
444
445
446
447
448
449
450
  // Collect Core scripting information
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
451

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

Jan Möbius's avatar
 
Jan Möbius committed
454
455
456
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
457

Jan Möbius's avatar
 
Jan Möbius committed
458
459
460
    /// Skip all signals for function calls
    if ( checkSignal( this, it.name().toAscii() ) )
      continue;
461

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

Jan Möbius's avatar
 
Jan Möbius committed
464
  }
465

Jan Möbius's avatar
 
Jan Möbius committed
466
  loadPlugins();
467

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

Dirk Wilden's avatar
Dirk Wilden committed
470
471
472
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

473
474
475
    //get keyAssignments from config files
    restoreKeyBindings();

476
    if ( OpenFlipper::Options::defaultToolboxMode( ) != "" )
Jan Möbius's avatar
 
Jan Möbius committed
477
478
479
      coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() );
    else
      coreWidget_->setViewMode("All");
480

Jan Möbius's avatar
Jan Möbius committed
481
482
483
484
485
486
487
    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
488
489

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

492
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
493
               this, SIGNAL( pluginViewChanged() ) ,Qt::DirectConnection);
Jan Möbius's avatar
Jan Möbius committed
494
    }
495

Jan Möbius's avatar
 
Jan Möbius committed
496
  }
497

Jan Möbius's avatar
Jan Möbius committed
498
499
500
501
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================

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

Jan Möbius's avatar
 
Jan Möbius committed
505
    if ( OpenFlipper::Options::gui() && OpenFlipper::Options::splash() ) {
506
      splash_->showMessage(tr("Loading Configuration File ") + QString::number(i) + "/"  + QString::number(optionFiles.size()) ,
Jan Möbius's avatar
 
Jan Möbius committed
507
508
509
                           Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
510

Jan Möbius's avatar
Jan Möbius committed
511
512
    // Load global ini files. Use only plugin global options from these files as the
    // rest has been loaded at the beginning.
513
514
515
516
    readRecentFiles( optionFiles[i] );
    if ( OpenFlipper::Options::gui() )
      coreWidget_->updateRecent();

Jan Möbius's avatar
Jan Möbius committed
517
    openIniFile( optionFiles[i] ,false,true,false);
Jan Möbius's avatar
 
Jan Möbius committed
518
519
  }

Jan Möbius's avatar
Jan Möbius committed
520
521
522
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================
523

Jan Möbius's avatar
 
Jan Möbius committed
524
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
525
    emit log(LOGWARN,tr("UTF8-Locale used!"));
Jan Möbius's avatar
Jan Möbius committed
526
527
528
529
//     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.");
530
  }
Jan Möbius's avatar
 
Jan Möbius committed
531
532

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

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

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
537
538
    //try to restore the windowState
    coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
539
    //try to restore the geometry
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
540
    coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
541

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

Jan Möbius's avatar
 
Jan Möbius committed
545
    coreWidget_->show();
546

547
548
    applyOptions();

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
549
550
551
552
553
554
555
    windowStates.beginGroup ("Core");
    windowStates.beginGroup ("LogSlider");
    coreWidget_->slidingLogger_->restoreState (windowStates);
    windowStates.endGroup ();
    coreWidget_->toolBox_->restoreState (windowStates);
    windowStates.endGroup ();

Jan Möbius's avatar
 
Jan Möbius committed
556
557
558
    if ( OpenFlipper::Options::splash() ) {
      splash_->finish(coreWidget_);
    }
559

560
561
562
    // start checking for scenegraph changes
    scenegraphCheckTimer_->setInterval (1000 / OpenFlipper::Options::maxFrameRate());
    scenegraphCheckTimer_->start ();
Jan Möbius's avatar
 
Jan Möbius committed
563
  }
564

Jan Möbius's avatar
Jan Möbius committed
565
566

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

569

Jan Möbius's avatar
 
Jan Möbius committed
570
571
572
573
574
575
//-----------------------------------------------------------------------------

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

Jan Möbius's avatar
 
Jan Möbius committed
577
578
579
580
581
     // 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);
  }
582

Jan Möbius's avatar
 
Jan Möbius committed
583
584
  objectRoot_->deleteSubtree();
  delete objectRoot_;
585

Jan Möbius's avatar
 
Jan Möbius committed
586
  // Clean up loggers
587
588
589
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
 
Jan Möbius committed
590
591
592
593
594
595
596
}

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

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

Jan Möbius's avatar
Jan Möbius committed
601
602
603
604
605
606
607
608
609
  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;
610
        if ( OpenFlipper::Options::doSlotDebugging() )
611
              emit log(LOGINFO,tr("slotMouseEventIdentify from examiner ") + QString::number(i) );
Jan Möbius's avatar
Jan Möbius committed
612
613
614
615
616
617
618
619
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
620
  emit PluginMouseEventIdentify( _event );
Jan Möbius's avatar
Jan Möbius committed
621
622


Jan Möbius's avatar
 
Jan Möbius committed
623
624
625
626
627
628
629
630
}

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


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

Jan Möbius's avatar
Jan Möbius committed
635
636
637
638
639
640
641
642
643
  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;
644
        if ( OpenFlipper::Options::doSlotDebugging() ) {
645
          QString message = tr("slotMouseEvent from examiner ") + QString::number(i) + " with ";
646
647
648
649
650
651
652
653
654
655

          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
656
            message += tr("unknown event type");
657
658
659
660

          emit log(LOGINFO,message );
        }

Jan Möbius's avatar
Jan Möbius committed
661
        break;
662

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

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
670
671
672
673
674
675
676
677
  emit PluginMouseEvent(_event );
}

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

void
Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
{
Jan Möbius's avatar
Jan Möbius committed
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  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
695
696
697
698
699
700
701
702
  emit PluginWheelEvent(_event , _mode );
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
705
706
707
708
709
710
}

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
715
716
717
718
719
720
721
}

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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
722
723
724
725

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
726
        emit log(LOGINFO,tr("updateView() called by ") + QString( sender()->metaObject()->className() ) );
Jan Möbius's avatar
Jan Möbius committed
727
728
729
730
      }
    }
  }

Dirk Wilden's avatar
Dirk Wilden committed
731
732
733
  if ( !OpenFlipper::Options::gui() )
    return;

734
  if ( OpenFlipper::Options::restrictFrameRate() ) {
735

736
    int elapsed = redrawTime_->elapsed ();
737

738
739
    if ( elapsed < 1000 / OpenFlipper::Options::maxFrameRate() )
    {
Jan Möbius's avatar
Jan Möbius committed
740
741
742
      // redraw time not reached ... waiting for timer event for next redraw
      if ( redrawTimer_->isActive() ) {
        if ( OpenFlipper::Options::doSlotDebugging() )
743
          emit log(LOGINFO,tr("Too early for redraw! Delaying request from ") +
Jan Möbius's avatar
Jan Möbius committed
744
745
746
747
748
749
750
                           QString( sender()->metaObject()->className() ) );
        return;
      }

      // Start the timer
      redrawTimer_->start( (1000 / OpenFlipper::Options::maxFrameRate()) - elapsed);
      return;
Jan Möbius's avatar
Jan Möbius committed
751
    }
752
753
    else if ( redrawTimer_->isActive() )
	redrawTimer_->stop ();
754
755
756

  }

757
  redrawTime_->restart ();
758

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

761
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
Jan Möbius committed
762
      coreWidget_->examiner_widgets_[i]->updateGL();
Jan Möbius's avatar
 
Jan Möbius committed
763
764
765
  }
}

Jan Möbius's avatar
Jan Möbius committed
766
767


768
769
770
771
772
773
774
//-----------------------------------------------------------------------------

 /** Check if scenegraph is dirty and initiate redraw
  */
void Core::checkScenegraphDirty() {
  if ( true )
  {
775
    // This is a single pass traversal as we only need to check if there is still one node dirty in the graph
776
777
    ACG::SceneGraph::CheckDirtyAction action;
    ACG::SceneGraph::traverse( root_node_scenegraph_, action );
778
779
    
    // If the scenegraph is dirty, we have to redraw
780
781
782
783
784
    if ( action.isDirty () )
      emit updateView ();
  }
}

Jan Möbius's avatar
 
Jan Möbius committed
785
786
//-----------------------------------------------------------------------------

787
788
789
790
791
792
793
794
795
void Core::restrictFrameRate( bool _enable ) {
  OpenFlipper::Options::restrictFrameRate( _enable );
}

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

void Core::setMaxFrameRate( int _rate ) {
  OpenFlipper::Options::maxFrameRate( _rate );
  OpenFlipper::Options::restrictFrameRate( true );
796
797
798

  // update Timer to new framerate
  scenegraphCheckTimer_->setInterval (1000 / OpenFlipper::Options::maxFrameRate());
799
800
801
802
}

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

803
804
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
805
{
806
807
808

  slotDeleteAllObjects();

Jan Möbius's avatar
Jan Möbius committed
809
  emit allCleared();
810

Jan Möbius's avatar
 
Jan Möbius committed
811
812
813
814
815
  slotScriptInfo( "core" , "clearAll()"  );
}

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

816
817
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
818
819
820
821
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
822

Jan Möbius's avatar
 
Jan Möbius committed
823
824
825
826
827
  QApplication::quit();
}

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

828
829
830
831
832
833
834
void Core::fullscreen( bool _state ) {
  if ( OpenFlipper::Options::gui() )
    coreWidget_->setFullscreen(_state);
}

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

Jan Möbius's avatar
Jan Möbius committed
835
836
void Core::loggerState(int _state) {
  OpenFlipper::Options::LoggerState state = static_cast<OpenFlipper::Options::LoggerState> (_state);
837
  if ( OpenFlipper::Options::gui() &&
Jan Möbius's avatar
Jan Möbius committed
838
839
840
841
       (state == OpenFlipper::Options::Hidden ||
        state == OpenFlipper::Options::InScene ||
        state == OpenFlipper::Options::Normal))
    coreWidget_->showLogger(state);
Jan Möbius's avatar
 
Jan Möbius committed
842
843
844
845
}

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

846
void Core::showToolbox( bool _state ) {
847
  if ( OpenFlipper::Options::gui() )
848
    coreWidget_->showToolbox(_state);
Jan Möbius's avatar
 
Jan Möbius committed
849
}
850

851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
void Core::multiViewMode( int _mode ) {
  if ( !OpenFlipper::Options::gui() || !OpenFlipper::Options::multiView() )
    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:
869
      emit log(LOGERR,tr("Requested illegal multiview mode!"));
870
871
872
873
874
875
  }

}



Jan Möbius's avatar
 
Jan Möbius committed
876
877
878

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

879
880
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
881
882
883
884
{
  QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles();
  for (int i = 0 ; i < recentFiles.size() ; ++i )
    if ( recentFiles[i].filename == _action->text() ){
885
      if (recentFiles[i].type == DATA_UNKNOWN)
Dirk Wilden's avatar
Dirk Wilden committed
886
        loadSettings( recentFiles[i].filename );
Dirk Wilden's avatar
Dirk Wilden committed
887
888
      else{
        OpenFlipper::Options::loadingRecentFile(true);
Dirk Wilden's avatar
Dirk Wilden committed
889
        loadObject(recentFiles[i].type, recentFiles[i].filename);
Dirk Wilden's avatar
Dirk Wilden committed
890
891
        OpenFlipper::Options::loadingRecentFile(false);
      }
Jan Möbius's avatar
 
Jan Möbius committed
892
893
894
895
896
      break;
    }
}


897
void
Jan Möbius's avatar
 
Jan Möbius committed
898
Core::writeOnExit() {
899
  QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Jan Möbius's avatar
 
Jan Möbius committed
900
901
902
903
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.ini";

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

Jan Möbius's avatar
 
Jan Möbius committed
906
    if ( ! ini.connect( inifile,true) ) {
907
      emit log(LOGERR,tr("Can not create user ini file"));
Jan Möbius's avatar
 
Jan Möbius committed
908
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
909
      writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
910
911
912
      ini.disconnect();
    }
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
913
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
914
    ini.disconnect();
915
916
  }

Dirk Wilden's avatar
Dirk Wilden committed
917
918
  //store the windowState
  if ( OpenFlipper::Options::gui() ) {
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934

    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
935
936
  }

Jan Möbius's avatar
 
Jan Möbius committed
937
938
939
940
941
942
943
944
945
946
947
  // 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
948
949
950
951

  if (logFile_)
    logFile_->close();

Jan Möbius's avatar
 
Jan Möbius committed
952
  qApp->quit();
953
}
Jan Möbius's avatar
 
Jan Möbius committed
954

Dirk Wilden's avatar
Dirk Wilden committed
955
956
957
958
959
960
961
/// log to file
void Core::slotLogToFile(Logtype _type, QString _message){

  if (!OpenFlipper::Options::logFileEnabled())
    return;

  if (logStream_ == 0){
962
963
964
965
966
    //check if a logfile has been specified and if the path is valid

    QFileInfo fi( OpenFlipper::Options::logFile() );

    if (OpenFlipper::Options::logFile() == "" || !fi.dir().exists() )
967
        OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Dirk Wilden's avatar
Dirk Wilden committed
968
969
970
971
972
973
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.log");

    logFile_ = new QFile( OpenFlipper::Options::logFile() );
    if ( logFile_->open(QFile::WriteOnly) ) {
        logStream_ = new QTextStream (logFile_);
    }else{
974
      emit log(LOGERR, tr("Unable to open logfile!"));
Dirk Wilden's avatar
Dirk Wilden committed
975
976
977
      return;
    }
  }
Jan Möbius's avatar
 
Jan Möbius committed
978

Dirk Wilden's avatar
Dirk Wilden committed
979
980
981
982
983
984
985
986
987
988
989
990
  switch (_type) {
    case LOGINFO:
      (*logStream_) << "INFO:"; break;
    case LOGOUT:
      (*logStream_) << "OUT :"; break;
    case LOGWARN:
      (*logStream_) << "WARN:"; break;
    case LOGERR:
      (*logStream_) << "ERR :"; break;
  }

  (*logStream_) << _message << "\n" << flush;
991

Dirk Wilden's avatar
Dirk Wilden committed
992
}
Jan Möbius's avatar
 
Jan Möbius committed
993

994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
/// set descriptions for a scriptable slot
void Core::slotSetSlotDescription(QString      _slotName,   QString _slotDescription,
                              QStringList _parameters, QStringList _descriptions)
{
  //handle core slots
  if (sender() == this){
    SlotInfo info;
    info.slotName = _slotName;
    info.slotDescription = _slotDescription;
    info.parameters = _parameters;
    info.descriptions = _descriptions;

    coreSlots_.push_back( info );
    return;
  }

  //handle plugin slots

  //find plugin
 PluginInfo* pluginInfo = 0;

  for (uint i=0; i < plugins.size(); i++)
    if (plugins[i].plugin == sender())
      pluginInfo = &plugins[i];

Jan Möbius's avatar
Jan Möbius committed
1019
    if (pluginInfo == 0){
1020
      emit log(LOGERR, tr("Unable to set slot-description. Plugin not found!"));
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
    return;
  }

  SlotInfo info;
  info.slotName = _slotName;
  info.slotDescription = _slotDescription;
  info.parameters = _parameters;
  info.descriptions = _descriptions;

  pluginInfo->slotInfos.append( info );
}

/// get available Descriptions for a scriptable slot
void Core::slotGetDescription(QString      _function,   QString&     _fnDescription,
                              QStringList& _parameters, QStringList& _descriptions )
{
  QString pluginName = _function.section(".", 0, 0);
  QString slotName   = _function.section(".", 1, 1);

  //handle core slots
  if (pluginName == "core"){

    _fnDescription = "";
    _parameters.clear();
    _descriptions.clear();

    for (int i=0; i < coreSlots_.count(); i++)
      if (coreSlots_[i].slotName == slotName){
      _fnDescription = coreSlots_[i].slotDescription;
      _parameters    = coreSlots_[i].parameters;
      _descriptions  = coreSlots_[i].descriptions;
      return;
      }
    return;
  }

  //handle plugin slots

  //find plugin
  PluginInfo* pluginInfo = 0;

  for (uint i=0; i < plugins.size(); i++)
    if (plugins[i].rpcName == pluginName)
      pluginInfo = &plugins[i];

  if (pluginInfo == 0){
1067
    emit log(LOGERR, tr("Unable to get slot-description. Plugin not found!"));
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
    return;
  }

  _fnDescription = "";
  _parameters.clear();
  _descriptions.clear();

  //find slot
  for (int i=0; i < pluginInfo->slotInfos.count(); i++)
    if (pluginInfo->slotInfos[i].slotName == slotName){
      _fnDescription = pluginInfo->slotInfos[i].slotDescription;
      _parameters    = pluginInfo->slotInfos[i].parameters;
      _descriptions  = pluginInfo->slotInfos[i].descriptions;
      return;
    }
}

Jan Möbius's avatar
Jan Möbius committed
1085
1086
1087
1088
void Core::snapshotBaseFileName(const QString& _fname, unsigned int _viewerId ){

  if ( OpenFlipper::Options::gui() ) {
    if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1089
      emit log(LOGERR,tr("Unable to snapshotBaseFileName for viewer ") + QString::number(_viewerId) );
Jan Möbius's avatar
Jan Möbius committed
1090
1091
1092
      return;
    }

1093
    PluginFunctions::viewerProperties(_viewerId).snapshotBaseFileName( _fname );
Jan Möbius's avatar
Jan Möbius committed
1094
1095
  }

1096
1097
}

Jan Möbius's avatar
Jan Möbius committed
1098
1099
1100
1101
1102
void Core::snapshot( unsigned int _viewerId ){


  if ( OpenFlipper::Options::gui() ) {
    if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1103
      emit log(LOGERR,tr("Unable to create snapshot for viewer ") + QString::number(_viewerId) );
Jan Möbius's avatar
Jan Möbius committed
1104
1105
1106
1107
      return;
    }
    coreWidget_->examiner_widgets_[_viewerId]->snapshot();
  }
1108
1109
1110

}

Dirk Wilden's avatar
Dirk Wilden committed
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
void Core::applicationSnapshot(){

  if ( OpenFlipper::Options::gui() )
    coreWidget_->applicationSnapshot();
}

void Core::applicationSnapshotName(QString _name){

  if ( OpenFlipper::Options::gui() )
    coreWidget_->applicationSnapshotName(_name);
}

Dirk Wilden's avatar
Dirk Wilden committed
1123
1124
1125
1126
1127
1128
void Core::viewerSnapshot(){

  if ( OpenFlipper::Options::gui() )
    coreWidget_->viewerSnapshot();
}

1129
void Core::resizeViewers(int _width, int _height ){
Dirk Wilden's avatar
   
Dirk Wilden committed
1130
  if ( OpenFlipper::Options::gui() ){
1131
1132
1133
1134
1135

    lastWidth_  = coreWidget_->glView_->width();
    lastHeight_ = coreWidget_->glView_->height();


1136
1137
    //+4,+20 to to get the correct dimension when using snapshotFunction
    coreWidget_->glView_->resize(_width+4, _height+20);
Dirk Wilden's avatar
   
Dirk Wilden committed
1138
  }
Dirk Wilden's avatar
   
Dirk Wilden committed
1139
1140
}

1141
1142
void Core::resizeApplication(int _width, int _height ){
 if ( OpenFlipper::Options::gui() ){
1143
1144
1145
1146

    lastWidth_  = coreWidget_->glView_->width();
    lastHeight_ = coreWidget_->glView_->height();

1147
1148
1149
1150
    coreWidget_->resize(_width, _height);
 }
}

Dirk Wilden's avatar
Dirk Wilden committed
1151
void Core::writeVersionNumbers(QString _filename){
Jan Möbius's avatar
Jan Möbius committed
1152

Dirk Wilden's avatar
Dirk Wilden committed
1153
1154
1155
INIFile ini;

  if ( ! ini.connect(_filename,true) ) {
1156
    emit log(LOGERR,tr("Failed to connect to _ini file") + _filename);
Dirk Wilden's avatar
Dirk Wilden committed
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
      return;
  }

  //add coreVersion
  ini.add_section( "Core" );
  if ( OpenFlipper::Options::isWindows() )
    ini.add_entry( "Core" , "VersionWindows" , OpenFlipper::Options::coreVersion() );
  else
    ini.add_entry( "Core" , "VersionLinux"   , OpenFlipper::Options::coreVersion() );

  //add pluginVersions
  for (uint i=0; i < plugins.size(); i++){
    ini.add_section( plugins[i].name );

    if ( OpenFlipper::Options::isWindows() )
      ini.add_entry( plugins[i].name , "VersionWindows" , plugins[i].version );
    else
      ini.add_entry( plugins[i].name , "VersionLinux"   , plugins[i].version );
  }

  ini.disconnect();
}

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
1180
1181
1182
QList<int> Core::objectList (QString _selection, QStringList _types)
{
  QList<int> rv;
1183
  DataType ids = 0;
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
1184
  PluginFunctions::IteratorRestriction selection = PluginFunctions::ALL_OBJECTS;
Mike Kremer's avatar
   
Mike Kremer committed
1185

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
  foreach (QString s, _types)
    if (!s.isEmpty ())
      ids = typeId (s);
  if (_selection == "source")
    selection = PluginFunctions::SOURCE_OBJECTS;
  else if (_selection == "target")
    selection = PluginFunctions::TARGET_OBJECTS;

  for ( PluginFunctions::ObjectIterator o_it(selection, ids) ;
                                        o_it != PluginFunctions::objectsEnd(); ++o_it)
    rv.append (o_it->id ());
  return rv;
}

1200
1201
1202
1203
1204
1205
/// set the descriptions for scriptable slots of the core
void Core::setDescriptions(){

  connect(this, SIGNAL(setSlotDescription(QString,QString,QStringList,QStringList)),
          this,   SLOT(slotSetSlotDescription(QString,QString,QStringList,QStringList)) );

1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
  emit setSlotDescription("updateView()", tr("Redraw the contents of the viewer."), QStringList(), QStringList());
  emit setSlotDescription("clearAll()", tr("Clear all data ob