openFunctions.cc 25.8 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56





#include "Core.hh"

#include <ACG/QtWidgets/QtFileDialog.hh>

#include "OpenFlipper/common/GlobalOptions.hh"
#include "OpenFlipper/BasePlugin/PluginFunctions.hh"

#include "OpenFlipper/widgets/loadWidget/loadWidget.hh"
#include "OpenFlipper/widgets/addEmptyWidget/addEmptyWidget.hh"

57
58
59
#include <OpenFlipper/common/Types.hh>
#include <ObjectTypes/PolyMesh/PolyMesh.hh>

60
61
#include <time.h>

62
void Core::resetScenegraph( bool _resetTrackBall  ) {
63
  if ( OpenFlipper::Options::gui() && !OpenFlipper::Options::loadingSettings() ) {
Jan Möbius's avatar
Jan Möbius committed
64
65

    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
66
      // update scene graph (get new bounding box and set projection right, including near and far plane)
67
      PluginFunctions::viewerProperties(i).lockUpdate();
68
      coreWidget_->examiner_widgets_[i]->sceneGraph(root_node_scenegraph_, _resetTrackBall );
69
      PluginFunctions::viewerProperties(i).unLockUpdate();
Jan Möbius's avatar
Jan Möbius committed
70
71
72
      coreWidget_->examiner_widgets_[i]->updateGL();
    }

Jan Möbius's avatar
 
Jan Möbius committed
73
  }
74

Jan Möbius's avatar
Jan Möbius committed
75
  // Update the draw Modes Menu
Dirk Wilden's avatar
Dirk Wilden committed
76
77
  if ( OpenFlipper::Options::gui() )
    coreWidget_->slotUpdateGlobalDrawMenu();
Jan Möbius's avatar
 
Jan Möbius committed
78
79
80
81
82
83
84
85
86
}

//========================================================================================
// ===            Open/Add-Empty Functions                    ============================
//========================================================================================


void Core::slotGetAllFilters ( QStringList& _list){

Jan Möbius's avatar
Jan Möbius committed
87
  // Iterate over all types
Jan Möbius's avatar
 
Jan Möbius committed
88
89
90
91
92
93
94
95
  for (int i=0; i < (int)supportedTypes_.size(); i++){
    QString f = supportedTypes_[i].plugin->getLoadFilters();
    f = f.section(")",0,0).section("(",1,1).trimmed();
    _list << (QString::number(supportedTypes_[i].plugin->supportedType()) + " " + f);
  }
}

void Core::commandLineOpen(const char* _filename, bool asPolyMesh ){
96

Jan Möbius's avatar
Jan Möbius committed
97
  QString file(_filename);
98

Jan Möbius's avatar
Jan Möbius committed
99
100
101
102
103
104
  // Modify filename to containe full paths
  if ( !file.startsWith("/") && !file.contains(":") ) {
    file = QDir::currentPath();
    file += OpenFlipper::Options::dirSeparator();
    file += _filename;
  }
105

Jan Möbius's avatar
Jan Möbius committed
106
107
  // Add to the open list
  commandLineFileNames_.push_back(std::pair< std::string , bool >(file.toStdString(), asPolyMesh));
Jan Möbius's avatar
 
Jan Möbius committed
108
109
110
}

void Core::commandLineScript(const char* _filename ) {
111
112
113
  commandLineScriptNames_.push_back(_filename);
}

