DataControlPlugin.cc 24 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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
*                           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/>.                                       *
*                                                                            *
33
34
35
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36
37
38
39
40
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
41
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51





#include <QtGui>

#include "DataControlPlugin.hh"

#include <QLayout>
52
#include <QGridLayout>
Jan Möbius's avatar
 
Jan Möbius committed
53
#include <QItemSelectionModel>
54

Jan Möbius's avatar
 
Jan Möbius committed
55
56
57
58
#include <iostream>
#include <ACG/GL/GLState.hh>
#include <QStringList>
#include <ACG/Scenegraph/BaseNode.hh>
Dirk Wilden's avatar
Dirk Wilden committed
59
#include <ACG/QtWidgets/QtMaterialDialog.hh>
Jan Möbius's avatar
 
Jan Möbius committed
60
61
62
63
64
#include <QModelIndexList>

#include <queue>

#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
65
#include <OpenFlipper/common/GlobalOptions.hh>
Jan Möbius's avatar
 
Jan Möbius committed
66

67
68
#include <ObjectTypes/Light/Light.hh>

Dirk Wilden's avatar
Dirk Wilden committed
69
//******************************************************************************
Dirk Wilden's avatar
Dirk Wilden committed
70

71
72
73
74
75
76
const ACG::Vec4f base_color (0.0,0.0,0.5,1.0);
const ACG::Vec4f source_color (0.5,0.0,0.0,1.0);
const ACG::Vec4f target_color (0.0,0.5,0.2,1.0);

//******************************************************************************

Dirk Wilden's avatar
Dirk Wilden committed
77
/** \brief Plugin initialization
78
 *
Dirk Wilden's avatar
Dirk Wilden committed
79
 */
Jan Möbius's avatar
 
Jan Möbius committed
80
void DataControlPlugin::pluginsInitialized() {
81

Jan Möbius's avatar
   
Jan Möbius committed
82
83
84
  //set the slot descriptions
  setDescriptions();

85
86
87
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
   
Dirk Wilden committed
88
  QMenu* contextMenu = new QMenu("Object");
89

Jan Möbius's avatar
 
Jan Möbius committed
90
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
91
92
  QIcon icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-hide-object.png");
  QAction* hideAction = new QAction(icon, tr("&Hide"), this);
Jan Möbius's avatar
 
Jan Möbius committed
93
94
95
  hideAction->setStatusTip(tr("Hide object"));
  connect(hideAction, SIGNAL(triggered()), this, SLOT(slotContextMenuHide()) );
  contextMenu->addAction(hideAction);
96

Jan Möbius's avatar
 
Jan Möbius committed
97
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
98
99
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-target-object.png");
  targetAction_ = new QAction(icon, tr("&Target"), this);
Jan Möbius's avatar
 
Jan Möbius committed
100
101
102
103
  targetAction_->setCheckable(true);
  targetAction_->setStatusTip(tr("Set object as target"));
  connect(targetAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuTarget()) );
  contextMenu->addAction(targetAction_);
104

Jan Möbius's avatar
 
Jan Möbius committed
105
  //Source Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
106
107
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-source-object.png");
  sourceAction_ = new QAction(icon, tr("&Source"), this);
Jan Möbius's avatar
 
Jan Möbius committed
108
109
110
  sourceAction_->setCheckable(true);
  sourceAction_->setStatusTip(tr("Set object as source"));
  connect(sourceAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuSource()) );
111
112
  contextMenu->addAction(sourceAction_);

Dirk Wilden's avatar
   
Dirk Wilden committed
113
114
115
116
117
118
119
120
121
122
  contextMenu->addSeparator();
  
  //Remove Objects
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-delete-item.png");
  removeAction_ = new QAction(icon, tr("&Remove"), this);
  removeAction_->setCheckable(false);
  removeAction_->setStatusTip(tr("Remove object"));
  connect(removeAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuRemove()) );
  contextMenu->addAction(removeAction_);
  
Jan Möbius's avatar
   
Jan Möbius committed
123
  emit addContextMenuItem(contextMenu->menuAction() , DATA_ALL , CONTEXTOBJECTMENU);
