Core.cc 27.5 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  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.
15
//
Jan Möbius's avatar
 
Jan Möbius committed
16 17 18 19
//  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.
20
//
Jan Möbius's avatar
 
Jan Möbius committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================





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


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

// -------------------- mview
#include "Core.hh"
// -------------------- ACG
#include <ACG/Scenegraph/DrawModes.hh>

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

#include <QKeyEvent>
#include <QSplitter>
#include <QMenuBar>
#include <QToolBox>
#include <QApplication>
#include <QStatusBar>
#include <QMessageBox>
#include <QFile>

#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"

#include <OpenMesh/Core/System/omstream.hh>

#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

91
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
92 93

/** \brief Constuctor for the Core Widget ( This is stage 1 , call init for stage 2)
94
 *
Jan Möbius's avatar
 
Jan Möbius committed
95 96 97 98 99 100 101 102 103 104 105 106 107
 * 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(),
  nextBackupId_(0),
  set_random_base_color_(true),
  coreWidget_(0)
{
Dirk Wilden's avatar
Dirk Wilden committed
108 109 110 111 112
  //init logFile
  logStream_ = 0;
  logFile_ = 0;
  OpenFlipper::Options::logFileEnabled(true);

Dirk Wilden's avatar
Dirk Wilden committed
113 114 115 116
  //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");

Jan Möbius's avatar
 
Jan Möbius committed
117 118 119 120 121
   // Add ViewMode All
  ViewMode* vm = new ViewMode();
  vm->name = "All";
  vm->custom = false;
  vm->visibleWidgets = QStringList();
122

Jan Möbius's avatar
 
Jan Möbius committed
123 124 125 126 127 128
  viewModes_.push_front(vm);

  // Get all relevant Paths and Options from option files
  setupOptions();
}

129 130 131
/** \brief Second initialization stage
 *
 * This Stage does the following :\n
Jan Möbius's avatar
 
Jan Möbius committed
132 133 134 135 136 137
 * - 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
 */
