openFunctions.cc 26 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
  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);
  }
}

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

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

99
  // Modify filename to contain full paths if they were given as relative paths
Jan Möbius's avatar
Jan Möbius committed
100
101
102
103
104
  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
  // Add to the open list
107
  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
114
115
116
117
118
119
120
121
122

  QString file(_filename);
  
  // Modify filename to contain full paths if they were given as relative paths
  if ( !file.startsWith("/") && !file.contains(":") ) {
    file = QDir::currentPath();
    file += OpenFlipper::Options::dirSeparator();
    file += _filename;
  }
  
  // Add to the open list
  commandLineScriptNames_.push_back(file.toStdString());
123
124
}

Jan Möbius's avatar
Jan Möbius committed
125
126
127
128
129
130
void Core::slotExecuteAfterStartup() {

  //check if we have scripting support:
  bool scriptingSupport = false;
  slotPluginExists("scripting",scriptingSupport);
  if ( ! scriptingSupport ) {
131
    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
132
133
134
135
136
137
138
139
140
  }

  // 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
141
142
      if ( scriptFiles[i].endsWith("ofs") )
        emit executeFileScript(scriptDir.path() + QDir::separator() + scriptFiles[i]);
Jan Möbius's avatar
Jan Möbius committed
143
144
145

  }

146
  for ( uint i = 0 ; i < commandLineFileNames_.size() ; ++i ) {
147
148

    // Skip scripts here as they will be handled by a different function
149
    QString tmp = QString::fromStdString(commandLineFileNames_[i].first);
150
151
152
153
154
    if ( tmp.endsWith("ofs") ) {
      commandLineScriptNames_.push_back(commandLineFileNames_[i].first);
      continue;
    }

155
    if (commandLineFileNames_[i].second)
156
157
158
159
      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
160
161
  }

Jan Möbius's avatar
Jan Möbius committed
162
  if ( scriptingSupport )
163
    for ( uint i = 0 ; i < commandLineScriptNames_.size() ; ++i ) {
164
      emit executeFileScript(QString::fromStdString(commandLineScriptNames_[i]));
165
    }
166

Dirk Wilden's avatar
Dirk Wilden committed
167
168
  if ( !OpenFlipper::Options::gui() && !OpenFlipper::Options::remoteControl())
    exitApplication();
Jan Möbius's avatar
 
Jan Möbius committed
169
170
171
172
}

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

Jan Möbius's avatar
 
Jan Möbius committed
174
  if (_filename.endsWith(".ini")) {
175
176

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

Jan Möbius's avatar
 
Jan Möbius committed
179
    if ( OpenFlipper::Options::gui() )
180
      coreWidget_->addRecent(_filename, DATA_UNKNOWN);
181

Jan Möbius's avatar
 
Jan Möbius committed
182
183
184
    return -2;
  } else
  if (_filename.endsWith(".ofs")) {
Jan Möbius's avatar
Jan Möbius committed
185
     emit log(LOGINFO ,tr("Starting script execution of %1.").arg( _filename)) ;
Jan Möbius's avatar
 
Jan Möbius committed
186
187
188
189
190
191
192
193
194
195
     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) {

196
  if (_type == DATA_UNKNOWN)
Jan Möbius's avatar
 
Jan Möbius committed
197
198
199
200
201
202
203
    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
204
        coreWidget_->statusMessage( tr("Loading %1 ... ").arg(_filename));
205
        if ( !OpenFlipper::Options::loadingSettings() )
Jan Möbius's avatar
 
Jan Möbius committed
206
207
208
209
210
211
212
213
          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
214
          coreWidget_->statusMessage( tr("Loading %1 ... done").arg(_filename), 4000 );
Jan Möbius's avatar
 
Jan Möbius committed
215
        else
Jan Möbius's avatar
Jan Möbius committed
216
          coreWidget_->statusMessage( tr("Loading %1 ... failed!").arg(_filename), 4000 );
Jan Möbius's avatar
 
Jan Möbius committed
217

218
        if ( !OpenFlipper::Options::loadingSettings() )
Jan Möbius's avatar
 
Jan Möbius committed
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
          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 );
}

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

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

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

  if ( !object ) {
Jan Möbius's avatar
Jan Möbius committed
257
    emit log(LOGERR,tr("Requested copy for unknown Object id: %1 ").arg(_oldId) );
Jan Möbius's avatar
Jan Möbius committed
258
259
260
261
262
263
264
265
    _newId = -1;
    return ;
  }

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

  if ( copy == 0 ) {
266
    emit log(LOGERR,tr("Unable to create a copy of the object."));
Jan Möbius's avatar
Jan Möbius committed
267
268
269
270
271
272
273
274
275
276
    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;

277
  // return the new id
Jan Möbius's avatar
Jan Möbius committed
278
  _newId = copy->id();
279

280
281
282
283
284
285
  // tell plugins that a new object has been created
  slotEmptyObjectAdded(_newId);

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

286
287
}