124

Dirk Wilden's avatar
   
Dirk Wilden committed
125
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-material.png");
Jan Möbius's avatar
Jan Möbius committed
126
  QAction* material = new QAction(icon, tr("Material Properties"), 0);
127
128
129
  connect (material, SIGNAL( triggered() ), this, SLOT ( slotMaterialProperties() ));

  emit addContextMenuItem(material , DATA_ALL , CONTEXTOBJECTMENU);
130
131
132

  PluginFunctions::setDefaultViewObjectMarker (&objectMarker);
  PluginFunctions::setViewObjectMarker (&objectMarker);
133
134
135
  
  connect(tool_->lightSources, SIGNAL(stateChanged(int)), this, SLOT(slotShowLightSources(int)));
  slotShowLightSources(tool_->lightSources->checkState());
Jan Möbius's avatar
 
Jan Möbius committed
136
137
}

Dirk Wilden's avatar
Dirk Wilden committed
138
139
140

//******************************************************************************

141
void DataControlPlugin::initializePlugin()
Jan Möbius's avatar
 
Jan Möbius committed
142
{
143
144
145
146
147
148
149
150
151
152
153
154
155
  if ( ! OpenFlipper::Options::gui())
    return;

  locked = false;
  tool_ = new DatacontrolToolboxWidget();
  connect( tool_ , SIGNAL( keyEvent( QKeyEvent* ) ),
      this  , SLOT(slotKeyEvent ( QKeyEvent* ) ));
  QSize size(300, 300);
  tool_->resize(size);

  model_ = new TreeModel( );

  view_ = tool_->treeView;
156

157
  tool_->treeView->setModel(model_);
158

159
160
161
  view_->QTreeView::resizeColumnToContents(1);
  view_->QTreeView::resizeColumnToContents(2);
  view_->QTreeView::resizeColumnToContents(3);
162

163

164
165
  connect( model_,SIGNAL(dataChangedInside(int,int,const QVariant&) ),
      this,  SLOT(    slotDataChanged(int,int,const QVariant&)) );
166

167
168
  connect( model_,SIGNAL(   moveBaseObject(int,int) ),
      this,  SLOT( slotMoveBaseObject(int,int) ) );
Dirk Wilden's avatar
Dirk Wilden committed
169

170
171
  connect( view_,SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,SLOT(slotCustomContextMenuRequested ( const QPoint & ) ));
172

173
174
175
176
177
178
  connect( tool_->notSelected, SIGNAL(stateChanged ( int ) ),
      this, SLOT (slotBoundingBoxChange ( ) ));
  connect( tool_->sourceSelected, SIGNAL(stateChanged ( int ) ),
      this, SLOT (slotBoundingBoxChange ( ) ));
  connect( tool_->targetSelected, SIGNAL(stateChanged ( int ) ),
      this, SLOT (slotBoundingBoxChange ( ) ));
179
180


181
182
  viewHeader_ = tool_->treeView->header();
  viewHeader_->setContextMenuPolicy(Qt::CustomContextMenu);
183

184
185
186
  // connect the slot for the context menu
  connect( viewHeader_, SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,        SLOT(slotHeaderCustomContextMenuRequested ( const QPoint & ) ));
187

188
  toolIcon_ = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-toolbox.png");
189

190
  emit addToolbox("Data Control", tool_, toolIcon_);
191

192
193
  onlyDown_ = 0;
  onlyUp_   = 0;
Dirk Wilden's avatar
Dirk Wilden committed
194

195
196
197
198
199
200
201
202
  QIcon icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-boundingBox.png");
  tool_->boundingBoxBtn->setIcon( icon );
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-hide-object.png");
  tool_->visibleDataBtn->setIcon( icon );

  //hide additional boxes
  tool_->visibleDataBtn->setChecked(false);
  tool_->boundingBoxBtn->setChecked(false);
Jan Möbius's avatar
 
Jan Möbius committed
203
204
205
}


Dirk Wilden's avatar
Dirk Wilden committed
206
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
207