Jan Möbius's avatar
Jan Möbius committed
114
115
116
117
118
119
void Core::slotExecuteAfterStartup() {

  //check if we have scripting support:
  bool scriptingSupport = false;
  slotPluginExists("scripting",scriptingSupport);
  if ( ! scriptingSupport ) {
120
    emit log(LOGERR ,tr("No scripting support available, please check if we load a scripting plugin .. Skipping script execution on startup"));
Jan Möbius's avatar
Jan Möbius committed
121
122
123
124
125
126
127
128
129
  }

  // Collect all script files from the scripting subdirectory and execute them if possible
  if ( scriptingSupport ) {

    QDir scriptDir = OpenFlipper::Options::scriptDir();
    QStringList scriptFiles = scriptDir.entryList(QDir::Files,QDir::Name);

    for ( int i = 0 ; i  < scriptFiles.size(); ++i )
Jan Möbius's avatar
Jan Möbius committed
130
131
      if ( scriptFiles[i].endsWith("ofs") )
        emit executeFileScript(scriptDir.path() + QDir::separator() + scriptFiles[i]);
Jan Möbius's avatar
Jan Möbius committed
132
133
134

  }

135
  for ( uint i = 0 ; i < commandLineFileNames_.size() ; ++i ) {
136
137

    // Skip scripts here as they will be handled by a different function
138
    QString tmp = QString::fromStdString(commandLineFileNames_[i].first);
139
140
141
142
143
    if ( tmp.endsWith("ofs") ) {
      commandLineScriptNames_.push_back(commandLineFileNames_[i].first);
      continue;
    }

144
    if (commandLineFileNames_[i].second)
145
146
147
148
      loadObject(DATA_POLY_MESH, QString::fromStdString(commandLineFileNames_[i].first));
    else {
      loadObject(QString::fromStdString(commandLineFileNames_[i].first));
    }
Jan Möbius's avatar
 
Jan Möbius committed
149
150
  }

Jan Möbius's avatar
Jan Möbius committed
151
  if ( scriptingSupport )
152
153
    for ( uint i = 0 ; i < commandLineScriptNames_.size() ; ++i ) {
      // Add the full path to the script to set scripting dir right
154
      QString tmp = QString::fromStdString(commandLineScriptNames_[i]);
155
156
157
      tmp = QDir::currentPath() + QDir::separator() + tmp;
      emit executeFileScript(tmp);
    }
158

Dirk Wilden's avatar
Dirk Wilden committed
159
160
  if ( !OpenFlipper::Options::gui() && !OpenFlipper::Options::remoteControl())
    exitApplication();
Jan Möbius's avatar
 
Jan Möbius committed
161
162
163
164
}

/// Load object by guessing DataType depending on the files extension
int Core::loadObject ( QString _filename ) {
165

Jan Möbius's avatar
 
Jan Möbius committed
166
  if (_filename.endsWith(".ini")) {
167
168

    // Load all information from the given ini file
169
    openIniFile(_filename,true,true,true);
170

Jan Möbius's avatar
 
Jan Möbius committed
171
    if ( OpenFlipper::Options::gui() )
172
      coreWidget_->addRecent(_filename, DATA_UNKNOWN);
173

Jan Möbius's avatar
 
Jan Möbius committed
174
175
176
    return -2;
  } else
  if (_filename.endsWith(".ofs")) {
Jan Möbius's avatar
Jan Möbius committed
177
     emit log(LOGINFO ,tr("Starting script execution of %1.").arg( _filename)) ;
Jan Möbius's avatar
 
Jan Möbius committed
178
179
180
181
182
183
184
185
186
187
     emit executeFileScript(_filename);
  } else
    return loadObject( DATA_TRIANGLE_MESH, _filename);

  return -1;
}

/// Function for loading a given file
int Core::loadObject( DataType _type, QString _filename) {

188
  if (_type == DATA_UNKNOWN)
Jan Möbius's avatar
 
Jan Möbius committed
189
190
191
192
193
194
195
    return loadObject(_filename);

  for (int i=0; i < (int)supportedTypes_.size(); i++)
    if (supportedTypes_[i].type == _type) {


      if ( OpenFlipper::Options::gui() ) {
Jan Möbius's avatar
Jan Möbius committed
196
        coreWidget_->statusMessage( tr("Loading %1 ... ").arg(_filename));
197
        if ( !OpenFlipper::Options::loadingSettings() )
Jan Möbius's avatar
 
Jan Möbius committed
198
199
200
201
202
203
204
205
          coreWidget_->setStatus(ApplicationStatus::PROCESSING );
      }

      //load file
      int id = supportedTypes_[i].plugin->loadObject(_filename);

      if ( OpenFlipper::Options::gui() ) {
        if ( id != -1 )
Jan Möbius's avatar
Jan Möbius committed
206
          coreWidget_->statusMessage( tr("Loading %1 ... done").arg(_filename), 4000 );
Jan Möbius's avatar
 
Jan Möbius committed
207
        else
Jan Möbius's avatar
Jan Möbius committed
208
          coreWidget_->statusMessage( tr("Loading %1 ... failed!").arg(_filename), 4000 );
Jan Möbius's avatar
 
Jan Möbius committed
209

210
        if ( !OpenFlipper::Options::loadingSettings() )
Jan Möbius's avatar
 
Jan Möbius committed
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
          coreWidget_->setStatus(ApplicationStatus::READY );
      }

      return id;
    }
  return -1; //no plugin found
}

