Core.cc 47.7 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
37
38
39
40
41
/*===========================================================================*\
 *                                                                           *
 *                              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/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $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
97

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

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

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

#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

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

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

Dirk Wilden's avatar
Dirk Wilden committed
129
130
131
  //init nodes
  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
  root_node_ = new ACG::SceneGraph::SeparatorNode(root_node_scenegraph_, "Data Root Node");
132
133
  coordsysMaterialNode_ = new ACG::SceneGraph::MaterialNode(root_node_scenegraph_,"Coordsys Material Node");
  coordsysNode_ = new ACG::SceneGraph::CoordsysNode(coordsysMaterialNode_,"Core Coordsys Node");
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
134
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
Dirk Wilden's avatar
Dirk Wilden committed
135

Jan Möbius's avatar
 
Jan Möbius committed
136
137
138
139
140
   // Add ViewMode All
  ViewMode* vm = new ViewMode();
  vm->name = "All";
  vm->custom = false;
  vm->visibleWidgets = QStringList();
141

Jan Möbius's avatar
 
Jan Möbius committed
142
143
  viewModes_.push_front(vm);

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

147
148
149
150
151
  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
152
153
154

  PluginFunctions::setViewerProperties(viewerProperties);

155
156
157
158
159
160
161
162
163
164
  //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
165
166
  // Get all relevant Paths and Options from option files
  setupOptions();
Jan Möbius's avatar
Jan Möbius committed
167

168
169
  // set discriptions for scriptable slots
  setDescriptions();
Jan Möbius's avatar
 
Jan Möbius committed
170
171
}

172
173
174
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
 
Jan Möbius committed
175
176
177
178
179
180
 * - 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
 */
181
182
183
void
Core::init() {

Jan Möbius's avatar
 
Jan Möbius committed
184
  // Make root_node available to the plugins ( defined in PluginFunctions.hh)
Jan Möbius's avatar
   
Jan Möbius committed
185
  PluginFunctions::setRootNode( root_node_ );
186

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

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

193

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

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

201
202
203
204
205
206
207
208
    // 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 ();
209

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

Jan Möbius's avatar
 
Jan Möbius committed
213
214
      splash_ = new QSplashScreen(splashPixmap);
      splash_->show();
215
216

      splash_->showMessage("Initializing mainwindow" ,
Jan Möbius's avatar
 
Jan Möbius committed
217
218
219
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
220

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

Jan Möbius's avatar
 
Jan Möbius committed
223
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
224
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(loadObject()));
Jan Möbius's avatar
 
Jan Möbius committed
225
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
226
227
228
229
    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()));
230
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
231
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
232
233
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
234

235
236
237

    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
238
239
    connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
    connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
240

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

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

Jan Möbius's avatar
Jan Möbius committed
245
246
247
248
249
250
251
252
253
254
255
256
    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
257
258
259
#ifdef ARCH_DARWIN
    width = rect.width() - 300;
    height = rect.height() - 150;
Jan Möbius's avatar
Jan Möbius committed
260

Jan Möbius's avatar
Jan Möbius committed
261
//     coreWidget_->setMaximumSize( width, height  );
Jan Möbius's avatar
Jan Möbius committed
262
263
#endif

Jan Möbius's avatar
Jan Möbius committed
264
    coreWidget_->resize(width,height);
265
266
267

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

Jan Möbius's avatar
 
Jan Möbius committed
268
  }
269

Jan Möbius's avatar
 
Jan Möbius committed
270
271
272
273
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
274

Jan Möbius's avatar
 
Jan Möbius committed
275
276
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
277
278
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

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

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

Dirk Wilden's avatar
Dirk Wilden committed
285
286
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
287
288
289
290
291
292
293

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

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

Dirk Wilden's avatar
Dirk Wilden committed
295
296
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
297
298
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
299
300
301
    // 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
302
303
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
304
  }
305

Jan Möbius's avatar
 
Jan Möbius committed
306
307
308
309
310
311
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
312

Jan Möbius's avatar
 
Jan Möbius committed
313
  loggers_.push_back(newlog);
314

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
321
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
322

Jan Möbius's avatar
 
Jan Möbius committed
323
324
325
326
327
328
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
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
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
345

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
356
357
358
359
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
360

Jan Möbius's avatar
 
Jan Möbius committed
361
  loggers_.push_back(newlog);
362

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
374
375
376
377
378
  // ======================================================================
  // This connection will tell the plugins, when their Toolbox is active
  // ======================================================================
  ///@todo reimplement
//   connect(module_list,SIGNAL(currentChanged(int)),this,SLOT(slotToolboxSwitched(int)));
379

Jan Möbius's avatar
Jan Möbius committed
380
381
382
  // Set a reference to the scriptengine for simple rpc calls
  RPC::setScriptEngine(&scriptEngine_);

