DataControlPlugin.cc 27.8 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
\*===========================================================================*/

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

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

44
45
#include "DataControlPlugin.hh"

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

Dirk Wilden's avatar
Dirk Wilden committed
47
#include <ACG/QtWidgets/QtMaterialDialog.hh>
Jan Möbius's avatar
 
Jan Möbius committed
48
49
50

#include <queue>

51
52
53
#include <ACG/Scenegraph/TranslationManipulatorNode.hh>
#include <ACG/Scenegraph/BoundingBoxNode.hh>

Dirk Wilden's avatar
Dirk Wilden committed
54
//******************************************************************************
Dirk Wilden's avatar
Dirk Wilden committed
55

Jan Möbius's avatar
Jan Möbius committed
56
57
58
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);
59
60
61

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

Jan Möbius's avatar
Jan Möbius committed
62
63
64
65
66
67
68
69
70
71
72
73
74


DataControlPlugin::DataControlPlugin() :
        tool_(0),
        toolIcon_(0),
        MeshDialogLayout_(0),
        objectList_(0),
        locked(false),
        model_(0),
        view_(0),
        viewHeader_(0),
        onlyDown_(0),
        onlyUp_(0),
75
        columnFromGUI_(-1),
Jan Möbius's avatar
Jan Möbius committed
76
77
78
        headerPopupType_(0),
        targetAction_(0),
        sourceAction_(0),
79
80
        removeAction_(0),
        advancedSettingsBtn_(0)
Jan Möbius's avatar
Jan Möbius committed
81
82
83
84
85
{

}


Dirk Wilden's avatar
Dirk Wilden committed
86
/** \brief Plugin initialization
87
 *
Dirk Wilden's avatar
Dirk Wilden committed
88
 */
Jan Möbius's avatar
 
Jan Möbius committed
89
void DataControlPlugin::pluginsInitialized() {
90

Jan Möbius's avatar
   
Jan Möbius committed
91
92
93
  //set the slot descriptions
  setDescriptions();

94
95
96
  if ( ! OpenFlipper::Options::gui())
    return;

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

Jan Möbius's avatar
 
Jan Möbius committed
99
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
100
101
  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
102
103
104
  hideAction->setStatusTip(tr("Hide object"));
  connect(hideAction, SIGNAL(triggered()), this, SLOT(slotContextMenuHide()) );
  contextMenu->addAction(hideAction);
105

Jan Möbius's avatar
 
Jan Möbius committed
106
  //Target Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
107
108
  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
109
110
111
112
  targetAction_->setCheckable(true);
  targetAction_->setStatusTip(tr("Set object as target"));
  connect(targetAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuTarget()) );
  contextMenu->addAction(targetAction_);
113

Jan Möbius's avatar
 
Jan Möbius committed
114
  //Source Objects
Dirk Wilden's avatar
   
Dirk Wilden committed
115
116
  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
117
118
119
  sourceAction_->setCheckable(true);
  sourceAction_->setStatusTip(tr("Set object as source"));
  connect(sourceAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuSource()) );
120
121
  contextMenu->addAction(sourceAction_);

Dirk Wilden's avatar
   
Dirk Wilden committed
122
123
124
125
126
127
128
129
130
131
  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
132
  emit addContextMenuItem(contextMenu->menuAction() , DATA_ALL , CONTEXTOBJECTMENU);
133

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

Matthias Möller's avatar
Matthias Möller committed
139
140
  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);
141
142
143
  connect (copyMaterial, SIGNAL( triggered() ), this, SLOT ( slotCopyMaterialToTargeted() ));
  emit addContextMenuItem(copyMaterial , DATA_ALL , CONTEXTOBJECTMENU);

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

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

154
155
  PluginFunctions::setDefaultViewObjectMarker (&objectMarker);
  PluginFunctions::setViewObjectMarker (&objectMarker);
156
  
157
  connect(tool_->lightSources, SIGNAL(toggled(bool)), this, SLOT(slotShowLightSources(bool)));
158
159
  //update light visibility, if layout was changed
  connect(model_, SIGNAL(layoutChanged ()), this, SLOT(slotShowLightSources()) );
160
  connect(model_, SIGNAL(rowsRemoved(const QModelIndex& , int , int )), this, SLOT(slotShowLightSources()));
Jan Möbius's avatar
 
Jan Möbius committed
161
162
}

Dirk Wilden's avatar
Dirk Wilden committed
163
164
165

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

166
void DataControlPlugin::initializePlugin()
Jan Möbius's avatar
 