/// Function for adding an empty object of given DataType
int Core::addEmptyObject( DataType _type ) {
  for (int i=0; i < (int)supportedTypes_.size(); i++)
    if (supportedTypes_[i].type == _type)
      return supportedTypes_[i].plugin->addEmpty();
  return -1; //no plugin found
}

//========================================================================================
// ===             Open/Add-Empty Slots                       ============================
//========================================================================================

/// Slot for adding an empty object of given DataType
void Core::slotAddEmptyObject( DataType _type , int& _id ) {
  _id = addEmptyObject( _type );
}

236
/// Slot creating a copy of an existing object
Jan Möbius's avatar
Jan Möbius committed
237
void Core::slotCopyObject( int _oldId , int& _newId ) {
238

Jan Möbius's avatar
Jan Möbius committed
239
  if ( _oldId == -1 ) {
Jan Möbius's avatar
Jan Möbius committed
240
    emit log(LOGERR,tr("Requested copy for illegal Object id: %1").arg(_oldId) );
Jan Möbius's avatar
Jan Möbius committed
241
242
243
244
245
246
247
248
    _newId = -1;
    return;
  }

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

  if ( !object ) {
Jan Möbius's avatar
Jan Möbius committed
249
    emit log(LOGERR,tr("Requested copy for unknown Object id: %1 ").arg(_oldId) );
Jan Möbius's avatar
Jan Möbius committed
250
251
252
253
254
255
256
257
    _newId = -1;
    return ;
  }

  // Copy the item
  BaseObject* copy = object->copy();

  if ( copy == 0 ) {
258
    emit log(LOGERR,tr("Unable to create a copy of the object."));
Jan Möbius's avatar
Jan Möbius committed
259
260
261
262
263
264
265
266
267
268
    return;
  }

  // Integrate into object tree
  copy->setParent( object->parent() );
  if ( object->parent() )
    object->parent()->appendChild(copy);
  else
    std::cerr << "Unable to add copy to object list" << std::endl;

269
  // return the new id
Jan Möbius's avatar
Jan Möbius committed
270
  _newId = copy->id();
271

272
273
274
275
276
277
  // tell plugins that a new object has been created
  slotEmptyObjectAdded(_newId);

  // tell plugins that the object has been updated
  slotObjectUpdated(_newId);

278
279
}

Dirk Wilden's avatar
Dirk Wilden committed
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
/// Function for loading a given file
void Core::slotLoad(QString _filename, int _pluginID) {

  if ( OpenFlipper::Options::gui() ) {
    coreWidget_->statusMessage( tr("Loading %1 ... ").arg(_filename));
    if ( !OpenFlipper::Options::loadingSettings() )
      coreWidget_->setStatus(ApplicationStatus::PROCESSING );
  }

  //load file
  int id = supportedTypes_[_pluginID].plugin->loadObject(_filename);

  if ( OpenFlipper::Options::gui() ) {
    if ( id != -1 )
      coreWidget_->statusMessage( tr("Loading %1 ... done").arg(_filename), 4000 );
    else
      coreWidget_->statusMessage( tr("Loading %1 ... failed!").arg(_filename), 4000 );

    if ( !OpenFlipper::Options::loadingSettings() )
      coreWidget_->setStatus(ApplicationStatus::READY );
  }

  BaseObjectData* object;
  PluginFunctions::getObject(id,object);

  DataType type = object->dataType();
  
  // Check if it is a polymesh
  if ( object != 0 && type == DATA_POLY_MESH ) {

    PolyMeshObject* poly = 0;
    PluginFunctions::getObject(id,poly);

    if ( poly != 0 ) {
        PolyMesh& mesh = *poly->mesh();

        bool isTriangleMesh = true;

        for ( PolyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end() ; ++f_it) {

          // Count number of vertices for the current face
          uint count = 0;
          for ( PolyMesh::FaceVertexIter fv_it( mesh,f_it); fv_it; ++fv_it )
            ++count;

          // Check if it is a triangle. If not, this is really a poly mesh
          if ( count != 3 ) {
            isTriangleMesh = false;
            break;
          }

        }

        // Mesh loaded as polymesh is actually a triangle mesh. Ask the user to reload as triangle mesh or keep it as poly mesh.
        if ( isTriangleMesh ) {
          QMessageBox::StandardButton result = QMessageBox::question ( 0,
                                                                      tr("TriMesh loaded as PolyMesh"),
                                                                      tr("You opened the mesh as a poly mesh but actually its a triangle mesh. \nShould it be opened as a triangle mesh?"),
                                                                      (QMessageBox::Yes | QMessageBox::No ),
                                                                      QMessageBox::Yes );
          // User decided to reload as triangle mesh
          if ( result == QMessageBox::Yes ) {
            slotDeleteObject(id);
            id = loadObject(DATA_TRIANGLE_MESH ,_filename);
            type = DATA_TRIANGLE_MESH;
          }
        }

    }
  }
  if ( id >= 0 )
    if ( OpenFlipper::Options::gui() )
      coreWidget_->addRecent(_filename, type);
}

