DataControlPlugin.cc 28.2 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
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
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40
41
42
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
43
44
45
46
47
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
48
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
49

50
51
#include "DataControlPlugin.hh"

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

Dirk Wilden's avatar
Dirk Wilden committed
53
#include <ACG/QtWidgets/QtMaterialDialog.hh>
Jan Möbius's avatar
 
Jan Möbius committed
54
55
56

#include <queue>

57
58
59
#include <ACG/Scenegraph/TranslationManipulatorNode.hh>
#include <ACG/Scenegraph/BoundingBoxNode.hh>

Dirk Wilden's avatar
Dirk Wilden committed
60
//******************************************************************************
Dirk Wilden's avatar
Dirk Wilden committed
61

Jan Möbius's avatar
Jan Möbius committed
62
63
64
const ACG::Vec4f base_color (0.0f,0.0f,0.5f,1.0f);
const ACG::Vec4f source_color (0.5f,0.0f,0.0f,1.0f);
const ACG::Vec4f target_color (0.0f,0.5f,0.2f,1.0f);
65
66
67

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

Jan Möbius's avatar
Jan Möbius committed
68
69
70
71
72
73
74
75
76
77
78
79
80


DataControlPlugin::DataControlPlugin() :
        tool_(0),
        toolIcon_(0),
        MeshDialogLayout_(0),
        objectList_(0),
        locked(false),
        model_(0),
        view_(0),
        viewHeader_(0),
        onlyDown_(0),
        onlyUp_(0),
81
        columnFromGUI_(-1),
Jan Möbius's avatar
Jan Möbius committed
82
83
84
        headerPopupType_(0),
        targetAction_(0),
        sourceAction_(0),
85
86
        removeAction_(0),
        advancedSettingsBtn_(0)
Jan Möbius's avatar
Jan Möbius committed
87
88
89
90
91
{

}


Dirk Wilden's avatar
Dirk Wilden committed
92
/** \brief Plugin initialization
93
 *
Dirk Wilden's avatar
Dirk Wilden committed
94
 */
Jan Möbius's avatar
 
Jan Möbius committed
95
void DataControlPlugin::pluginsInitialized() {
96

Jan Möbius's avatar
   
Jan Möbius committed
97
98
99
  //set the slot descriptions
  setDescriptions();

100
101
102
  if ( ! OpenFlipper::Options::gui())
    return;

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

Jan Möbius's avatar
 
Jan Möbius committed
105
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
106
107
  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
108
109
110
  hideAction->setStatusTip(tr("Hide object"));
  connect(hideAction, SIGNAL(triggered()), this, SLOT(slotContextMenuHide()) );
  contextMenu->addAction(hideAction);
111

Jan Möbius's avatar
 
Jan Möbius committed
112
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
113
114
  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
115
116
117
118
  targetAction_->setCheckable(true);
  targetAction_->setStatusTip(tr("Set object as target"));
  connect(targetAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuTarget()) );
  contextMenu->addAction(targetAction_);
119

Jan Möbius's avatar
 
Jan Möbius committed
120
  //Source Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
121
122
  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
123
124
125
  sourceAction_->setCheckable(true);
  sourceAction_->setStatusTip(tr("Set object as source"));
  connect(sourceAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuSource()) );
126
127
  contextMenu->addAction(sourceAction_);

Dirk Wilden's avatar
   
Dirk Wilden committed
128
129
130
131
132
133
134
135
136
137
  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
138
  emit addContextMenuItem(contextMenu->menuAction() , DATA_ALL , CONTEXTOBJECTMENU);
139

Dirk Wilden's avatar
   
Dirk Wilden committed
140
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-material.png");
Jan Möbius's avatar
Jan Möbius committed
141
  QAction* material = new QAction(icon, tr("Material Properties"), 0);
142
143
  connect (material, SIGNAL( triggered() ), this, SLOT ( slotMaterialProperties() ));
  emit addContextMenuItem(material , DATA_ALL , CONTEXTOBJECTMENU);
144

