Core.cc 47.9 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 130
  //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");
131 132
  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
133
  coordsysNode_->setTraverseMode (BaseNode::NodeFirst | BaseNode::SecondPass);
134 135
//   gridNode_ = new ACG::SceneGraph::GridNode(root_node_scenegraph_,"Grid Node");
//   gridNode_->hide();
Dirk Wilden's avatar
Dirk Wilden committed
136

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

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

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

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

  PluginFunctions::setViewerProperties(viewerProperties);

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

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

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

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

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

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

194

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

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

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

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

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

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

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

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

236 237 238

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
341 342 343 344 345
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
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
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
361

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

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

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

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

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

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

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

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

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

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


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


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

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


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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
449
  }
450

Jan Möbius's avatar
 
Jan Möbius committed
451
  loadPlugins();
452

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

Dirk Wilden's avatar
Dirk Wilden committed
455 456 457
    //register keyBinding for all scripting slots
    coreWidget_->slotRegisterSlotKeyBindings();

458 459 460
    //get keyAssignments from config files
    restoreKeyBindings();

461
    if ( OpenFlipper::Options::defaultToolboxMode( ) != "" )
Jan Möbius's avatar
 
Jan Möbius committed
462 463 464
      coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() );
    else
      coreWidget_->setViewMode("All");
465

Jan Möbius's avatar
Jan Möbius committed
466 467 468 469 470 471 472
    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
473 474

      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewUpdated() ),
475
               this, SLOT( viewUpdated()) ,Qt::DirectConnection);
476
               
477
      connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
478
               this, SIGNAL( pluginViewChanged() ) ,Qt::DirectConnection);               
Jan Möbius's avatar
Jan Möbius committed
479
    }
480

Jan Möbius's avatar
 
Jan Möbius committed
481
  }
482

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

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

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

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

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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
530
    coreWidget_->show();
531

532 533
    applyOptions();

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

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

Jan Möbius's avatar
Jan Möbius committed
550 551

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

554

Jan Möbius's avatar
 
Jan Möbius committed
555 556 557 558 559 560
//-----------------------------------------------------------------------------

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
575 576 577 578 579 580 581
}

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

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

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

  }

  PluginFunctions::setActiveExaminer( examinerId );

Jan Möbius's avatar
 
Jan Möbius committed
605
  emit PluginMouseEventIdentify( _event );
Jan Möbius's avatar
Jan Möbius committed
606 607


Jan Möbius's avatar
 
Jan Möbius committed
608 609 610 611 612 613 614 615
}

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


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

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

          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
641
            message += tr("unknown event type");
642 643 644 645

          emit log(LOGINFO,message );
        }

Jan Möbius's avatar
Jan Möbius committed
646
        break;
647

Jan Möbius's avatar
Jan Möbius committed
648 649 650 651 652 653 654
      }
    }

  }

  PluginFunctions::setActiveExaminer( examinerId );

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
690 691 692 693 694 695
}

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

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

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

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

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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
707 708 709 710

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
711
        emit log(LOGINFO,tr("updateView() called by ") + QString( sender()->metaObject()->className() ) );
Jan Möbius's avatar
Jan Möbius committed
712 713 714 715
      }
    }
  }

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

719
  if ( OpenFlipper::Options::restrictFrameRate() ) {
720

721
    int elapsed = redrawTime_->elapsed ();
722

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

  }

742
  redrawTime_->restart ();
743

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

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

Jan Möbius's avatar
Jan Möbius committed
751 752