Jan Möbius committed
167
{
168
169
170
171
172
173
174
175
176
177
178
179
  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;
180

181
  tool_->treeView->setModel(model_);
182

183
184
185
  view_->QTreeView::resizeColumnToContents(1);
  view_->QTreeView::resizeColumnToContents(2);
  view_->QTreeView::resizeColumnToContents(3);
186

187

188
189
  connect( model_,SIGNAL(dataChangedInside(int,int,const QVariant&) ),
      this,  SLOT(    slotDataChanged(int,int,const QVariant&)) );
190

191
192
  connect( model_,SIGNAL(   moveBaseObject(int,int) ),
      this,  SLOT( slotMoveBaseObject(int,int) ) );
Dirk Wilden's avatar
Dirk Wilden committed
193

194
195
  connect( view_,SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,SLOT(slotCustomContextMenuRequested ( const QPoint & ) ));
196

197
  connect( tool_->notSelected, SIGNAL(toggled ( bool ) ),
198
      this, SLOT (slotBoundingBoxChange ( ) ));
199
  connect( tool_->sourceSelected, SIGNAL(toggled ( bool ) ),
200
      this, SLOT (slotBoundingBoxChange ( ) ));
201
  connect( tool_->targetSelected, SIGNAL(toggled ( bool ) ),
202
      this, SLOT (slotBoundingBoxChange ( ) ));
203

204
  connect( this, SIGNAL(objectsGrouped(IdList)), this, SLOT(slotObjectsGrouped(IdList)),Qt::QueuedConnection);
205

206
207
  viewHeader_ = tool_->treeView->header();
  viewHeader_->setContextMenuPolicy(Qt::CustomContextMenu);
208

209
210
211
  // connect the slot for the context menu
  connect( viewHeader_, SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,        SLOT(slotHeaderCustomContextMenuRequested ( const QPoint & ) ));
212

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

215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
  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
236
237
}

238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
//******************************************************************************

/** \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
258

Dirk Wilden's avatar
Dirk Wilden committed
259
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
260

Dirk Wilden's avatar
Dirk Wilden committed
261
/** \brief update drawing of objects when the active object changed
262
 *
Dirk Wilden's avatar
Dirk Wilden committed
263
264
265
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{
266
267
268
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
269
270
  BaseObjectData* obj = 0;

271
  if ( PluginFunctions::getObject( _identifier, obj) )
272
273
    updateBoundingBox (obj);

Dirk Wilden's avatar
Dirk Wilden committed
274
  BaseObject* object = 0;
275
276
  if ( !PluginFunctions::getObject( _identifier, object) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
277

278
279
280
281
282
283
284
  //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;
285

286
287
288
289
290
291
292
    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
  }
293

Dirk Wilden's avatar
Dirk Wilden committed
294

295
  model_->objectChanged( _identifier );
296

297
298
299
300
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

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

304
    onlyDown_++;
305

306
307
    if ( object->isGroup() )
      propagateDownwards(object, column); // 2: source 3: target
308

309
310
    onlyDown_--;
  }
311

312
313
  // if we are allowed to propagate up
  if ( onlyDown_ == 0 ){
Dirk Wilden's avatar
Dirk Wilden committed
314

315
316
317
318
319
    onlyUp_++;

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

    onlyUp_--;
320
  }
321
322
323
324

  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);
  emit updateView();
Dirk Wilden's avatar
Dirk Wilden committed
325
326
327
328
329
330
}


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

/** \brief Update the model if the visibility of an object changed
331
 *
Dirk Wilden's avatar
Dirk Wilden committed
332
333
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
334
void DataControlPlugin::slotVisibilityChanged( int _identifier ){
335

336
337
338
  if ( ! OpenFlipper::Options::gui())
    return;

339
340
341
342
343
344
  // 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
345
346
347
348

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

349
350
351
352
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

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

355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
    // 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
376
377
  }

378
379
380
  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);

381
382
383
384
385
  BaseObjectData* object = 0;

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

386
387
  emit updateView();

Jan Möbius's avatar
 
Jan Möbius committed
388
389
390
}


Dirk Wilden's avatar
Dirk Wilden committed
391
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
392

Dirk Wilden's avatar
Dirk Wilden committed
393
/** \brief Update the model if properties of an object changed
394
 *
Dirk Wilden's avatar
Dirk Wilden committed
395
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
396
 */
Dirk Wilden's avatar
Dirk Wilden committed
397
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
398
399
400
401

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

Dirk Wilden's avatar
Dirk Wilden committed
402
403
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
404