Dirk Wilden's avatar
Dirk Wilden committed
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
355
356
357
358
359
360
361
362
/// 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
363
364
365
/// Slot for loading a given file
void Core::slotLoad(QString _filename, DataType _type, int& _id) {
  _id = loadObject(_type,_filename);
366

367
368
  // Check if it is a polymesh
  if ( _type == DATA_POLY_MESH ) {
369

370
371
    PolyMeshObject* poly = 0;
    PluginFunctions::getObject(_id,poly);
372

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

376
        bool isTriangleMesh = true;
377

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

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

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

391
        }
392

393
394
        // 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 ) {
395
396
397
398
          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 ),
399
                                                                      QMessageBox::Yes );
400
          // User decided to reload as triangle mesh
401
402
403
404
405
406
          if ( result == QMessageBox::Yes ) {
            slotDeleteObject(_id);
            _id = loadObject(DATA_TRIANGLE_MESH ,_filename);
            _type = DATA_TRIANGLE_MESH;
          }
        }
407

408
409
    }
  }
Jan Möbius's avatar
 
Jan Möbius committed
410
411
412
  if ( _id < 0 )
    _id = -1;
  else
413
    if ( OpenFlipper::Options::gui() )
Jan Möbius's avatar
 
Jan Möbius committed
414
415
416
417
      coreWidget_->addRecent(_filename,_type);
}

/// Slot gets called after a file-plugin has opened an object
418
419
420
421
void Core::slotObjectOpened ( int _id ) {
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
422
        emit log(LOGINFO,tr("slotObjectOpened( ") + QString::number(_id) + tr(" ) called by ") +
423
424
425
                  QString( sender()->metaObject()->className() ) );
      }
    } else {
426
      emit log(LOGINFO,tr("slotObjectOpened( ") + QString::number(_id) + tr(" ) called by Core") );
427
428
    }
  }
429
430

  // get the opened object
431
432
  BaseObjectData* object;
  PluginFunctions::getObject(_id,object);
433

434
  QColor color;
435

436
  if ( OpenFlipper::Options::randomBaseColor() ){
437
438
439
440
441
      //init random seed
      srand ( time(NULL) );

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

443
444
      do{
        color.setRgb(rand()%255, rand()%255, rand()%255);
445

446
447
448
        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());
449
      }while (diff < 70000);
450
451
  }
  else{
452
      color = OpenFlipper::Options::defaultBaseColor();
453
  }
454

455
456
457
458
459
  ACG::Vec4f colorV;
  colorV[0] = color.redF();
  colorV[1] = color.greenF();
  colorV[2] = color.blueF();
  colorV[3] = color.alphaF();
460

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

Jan Möbius's avatar
Jan Möbius committed
463
  // ================================================================================
464
  // Set defaults for DrawMode, ViewingDirection and Projection if this is the first opened object