Dirk Wilden's avatar
Dirk Wilden committed
208
/** \brief update drawing of objects when the active object changed
209
 *
Dirk Wilden's avatar
Dirk Wilden committed
210
211
212
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{
213
  
214
215
216
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
217
218
  BaseObjectData* obj = 0;

219
  if ( PluginFunctions::getObject( _identifier, obj) )
220
221
    updateBoundingBox (obj);

222
223
224
225
  // if onlyUp_ > 0 --> _identifier is a group and the selection
  // does not have to be applied
  if (onlyUp_ == 0)
    model_->objectChanged( _identifier );
Dirk Wilden's avatar
Dirk Wilden committed
226

227
  
Dirk Wilden's avatar
Dirk Wilden committed
228
229
230
231
  //check for changes in the tree
  BaseObject* object = 0;

  if ( PluginFunctions::getObject( _identifier, object) ){
232
233
234
235
236
237
238
239
240
241
242
243
244
    
      // if we are allowed to propagate up
      if ( onlyDown_ == 0 ){
  
        onlyUp_++;
    
        propagateUpwards(object->parent(), 2); // 2 = source-target

        onlyUp_--;
      }
    
      // if we are allowed to propagate down
      if ( onlyUp_ == 0 ){
Dirk Wilden's avatar
Dirk Wilden committed
245

246
        onlyDown_++;
Dirk Wilden's avatar
Dirk Wilden committed
247

248
249
250
251
252
253
        if ( object->isGroup() )
          propagateDownwards(object, 2); // 2 = source-target
      
        onlyDown_--;
      }
  }
Dirk Wilden's avatar
Dirk Wilden committed
254
255
256
257
258
259
}


//******************************************************************************

/** \brief Update the model if the visibility of an object changed
260
 *
Dirk Wilden's avatar
Dirk Wilden committed
261
262
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
263
void DataControlPlugin::slotVisibilityChanged( int _identifier ){
264

265
266
267
  if ( ! OpenFlipper::Options::gui())
    return;

268
269
270
271
272
273
  // if onlyUp_ > 0 --> _identifier is a group and the selection
  // does not have to be applied
  if (onlyUp_ == 0){
    //inform the model
    model_->objectChanged( _identifier );
  }
Dirk Wilden's avatar
Dirk Wilden committed
274
275
276
277
278
279

  //check for changes in the tree
  BaseObject* obj = 0;

  if ( PluginFunctions::getObject( _identifier, obj) ){

280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
    // if we are allowed to propagate up
    if ( onlyDown_ == 0 ){
    
      onlyUp_++;

      propagateUpwards(obj->parent(), 1); // 1 = visibilty

      onlyUp_--;  

    }

    // if we are allowed to propagate down
    if ( onlyUp_ == 0 ){

      onlyDown_++;
      
      if ( obj->isGroup() )
        propagateDownwards(obj, 1); // 1 = visibilty

      onlyDown_--;
    }
Dirk Wilden's avatar
Dirk Wilden committed
301
302
  }

303
304
305
306
307
  BaseObjectData* object = 0;

  if ( PluginFunctions::getObject( _identifier, object) )
    updateBoundingBox (object);

Jan Möbius's avatar
 
Jan Möbius committed
308
309
310
}


Dirk Wilden's avatar
Dirk Wilden committed
311
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
312

Dirk Wilden's avatar
Dirk Wilden committed
313
/** \brief Update the model if properties of an object changed
314
 *
Dirk Wilden's avatar
Dirk Wilden committed
315
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
316
 */
Dirk Wilden's avatar
Dirk Wilden committed
317
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
318
319
320
321

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

Dirk Wilden's avatar
Dirk Wilden committed
322
323
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
324

Dirk Wilden's avatar
Dirk Wilden committed
325
326
327

//******************************************************************************

328
/** \brief Update the model if an object was deleted
329
 *
Dirk Wilden's avatar
Dirk Wilden committed
330
331
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
332
void DataControlPlugin::slotObjectUpdated( int /*_identifier*/ , const UpdateType /*_type*/ ){
Dirk Wilden's avatar
Dirk Wilden committed
333

Dirk Wilden's avatar
Dirk Wilden committed
334
}
Dirk Wilden's avatar
Dirk Wilden committed
335