753 754 755 756 757 758 759 760 761 762 763 764 765 766
//-----------------------------------------------------------------------------

 /** 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
767 768
//-----------------------------------------------------------------------------

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

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

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

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

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

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

  slotDeleteAllObjects();

Jan Möbius's avatar
Jan Möbius committed
791
  emit allCleared();
792

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

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

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

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

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

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

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

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

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

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

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

}



Jan Möbius's avatar
 
Jan Möbius committed
858 859 860

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

861 862
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
863 864 865 866
{
  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
867 868
      if (recentFiles[i].type == DATA_NONE)
        loadSettings( recentFiles[i].filename );
Dirk Wilden's avatar
Dirk Wilden committed
869 870
      else{
        OpenFlipper::Options::loadingRecentFile(true);
Dirk Wilden's avatar
Dirk Wilden committed
871
        loadObject(recentFiles[i].type, recentFiles[i].filename);
Dirk Wilden's avatar
Dirk Wilden committed
872 873
        OpenFlipper::Options::loadingRecentFile(false);
      }
Jan Möbius's avatar
 
Jan Möbius committed
874 875 876 877 878
      break;
    }
}


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

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

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

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

    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
917 918
  }

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

  if (logFile_)
    logFile_->close();

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

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

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

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
974
}
Jan Möbius's avatar
 
Jan Möbius committed
975

976 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())
      pluginInfo = &plugins[i];

Jan Möbius's avatar
Jan Möbius committed
1001
    if (pluginInfo == 0){
1002
      emit log(LOGERR, tr("Unable to set slot-description. Plugin not found!"));
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 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
    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){
1049
    emit log(LOGERR, tr("Unable to get slot-description. Plugin not found!"));
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    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
1067 1068 1069 1070
void Core::snapshotBaseFileName(const QString& _fname, unsigned int _viewerId ){

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

1075
    PluginFunctions::viewerProperties(_viewerId).snapshotBaseFileName( _fname );
Jan Möbius's avatar
Jan Möbius committed
1076 1077
  }

1078 1079
}

Jan Möbius's avatar
Jan Möbius committed
1080 1081 1082 1083 1084
void Core::snapshot( unsigned int _viewerId ){


  if ( OpenFlipper::Options::gui() ) {
    if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1085
      emit log(LOGERR,tr("Unable to create snapshot for viewer ") + QString::number(_viewerId) );
Jan Möbius's avatar
Jan Möbius committed
1086 1087 1088 1089
      return;
    }
    coreWidget_->examiner_widgets_[_viewerId]->snapshot();
  }
1090 1091 1092

}

Dirk Wilden's avatar
Dirk Wilden committed
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
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
1105 1106 1107 1108 1109 1110
void Core::viewerSnapshot(){

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

1111
void Core::resizeViewers(int _width, int _height ){
Dirk Wilden's avatar
 
Dirk Wilden committed
1112
  if ( OpenFlipper::Options::gui() ){
1113 1114 1115 1116 1117

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


1118 1119
    //+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
1120
  }
Dirk Wilden's avatar
 
Dirk Wilden committed
1121 1122
}

1123 1124
void Core::resizeApplication(int _width, int _height ){
 if ( OpenFlipper::Options::gui() ){
1125 1126 1127 1128

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

1129 1130 1131 1132
    coreWidget_->resize(_width, _height);
 }
}

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

Dirk Wilden's avatar
Dirk Wilden committed
1135 1136 1137
INIFile ini;

  if ( ! ini.connect(_filename,true) ) {
1138
    emit log(LOGERR,tr("Failed to connect to _ini file") + _filename);
Dirk Wilden's avatar
Dirk Wilden committed
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
      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
1162 1163 1164 1165 1166
QList<int> Core::objectList (QString _selection, QStringList _types)
{
  QList<int> rv;
  unsigned int ids = 0;
  PluginFunctions::IteratorRestriction selection = PluginFunctions::ALL_OBJECTS;
Mike Kremer's avatar
 
Mike Kremer committed
1167

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
  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;
}

1182 1183 1184 1185 1186 1187
/// 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)) );

1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203
  emit setSlotDescription("updateView()", tr("Redraw the contents of the viewer."), QStringList(), QStringList());
  emit setSlotDescription("clearAll()", tr("Clear all data objects."), QStringList(), QStringList());
  emit setSlotDescription("exitApplication()", tr("Quit OpenFlipper"), QStringList(), QStringList());
  emit setSlotDescription("fullscreen(bool)", tr("Enable or disable fullscreen mode"),
                           QStringList(tr("enabled")) ,
                           QStringList(tr("Enable or disable fullscreen mode")));
  emit setSlotDescription("loggerState(int)", tr("Change the logger window state"), QStringList(tr("Change the logger window state")), QStringList());
  emit setSlotDescription("showToolbox(bool)", tr("Show or hide toolbox"), QStringList(tr("Show or hide the toolbox")), QStringList());
  emit setSlotDescription("multiViewMode(int)", tr("Switch MultiView Mode"),
                          QStringList(tr("Mode")), QStringList(tr("0: One Viewer\n 1: Grid \n 2: Horizontal split")));

  emit setSlotDescription("restrictFrameRate(bool)", tr("Restrict FrameRate to MaxFrameRate"),
                        QStringList(tr("enabled")), QStringList(tr("restriction switch")));
  emit setSlotDescription("setMaxFrameRate(int)", tr("set the maximal framerate (automatically enables framerate restriction)"),
                        QStringList(tr("frameRate")), QStringList(tr("Maximum frameRate")));
  emit setSlotDescription("snapshotBaseFileName(QString&)", tr("Set a filename for storing snapshots.")
Dirk Wilden's avatar
 
Dirk Wilden committed
1204
                          , QStringList(), QStringList());
1205
  emit setSlotDescription("snapshot()", tr("Make a snapshot of the viewer. If no filename"
Dirk Wilden's avatar
 
Dirk Wilden committed
1206 1207
                          " was set using snapshotBaseFileName() the snapshot is stored"
                          " in snap.png in the current directory. For every snapshot"
1208 1209 1210 1211 1212 1213 1214
                          " a counter is added to the filename."), QStringList(), QStringList());
  emit setSlotDescription("resizeViewer(int,int)", tr("Resize the viewer"),
                           QString(tr("width,height")).split(","),
                           QString(tr("new width for the viewer,new height for the viewer")).split(","));
  emit setSlotDescription("writeVersionNumbers(QString)", tr("write the current versions of all plugins to INI file"),
                           QStringList(tr("filename")),
                           QStringList(tr("fullpath to a file where the versions should be written to.")));
1215
  //save slots
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
  emit setSlotDescription("saveObject(int,QString)", tr("Save object to file. If the file exists it will be overwritten."),
                           QString(tr("object-id,filename")).split(","),
                           QString(tr("id of the object, complete path and filename")).split(","));
  emit setSlotDescription("saveObjectTo(int,QString)", tr("Save object to file. The location can be chosen in a dialog. "
                          "(only works if GUI is available)"),
                           QString(tr("object-id,filename")).split(","),
                           QString(tr("id of the object, initial filename for the dialog")).split(","));
  emit setSlotDescription("saveAllObjects()", tr("Saves all target objects. "
                          "If no filename is available a dialog is shown. (only works if GUI is available)"),QStringList(), QStringList());
  emit setSlotDescription("saveAllObjectsTo()", tr("Saves all target objects. The locations can be chosen in dialogs. "
                          "(only works if GUI is available)"),QStringList(), QStringList());
  emit setSlotDescription("saveSettings()", tr("Show the dialog to save the current setting. (only works if GUI is available)"),QStringList(), QStringList());
1228
  //load slots
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
  emit setSlotDescription("loadObject()", tr("Show the dialog to load an object. (only works if GUI is available)"),QStringList(), QStringList());
  emit setSlotDescription("getObjectId(QString)", tr("Return identifier of object with specified name. Returns -1 if object was not found."),QStringList(), QStringList());
  emit setSlotDescription("loadSettings()", tr("Show the dialog to load settings. (only works if GUI is available)"),QStringList(), QStringList());
  emit setSlotDescription("loadSettings(QString)", tr("load settings from file."),QStringList(), QStringList());

  emit setSlotDescription("createWidget(QString,QString)", tr("Create a widget from an ui file"),
                          QString(tr("Object name,ui file")).split(","),
                          QString(tr("Name of the new widget in script,ui file to load")).split(","));

  emit setSlotDescription("addToolbox(QString,QWidget*)", tr("Add a widget as a toolbox"),
                          QString(tr("Toolbox Entry name,Widget")).split(","),
                          QString(tr("Name of the new widget in the toolbox,Pointer to the new widget")).split(","));

  emit setSlotDescription("addViewMode(QString,QString)", tr("Add a new viewmode"),
                          QString(tr("Name,Toolbox List")).split(","),
                          QString(tr("Name of the new Viewmode, ; seperated list of toolboxes visible in this viewmode")).split(","));

  emit setSlotDescription("objectList(QString,QStringList)", tr("Returns object list"),
                          QString(tr("Selection type,Object types")).split(","),
                          QString(tr("Type of object selection (all,source,target),Object type (All,PolyMesh,TriangleMesh,...)")).split(";"));
1249 1250
}

1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
void Core::slotDeleteObject( int _id ){

  if ( _id == -1 )
    return;

  // get the node
  BaseObject* object = objectRoot_->childExists(_id);

  if ( !object || object == objectRoot_ ) {
    std::cerr << "Error while deleting object, does not exist!!" << std::endl;
    return;
  }

  // remove the whole subtree below this item
  object->deleteSubtree();

  // remove the item itself from the parent
  object->parent()->removeChild(object);

  // delete it
  delete object;

  emit objectDeleted(_id);

  slotObjectUpdated(-1);
}

1278 1279 1280 1281
void Core::slotDeleteAllObjects( ){

  // Remember ids
  std::vector< int > ids;
1282 1283 1284 1285 1286 1287

  BaseObject* current = objectRoot_->next();

  while( current != objectRoot_ ){
    ids.push_back( current->id() );
    current = current->next();
1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
  }

  // remove the whole subtree below the root
  objectRoot_->deleteSubtree();

  for ( uint i = 0 ; i < ids.size(); ++i ) {
    emit objectDeleted(ids[i]);
  }

  slotObjectUpdated(-1);
}

Dirk Wilden's avatar
Dirk Wilden committed
1300
// //-----------------------------------------------------------------------------
1301
//
Dirk Wilden's avatar
Dirk Wilden committed
1302 1303 1304 1305 1306 1307
// void Core::slotGetPlugin(QString _name, QObject* & _plugin ){
//   for (uint i=0; i < plugins.size(); i++)
//     if (plugins[i].name == _name){
//       _plugin = plugins[i].plugin;
//       return;
//     }
1308
//
Dirk Wilden's avatar
Dirk Wilden committed
1309 1310 1311
//   _plugin = 0;
//   return;
// }
Jan Möbius's avatar
 
Jan Möbius committed
1312 1313

//=============================================================================