Matthias Möller's avatar
Matthias Möller committed
145
146
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-copyToTargets-material.png");
  QAction* copyMaterial = new QAction(icon, tr("Copy Material Properties to Targeted Objects"), 0);
147
148
149
  connect (copyMaterial, SIGNAL( triggered() ), this, SLOT ( slotCopyMaterialToTargeted() ));
  emit addContextMenuItem(copyMaterial , DATA_ALL , CONTEXTOBJECTMENU);

Matthias Möller's avatar
Matthias Möller committed
150
151
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-copy-material.png");
  QAction* copyMaterialToClipboard = new QAction(icon, tr("Copy Material Properties to Clipboard"), 0);
152
153
154
  connect (copyMaterialToClipboard, SIGNAL( triggered() ), this, SLOT ( slotCopyMaterialToClipboard() ));
  emit addContextMenuItem(copyMaterialToClipboard , DATA_ALL , CONTEXTOBJECTMENU);

Matthias Möller's avatar
Matthias Möller committed
155
156
  icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-paste-material.png");
  QAction* pasteMaterialFromClipboard = new QAction(icon, tr("Paste Material Properties from Clipboard"), 0);
157
158
159
  connect (pasteMaterialFromClipboard, SIGNAL( triggered() ), this, SLOT ( slotPasteMaterialFromClipboard() ));
  emit addContextMenuItem(pasteMaterialFromClipboard , DATA_ALL , CONTEXTOBJECTMENU);

160
161
  PluginFunctions::setDefaultViewObjectMarker (&objectMarker);
  PluginFunctions::setViewObjectMarker (&objectMarker);
162
  
163
  connect(tool_->lightSources, SIGNAL(toggled(bool)), this, SLOT(slotShowLightSources(bool)));
164
165
  //update light visibility, if layout was changed
  connect(model_, SIGNAL(layoutChanged ()), this, SLOT(slotShowLightSources()) );
166
  connect(model_, SIGNAL(rowsRemoved(const QModelIndex& , int , int )), this, SLOT(slotShowLightSources()));
Jan Möbius's avatar
 
Jan Möbius committed
167
168
}

Dirk Wilden's avatar
Dirk Wilden committed
169
170
171

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

172
void DataControlPlugin::initializePlugin()
Jan Möbius's avatar
 
Jan Möbius committed
173
{
174
175
176
177
178
179
180
181
182
183
184
185
  if ( ! OpenFlipper::Options::gui())
    return;

  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;
186

187
  tool_->treeView->setModel(model_);
188

189
190
191
  view_->QTreeView::resizeColumnToContents(1);
  view_->QTreeView::resizeColumnToContents(2);
  view_->QTreeView::resizeColumnToContents(3);
192

193

194
195
  connect( model_,SIGNAL(dataChangedInside(int,int,const QVariant&) ),
      this,  SLOT(    slotDataChanged(int,int,const QVariant&)) );
196

197
198
  connect( model_,SIGNAL(   moveBaseObject(int,int) ),
      this,  SLOT( slotMoveBaseObject(int,int) ) );
Dirk Wilden's avatar
Dirk Wilden committed
199

200
201
  connect( view_,SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,SLOT(slotCustomContextMenuRequested ( const QPoint & ) ));
202

203
  connect( tool_->notSelected, SIGNAL(toggled ( bool ) ),
204
      this, SLOT (slotBoundingBoxChange ( ) ));
205
  connect( tool_->sourceSelected, SIGNAL(toggled ( bool ) ),
206
      this, SLOT (slotBoundingBoxChange ( ) ));
207
  connect( tool_->targetSelected, SIGNAL(toggled ( bool ) ),
208
      this, SLOT (slotBoundingBoxChange ( ) ));
209

210
  connect( this, SIGNAL(objectsGrouped(IdList)), this, SLOT(slotObjectsGrouped(IdList)),Qt::QueuedConnection);
211

212
213
  viewHeader_ = tool_->treeView->header();
  viewHeader_->setContextMenuPolicy(Qt::CustomContextMenu);
214

215
216
217
  // connect the slot for the context menu
  connect( viewHeader_, SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,        SLOT(slotHeaderCustomContextMenuRequested ( const QPoint & ) ));
218

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

221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
  QWidget *headerAreaWidget = new QWidget();
  advancedSettingsBtn_ = new QToolButton();
  advancedSettingsBtn_->setAutoRaise(true);
  advancedSettingsBtn_->setIcon(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"preferences.png"));
  advancedSettingsBtn_->setIconSize(QSize(16, 16));
  advancedSettingsBtn_->setPopupMode(QToolButton::InstantPopup);
  advancedSettingsBtn_->setToolTip(tr("Advanced Settings"));
  QHBoxLayout *hl = new QHBoxLayout;
  hl->addWidget(advancedSettingsBtn_);
  hl->addStretch(1);
  hl->setContentsMargins(8, 0, 0, 0);
  headerAreaWidget->setLayout(hl);

  QMenu *menu = new QMenu();
  menu->addAction(tool_->lightSources);
  menu->addAction(tool_->notSelected);
  menu->addAction(tool_->sourceSelected);
  menu->addAction(tool_->targetSelected);
  advancedSettingsBtn_->setMenu(menu);

  emit addToolbox("Data Control", tool_, toolIcon_, headerAreaWidget);
