Core.cc 25.6 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 421
  if ( OpenFlipper::Options::gui() ) {
    coreWidget_->show();
422

Jan Möbius's avatar
 
Jan Möbius committed
423 424 425
    if ( OpenFlipper::Options::splash() ) {
      splash_->finish(coreWidget_);
    }
426

Jan Möbius's avatar
 
Jan Möbius committed
427
  }
428

Jan Möbius's avatar
 
Jan Möbius committed
429 430 431 432 433 434 435 436
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
438 439 440 441 442
     // 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);
  }
443

Jan Möbius's avatar
 
Jan Möbius committed
444 445
  objectRoot_->deleteSubtree();
  delete objectRoot_;
446

Jan Möbius's avatar
 
Jan Möbius committed
447
  // Clean up loggers
448 449 450
  for ( uint i = 0 ; i < loggers_.size(); ++i )
    delete loggers_[i];

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
  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() )
491
    coreWidget_->examiner_widget_->addPickMode(_mode);
Jan Möbius's avatar
 
Jan Möbius committed
492 493 494 495 496 497 498
}

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

void
Core::slotAddHiddenPickMode( const std::string _mode ) {
  if ( OpenFlipper::Options::gui() )
499
    coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,false);
Jan Möbius's avatar
 
Jan Möbius committed
500 501 502 503 504 505 506
}

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

void
Core::slotAddPickMode( const std::string _mode , QCursor _cursor) {
  if ( OpenFlipper::Options::gui() )
507
    coreWidget_->examiner_widget_->addPickMode(_mode,false,1000,true,_cursor);
Jan Möbius's avatar
 
Jan Möbius committed
508 509 510 511 512 513 514
}

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

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



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

 /** Update the view in the examiner widget
  */
void Core::updateView() {
Jan Möbius's avatar
Jan Möbius committed
525 526 527 528 529 530 531 532 533

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

534
  if ( OpenFlipper::Options::restrictFrameRate() ) {
535 536 537

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

543
//     std::cerr << "Redraw" << std::endl;
544 545

    // Start the timer if we are not called by the timer
Jan Möbius's avatar
Jan Möbius committed
546
    if ( sender() != redrawTimer_ ) {
547
      redrawTimer_->start( 1000 / OpenFlipper::Options::maxFrameRate() );
Jan Möbius's avatar
Jan Möbius committed
548
    }
549 550 551 552

  }


Dirk Wilden's avatar
Dirk Wilden committed
553
  if ( OpenFlipper::Options::gui() && !OpenFlipper::Options::openingIni() && !OpenFlipper::Options::redrawDisabled() ) {
Dirk Wilden's avatar
Dirk Wilden committed
554
    coreWidget_->examiner_widget_->sceneGraph(root_node_scenegraph_);
Jan Möbius's avatar
 
Jan Möbius committed
555 556 557 558 559 560
    coreWidget_->examiner_widget_->updateGL();
  }
}

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

561 562
void
Core::clearAll()
Jan Möbius's avatar
 
Jan Möbius committed
563 564
{
  objectRoot_->deleteSubtree();
Jan Möbius's avatar
Jan Möbius committed
565
  emit allCleared();
Jan Möbius's avatar
 
Jan Möbius committed
566
  emit ObjectListUpdated(-1);
567

Jan Möbius's avatar
 
Jan Möbius committed
568 569 570 571 572
  slotScriptInfo( "core" , "clearAll()"  );
}

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

573 574
void
Core::exitApplication()
Jan Möbius's avatar
 
Jan Möbius committed
575 576 577 578
{
  QTimer* timer = new QTimer();
  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
  timer->start(100);
579

Jan Möbius's avatar
 
Jan Möbius committed
580 581 582 583 584
  QApplication::quit();
}

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

585 586
void
Core::setDrawMode(QString _mode)
Jan Möbius's avatar
 
Jan Möbius committed
587
{
588

Jan Möbius's avatar
 
Jan Möbius committed
589 590 591
  QStringList list = _mode.split(';');

  std::vector< QString > drawModeList;
592

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

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

Jan Möbius's avatar
 
Jan Möbius committed
598 599 600 601 602 603 604 605
  PluginFunctions::setDrawMode( mode );
  emit updateView();
}


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

void Core::translate( Vector _vec ) {
606
  PluginFunctions::translate( _vec );
Jan Möbius's avatar
 
Jan Möbius committed
607 608 609 610 611
}

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

void Core::rotate( Vector _axis, double _angle, Vector _center ) {
612
  PluginFunctions::rotate( _axis, _angle, _center );
Jan Möbius's avatar
 
Jan Möbius committed
613 614 615 616 617 618 619 620 621 622 623
}

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

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

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

void Core::fullscreen() {
624
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
625 626 627 628 629 630
    coreWidget_->toggleFullscreen();
}

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

void Core::logger() {
631
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
632 633 634 635 636 637
    coreWidget_->toggleLogger();
}

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

void Core::toolbox() {
638
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
639 640
    coreWidget_->toggleToolbox();
}
641

Jan Möbius's avatar
 
Jan Möbius committed
642 643 644

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

645 646
void
Core::slotRecentOpen(QAction* _action)
Jan Möbius's avatar
 
Jan Möbius committed
647 648 649 650 651 652 653 654 655 656
{
  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;
    }
}


657
void
Jan Möbius's avatar
 
Jan Möbius committed
658
Core::writeOnExit() {
659
  QString inifile = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Jan Möbius's avatar
 
Jan Möbius committed
660 661 662 663 664
                                                  OpenFlipper::Options::dirSeparator() +  "OpenFlipper.ini";

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

Jan Möbius's avatar
 
Jan Möbius committed
666 667 668
    if ( ! ini.connect( inifile,true) ) {
      emit log(LOGERR,"Can not create user ini file");
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
669
      writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
670 671 672
      ini.disconnect();
    }
  } else {
Dirk Wilden's avatar
Dirk Wilden committed
673
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
674
    ini.disconnect();
675 676
  }

Jan Möbius's avatar
 
Jan Möbius committed
677 678 679 680 681 682 683 684 685 686 687
  // 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
688 689 690 691

  if (logFile_)
    logFile_->close();

Jan Möbius's avatar
 
Jan Möbius committed
692
  qApp->quit();
693
}
Jan Möbius's avatar
 
Jan Möbius committed
694 695 696 697 698 699 700

/// 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);
701
    if (ok)
Jan Möbius's avatar
 
Jan Möbius committed
702 703 704 705 706 707 708 709
      coreWidget_->examiner_widget_->setSynchronization(true);
    else
      emit log(LOGERR,"Sync failed! ");
    return ok;
  }
  return false;
}

Dirk Wilden's avatar
Dirk Wilden committed
710 711 712 713 714 715 716 717 718
/// 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() == "")
719
        OpenFlipper::Options::logFile(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
Dirk Wilden's avatar
Dirk Wilden committed
720 721 722 723 724 725 726 727 728 729
                                                  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
730

Dirk Wilden's avatar
Dirk Wilden committed
731 732 733 734 735 736 737 738 739 740 741 742
  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;
743

Dirk Wilden's avatar
Dirk Wilden committed
744
}
Jan Möbius's avatar
 
Jan Möbius committed
745

Dirk Wilden's avatar
Dirk Wilden committed
746 747 748 749 750 751 752 753 754 755 756 757
// //-----------------------------------------------------------------------------
// 
// 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;
//     }
//   
//   _plugin = 0;
//   return;
// }
Jan Möbius's avatar
 
Jan Möbius committed
758 759

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