138 139 140
void
Core::init() {

Jan Möbius's avatar
 
Jan Möbius committed
141
  // Make root_node available to the plugins ( defined in PluginFunctions.hh)
142 143 144
  PluginFunctions::set_rootNode( root_node_ );

  PluginFunctions::set_sceneGraphRootNode( root_node_scenegraph_ );
Dirk Wilden's avatar
Dirk Wilden committed
145

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

150

Jan Möbius's avatar
 
Jan Möbius committed
151
  if ( OpenFlipper::Options::gui() ) {
152 153 154 155 156 157

    redrawTimer_ = new QTimer();
    redrawTimer_->setSingleShot(true);
    connect(redrawTimer_, SIGNAL(timeout()), this, SLOT(updateView()),Qt::DirectConnection);


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

Jan Möbius's avatar
 
Jan Möbius committed
161 162
      splash_ = new QSplashScreen(splashPixmap);
      splash_->show();
163 164

      splash_->showMessage("Initializing mainwindow" ,
Jan Möbius's avatar
 
Jan Möbius committed
165 166 167
                          Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
168

Dirk Wilden's avatar
Dirk Wilden committed
169
    coreWidget_ = new CoreWidget(viewModes_ , plugins);
170

Jan Möbius's avatar
 
Jan Möbius committed
171 172 173 174 175 176 177
    connect(coreWidget_, SIGNAL(clearAll())           , this, SLOT(clearAll()));
    connect(coreWidget_, SIGNAL(loadMenu())           , this, SLOT(slotLoadMenu()));
    connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
    connect(coreWidget_, SIGNAL(saveMenu())           , this, SLOT(slotSaveMenu()));
    connect(coreWidget_, SIGNAL(saveToMenu())         , this, SLOT(slotSaveToMenu()));
    connect(coreWidget_, SIGNAL(loadIniMenu())        , this, SLOT(slotLoadIniMenu()));
    connect(coreWidget_, SIGNAL(saveIniMenu())        , this, SLOT(slotSaveIniMenu()));
178
    connect(coreWidget_, SIGNAL(applyOptions())       , this, SLOT(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
179
    connect(coreWidget_, SIGNAL(saveOptions())        , this, SLOT(saveOptions()));
Jan Möbius's avatar
 
Jan Möbius committed
180 181
    connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
    connect(coreWidget_, SIGNAL(exit())               , this, SLOT(slotExit()));
182

Jan Möbius's avatar
 
Jan Möbius committed
183 184
    connect(coreWidget_, SIGNAL(loadPlugin())         , this, SLOT(slotLoadPlugin()));
    connect(coreWidget_, SIGNAL(unloadPlugin())       , this, SLOT(slotUnloadPlugin()));
185

Jan Möbius's avatar
 
Jan Möbius committed
186
    coreWidget_->resize(1000,1000);
187 188 189

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

Jan Möbius's avatar
 
Jan Möbius committed
190 191
    // Make examiner available to the plugins ( defined in PluginFunctions.hh)
    PluginFunctions::set_examiner( coreWidget_->examiner_widget_ );
192 193


Jan Möbius's avatar
 
Jan Möbius committed
194
  }
195

Jan Möbius's avatar
 
Jan Möbius committed
196 197 198 199
  // ======================================================================
  // Create intermediate logger class for Core which will mangle the output
  // ======================================================================
  PluginLogger* newlog = new PluginLogger("Core");
200

Jan Möbius's avatar
 
Jan Möbius committed
201 202
  loggers_.push_back(newlog);
  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
203 204
  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);

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

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

Dirk Wilden's avatar
Dirk Wilden committed
211 212
  // connection to file logger
  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
213 214 215 216 217 218 219

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

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

Dirk Wilden's avatar
Dirk Wilden committed
221 222
    loggers_.push_back(widgetlog);
    connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
223 224
    connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);

Dirk Wilden's avatar
Dirk Wilden committed
225 226 227
    // 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
228 229
    // connection to file logger
    connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
Dirk Wilden's avatar
Dirk Wilden committed
230
  }
231

Jan Möbius's avatar
 
Jan Möbius committed
232 233 234 235 236 237
  // ======================================================================
  // Catch OpenMesh Error logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
  omerr().connect(*newlog);
  omerr().disconnect(std::cerr);
238

Jan Möbius's avatar
 
Jan Möbius committed
239
  loggers_.push_back(newlog);
240

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

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

Jan Möbius's avatar
 
Jan Möbius committed
249 250 251 252 253 254
  // ======================================================================
  // Catch OpenMesh omout logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
  omout().connect(*newlog);
  omout().disconnect(std::cout);
255

Jan Möbius's avatar
 
Jan Möbius committed
256
  loggers_.push_back(newlog);
257

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

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

Jan Möbius's avatar
 
Jan Möbius committed
266 267 268 269 270
  // ======================================================================
  // Catch OpenMesh omlog logs with an own Logger
  // ======================================================================
  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
  omlog().connect(*newlog);
271

Jan Möbius's avatar
 
Jan Möbius committed
272
  loggers_.push_back(newlog);
273

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

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

Jan Möbius's avatar
 
Jan Möbius committed
282 283 284 285
  // ======================================================================
  // Log Scripting stuff through a separate logger
  // ======================================================================
  newlog = new PluginLogger("Scripting",LOGOUT);
286

Jan Möbius's avatar
 
Jan Möbius committed
287
  loggers_.push_back(newlog);
288

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
300 301 302 303 304
  // ======================================================================
  // This connection will tell the plugins, when their Toolbox is active
  // ======================================================================
  ///@todo reimplement
//   connect(module_list,SIGNAL(currentChanged(int)),this,SLOT(slotToolboxSwitched(int)));
305

Jan Möbius's avatar
 
Jan Möbius committed
306 307
  // process Events every 500 msecs during script execution
  scriptEngine_.setProcessEventsInterval( 500 );
308

Jan Möbius's avatar
 
Jan Möbius committed
309 310 311 312
  // Register own print function :
  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
  scriptEngine_.globalObject().setProperty("print", printFunction);
313

Jan Möbius's avatar
 
Jan Möbius committed
314
  // Register Vector Type to ScriptEngine ( is Vec3d )
315 316
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueVector,
Jan Möbius's avatar
 
Jan Möbius committed
317 318
                          fromScriptValueVector,
                          scriptEngine_.newQObject(&vec3dPrototype_));