Jan Möbius's avatar
 
Jan Möbius committed
383
384
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
385

Jan Möbius's avatar
 
Jan Möbius committed
386
387
388
389
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
390

Jan Möbius's avatar
 
Jan Möbius committed
391
  // Register Vector Type to ScriptEngine ( is Vec3d )
392
393
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
394
395
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
396

Jan Möbius's avatar
 
Jan Möbius committed
397
398
399
  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctor = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctor);
400
401


Jan Möbius's avatar
 
Jan Möbius committed
402
//    // Register ObjectId Type to ScriptEngine ( is int )
403
404
//   qScriptRegisterMetaType(&scriptEngine_,
//                           toScriptValueObjectId,
Jan Möbius's avatar
 
Jan Möbius committed
405
//                           fromScriptValueObjectId);
406
//
Jan Möbius's avatar
 
Jan Möbius committed
407
408
409
//   // set a constructor to allow creation via Vector(x,y,z)
//   ctor = scriptEngine_.newFunction(createObjectId);
//   scriptEngine_.globalObject().setProperty("ObjectId", ctor);
410
411


Jan Möbius's avatar
 
Jan Möbius committed
412
413
414
415
  // Register idList Type to scripting Engine
  qScriptRegisterSequenceMetaType< idList >(&scriptEngine_);

  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
416
417


Jan Möbius's avatar
 
Jan Möbius committed
418
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
419
420
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
421
422
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
423

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

Jan Möbius's avatar
 
Jan Möbius committed
428
429
430
431
432
433
434
  // Collect Core scripting information
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
435

Jan Möbius's avatar
 
Jan Möbius committed
436
437
  scriptEngine_.globalObject().setProperty("core", scriptInstance);
  emit log(LOGOUT,"Core Scripting initialized with Name : core  ");
438

Jan Möbius's avatar
 
Jan Möbius committed
439
  emit log(LOGOUT,"Available scripting functions :");
440

Jan Möbius's avatar
 
Jan Möbius committed
441
442
443
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
444

Jan Möbius's avatar
 
Jan Möbius committed
445
446
447
    /// Skip all signals for function calls
    if ( checkSignal( this, it.name().toAscii() ) )
      continue;
448

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

Jan Möbius's avatar
 
Jan Möbius committed
451
452
    emit log(LOGOUT,"\t" + it.name());
  }
453

Jan Möbius's avatar
 
Jan Möbius committed
454
  emit log(LOGOUT,"=============================================================================================");
455

Jan Möbius's avatar
 
Jan Möbius committed
456
  loadPlugins();
457

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

Dirk Wilden's avatar
Dirk Wilden committed
460
461
462
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

463
464
465
    //get keyAssignments from config files
    restoreKeyBindings();

466
    if ( OpenFlipper::Options::defaultToolboxMode( ) != "" )
Jan Möbius's avatar
 
Jan Möbius committed
467
468
469
      coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() );
    else
      coreWidget_->setViewMode("All");
470

Jan Möbius's avatar
Jan Möbius committed
471
472
473
474
475
476
477
    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
478
479

      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewUpdated() ),
480
               this, SLOT( viewUpdated()) ,Qt::DirectConnection);
Jan Möbius's avatar
Jan Möbius committed
481
    }
482

Jan Möbius's avatar
 
Jan Möbius committed
483
  }
484

Jan Möbius's avatar
Jan Möbius committed
485
486
487
488
  // ===============================================================================================
  // Load Settings from configuration files
  // ===============================================================================================

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

Jan Möbius's avatar
 
Jan Möbius committed
492
    if ( OpenFlipper::Options::gui() && OpenFlipper::Options::splash() ) {
493
      splash_->showMessage("Loading Configuration File " + QString::number(i) + "/"  + QString::number(optionFiles.size()) ,
Jan Möbius's avatar
 
Jan Möbius committed
494
495
496
                           Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
497

Jan Möbius's avatar
Jan Möbius committed
498
499
    // Load global ini files. Use only plugin global options from these files as the
    // rest has been loaded at the beginning.
500
501
502
503
    readRecentFiles( optionFiles[i] );
    if ( OpenFlipper::Options::gui() )
      coreWidget_->updateRecent();

Jan Möbius's avatar
Jan Möbius committed
504
    openIniFile( optionFiles[i] ,false,true,false);
Jan Möbius's avatar
 
Jan Möbius committed
505
506
  }

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

Jan Möbius's avatar
 
Jan Möbius committed
511
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
Jan Möbius's avatar
Jan Möbius committed
512
513
514
515
516
    emit log(LOGWARN,"UTF8-Locale used!");
//     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.");
517
  }
Jan Möbius's avatar
 
Jan Möbius committed
518
519

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

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

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
524
525
    //try to restore the windowState
    coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
Dirk Wilden's avatar
Dirk Wilden committed
526
    //try to restore the geometry
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
527
    coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