336

Dirk Wilden's avatar
Dirk Wilden committed
337
338
339
//******************************************************************************

/** \brief Update the model if a file has been opened
340
 *
Dirk Wilden's avatar
Dirk Wilden committed
341
342
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
343
344
void DataControlPlugin::fileOpened(int _id){

345
346
347
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
348
349
350
351
  BaseObject* obj = 0;

  if ( PluginFunctions::getObject(_id, obj) )
    model_->objectAdded(obj);
352
353
  
  slotShowLightSources(tool_->lightSources->checkState());
Dirk Wilden's avatar
Dirk Wilden committed
354
  view_->resizeColumnToContents(0);
Dirk Wilden's avatar
Dirk Wilden committed
355
356
357
358
359
360
}


//******************************************************************************

/** \brief Update the model if an empty object has been added
361
 *
Dirk Wilden's avatar
Dirk Wilden committed
362
363
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
364
365
366
367
368
369
370
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

//******************************************************************************

/** \brief an object was deleted. delete it internally
371
 *
Dirk Wilden's avatar
Dirk Wilden committed
372
373
374
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
375
376
377
378

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

Dirk Wilden's avatar
Dirk Wilden committed
379
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
380
381
}

Dirk Wilden's avatar
Dirk Wilden committed
382
383
384
//******************************************************************************

/** \brief a key event occurred
385
 *
Dirk Wilden's avatar
Dirk Wilden committed
386
387
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
388
389
390
391
392
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
393
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
394
395
396
397
398
399
          setAllTarget();
        return;
      default:
        return;
    }
  }
400

401
402
403
404
405
406
407
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
408

Jan Möbius's avatar
 
Jan Möbius committed
409
410
}

Dirk Wilden's avatar
Dirk Wilden committed
411
412
413
414

//******************************************************************************

/** \brief emit the right updates when the model changed
415
 *
Dirk Wilden's avatar
Dirk Wilden committed
416
 * @param topLeft index in the model
Dirk Wilden's avatar
Dirk Wilden committed
417
 * @param _column hmm
Dirk Wilden's avatar
Dirk Wilden committed
418
 */