Jan Möbius's avatar
 
Jan Möbius committed
242
243
}

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
//******************************************************************************

/** \brief update objects when they have been grouped
 *
 */
void DataControlPlugin::slotObjectsGrouped(IdList _lst)
{
  // Get all selected rows
  int selectedRows = _lst.size();

  //update each item
  for(int i = 0 ; i < selectedRows ; ++i)
  {
    int id = _lst[i];
    BaseObject* item = 0;

    if ( id != -1 && PluginFunctions::getObject(id,item) )
      emit updatedObject(item->id(),UPDATE_ALL);
  }
}
Jan Möbius's avatar
 
Jan Möbius committed
264

Dirk Wilden's avatar
Dirk Wilden committed
265
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
266

Dirk Wilden's avatar
Dirk Wilden committed
267
/** \brief update drawing of objects when the active object changed
268
 *
Dirk Wilden's avatar
Dirk Wilden committed
269
270
271
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{
272
273
274
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
275
276
  BaseObjectData* obj = 0;

277
  if ( PluginFunctions::getObject( _identifier, obj) )
278
279
    updateBoundingBox (obj);

Dirk Wilden's avatar
Dirk Wilden committed
280
  BaseObject* object = 0;
281
282
  if ( !PluginFunctions::getObject( _identifier, object) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
283

284
285
286
287
288
289
290
  //check for changes
  int column = columnFromGUI_;//if GUI has set the column, use this information
  if (column == -1)//otherwise, try to get the column
  {
    TreeItem* item = model_->getItem(_identifier);
    if ( !item )
      return;
291

292
293
294
295
296
297
298
    if (item->source() != object->source())
      column = 2;
    else if (item->target() != object->target())
      column = 3;
    else
      return;//could not decide, which column needs a update, discard
  }
299

Dirk Wilden's avatar
Dirk Wilden committed
300

301
  model_->objectChanged( _identifier );
302

303
304
305
306
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

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

310
    onlyDown_++;
311

312
313
    if ( object->isGroup() )
      propagateDownwards(object, column); // 2: source 3: target
314

315
316
    onlyDown_--;
  }
317

318
319
  // if we are allowed to propagate up
  if ( onlyDown_ == 0 ){
Dirk Wilden's avatar
Dirk Wilden committed
320

321
322
323
324
325
    onlyUp_++;

    propagateUpwards(object->parent(), column); // 2: source 3: target

    onlyUp_--;
326
  }
327
328
329
330

  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);
  emit updateView();
Dirk Wilden's avatar
Dirk Wilden committed
331
332
333
334
335
336
}


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

/** \brief Update the model if the visibility of an object changed
337
 *
Dirk Wilden's avatar
Dirk Wilden committed
338
339
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
340
void DataControlPlugin::slotVisibilityChanged( int _identifier ){
341

342
343
344
  if ( ! OpenFlipper::Options::gui())
    return;

345
346
347
348
349
350
  // 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
351
352
353
354

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

355
356
357
358
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

Dirk Wilden's avatar
Dirk Wilden committed
359
360
  if ( PluginFunctions::getObject( _identifier, obj) ){

361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
    // 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
382
383
  }

384
385
386
  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);

387
388
389
390
391
  BaseObjectData* object = 0;

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

392
393
  emit updateView();

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


Dirk Wilden's avatar
Dirk Wilden committed
397
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
398

Dirk Wilden's avatar
Dirk Wilden committed
399
/** \brief Update the model if properties of an object changed
400
 *
Dirk Wilden's avatar
Dirk Wilden committed
401
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
402
 */