Jan Möbius's avatar
 
Jan Möbius committed
355
356
357
/// Slot for loading a given file
void Core::slotLoad(QString _filename, DataType _type, int& _id) {
  _id = loadObject(_type,_filename);
358

359
360
  // Check if it is a polymesh
  if ( _type == DATA_POLY_MESH ) {
361

362
363
    PolyMeshObject* poly = 0;
    PluginFunctions::getObject(_id,poly);
364

365
366
    if ( poly != 0 ) {
        PolyMesh& mesh = *poly->mesh();
367

368
        bool isTriangleMesh = true;
369

370
        for ( PolyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end() ; ++f_it) {
371

372
373
          // Count number of vertices for the current face
          uint count = 0;
374
          for ( PolyMesh::FaceVertexIter fv_it( mesh,f_it); fv_it; ++fv_it )
375
            ++count;
376

377
378
379
380
381
          // Check if it is a triangle. If not, this is really a poly mesh
          if ( count != 3 ) {
            isTriangleMesh = false;
            break;
          }
382

383
        }
384

385
386
        // Mesh loaded as polymesh is actually a triangle mesh. Ask the user to reload as triangle mesh or keep it as poly mesh.
        if ( isTriangleMesh ) {
387
388
389
390
          QMessageBox::StandardButton result = QMessageBox::question ( 0,
                                                                      tr("TriMesh loaded as PolyMesh"),
                                                                      tr("You opened the mesh as a poly mesh but actually its a triangle mesh. \nShould it be opened as a triangle mesh?"),
                                                                      (QMessageBox::Yes | QMessageBox::No ),
391
                                                                      QMessageBox::Yes );
392
          // User decided to reload as triangle mesh
393
394
395
396
397
398
          if ( result == QMessageBox::Yes ) {
            slotDeleteObject(_id);
            _id = loadObject(DATA_TRIANGLE_MESH ,_filename);
            _type = DATA_TRIANGLE_MESH;
          }
        }
399

400
401
    }
  }
Jan Möbius's avatar
 
Jan Möbius committed
402
403
404
  if ( _id < 0 )
    _id = -1;
  else
405
    if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
406
407
408
409
      coreWidget_->addRecent(_filename,_type);
}

/// Slot gets called after a file-plugin has opened an object
410
411
412
413
void Core::slotObjectOpened ( int _id ) {
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
414
        emit log(LOGINFO,tr("slotObjectOpened( ") + QString::number(_id) + tr(" ) called by ") +
415
416
417
                  QString( sender()->metaObject()->className() ) );
      }
    } else {
418
      emit log(LOGINFO,tr("slotObjectOpened( ") + QString::number(_id) + tr(" ) called by Core") );
419
420
    }
  }
421
422

  // get the opened object
423
424
  BaseObjectData* object;
  PluginFunctions::getObject(_id,object);
425

426
  QColor color;
427

428
  if ( OpenFlipper::Options::randomBaseColor() ){
429
430
431
432
433
      //init random seed
      srand ( time(NULL) );

      QColor bckgrnd = OpenFlipper::Options::defaultBackgroundColor();
      int diff;
434

435
436
      do{
        color.setRgb(rand()%255, rand()%255, rand()%255);
437

438
439
440
        diff = (bckgrnd.red()   - color.red())  *(bckgrnd.red()   - color.red())
              +(bckgrnd.green() - color.green())*(bckgrnd.green() - color.green())
              +(bckgrnd.blue()  - color.blue()) *(bckgrnd.blue()  - color.blue());
441
      }while (diff < 70000);
442
443
  }
  else{
444
      color = OpenFlipper::Options::defaultBaseColor();
445
  }