528

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

Jan Möbius's avatar
 
Jan Möbius committed
532
    coreWidget_->show();
533

534
535
    applyOptions();

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
536
537
538
539
540
541
542
    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
543
544
545
    if ( OpenFlipper::Options::splash() ) {
      splash_->finish(coreWidget_);
    }
546

547
548
549
    // start checking for scenegraph changes
    scenegraphCheckTimer_->setInterval (1000 / OpenFlipper::Options::maxFrameRate());
    scenegraphCheckTimer_->start ();
Jan Möbius's avatar
 
Jan Möbius committed
550
  }
551

Jan Möbius's avatar
Jan Möbius committed
552
553

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

556

Jan Möbius's avatar
 
Jan Möbius committed
557
558
559
560
561
562
//-----------------------------------------------------------------------------

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

Jan Möbius's avatar
 
Jan Möbius committed
564
565
566
567
568
     // 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);
  }
569

Jan Möbius's avatar
 
Jan Möbius committed
570
571
  objectRoot_->deleteSubtree();
  delete objectRoot_;
572

Jan Möbius's avatar
 
Jan Möbius committed
573
  // Clean up loggers
574
575
576
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
 
Jan Möbius committed
577
578
579
580
581
582
583
}

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

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

Jan Möbius's avatar
Jan Möbius committed
588
589
590
591
592
593
594
595
596
  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;
597
598
        if ( OpenFlipper::Options::doSlotDebugging() )
              emit log(LOGINFO,"slotMouseEventIdentify from examiner " + QString::number(i) );
Jan Möbius's avatar
Jan Möbius committed
599
600
601
602
603
604
605
606
        break;
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
607
  emit PluginMouseEventIdentify( _event );
Jan Möbius's avatar
Jan Möbius committed
608
609


Jan Möbius's avatar
 
Jan Möbius committed
610
611
612
613
614
615
616
617
}

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


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

Jan Möbius's avatar
Jan Möbius committed
622
623
624
625
626
627
628
629
630
  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;
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
        if ( OpenFlipper::Options::doSlotDebugging() ) {
          QString message = "slotMouseEvent from examiner " + QString::number(i) + " with ";

          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
            message += "unknown event type";

          emit log(LOGINFO,message );
        }

Jan Möbius's avatar
Jan Möbius committed
648
        break;
649

Jan Möbius's avatar
Jan Möbius committed
650
651
652
653
654
655
656
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
657
658
659
660
661
662
663
664
  emit PluginMouseEvent(_event );
}

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

void
Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
{
Jan Möbius's avatar
Jan Möbius committed
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
  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
682
683
684
685
686
687
688
689
  emit PluginWheelEvent(_event , _mode );
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
692
693
694
695
696
697
}

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

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

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

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

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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
709
710
711
712
713
714
715
716
717

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
        emit log(LOGINFO,"updateView() called by " + QString( sender()->metaObject()->className() ) );
      }
    }
  }

Dirk Wilden's avatar
Dirk Wilden committed
718
719
720
  if ( !OpenFlipper::Options::gui() )
    return;

721
  if ( OpenFlipper::Options::restrictFrameRate() ) {
722

723
    int elapsed = redrawTime_->elapsed ();
724

725
726
    if ( elapsed < 1000 / OpenFlipper::Options::maxFrameRate() )
    {
Jan Möbius's avatar
Jan Möbius committed
727
728
729
730
731
732
733
734
735
736
737
      // redraw time not reached ... waiting for timer event for next redraw
      if ( redrawTimer_->isActive() ) {
        if ( OpenFlipper::Options::doSlotDebugging() )
          emit log(LOGINFO,"Too early for redraw! Delaying request from " +
                           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
738
    }
739
740
    else if ( redrawTimer_->isActive() )
	redrawTimer_->stop ();
741
742
743

  }

744
  redrawTime_->restart ();
745

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

748
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
Jan Möbius committed
749
      coreWidget_->examiner_widgets_[i]->updateGL();
Jan Möbius's avatar
 
Jan Möbius committed
750
751
752
  }
}

Jan Möbius's avatar
Jan Möbius committed
753
754


755
756
757
758
759
760
761
762
763
764
765
766
767
768
//-----------------------------------------------------------------------------

 /** Check if scenegraph is dirty and initiate redraw
  */
void Core::checkScenegraphDirty() {
  if ( true )
  {
    ACG::SceneGraph::CheckDirtyAction action;
    ACG::SceneGraph::traverse( root_node_scenegraph_, action );
    if ( action.isDirty () )
      emit updateView ();
  }
}

Jan Möbius's avatar
 
Jan Möbius committed
769
770
//-----------------------------------------------------------------------------

771
772
773
774
775
776
777
778
779
void Core::restrictFrameRate( bool _enable ) {
  OpenFlipper::Options::restrictFrameRate( _enable );
}

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