Dirk Wilden's avatar
Dirk Wilden committed
403
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
404
405
406
407

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

Dirk Wilden's avatar
Dirk Wilden committed
408
409
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
410

Dirk Wilden's avatar
Dirk Wilden committed
411

Dirk Wilden's avatar
Dirk Wilden committed
412
413
414
//******************************************************************************

/** \brief Update the model if a file has been opened
415
 *
Dirk Wilden's avatar
Dirk Wilden committed
416
417
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
418
419
void DataControlPlugin::fileOpened(int _id){

420
421
422
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
423
424
  BaseObject* obj = 0;

425
  if ( PluginFunctions::getObject(_id, obj) ) {
Dirk Wilden's avatar
Dirk Wilden committed
426
    model_->objectAdded(obj);
427

428
429
    // Only if the added object was a light source, we will traverse the objects!
    if ( obj->dataType() == DATA_LIGHT)
430
      slotShowLightSources(tool_->lightSources->isChecked());
431

432
433
    view_->resizeColumnToContents(0);
  }
Dirk Wilden's avatar
Dirk Wilden committed
434
435
436
437
438
439
}


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

/** \brief Update the model if an empty object has been added
440
 *
Dirk Wilden's avatar
Dirk Wilden committed
441
442
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
443
444
445
446
447
448
449
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

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

/** \brief an object was deleted. delete it internally
450
 *
Dirk Wilden's avatar
Dirk Wilden committed
451
452
453
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
454
455
456
457

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

Dirk Wilden's avatar
Dirk Wilden committed
458
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
459
460
}

Dirk Wilden's avatar
Dirk Wilden committed
461
462
463
//******************************************************************************

/** \brief a key event occurred
464
 *
Dirk Wilden's avatar
Dirk Wilden committed
465
466
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
467
468
469
470
471
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
472
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
473
474
475
476
477
478
          setAllTarget();
        return;
      default:
        return;
    }
  }
479

480
481
482
483
484
485
486
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
487

Jan Möbius's avatar
 
Jan Möbius committed
488
489
}

Dirk Wilden's avatar
Dirk Wilden committed
490
491
492
493

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

/** \brief emit the right updates when the model changed
494
 *
Jan Möbius's avatar
Jan Möbius committed
495
496
497
 * @param _id     Object id that was changed
 * @param _column Which column changed
 * @param _value  What is the new value?
Dirk Wilden's avatar
Dirk Wilden committed
498
 */