446

447
448
449
450
451
  ACG::Vec4f colorV;
  colorV[0] = color.redF();
  colorV[1] = color.greenF();
  colorV[2] = color.blueF();
  colorV[3] = color.alphaF();
452

453
  object->setBaseColor( colorV );
Jan Möbius's avatar
 
Jan Möbius committed
454

Jan Möbius's avatar
Jan Möbius committed
455
  // ================================================================================
456
  // Set defaults for DrawMode, ViewingDirection and Projection if this is the first opened object
Jan Möbius's avatar
Jan Möbius committed
457
458
459
  // If a plugin changes the drawmode later, this setting will be overridden!
  // ================================================================================
  if ( PluginFunctions::objectCount() == 1 && OpenFlipper::Options::gui() && !OpenFlipper::Options::loadingSettings() )
460
461
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ){
      PluginFunctions::viewerProperties(i).drawMode( OpenFlipper::Options::defaultDrawMode(i) );
462

463
464
465
466
467
468
469
      if ( OpenFlipper::Options::defaultProjectionMode(i) == 0 )
	PluginFunctions::orthographicProjection(i);
      else
	PluginFunctions::perspectiveProjection(i);

      PluginFunctions::setFixedView(OpenFlipper::Options::defaultViewingDirection(i), i );
    }
Jan Möbius's avatar
Jan Möbius committed
470
471
472

  // ================================================================================
  // Recompute bounding box and scenegraph info
473
  // Reset scene center here to include new object
Jan Möbius's avatar
Jan Möbius committed
474
  // ================================================================================
475
  resetScenegraph(true);
Jan Möbius's avatar
 
Jan Möbius committed
476

Jan Möbius's avatar
Jan Möbius committed
477
478
479
  // ================================================================================
  // Tell plugins, that a file has been opened
  // ================================================================================
480
  emit openedFile( _id );
Jan Möbius's avatar
 
Jan Möbius committed
481

Jan Möbius's avatar
Jan Möbius committed
482
483
484
  // ================================================================================
  // Tell plugins, that the Object is updated and the active object has changed
  // ================================================================================
485
486
  emit signalObjectUpdated(_id);
  emit objectSelectionChanged( _id );
Jan Möbius's avatar
 
Jan Möbius committed
487

Jan Möbius's avatar
Jan Möbius committed
488
489
490
  // ================================================================================
  // Create initial backup
  // ================================================================================
491
  backupRequest(_id,"Original Object");
Jan Möbius's avatar
 
Jan Möbius committed
492

493
494
495
  // ================================================================================
  // Add the file to the recent files menu
  // ================================================================================
496
497
498
499
  QString filename = object->path() + OpenFlipper::Options::dirSeparator() + object->name();
  BaseObject* object2;
  PluginFunctions::getObject(_id,object2);
  if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
500
501
    coreWidget_->addRecent( filename, object2->dataType() );

Jan Möbius's avatar
Jan Möbius committed
502
503
504
  // ================================================================================
  // if this is the first object opend, reset the global view
  // ================================================================================
505
  if ( PluginFunctions::objectCount() == 1 && OpenFlipper::Options::gui() && !OpenFlipper::Options::loadingSettings() )
506
507
508
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      coreWidget_->examiner_widgets_[i]->viewAll();
    }
509

Jan Möbius's avatar
 
Jan Möbius committed
510
  // objectRoot_->dumpTree();
511
}
Jan Möbius's avatar
 
Jan Möbius committed
512
513

 /// Slot gets called after a file-plugin has opened an object
514
515
516
517
void Core::slotEmptyObjectAdded ( int _id ) {
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
518
        emit log(LOGINFO,tr("slotEmptyObjectAdded( ") + QString::number(_id) + tr(" ) called by ") +
519
520
521
                  QString( sender()->metaObject()->className() ) );
      }
    } else {
522
      emit log(LOGINFO,tr("slotEmptyObjectAdded( ") + QString::number(_id) + tr(" ) called by Core") );
523
524
525
    }
  }