Dirk Wilden's avatar
Dirk Wilden committed
419
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
420
{
421

Dirk Wilden's avatar
Dirk Wilden committed
422
423
424
425
  //get the corresponding baseObject
  BaseObject* obj = 0;
  if ( !PluginFunctions::getObject( _id, obj) )
    return;
426
  
Dirk Wilden's avatar
Dirk Wilden committed
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  switch ( _column ) {
    // Name
    case 0:
      obj->setName( _value.toString() );
      break;

    // show/hide
    case 1:
      obj->visible( _value.toBool() );
      break;

    // source
    case 2:
      obj->source( _value.toBool() );
      break;

    // target
    case 3:
      obj->target( _value.toBool() );
      break;
Dirk Wilden's avatar
Dirk Wilden committed
447

Dirk Wilden's avatar
Dirk Wilden committed
448
449
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
450
451
452
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
453
454
455

//******************************************************************************

Dirk Wilden's avatar
Dirk Wilden committed
456
/** \brief Gets called when an object was moved via drag n drop
457
 *
Dirk Wilden's avatar
Dirk Wilden committed
458
459
 * @param _id id of the object
 * @param _parentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
460
 */
Dirk Wilden's avatar
Dirk Wilden committed
461
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
462

Dirk Wilden's avatar
Dirk Wilden committed
463
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
464

Dirk Wilden's avatar
Dirk Wilden committed
465
466
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
467

Dirk Wilden's avatar
Dirk Wilden committed
468
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
469

Dirk Wilden's avatar
Dirk Wilden committed
470
471
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
472

Dirk Wilden's avatar
Dirk Wilden committed
473
  BaseObject* oldParent = obj->parent();
Dirk Wilden's avatar
Dirk Wilden committed
474

Dirk Wilden's avatar
Dirk Wilden committed
475
476
  //set new parent
  obj->setParent( parent );
Dirk Wilden's avatar
Dirk Wilden committed
477

Dirk Wilden's avatar
Dirk Wilden committed
478
479
480
  //if oldParent is an empty group -> delete it
  if ( oldParent != PluginFunctions::objectRoot() && oldParent->childCount() == 0 )
    emit deleteObject( oldParent->id() );
Dirk Wilden's avatar
Dirk Wilden committed
481
482
483
}


484
485
486
487
488
489
490
491
492
493
494
495
496
497
//******************************************************************************

void DataControlPlugin::slotShowLightSources( int _state ) {

    int rows = model_->rowCount();
    
    for(int i = 0; i < rows; ++i) {
        TreeItem* item = model_->getItem(model_->index(i,0));
        if(item->dataType() == DATA_LIGHT) {
            view_->setRowHidden(i, model_->parent(model_->index(i,0)), !(_state == Qt::Checked));
        }
    }
}

Dirk Wilden's avatar
Dirk Wilden committed
498
499
500
//******************************************************************************

/** \brief Load Groups from ini file
501
 *
Dirk Wilden's avatar
Dirk Wilden committed
502
503
 * @param _ini an ini file
 */
Jan Möbius's avatar
   
Jan Möbius committed
504
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
505

506
  if ( _ini.section_exists( "BoundingBox" ) && OpenFlipper::Options::gui() )
507
508
509
510
511
512
513
514
515
516
  {
    bool value;
    if (_ini.get_entry(value, "BoundingBox","notSelected"))
      tool_->notSelected->setChecked (value);
    if (_ini.get_entry(value, "BoundingBox","sourceSelected"))
      tool_->sourceSelected->setChecked (value);
    if (_ini.get_entry(value, "BoundingBox","targetSelected"))
      tool_->targetSelected->setChecked (value);
  }

517
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
518
    return;
519

Jan Möbius's avatar
 
Jan Möbius committed
520
521
  // Names of all groups
  QStringList groupNames;
522

Jan Möbius's avatar
 
Jan Möbius committed
523
524
  // names of the primary groups
  QStringList rootGroup;
525

Jan Möbius's avatar
 
Jan Möbius committed
526
527
  // Get the list of group names to the file
  _ini.get_entry(groupNames,"Groups","groups");
528

Jan Möbius's avatar
 
Jan Möbius committed
529
530
  // Get the primary group names to the file
  _ini.get_entry(rootGroup,"Groups","rootGroup");
531

Dirk Wilden's avatar
Dirk Wilden committed
532
533
534
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
535
536
537
538
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
539

Jan Möbius's avatar
 
Jan Möbius committed
540
541
    QStringList groupChildren;
    QStringList elementChildren;
542

Jan Möbius's avatar
 
Jan Möbius committed
543
544
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
545

Jan Möbius's avatar
 
Jan Möbius committed
546
547
548
549
550
551
    // if we get a parent item, scan the tree for it or use the root node otherwise
    BaseObject* parentItem;
    QString parentName;
    if ( _ini.get_entry(parentName,current,"parent") ) {
      parentItem = PluginFunctions::objectRoot()->childExists(parentName);
      if ( parentItem == 0 )
552
553
554
555
556
557
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

Jan Möbius's avatar
 
Jan Möbius committed
558
559
    // check if this group already exists
    BaseObject* group =  PluginFunctions::objectRoot()->childExists( current );
560

Jan Möbius's avatar
 
Jan Möbius committed
561
562
    // group does not exist
    if ( !group ) {
563

Jan Möbius's avatar
 
Jan Möbius committed
564
      group = dynamic_cast< BaseObject* >( new GroupObject( current, dynamic_cast< GroupObject* >(parentItem ) ) );
565

Dirk Wilden's avatar
Dirk Wilden committed
566
567
568
569
570
571
572
573
574
      emit emptyObjectAdded( group->id() );

      // in the groups vector we only need the lowest groups
      // because they are used recursively
      int p = groups.indexOf( group->parent() );
      if ( p > -1 )
        groups.remove( p );

      groups.push_back( group );
Jan Möbius's avatar
 
Jan Möbius committed
575
    }
576

Jan Möbius's avatar
 
Jan Möbius committed
577
578
579
580
581
582
583
584
585
586
    // process children
    for ( int i = 0 ; i < elementChildren.size() ; ++i ) {
      BaseObject* childItem =  PluginFunctions::objectRoot()->childExists( elementChildren[i] );
      if ( childItem ) {
        childItem->setParent(group);
      }
    }
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
587
588
589
590

//******************************************************************************

/** \brief Save groups to ini file
591
 *
Dirk Wilden's avatar
Dirk Wilden committed
592
593
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
594
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
595

596
597
598
  if ( !_ini.section_exists( "Groups" ) )
    _ini.add_section("Groups");

Jan Möbius's avatar
 
Jan Möbius committed
599
600
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
601

Jan Möbius's avatar
 
Jan Möbius committed
602
  std::vector< BaseObject* > groups;
603

Jan Möbius's avatar
 
Jan Möbius committed
604
  // Get all groups from the tree
Jan Möbius's avatar
Jan Möbius committed
605
  while ( ! children.empty() ) {
Jan Möbius's avatar
 
Jan Möbius committed
606
607
    BaseObject* item = children.front();
    children.pop();
608
609
610
611
612

    for ( int i = 0 ; i < item->childCount(); ++i )
      if ( item->child(i)->dataType(DATA_GROUP))
        children.push( item->child(i) );

Jan Möbius's avatar
 
Jan Möbius committed
613
614
615
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
616

Jan Möbius's avatar
 
Jan Möbius committed
617
618
  // Names of all groups
  QStringList groupNames;
619

Jan Möbius's avatar
 
Jan Möbius committed
620
621
  // names of the primary groups
  QStringList rootGroup;
622

Jan Möbius's avatar
 
Jan Möbius committed
623
  for ( uint i = 0 ; i < groups.size() ; ++i ) {
624
625
626
627
628
    groupNames.push_back( groups[i]->name() );

    if ( !_ini.section_exists( groups[i]->name() ) )
      _ini.add_section(groups[i]->name());

Jan Möbius's avatar
 
Jan Möbius committed
629
    _ini.add_entry(groups[i]->name(),"groupname",groups[i]->name());
630
631

    // write the name of the parent
Jan Möbius's avatar
 
Jan Möbius committed
632
633
    if ( ( groups[i]->parent() != 0 ) && ( groups[i]->parent() != PluginFunctions::objectRoot() ) )
      _ini.add_entry(groups[i]->name(),"parent",groups[i]->parent()->name());
634

Jan Möbius's avatar
 
Jan Möbius committed
635
636
    if ( groups[i]->parent() == PluginFunctions::objectRoot() )
      rootGroup.push_back( groups[i]->name() );
637

Jan Möbius's avatar
 
Jan Möbius committed
638
639
640
641
642
643
644
645
646
    // Write a list of this groups children
    QStringList groupchildren;
    QStringList elementchildren;
    for ( int j = 0 ; j < groups[i]->childCount(); ++j ) {
      if  ( groups[i]->child(j)->dataType(DATA_GROUP) )
        groupchildren.push_back( groups[i]->child(j)->name() );
      else
        elementchildren.push_back( groups[i]->child(j)->name() );
    }
647

Jan Möbius's avatar
 
Jan Möbius committed
648
649
650
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
651

Jan Möbius's avatar
 
Jan Möbius committed
652
653
  // Write the list of group names to the file
  _ini.add_entry("Groups","groups",groupNames);
654

Jan Möbius's avatar
 
Jan Möbius committed
655
656
  // Write the primary group names to the file
  _ini.add_entry("Groups","rootGroup",rootGroup);
657

658
659
660
661
662
663
664
665
  if ( OpenFlipper::Options::gui() ) {
    if ( !_ini.section_exists( "BoundingBox" ) )
      _ini.add_section("BoundingBox");

    _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
    _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
    _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
  }
666

Jan Möbius's avatar
 
Jan Möbius committed
667
668
669
}


Dirk Wilden's avatar
Dirk Wilden committed
670
671
672
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
673
 *
Dirk Wilden's avatar
Dirk Wilden committed
674
675
676
677
 * @param _obj object to start with
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

678
  
Dirk Wilden's avatar
Dirk Wilden committed
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
  if ( _obj == PluginFunctions::objectRoot() || (!_obj->isGroup()) )
    return;

  QList< BaseObject* > children = _obj->getLeafs();
  bool changed = false;
  bool value    = false;
  bool value2   = false;


  switch ( _column ){

    case 1: //VISIBILTY

      for (int i=0; i < children.size(); i++)
        value |= children[i]->visible();

      _obj->visible( value );

      changed = true;

      break;

    case 2: //SOURCE-TARGET

      for (int i=0; i < children.size(); i++){
        value  |= children[i]->source();
        value2 |= children[i]->target();
      }

      if (_obj->source() != value){
        _obj->source( value );
        changed = true;
      }

      if (_obj->target() != value2){
        _obj->target( value2 );
        changed = true;
      }

      break;

    default:
      break;
  }

  if ( changed )
    propagateUpwards( _obj->parent(), _column );
}

//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
731
 *
Dirk Wilden's avatar
Dirk Wilden committed
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
 * @param _obj object to start with
 */
void DataControlPlugin::propagateDownwards(BaseObject* _obj, int _column ){

  for (int i=0; i < _obj->childCount(); i++){

    BaseObject* current = _obj->child(i);

    bool changed = false;

    switch ( _column ){

      case 1: //VISIBILTY

        if ( current->visible() != _obj->visible() ){

          current->visible( _obj->visible() );

          changed = true;
        }
        break;

      case 2: //SOURCE-TARGET

        if ( current->source() != _obj->source() ){
          current->source( _obj->source() );
          changed = true;
        }

        if ( current->target() != _obj->target() ){
          current->target( _obj->target() );
          changed = true;
        }

        break;

      default:
        break;
    }

    if ( changed && current->isGroup() ){
      propagateDownwards(current, _column);

    }
  }
}

779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
//******************************************************************************

/** \brief Bounding box visibility selection changed
 */
void DataControlPlugin::slotBoundingBoxChange( )
{
  for (PluginFunctions::ObjectIterator o_it; o_it != PluginFunctions::objectsEnd(); ++o_it)  {
    updateBoundingBox (o_it);
  }

  emit updateView();
}

//******************************************************************************

/** \brief Update state of bounding box node
 *
 * @param _obj object
 */
void DataControlPlugin::updateBoundingBox(BaseObjectData* _obj)
{
  if (tool_->notSelected->isChecked () ||
      (_obj->source () && tool_->sourceSelected->isChecked ()) ||
      (_obj->target () && tool_->targetSelected->isChecked ()))
  {
    _obj->boundingBoxNode()->set_status( ACG::SceneGraph::BaseNode::Active );

    ACG::Vec4f color = base_color;

    if (_obj->source () && tool_->sourceSelected->isChecked ())
      color += source_color;

    if (_obj->target () && tool_->targetSelected->isChecked ())
      color += target_color;

    _obj->boundingBoxNode()->set_base_color (color);
  }
  else
    _obj->boundingBoxNode()->set_status( ACG::SceneGraph::TranslationManipulatorNode::HideNode );

}

//******************************************************************************
/** \brief Save settings before application is closed
 *
 * @param _ini reference to ini file
 */
void DataControlPlugin::saveOnExit(INIFile& _ini){
827
828
829
830
831
  if ( !_ini.section_exists( "BoundingBox" ) )
    _ini.add_section("BoundingBox");
  _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
  _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
  _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
832
833
}

Dirk Wilden's avatar
Dirk Wilden committed
834

Jan Möbius's avatar
 
Jan Möbius committed
835
836
Q_EXPORT_PLUGIN2( datacontrolplugin , DataControlPlugin );