Dirk Wilden's avatar
Dirk Wilden committed
499
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
500
{
501

Dirk Wilden's avatar
Dirk Wilden committed
502
503
504
505
  //get the corresponding baseObject
  BaseObject* obj = 0;
  if ( !PluginFunctions::getObject( _id, obj) )
    return;
506
  
Dirk Wilden's avatar
Dirk Wilden committed
507
508
509
510
511
512
513
514
515
516
517
518
519
  switch ( _column ) {
    // Name
    case 0:
      obj->setName( _value.toString() );
      break;

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

    // source
    case 2:
520
      columnFromGUI_ = 2;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
521
      obj->source( _value.toBool() );
522
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
523
524
525
526
      break;

    // target
    case 3:
527
      columnFromGUI_ = 3;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
528
      obj->target( _value.toBool() );
529
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
530
      break;
Dirk Wilden's avatar
Dirk Wilden committed
531

Dirk Wilden's avatar
Dirk Wilden committed
532
533
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
534
535
536
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
537
538
539

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

Dirk Wilden's avatar
Dirk Wilden committed
540
/** \brief Gets called when an object was moved via drag n drop
541
 *
Jan Möbius's avatar
Jan Möbius committed
542
543
 * @param _id          id of the object
 * @param _newParentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
544
 */
Dirk Wilden's avatar
Dirk Wilden committed
545
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
546

Dirk Wilden's avatar
Dirk Wilden committed
547
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
548

Dirk Wilden's avatar
Dirk Wilden committed
549
550
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
551

Dirk Wilden's avatar
Dirk Wilden committed
552
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
553

Dirk Wilden's avatar
Dirk Wilden committed
554
555
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
556

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

Dirk Wilden's avatar
Dirk Wilden committed
559
560
  //set new parent
  obj->setParent( parent );
Dirk Wilden's avatar
Dirk Wilden committed
561

Dirk Wilden's avatar
Dirk Wilden committed
562
563
564
  //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
565
566
567
}


568
569
//******************************************************************************

570
void DataControlPlugin::slotShowLightSources( bool _state ) {
571
572

    int rows = model_->rowCount();
573

574
575
576
    for(int i = 0; i < rows; ++i) {
        TreeItem* item = model_->getItem(model_->index(i,0));
        if(item->dataType() == DATA_LIGHT) {
577
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), !_state);
578
579
580
        }else{
          //always show, if it is not a light
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), false);
581
582
583
584
        }
    }
}

585
586
587

void DataControlPlugin::slotShowLightSources()
{
588
  slotShowLightSources( tool_->lightSources->isChecked() );
589
}
Dirk Wilden's avatar
Dirk Wilden committed
590
591
592
//******************************************************************************

/** \brief Load Groups from ini file
593
 *
Dirk Wilden's avatar
Dirk Wilden committed
594
595
 * @param _ini an ini file
 */
Jan Möbius's avatar
   
Jan Möbius committed
596
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
597

598
  if ( _ini.section_exists( "BoundingBox" ) && OpenFlipper::Options::gui() )
599
600
601
602
603
604
605
606
607
608
  {
    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);
  }

609
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
610
    return;
611

Jan Möbius's avatar
 
Jan Möbius committed
612
613
  // Names of all groups
  QStringList groupNames;
614

Jan Möbius's avatar
 
Jan Möbius committed
615
616
  // names of the primary groups
  QStringList rootGroup;
617

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

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

Dirk Wilden's avatar
Dirk Wilden committed
624
625
626
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
627
628
629
630
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
631

Jan Möbius's avatar
 
Jan Möbius committed
632
633
    QStringList groupChildren;
    QStringList elementChildren;
634

Jan Möbius's avatar
 
Jan Möbius committed
635
636
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
637

Jan Möbius's avatar
 
Jan Möbius committed
638
639
640
641
642
643
    // 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 )
644
645
646
647
648
649
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

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

Jan Möbius's avatar
 
Jan Möbius committed
653
654
    // group does not exist
    if ( !group ) {
655

656
657
      int groupId = addEmptyGroup(current, parentItem->id());
      PluginFunctions::getObject(groupId, group);
Dirk Wilden's avatar
Dirk Wilden committed
658
659
660
661
662
663
664
665

      // 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
666
    }
667

Jan Möbius's avatar
 
Jan Möbius committed
668
669
670
671
672
673
674
675
676
677
    // 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
678
679
680
681

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