void Core::setMaxFrameRate( int _rate ) {
  OpenFlipper::Options::maxFrameRate( _rate );
  OpenFlipper::Options::restrictFrameRate( true );
780
781
782

  // update Timer to new framerate
  scenegraphCheckTimer_->setInterval (1000 / OpenFlipper::Options::maxFrameRate());
783
784
785
786
}

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

787
788
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
789
{
790
791
792

  slotDeleteAllObjects();

Jan Möbius's avatar
Jan Möbius committed
793
  emit allCleared();
794

Jan Möbius's avatar
 
Jan Möbius committed
795
796
797
798
799
  slotScriptInfo( "core" , "clearAll()"  );
}

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

800
801
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
802
803
804
805
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
806

Jan Möbius's avatar
 
Jan Möbius committed
807
808
809
810
811
  QApplication::quit();
}

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

812
813
814
815
816
817
818
void Core::fullscreen( bool _state ) {
  if ( OpenFlipper::Options::gui() )
    coreWidget_->setFullscreen(_state);
}

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

Jan Möbius's avatar
Jan Möbius committed
819
820
void Core::loggerState(int _state) {
  OpenFlipper::Options::LoggerState state = static_cast<OpenFlipper::Options::LoggerState> (_state);
821
  if ( OpenFlipper::Options::gui() &&
Jan Möbius's avatar
Jan Möbius committed
822
823
824
825
       (state == OpenFlipper::Options::Hidden ||
        state == OpenFlipper::Options::InScene ||
        state == OpenFlipper::Options::Normal))
    coreWidget_->showLogger(state);
Jan Möbius's avatar
 
Jan Möbius committed
826
827
828
829
}

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

830
void Core::showToolbox( bool _state ) {
831
  if ( OpenFlipper::Options::gui() )
832
    coreWidget_->showToolbox(_state);
Jan Möbius's avatar
 
Jan Möbius committed
833
}
834

835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
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:
      emit log(LOGERR,"Requested illegal multiview mode!");
  }

}



Jan Möbius's avatar
 
Jan Möbius committed
860
861
862

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

863
864
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
865
866
867
868
{
  QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles();
  for (int i = 0 ; i < recentFiles.size() ; ++i )
    if ( recentFiles[i].filename == _action->text() ){
Dirk Wilden's avatar
Dirk Wilden committed
869
870
      if (recentFiles[i].type == DATA_NONE)
        loadSettings( recentFiles[i].filename );
Dirk Wilden's avatar
Dirk Wilden committed
871
872
      else{
        OpenFlipper::Options::loadingRecentFile(true);
Dirk Wilden's avatar
Dirk Wilden committed
873
        loadObject(recentFiles[i].type, recentFiles[i].filename);
Dirk Wilden's avatar
Dirk Wilden committed
874
875
        OpenFlipper::Options::loadingRecentFile(false);
      }
Jan Möbius's avatar
 
Jan Möbius committed
876
877
878
879
880
      break;
    }
}


881
void
Jan Möbius's avatar
 
Jan Möbius committed
882
Core::writeOnExit() {
883
  QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Jan Möbius's avatar
 
Jan Möbius committed
884
885
886
887
888
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.ini";

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

Jan Möbius's avatar
 
Jan Möbius committed
890
891
892
    if ( ! ini.connect( inifile,true) ) {
      emit log(LOGERR,"Can not create user ini file");
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
893
      writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
894
895
896
      ini.disconnect();
    }
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
897
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
898
    ini.disconnect();
899
900
  }

Dirk Wilden's avatar
Dirk Wilden committed
901
902
  //store the windowState
  if ( OpenFlipper::Options::gui() ) {
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918

    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
919
920
  }

Jan Möbius's avatar
 
Jan Möbius committed
921
922
923
924
925
926
927
928
929
930
931
  // 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
932
933
934
935

  if (logFile_)
    logFile_->close();

Jan Möbius's avatar
 
Jan Möbius committed
936
  qApp->quit();
937
}
Jan Möbius's avatar
 
Jan Möbius committed
938

Dirk Wilden's avatar
Dirk Wilden committed
939
940
941
942
943
944
945
/// log to file
void Core::slotLogToFile(Logtype _type, QString _message){

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

  if (logStream_ == 0){
946
947
948
949
950
    //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() )
951
        OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Dirk Wilden's avatar
Dirk Wilden committed
952
953
954
955
956
957
958
959
960
961
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.log");

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

Dirk Wilden's avatar
Dirk Wilden committed
963
964
965
966
967
968
969
970
971
972
973
974
  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;
975

Dirk Wilden's avatar
Dirk Wilden committed
976
}
Jan Möbius's avatar
 
Jan Möbius committed
977

978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/// 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())
For faster browsing, not all history is shown. View entire blame