Jan Möbius's avatar
Jan Möbius committed
465
466
467
  // If a plugin changes the drawmode later, this setting will be overridden!
  // ================================================================================
  if ( PluginFunctions::objectCount() == 1 && OpenFlipper::Options::gui() && !OpenFlipper::Options::loadingSettings() )
468
469
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ){
      PluginFunctions::viewerProperties(i).drawMode( OpenFlipper::Options::defaultDrawMode(i) );
470

471
472
473
474
475
476
477
      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
478
479
480

  // ================================================================================
  // Recompute bounding box and scenegraph info
481
  // Reset scene center here to include new object
Jan Möbius's avatar
Jan Möbius committed
482
  // ================================================================================
483
  resetScenegraph(true);
Jan Möbius's avatar
 
Jan Möbius committed
484

Jan Möbius's avatar
Jan Möbius committed
485
486
487
  // ================================================================================
  // Tell plugins, that a file has been opened
  // ================================================================================
488
  emit openedFile( _id );
Jan Möbius's avatar
 
Jan Möbius committed
489

Jan Möbius's avatar
Jan Möbius committed
490
491
492
  // ================================================================================
  // Tell plugins, that the Object is updated and the active object has changed
  // ================================================================================
493
494
  emit signalObjectUpdated(_id);
  emit objectSelectionChanged( _id );
Jan Möbius's avatar
 
Jan Möbius committed
495

Jan Möbius's avatar
Jan Möbius committed
496
497
498
  // ================================================================================
  // Create initial backup
  // ================================================================================
499
  backupRequest(_id,"Original Object");
Jan Möbius's avatar
 
Jan Möbius committed
500

501
502
503
  // ================================================================================
  // Add the file to the recent files menu
  // ================================================================================
504
505
506
507
  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
508
509
    coreWidget_->addRecent( filename, object2->dataType() );

Jan Möbius's avatar
Jan Möbius committed
510
511
512
  // ================================================================================
  // if this is the first object opend, reset the global view
  // ================================================================================
513
  if ( PluginFunctions::objectCount() == 1 && OpenFlipper::Options::gui() && !OpenFlipper::Options::loadingSettings() )
514
515
516
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      coreWidget_->examiner_widgets_[i]->viewAll();
    }
517

Jan Möbius's avatar
 
Jan Möbius committed
518
  // objectRoot_->dumpTree();
519
}
Jan Möbius's avatar
 
Jan Möbius committed
520
521

 /// Slot gets called after a file-plugin has opened an object
522
523
524
525
void Core::slotEmptyObjectAdded ( int _id ) {
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
526
        emit log(LOGINFO,tr("slotEmptyObjectAdded( ") + QString::number(_id) + tr(" ) called by ") +
527
528
529
                  QString( sender()->metaObject()->className() ) );
      }
    } else {
530
      emit log(LOGINFO,tr("slotEmptyObjectAdded( ") + QString::number(_id) + tr(" ) called by Core") );
531
532
533
    }
  }

534
535
536
537
538
  // get the opened object
  BaseObjectData* object;
  PluginFunctions::getObject(_id,object);

  emit emptyObjectAdded( _id );
539

Jan Möbius's avatar
 
Jan Möbius committed
540
  // Tell the Plugins that the Object List and the active object have changed
541
542
  emit signalObjectUpdated(_id);
  emit objectSelectionChanged(_id);
Jan Möbius's avatar
 
Jan Möbius committed
543

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

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

//    addRecent(filename);
550
}
Jan Möbius's avatar
 
Jan Möbius committed
551
552
553
554
555
556
557
558
559
560
561
562

//========================================================================================
// ===             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
563
564
565
566
      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
567
      widget = new addEmptyWidget(types,typeNames);
568
      widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );
Jan Möbius's avatar
 
Jan Möbius committed
569
570
571
572
      connect(widget,SIGNAL(chosen(DataType, int&)),this,SLOT(slotAddEmptyObject(DataType, int&)));
    }
    widget->show();
  }else