319

Jan Möbius's avatar
 
Jan Möbius committed
320 321 322
  // set a constructor to allow creation via Vector(x,y,z)
  QScriptValue ctor = scriptEngine_.newFunction(createVector);
  scriptEngine_.globalObject().setProperty("Vector", ctor);
323 324


Jan Möbius's avatar
 
Jan Möbius committed
325
//    // Register ObjectId Type to ScriptEngine ( is int )
326 327
//   qScriptRegisterMetaType(&scriptEngine_,
//                           toScriptValueObjectId,
Jan Möbius's avatar
 
Jan Möbius committed
328
//                           fromScriptValueObjectId);
329
//
Jan Möbius's avatar
 
Jan Möbius committed
330 331 332
//   // set a constructor to allow creation via Vector(x,y,z)
//   ctor = scriptEngine_.newFunction(createObjectId);
//   scriptEngine_.globalObject().setProperty("ObjectId", ctor);
333 334


Jan Möbius's avatar
 
Jan Möbius committed
335 336 337 338
  // Register idList Type to scripting Engine
  qScriptRegisterSequenceMetaType< idList >(&scriptEngine_);

  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
339 340


Jan Möbius's avatar
 
Jan Möbius committed
341
  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
342 343
  qScriptRegisterMetaType(&scriptEngine_,
                          toScriptValueMatrix4x4 ,
Jan Möbius's avatar
 
Jan Möbius committed
344 345
                          fromScriptValueMatrix4x4,
                          scriptEngine_.newQObject(&matrix4x4Prototype_));
346

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

Jan Möbius's avatar
 
Jan Möbius committed
351 352 353 354 355 356 357
  // Collect Core scripting information
  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
                                                         QScriptEngine::QtOwnership,
                                                         QScriptEngine::ExcludeChildObjects |
                                                         QScriptEngine::ExcludeSuperClassMethods |
                                                         QScriptEngine::ExcludeSuperClassProperties
                                                         );
358

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

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

Jan Möbius's avatar
 
Jan Möbius committed
364 365 366
  QScriptValueIterator it(scriptInstance);
  while (it.hasNext()) {
    it.next();
367

Jan Möbius's avatar
 
Jan Möbius committed
368 369 370
    /// Skip all signals for function calls
    if ( checkSignal( this, it.name().toAscii() ) )
      continue;
371

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

Jan Möbius's avatar
 
Jan Möbius committed
374 375
    emit log(LOGOUT,"\t" + it.name());
  }
376

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

Jan Möbius's avatar
 
Jan Möbius committed
379
  loadPlugins();
380

Jan Möbius's avatar
 
Jan Möbius committed
381
  if ( OpenFlipper::Options::gui() ) {
382 383

    if ( OpenFlipper::Options::defaultToolboxMode( ) != "" )
Jan Möbius's avatar
 
Jan Möbius committed
384 385 386
      coreWidget_->setViewMode( OpenFlipper::Options::defaultToolboxMode() );
    else
      coreWidget_->setViewMode("All");
387 388

    connect( coreWidget_->examiner_widget_, SIGNAL(signalMouseEvent(QMouseEvent*)),
Jan Möbius's avatar
 
Jan Möbius committed
389 390 391 392 393
            this,SLOT(slotMouseEvent(QMouseEvent*)));
    connect( coreWidget_->examiner_widget_, SIGNAL(signalMouseEventIdentify(QMouseEvent*)),
            this,SLOT(slotMouseEventIdentify(QMouseEvent*)));
    connect( coreWidget_->examiner_widget_, SIGNAL(signalWheelEvent(QWheelEvent *, const std::string &)),
            this,                           SLOT(slotWheelEvent(QWheelEvent *, const std::string &)));
394

Jan Möbius's avatar
 
Jan Möbius committed
395
  }
396

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

Jan Möbius's avatar
 
Jan Möbius committed
400
    if ( OpenFlipper::Options::gui() && OpenFlipper::Options::splash() ) {
401
      splash_->showMessage("Loading Configuration File " + QString::number(i) + "/"  + QString::number(optionFiles.size()) ,
Jan Möbius's avatar
 
Jan Möbius committed
402 403 404
                           Qt::AlignBottom | Qt::AlignLeft , Qt::white);
      QApplication::processEvents();
    }