526
527
528
529
530
  // get the opened object
  BaseObjectData* object;
  PluginFunctions::getObject(_id,object);

  emit emptyObjectAdded( _id );
531

Jan Möbius's avatar
 
Jan Möbius committed
532
  // Tell the Plugins that the Object List and the active object have changed
533
534
  emit signalObjectUpdated(_id);
  emit objectSelectionChanged(_id);
Jan Möbius's avatar
 
Jan Möbius committed
535

536
  backupRequest(_id,"Original Object");
Jan Möbius's avatar
 
Jan Möbius committed
537

538
  ///@todo : set a default path for new objects
Jan Möbius's avatar
 
Jan Möbius committed
539
540
541
//    QString filename = object->path() + OpenFlipper::Options::dirSeparator() + object->name();

//    addRecent(filename);
542
}
Jan Möbius's avatar
 
Jan Möbius committed
543
544
545
546
547
548
549
550
551
552
553
554

//========================================================================================
// ===             Menu Slots                                 ============================
//========================================================================================

/// Opens AddEmpty-Object widget
void Core::slotAddEmptyObjectMenu() {
  if (supportedTypes_.size() != 0){
    static addEmptyWidget* widget = 0;
    if ( !widget ){
      std::vector< DataType > types;
      QStringList typeNames;
Jan Möbius's avatar
   
Jan Möbius committed
555
556
557
558
      for (int i=0; i < (int)supportedTypes_.size(); i++) {
        types.push_back(supportedTypes_[i].type);
        typeNames.push_back(supportedTypes_[i].plugin->typeName());
      }
Jan Möbius's avatar
 
Jan Möbius committed
559
      widget = new addEmptyWidget(types,typeNames);
560
      widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );
Jan Möbius's avatar
 
Jan Möbius committed
561
562
563
564
      connect(widget,SIGNAL(chosen(DataType, int&)),this,SLOT(slotAddEmptyObject(DataType, int&)));
    }
    widget->show();
  }else
565
    emit log(LOGERR,tr("Could not show 'add Empty' dialog. Missing file-plugins."));
Jan Möbius's avatar
 
Jan Möbius committed
566
567
}

568
569
570
571
//========================================================================================
// ===             Public Slots                                 ============================
//========================================================================================

Jan Möbius's avatar
 
Jan Möbius committed
572
/// Open Load-Object Widget
573
574
575
576
577
void Core::loadObject() {

  if ( OpenFlipper::Options::gui() ){

    if (supportedTypes_.size() != 0){
578
      LoadWidget* widget = new LoadWidget(supportedTypes_);
Dirk Wilden's avatar
Dirk Wilden committed
579
580
      connect(widget,SIGNAL(load(QString, int)),this,SLOT(slotLoad(QString, int)));
      connect(widget,SIGNAL(save(int, QString, int)),this,SLOT(saveObject(int, QString, int)));
Jan Möbius's avatar
Jan Möbius committed
581

582
583
      widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );

584
      widget->showLoad();
585
586
587
588

      widget->disconnect();
      delete widget;

589
    }else
590
      emit log(LOGERR,tr("Could not show 'load objects' dialog. Missing file-plugins."));
Jan Möbius's avatar
 
Jan Möbius committed
591

592
  }
Jan Möbius's avatar
 
Jan Möbius committed
593
594
}