573
    emit log(LOGERR,tr("Could not show 'add Empty' dialog. Missing file-plugins."));
Jan Möbius's avatar
 
Jan Möbius committed
574
575
}

576
577
578
579
//========================================================================================
// ===             Public Slots                                 ============================
//========================================================================================

Jan Möbius's avatar
 
Jan Möbius committed
580
/// Open Load-Object Widget
581
582
583
584
585
void Core::loadObject() {

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

    if (supportedTypes_.size() != 0){
586
      LoadWidget* widget = new LoadWidget(supportedTypes_);
Dirk Wilden's avatar
Dirk Wilden committed
587
588
      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
589

590
591
      widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );

592
      widget->showLoad();
593
594
595
596

      widget->disconnect();
      delete widget;

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

600
  }
Jan Möbius's avatar
 
Jan Möbius committed
601
602
}

603
604
605
606
607
608
/// Load settings from file
void Core::loadSettings(){

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

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

610
611
612
613
614
615

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

616
    fileDialog.setOption (QFileDialog::DontUseNativeDialog, true);
617
618
619
620
621
622
623
    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 ) );
624
    optionsBox->setTitle(tr("Options"));
625
626
627
    layout->addWidget( optionsBox, layout->rowCount() , 0 , 1,layout->columnCount() );

    QCheckBox *loadProgramSettings = new QCheckBox(optionsBox);
628
629
    loadProgramSettings->setText(tr("Load program settings"));
    loadProgramSettings->setToolTip(tr("Load all current program settings from the file ( This will include view settings, colors,...) "));
630
631
632
    loadProgramSettings->setCheckState( Qt::Unchecked );

    QCheckBox *loadPluginSettings = new QCheckBox(optionsBox);
633
634
    loadPluginSettings->setText(tr("Load per Plugin Settings"));
    loadPluginSettings->setToolTip(tr("Plugins should load their current global settings from the file"));
635
636
637
    loadPluginSettings->setCheckState( Qt::Checked );

    QCheckBox *loadObjectInfo = new QCheckBox(optionsBox);
638
639
    loadObjectInfo->setText(tr("Load all objects defined in the file"));
    loadObjectInfo->setToolTip(tr("Load all objects which are defined in the file"));
640
641
642
643
644
645
646
647
    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
648
649
    fileDialog.resize(550 ,500);

650
651
652
653
654
655
656
657
658
659
660
661
    // ========================================================================================
    // 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;
662
      return;
663
664
665
666
    }

    complete_name = fileNames[0];

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

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

671
    if ( complete_name.endsWith("ini") ) {
672
673
674
675
      openIniFile( complete_name,
                   loadProgramSettings->isChecked(),
                   loadPluginSettings->isChecked(),
                   loadObjectInfo->isChecked());
676
677
      if ( loadProgramSettings->isChecked() )
        applyOptions();
678
679
    } else if ( complete_name.endsWith("obj") ) {
      openObjFile(complete_name);
680
681
      if ( loadProgramSettings->isChecked() )
        applyOptions();
682
    }
Jan Möbius's avatar
Jan Möbius committed
683

684
    coreWidget_->addRecent(complete_name, DATA_UNKNOWN);
685
686
  }
}
Jan Möbius's avatar
 
Jan Möbius committed
687

688
689
/// Load settings from file
void Core::loadSettings(QString _filename){
Jan Möbius's avatar
Jan Möbius committed
690

691
  if ( !QFile(_filename).exists() )
Jan Möbius's avatar
 
Jan Möbius committed
692
693
    return;

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

697
  if ( _filename.endsWith("ini") ) {
698
    // Loaded function for recent files. Load everything.
699
    openIniFile(_filename,true,true,true);
Jan Möbius's avatar
 
Jan Möbius committed
700
    applyOptions();
701
702
  } else if ( _filename.endsWith("obj") ) {
    openObjFile(_filename);
Jan Möbius's avatar
 
Jan Möbius committed
703
704
705
706
    applyOptions();
  }

}