/** \brief Save groups to ini file
682
 *
Dirk Wilden's avatar
Dirk Wilden committed
683
684
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
685
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
686

Jan Möbius's avatar
 
Jan Möbius committed
687
688
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
689

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

Jan Möbius's avatar
 
Jan Möbius committed
692
  // Get all groups from the tree
Jan Möbius's avatar
Jan Möbius committed
693
  while ( ! children.empty() ) {
Jan Möbius's avatar
 
Jan Möbius committed
694
695
    BaseObject* item = children.front();
    children.pop();
696
697
698
699
700

    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
701
702
703
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
704

Jan Möbius's avatar
 
Jan Möbius committed
705
706
  // Names of all groups
  QStringList groupNames;
707

Jan Möbius's avatar
 
Jan Möbius committed
708
709
  // names of the primary groups
  QStringList rootGroup;
710

Jan Möbius's avatar
 
Jan Möbius committed
711
  for ( uint i = 0 ; i < groups.size() ; ++i ) {
712
713
    groupNames.push_back( groups[i]->name() );

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
723
724
725
726
727
728
729
730
731
    // 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() );
    }
732

Jan Möbius's avatar
 
Jan Möbius committed
733
734
735
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
736

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

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

743
744
745
746
747
748
  if ( OpenFlipper::Options::gui() ) {

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

Jan Möbius's avatar
 
Jan Möbius committed
750
751
752
}


Dirk Wilden's avatar
Dirk Wilden committed
753
754
755
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
756
 *
Jan Möbius's avatar
Jan Möbius committed
757
758
 * @param _obj    Object to start with
 * @param _column Column to propagate
Dirk Wilden's avatar
Dirk Wilden committed
759
760
761
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

762
  
Dirk Wilden's avatar
Dirk Wilden committed
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
  if ( _obj == PluginFunctions::objectRoot() || (!_obj->isGroup()) )
    return;

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


  switch ( _column ){

    case 1: //VISIBILTY

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

      _obj->visible( value );

      changed = true;

      break;

784
    case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
785
786
787
788
789
790
791
792
793

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

      if (_obj->source() != value){
        _obj->source( value );
        changed = true;
      }
794
      break;
Dirk Wilden's avatar
Dirk Wilden committed
795

796
797
798
799
800
801
802
803
    case 3: //TARGET

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

      if (_obj->target() != value){
        _obj->target( value );
Dirk Wilden's avatar
Dirk Wilden committed
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
        changed = true;
      }

      break;

    default:
      break;
  }

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

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

/** \brief Recursively update a column up to the root of the tree
820
 *
Jan Möbius's avatar
Jan Möbius committed
821
822
 * @param _obj    object to start with
 * @param _column Column to be propagated
Dirk Wilden's avatar
Dirk Wilden committed
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
 */
void DataControlPlugin::propagateDownwards(BaseObject* _obj, int _column ){

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

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

    switch ( _column ){

      case 1: //VISIBILTY

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

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

840
      case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
841
842
843
844

        if ( current->source() != _obj->source() ){
          current->source( _obj->source() );
        }
845
846
847
        break;

      case 3: //TARGET
Dirk Wilden's avatar
Dirk Wilden committed
848
849
850
851
852
853
854
855
856
857
858

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

        break;

      default:
        break;
    }

859
    if ( current->isGroup() ){
Dirk Wilden's avatar
Dirk Wilden committed
860
861
862
863
864
865
      propagateDownwards(current, _column);

    }
  }
}

866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
//******************************************************************************

/** \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){
914
915
916
  _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
  _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
  _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
917
918
}

Jan Möbius's avatar
Jan Möbius committed
919
void DataControlPlugin::showReducedUi(bool reduced) {
920
921
    if (advancedSettingsBtn_)
        advancedSettingsBtn_->setVisible(reduced);
Jan Möbius's avatar
Jan Möbius committed
922
}
Dirk Wilden's avatar
Dirk Wilden committed
923

924
925
926
927
928
929
930
931
void DataControlPlugin::slotObjectUpdated( int _identifier, const UpdateType& _type )
{
  if ( ! OpenFlipper::Options::gui() || !_type.contains(UPDATE_GEOMETRY))
    return;

  BaseObjectData* obj = 0;

  if ( PluginFunctions::getObject( _identifier, obj) )
932
  {
933
    updateBoundingBox (obj);
934
935
    model_->objectChanged(obj->id());
  }
936
937
}

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