Dirk Wilden's avatar
Dirk Wilden committed
405

Dirk Wilden's avatar
Dirk Wilden committed
406
407
408
//******************************************************************************

/** \brief Update the model if a file has been opened
409
 *
Dirk Wilden's avatar
Dirk Wilden committed
410
411
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
412
413
void DataControlPlugin::fileOpened(int _id){

414
415
416
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
417
418
  BaseObject* obj = 0;

419
  if ( PluginFunctions::getObject(_id, obj) ) {
Dirk Wilden's avatar
Dirk Wilden committed
420
    model_->objectAdded(obj);
421

422
423
    // Only if the added object was a light source, we will traverse the objects!
    if ( obj->dataType() == DATA_LIGHT)
424
      slotShowLightSources(tool_->lightSources->isChecked());
425

426
427
    view_->resizeColumnToContents(0);
  }
Dirk Wilden's avatar
Dirk Wilden committed
428
429
430
431
432
433
}


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

/** \brief Update the model if an empty object has been added
434
 *
Dirk Wilden's avatar
Dirk Wilden committed
435
436
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
437
438
439
440
441
442
443
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

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

/** \brief an object was deleted. delete it internally
444
 *
Dirk Wilden's avatar
Dirk Wilden committed
445
446
447
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
448
449
450
451

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

Dirk Wilden's avatar
Dirk Wilden committed
452
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
453
454
}

Dirk Wilden's avatar
Dirk Wilden committed
455
456
457
//******************************************************************************

/** \brief a key event occurred
458
 *
Dirk Wilden's avatar
Dirk Wilden committed
459
460
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
461
462
463
464
465
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
466
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
467
468
469
470
471
472
          setAllTarget();
        return;
      default:
        return;
    }
  }
473

474
475
476
477
478
479
480
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
481

Jan Möbius's avatar
 
Jan Möbius committed
482
483
}

Dirk Wilden's avatar
Dirk Wilden committed
484
485
486
487

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

/** \brief emit the right updates when the model changed
488
 *
Jan Möbius's avatar
Jan Möbius committed
489
490
491
 * @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
492
 */
Dirk Wilden's avatar
Dirk Wilden committed
493
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
494
{
495

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

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

    // source
    case 2:
514
      columnFromGUI_ = 2;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
515
      obj->source( _value.toBool() );
516
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
517
518
519
520
      break;

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

Dirk Wilden's avatar
Dirk Wilden committed
526
527
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
528
529
530
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
531
532
533

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

Dirk Wilden's avatar
Dirk Wilden committed
534
/** \brief Gets called when an object was moved via drag n drop
535
 *
Jan Möbius's avatar
Jan Möbius committed
536
537
 * @param _id          id of the object
 * @param _newParentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
538
 */
Dirk Wilden's avatar
Dirk Wilden committed
539
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
540

Dirk Wilden's avatar
Dirk Wilden committed
541
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
542

Dirk Wilden's avatar
Dirk Wilden committed
543
544
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
545

Dirk Wilden's avatar
Dirk Wilden committed
546
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
547

Dirk Wilden's avatar
Dirk Wilden committed
548
549
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
550

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

Dirk Wilden's avatar
Dirk Wilden committed
553
554
  //set new parent
  obj->setParent( parent );
Dirk Wilden's avatar
Dirk Wilden committed
555

Dirk Wilden's avatar
Dirk Wilden committed
556
557
558
  //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
559
560
561
}


562
563
//******************************************************************************

564
void DataControlPlugin::slotShowLightSources( bool _state ) {
565
566

    int rows = model_->rowCount();
567

568
569
570
    for(int i = 0; i < rows; ++i) {
        TreeItem* item = model_->getItem(model_->index(i,0));
        if(item->dataType() == DATA_LIGHT) {
571
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), !_state);
572
573
574
        }else{
          //always show, if it is not a light
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), false);
575
576
577
578
        }
    }
}

579
580
581

void DataControlPlugin::slotShowLightSources()
{
582
  slotShowLightSources( tool_->lightSources->isChecked() );
583
}
Dirk Wilden's avatar
Dirk Wilden committed
584
585
586
//******************************************************************************

/** \brief Load Groups from ini file
587
 *
Dirk Wilden's avatar
Dirk Wilden committed
588
589
 * @param _ini an ini file
 */
Jan Möbius's avatar
   
Jan Möbius committed
590
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
591

592
  if ( _ini.section_exists( "BoundingBox" ) && OpenFlipper::Options::gui() )
593
594
595
596
597
598
599
600
601
602
  {
    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);
  }