405

Jan Möbius's avatar
 
Jan Möbius committed
406 407 408
    openIniFile( optionFiles[i] );
  }

409

Jan Möbius's avatar
 
Jan Möbius committed
410 411 412 413 414 415
  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
    emit log(LOGWARN,"Warning, OpenFlipper detected that you are using an utf-8 locale!");
    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.");
416
  }
Jan Möbius's avatar
 
Jan Möbius committed
417 418

  applyOptions();
419

Jan Möbius's avatar
 
Jan Möbius committed
420
  if ( OpenFlipper::Options::gui() ) {
Dirk Wilden's avatar
Dirk Wilden committed
421 422 423 424 425 426

    //try to restore the windowState
    QFile file(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                                                  OpenFlipper::Options::dirSeparator() +  "windowState.dat");
    if (file.open(QIODevice::ReadOnly)){
      QByteArray bytes = file.readAll();
427

Dirk Wilden's avatar
Dirk Wilden committed
428
      coreWidget_->restoreState( bytes );
429

Dirk Wilden's avatar
Dirk Wilden committed
430 431 432 433 434 435 436 437
      file.close();
    }

    //try to restore the geometry
    QFile file2(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                                                  OpenFlipper::Options::dirSeparator() +  "geometry.dat");
    if (file2.open(QIODevice::ReadOnly)){
      QByteArray bytes = file2.readAll();
438

Dirk Wilden's avatar
Dirk Wilden committed
439
      coreWidget_->restoreGeometry( bytes );
440

Dirk Wilden's avatar
Dirk Wilden committed
441 442 443 444
      file2.close();
    }


Jan Möbius's avatar
 
Jan Möbius committed
445
    coreWidget_->show();
446

Jan Möbius's avatar
 
Jan Möbius committed
447 448 449
    if ( OpenFlipper::Options::splash() ) {
      splash_->finish(coreWidget_);
    }
450

Jan Möbius's avatar
 
Jan Möbius committed
451
  }
452

Jan Möbius's avatar
 
Jan Möbius committed
453 454 455 456 457 458 459 460
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
462 463 464 465 466
     // 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);
  }
467

Jan Möbius's avatar
 
Jan Möbius committed
468 469
  objectRoot_->deleteSubtree();
  delete objectRoot_;
470

Jan Möbius's avatar
 
Jan Möbius committed
471
  // Clean up loggers
472 473 474
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

Jan Möbius's avatar
 
Jan Möbius committed
475 476 477 478 479 480 481 482 483 484
}

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

void
Core::slotMouseEventIdentify( QMouseEvent* _event )
{
  // Dont do anything as a context Menu will popup on right button click
  if ( _event->button() == Qt::RightButton )
    return;
485

Jan Möbius's avatar
 
Jan Möbius committed
486 487 488 489 490 491 492 493 494 495 496 497
  emit PluginMouseEventIdentify( _event );
}

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


void
Core::slotMouseEvent( QMouseEvent* _event )
{
  // Dont do anything as a context Menu will popup on right button click
  if ( _event->button() == Qt::RightButton )
    return;
498

Jan Möbius's avatar
 
Jan Möbius committed
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
  emit PluginMouseEvent(_event );
}

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

void
Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
{
  emit PluginWheelEvent(_event , _mode );
}

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

void
Core::slotAddPickMode( const std::string _mode ) {
  if ( OpenFlipper::Options::gui() )
515
    coreWidget_->examiner_widget_->addPickMode(_mode);
Jan Möbius's avatar
 
Jan Möbius committed
516 517 518 519 520 521 522
}

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

void
Core::slotAddHiddenPickMode( const std::string _mode ) {
  if ( OpenFlipper::Options::gui() )
523
    coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false);
Jan Möbius's avatar
 
Jan Möbius committed
524 525 526 527 528 529 530
}

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

void
Core::slotAddPickMode( const std::string _mode , QCursor _cursor) {
  if ( OpenFlipper::Options::gui() )
531
    coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,true,_cursor);