595
596
597
598
599
600
/// Load settings from file
void Core::loadSettings(){

  if ( OpenFlipper::Options::gui() ){

    QString complete_name;
Jan Möbius's avatar
Jan Möbius committed
601

602
603
604
605
606
607

    QFileDialog fileDialog( coreWidget_,
                            tr("Load Settings"),
                            OpenFlipper::Options::currentDirStr(),
                            tr("INI files (*.ini);;OBJ files (*.obj )") );

608
    fileDialog.setOption (QFileDialog::DontUseNativeDialog, true);
609
610
611
612
613
614
615
    fileDialog.setAcceptMode ( QFileDialog::AcceptOpen );
    fileDialog.setFileMode ( QFileDialog::AnyFile );

    QGridLayout *layout = (QGridLayout*)fileDialog.layout();

    QGroupBox* optionsBox = new QGroupBox( &fileDialog ) ;
    optionsBox->setSizePolicy( QSizePolicy ( QSizePolicy::Expanding , QSizePolicy::Preferred ) );
616
    optionsBox->setTitle(tr("Options"));
617
618
619
    layout->addWidget( optionsBox, layout->rowCount() , 0 , 1,layout->columnCount() );

    QCheckBox *loadProgramSettings = new QCheckBox(optionsBox);
620
621
    loadProgramSettings->setText(tr("Load program settings"));
    loadProgramSettings->setToolTip(tr("Load all current program settings from the file ( This will include view settings, colors,...) "));
622
623
624
    loadProgramSettings->setCheckState( Qt::Unchecked );

    QCheckBox *loadPluginSettings = new QCheckBox(optionsBox);
625
626
    loadPluginSettings->setText(tr("Load per Plugin Settings"));
    loadPluginSettings->setToolTip(tr("Plugins should load their current global settings from the file"));
627
628
629
    loadPluginSettings->setCheckState( Qt::Checked );

    QCheckBox *loadObjectInfo = new QCheckBox(optionsBox);
630
631
    loadObjectInfo->setText(tr("Load all objects defined in the file"));
    loadObjectInfo->setToolTip(tr("Load all objects which are defined in the file"));
632
633
634
635
636
637
638
639
    loadObjectInfo->setCheckState( Qt::Checked );

    QBoxLayout* frameLayout = new QBoxLayout(QBoxLayout::TopToBottom,optionsBox);
    frameLayout->addWidget( loadProgramSettings , 0 , 0);
    frameLayout->addWidget( loadPluginSettings  , 1 , 0);
    frameLayout->addWidget( loadObjectInfo      , 2 , 0);
    frameLayout->addStretch();

Jan Möbius's avatar
Jan Möbius committed
640
641
    fileDialog.resize(550 ,500);

642
643
644
645
646
647
648
649
650
651
652
653
    // ========================================================================================
    // show the saveSettings-Dialog and get the target file
    // ========================================================================================
    QStringList fileNames;
    if (fileDialog.exec()) {
      fileNames = fileDialog.selectedFiles();
    } else {
      return;
    }

    if ( fileNames.size() > 1 ) {
      std::cerr << "Too many save filenames selected" << std::endl;
654
      return;
655
656
657
658
    }

    complete_name = fileNames[0];

Jan Möbius's avatar
Jan Möbius committed
659

660
661
    QString newpath = complete_name.section(OpenFlipper::Options::dirSeparator(),0,-2);
    OpenFlipper::Options::currentDir(newpath);
Jan Möbius's avatar
Jan Möbius committed
662

663
    if ( complete_name.endsWith("ini") ) {
664
665
666
667
      openIniFile( complete_name,
                   loadProgramSettings->isChecked(),
                   loadPluginSettings->isChecked(),
                   loadObjectInfo->isChecked());
668
669
      if ( loadProgramSettings->isChecked() )
        applyOptions();
670
671
    } else if ( complete_name.endsWith("obj") ) {
      openObjFile(complete_name);
672
673
      if ( loadProgramSettings->isChecked() )
        applyOptions();
674
    }
Jan Möbius's avatar
Jan Möbius committed
675

676
    coreWidget_->addRecent(complete_name, DATA_UNKNOWN);
677
678
  }
}
Jan Möbius's avatar
 
Jan Möbius committed
679

680
681
/// Load settings from file
void Core::loadSettings(QString _filename){
Jan Möbius's avatar
Jan Möbius committed
682

683
  if ( !QFile(_filename).exists() )
Jan Möbius's avatar
 
Jan Möbius committed
684
685
    return;

686
  QString newpath = _filename.section(OpenFlipper::Options::dirSeparator(),0,-2);
Jan Möbius's avatar
 
Jan Möbius committed
687
688
  OpenFlipper::Options::currentDir(newpath);

689
  if ( _filename.endsWith("ini") ) {
690
    // Loaded function for recent files. Load everything.
691
    openIniFile(_filename,true,true,true);
Jan Möbius's avatar
 
Jan Möbius committed
692
    applyOptions();
693
694
  } else if ( _filename.endsWith("obj") ) {
    openObjFile(_filename);
Jan Möbius's avatar
 
Jan Möbius committed
695
696
697
698
    applyOptions();
  }

}