603
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
604
    return;
605

Jan Möbius's avatar
 
Jan Möbius committed
606
607
  // Names of all groups
  QStringList groupNames;
608

Jan Möbius's avatar
 
Jan Möbius committed
609
610
  // names of the primary groups
  QStringList rootGroup;
611

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

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

Dirk Wilden's avatar
Dirk Wilden committed
618
619
620
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
621
622
623
624
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
625

Jan Möbius's avatar
 
Jan Möbius committed
626
627
    QStringList groupChildren;
    QStringList elementChildren;
628

Jan Möbius's avatar
 
Jan Möbius committed
629
630
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
631

Jan Möbius's avatar
 
Jan Möbius committed
632
633
634
635
636
637
    // 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 )
638
639
640
641
642
643
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

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

Jan Möbius's avatar
 
Jan Möbius committed
647
648
    // group does not exist
    if ( !group ) {
649

650
651
      int groupId = addEmptyGroup(current, parentItem->id());
      PluginFunctions::getObject(groupId, group);
Dirk Wilden's avatar
Dirk Wilden committed
652
653
654
655
656
657
658
659

      // 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
660
    }
661

Jan Möbius's avatar
 
Jan Möbius committed
662
663
664
665
666
667
668
669
670
671
    // 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
672
673
674
675

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

/** \brief Save groups to ini file
676
 *
Dirk Wilden's avatar
Dirk Wilden committed
677
678
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
679
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
680

Jan Möbius's avatar
 
Jan Möbius committed
681
682
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
683

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

Jan Möbius's avatar
 
Jan Möbius committed
686
  // Get all groups from the tree
Jan Möbius's avatar
Jan Möbius committed
687
  while ( ! children.empty() ) {
Jan Möbius's avatar
 
Jan Möbius committed
688
689
    BaseObject* item = children.front();
    children.pop();
690
691
692
693
694

    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
695
696
697
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
698

Jan Möbius's avatar
 
Jan Möbius committed
699
700
  // Names of all groups
  QStringList groupNames;
701

Jan Möbius's avatar
 
Jan Möbius committed
702
703
  // names of the primary groups
  QStringList rootGroup;
704

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
717
718
719
720
721
722
723
724
725
    // 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() );
    }
726

Jan Möbius's avatar
 
Jan Möbius committed
727
728
729
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
730

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

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

737
738
739
740
741
742
  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 ());
  }
743

Jan Möbius's avatar
 
Jan Möbius committed
744
745
746
}


Dirk Wilden's avatar
Dirk Wilden committed
747
748
749
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
750
 *
Jan Möbius's avatar
Jan Möbius committed
751
752
 * @param _obj    Object to start with
 * @param _column Column to propagate
Dirk Wilden's avatar
Dirk Wilden committed
753
754
755
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

756
  
Dirk Wilden's avatar
Dirk Wilden committed
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
  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;

778
    case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
779
780
781
782
783
784
785
786
787

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

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

790
791
792
793
794
795
796
797
    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
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
        changed = true;
      }

      break;

    default:
      break;
  }

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

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

/** \brief Recursively update a column up to the root of the tree
814
 *
Jan Möbius's avatar
Jan Möbius committed
815
816
 * @param _obj    object to start with
 * @param _column Column to be propagated
Dirk Wilden's avatar
Dirk Wilden committed
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
 */
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;

834
      case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
835
836
837
838

        if ( current->source() != _obj->source() ){
          current->source( _obj->source() );
        }
839
840
841
        break;

      case 3: //TARGET
Dirk Wilden's avatar
Dirk Wilden committed
842
843
844
845
846
847
848
849
850
851
852

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

        break;

      default:
        break;
    }

853
    if ( current->isGroup() ){
Dirk Wilden's avatar
Dirk Wilden committed
854
855
856
857
858
859
      propagateDownwards(current, _column);

    }
  }
}

860
861
862
863
864
865
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
//******************************************************************************

/** \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){
908
909
910
  _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
  _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
  _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
911
912
}

Jan Möbius's avatar
Jan Möbius committed
913
void DataControlPlugin::showReducedUi(bool reduced) {
914
915
    if (advancedSettingsBtn_)
        advancedSettingsBtn_->setVisible(reduced);
Jan Möbius's avatar
Jan Möbius committed
916
}
Dirk Wilden's avatar
Dirk Wilden committed
917

918
919
920
921
922
923
924
925
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) )
926
  {
927
    updateBoundingBox (obj);
928
929
    model_->objectChanged(obj->id());
  }
930
931
}

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