Jan Möbius's avatar
 
Jan Möbius committed
532 533 534 535 536 537 538
}

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

void
Core::slotAddHiddenPickMode( const std::string _mode , QCursor _cursor) {
  if ( OpenFlipper::Options::gui() )
539
    coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false, _cursor);
Jan Möbius's avatar
 
Jan Möbius committed
540 541 542 543 544 545 546 547 548
}



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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
549 550 551 552 553 554 555 556 557

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

558
  if ( OpenFlipper::Options::restrictFrameRate() ) {
559 560 561

    // redraw time not reached ... waiting for timer event for next redraw
    if ( redrawTimer_->isActive() ) {
Jan Möbius's avatar
Jan Möbius committed
562 563
      if ( OpenFlipper::Options::doSlotDebugging() )
        emit log(LOGINFO,"Too early for redraw! Delaying request from " + QString( sender()->metaObject()->className() ) );
564 565 566
      return;
    }

567
//     std::cerr << "Redraw" << std::endl;
568 569

    // Start the timer if we are not called by the timer
Jan Möbius's avatar
Jan Möbius committed
570
    if ( sender() != redrawTimer_ ) {
571
      redrawTimer_->start( 1000 / OpenFlipper::Options::maxFrameRate() );
Jan Möbius's avatar
Jan Möbius committed
572
    }
573 574 575 576

  }


Dirk Wilden's avatar
Dirk Wilden committed
577
  if ( OpenFlipper::Options::gui() && !OpenFlipper::Options::openingIni() && !OpenFlipper::Options::redrawDisabled() ) {
Dirk Wilden's avatar
Dirk Wilden committed
578
    coreWidget_->examiner_widget_->sceneGraph(root_node_scenegraph_);
Jan Möbius's avatar
 
Jan Möbius committed
579 580 581 582 583 584
    coreWidget_->examiner_widget_->updateGL();
  }
}

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

585 586 587 588 589 590 591 592 593 594 595 596 597
void Core::restrictFrameRate( bool _enable ) {
  OpenFlipper::Options::restrictFrameRate( _enable );
}

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

void Core::setMaxFrameRate( int _rate ) {
  OpenFlipper::Options::maxFrameRate( _rate );
  OpenFlipper::Options::restrictFrameRate( true );
}

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

598 599
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
600 601
{
  objectRoot_->deleteSubtree();
Jan Möbius's avatar
Jan Möbius committed
602
  emit allCleared();
Jan Möbius's avatar
 
Jan Möbius committed
603
  emit ObjectListUpdated(-1);
604

Jan Möbius's avatar
 
Jan Möbius committed
605 606 607 608 609
  slotScriptInfo( "core" , "clearAll()"  );
}

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

610 611
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
612 613 614 615
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
616

Jan Möbius's avatar
 
Jan Möbius committed
617 618 619 620 621
  QApplication::quit();
}

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

622 623
void
Core::setDrawMode(QString _mode)
Jan Möbius's avatar
 
Jan Möbius committed
624
{
625

Jan Möbius's avatar
 
Jan Möbius committed
626 627 628
  QStringList list = _mode.split(';');

  std::vector< QString > drawModeList;
629

Jan Möbius's avatar
 
Jan Möbius committed
630 631
  for ( int i = 0 ; i < list.size() ; ++i )
    drawModeList.push_back(list[i]);
632

Jan Möbius's avatar
 
Jan Möbius committed
633
  unsigned int mode = ListToDrawMode(drawModeList);
634

Jan Möbius's avatar
 
Jan Möbius committed
635 636 637 638 639 640 641 642
  PluginFunctions::setDrawMode( mode );
  emit updateView();
}


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

void Core::translate( Vector _vec ) {
643
  PluginFunctions::translate( _vec );
Jan Möbius's avatar
 
Jan Möbius committed
644 645 646 647 648
}

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

void Core::rotate( Vector _axis, double _angle, Vector _center ) {
649
  PluginFunctions::rotate( _axis, _angle, _center );
Jan Möbius's avatar
 
Jan Möbius committed
650 651 652 653 654 655 656 657 658 659 660
}

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

void Core::setViewingDirection( Vector _direction, Vector _upvector ) {
  PluginFunctions::viewingDirection(_direction, _upvector);
}

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

void Core::fullscreen() {
661
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
662 663 664 665 666 667
    coreWidget_->toggleFullscreen();
}

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

void Core::logger() {
668
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
669 670 671 672 673 674
    coreWidget_->toggleLogger();
}

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

void Core::toolbox() {
675
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
676 677
    coreWidget_->toggleToolbox();
}
678

Jan Möbius's avatar
 
Jan Möbius committed
679 680 681

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

682 683
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
684 685 686 687 688 689 690 691 692 693
{
  QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles();
  for (int i = 0 ; i < recentFiles.size() ; ++i )
    if ( recentFiles[i].filename == _action->text() ){
      loadObject(recentFiles[i].type, recentFiles[i].filename);
      break;
    }
}


694
void
Jan Möbius's avatar
 
Jan Möbius committed
695
Core::writeOnExit() {
696
  QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Jan Möbius's avatar
 
Jan Möbius committed
697 698 699 700 701
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.ini";

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

Jan Möbius's avatar
 
Jan Möbius committed
703 704 705
    if ( ! ini.connect( inifile,true) ) {
      emit log(LOGERR,"Can not create user ini file");
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
706
      writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
707 708 709
      ini.disconnect();
    }
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
710
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
711
    ini.disconnect();
712 713
  }

Dirk Wilden's avatar
Dirk Wilden committed
714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
  //store the windowState
  if ( OpenFlipper::Options::gui() ) {
    QFile file(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                                                  OpenFlipper::Options::dirSeparator() +  "windowState.dat");
    if (file.open(QIODevice::WriteOnly))
    {
      file.write( coreWidget_->saveState() );
      file.close();
    }
    QFile file2(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
                                                  OpenFlipper::Options::dirSeparator() +  "geometry.dat");
    if (file2.open(QIODevice::WriteOnly))
    {
      file2.write( coreWidget_->saveGeometry() );
      file2.close();
    }
  }

Jan Möbius's avatar
 
Jan Möbius committed
732 733 734 735 736 737 738 739 740 741 742
  // 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
743 744 745 746

  if (logFile_)
    logFile_->close();

Jan Möbius's avatar
 
Jan Möbius committed
747
  qApp->quit();
748
}
Jan Möbius's avatar
 
Jan Möbius committed
749 750 751 752 753 754 755

/// Synchronise two viewers
bool Core::add_sync_host(const QString& _name)
{
  if ( OpenFlipper::Options::gui() ) {
    emit log(LOGINFO,"Adding SyncHost");
    bool ok = coreWidget_->examiner_widget_->add_sync_host(_name);
756
    if (ok)
Jan Möbius's avatar
 
Jan Möbius committed
757 758 759 760 761 762 763 764
      coreWidget_->examiner_widget_->setSynchronization(true);
    else
      emit log(LOGERR,"Sync failed! ");
    return ok;
  }
  return false;
}

Dirk Wilden's avatar
Dirk Wilden committed
765 766 767 768 769 770 771 772 773
/// log to file
void Core::slotLogToFile(Logtype _type, QString _message){

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

  if (logStream_ == 0){
    //check if a logfile has been specified
    if (OpenFlipper::Options::logFile() == "")
774
        OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Dirk Wilden's avatar
Dirk Wilden committed
775 776 777 778 779 780 781 782 783 784
                                                  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
785

Dirk Wilden's avatar
Dirk Wilden committed
786 787 788 789 790 791 792 793 794 795 796 797
  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;
798

Dirk Wilden's avatar
Dirk Wilden committed
799
}
Jan Möbius's avatar
 
Jan Möbius committed
800

Dirk Wilden's avatar
Dirk Wilden committed
801
// //-----------------------------------------------------------------------------
802
//
Dirk Wilden's avatar
Dirk Wilden committed
803 804 805 806 807 808
// 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;
//     }
809
//
Dirk Wilden's avatar
Dirk Wilden committed
810 811 812
//   _plugin = 0;
//   return;
// }
Jan Möbius's avatar
 
Jan Möbius committed
813 814

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