DataControlPlugin.cc 27.7 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"

52
#if QT_VERSION >= 0x050000
Matthias Möller's avatar
Matthias Möller committed
53 54 55
#else
  #include <QtGui>
#endif
Jan Möbius's avatar
 
Jan Möbius committed
56

Dirk Wilden's avatar
Dirk Wilden committed
57
#include <ACG/QtWidgets/QtMaterialDialog.hh>
Jan Möbius's avatar
 
Jan Möbius committed
58 59 60

#include <queue>

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

Jan Möbius's avatar
Jan Möbius committed
63 64 65
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);
66 67 68

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

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


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

}


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

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

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

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

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

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

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

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

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

Matthias Möller's avatar
Matthias Möller committed
146 147
  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);
148 149 150
  connect (copyMaterial, SIGNAL( triggered() ), this, SLOT ( slotCopyMaterialToTargeted() ));
  emit addContextMenuItem(copyMaterial , DATA_ALL , CONTEXTOBJECTMENU);

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
170 171 172

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

173
void DataControlPlugin::initializePlugin()
Jan Möbius's avatar
 
Jan Möbius committed
174
{
175 176 177 178 179 180 181 182 183 184 185 186
  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;
187

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

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

194

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

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

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

204
  connect( tool_->notSelected, SIGNAL(toggled ( bool ) ),
205
      this, SLOT (slotBoundingBoxChange ( ) ));
206
  connect( tool_->sourceSelected, SIGNAL(toggled ( bool ) ),
207
      this, SLOT (slotBoundingBoxChange ( ) ));
208
  connect( tool_->targetSelected, SIGNAL(toggled ( bool ) ),
209
      this, SLOT (slotBoundingBoxChange ( ) ));
210 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
}


Dirk Wilden's avatar
Dirk Wilden committed
245
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
246

Dirk Wilden's avatar
Dirk Wilden committed
247
/** \brief update drawing of objects when the active object changed
248
 *
Dirk Wilden's avatar
Dirk Wilden committed
249 250 251
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{
252 253 254
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
255 256
  BaseObjectData* obj = 0;

257
  if ( PluginFunctions::getObject( _identifier, obj) )
258 259
    updateBoundingBox (obj);

Dirk Wilden's avatar
Dirk Wilden committed
260
  BaseObject* object = 0;
261 262
  if ( !PluginFunctions::getObject( _identifier, object) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
263

264 265 266 267 268 269 270
  //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;
271

272 273 274 275 276 277 278
    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
  }
279

Dirk Wilden's avatar
Dirk Wilden committed
280

281
  model_->objectChanged( _identifier );
282

283 284 285 286
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

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

290
    onlyDown_++;
291

292 293
    if ( object->isGroup() )
      propagateDownwards(object, column); // 2: source 3: target
294

295 296
    onlyDown_--;
  }
297

298 299
  // if we are allowed to propagate up
  if ( onlyDown_ == 0 ){
Dirk Wilden's avatar
Dirk Wilden committed
300

301 302 303 304 305
    onlyUp_++;

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

    onlyUp_--;
306
  }
307 308 309 310

  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);
  emit updateView();
Dirk Wilden's avatar
Dirk Wilden committed
311 312 313 314 315 316
}


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

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

322 323 324
  if ( ! OpenFlipper::Options::gui())
    return;

325 326 327 328 329 330
  // 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
331 332 333 334

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

335 336 337 338
  //block scenegraph reset and redraw in core
  OpenFlipper::Options::blockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(true);

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

341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
    // 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
362 363
  }

364 365 366
  OpenFlipper::Options::unblockSceneGraphUpdates();
  OpenFlipper::Options::redrawDisabled(false);

367 368 369 370 371
  BaseObjectData* object = 0;

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

372 373
  emit updateView();

Jan Möbius's avatar
 
Jan Möbius committed
374 375 376
}


Dirk Wilden's avatar
Dirk Wilden committed
377
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
378

Dirk Wilden's avatar
Dirk Wilden committed
379
/** \brief Update the model if properties of an object changed
380
 *
Dirk Wilden's avatar
Dirk Wilden committed
381
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
382
 */
Dirk Wilden's avatar
Dirk Wilden committed
383
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
384 385 386 387

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

Dirk Wilden's avatar
Dirk Wilden committed
388 389
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
390

Dirk Wilden's avatar
Dirk Wilden committed
391

Dirk Wilden's avatar
Dirk Wilden committed
392 393 394
//******************************************************************************

/** \brief Update the model if a file has been opened
395
 *
Dirk Wilden's avatar
Dirk Wilden committed
396 397
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
398 399
void DataControlPlugin::fileOpened(int _id){

400 401 402
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
403 404
  BaseObject* obj = 0;

405
  if ( PluginFunctions::getObject(_id, obj) ) {
Dirk Wilden's avatar
Dirk Wilden committed
406
    model_->objectAdded(obj);
407

408 409
    // Only if the added object was a light source, we will traverse the objects!
    if ( obj->dataType() == DATA_LIGHT)
410
      slotShowLightSources(tool_->lightSources->isChecked());
411

412 413
    view_->resizeColumnToContents(0);
  }
Dirk Wilden's avatar
Dirk Wilden committed
414 415 416 417 418 419
}


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

/** \brief Update the model if an empty object has been added
420
 *
Dirk Wilden's avatar
Dirk Wilden committed
421 422
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
423 424 425 426 427 428 429
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

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

/** \brief an object was deleted. delete it internally
430
 *
Dirk Wilden's avatar
Dirk Wilden committed
431 432 433
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
434 435 436 437

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

Dirk Wilden's avatar
Dirk Wilden committed
438
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
439 440
}

Dirk Wilden's avatar
Dirk Wilden committed
441 442 443
//******************************************************************************

/** \brief a key event occurred
444
 *
Dirk Wilden's avatar
Dirk Wilden committed
445 446
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
447 448 449 450 451
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
452
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
453 454 455 456 457 458
          setAllTarget();
        return;
      default:
        return;
    }
  }
459

460 461 462 463 464 465 466
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
467

Jan Möbius's avatar
 
Jan Möbius committed
468 469
}

Dirk Wilden's avatar
Dirk Wilden committed
470 471 472 473

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

/** \brief emit the right updates when the model changed
474
 *
Jan Möbius's avatar
Jan Möbius committed
475 476 477
 * @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
478
 */
Dirk Wilden's avatar
Dirk Wilden committed
479
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
480
{
481

Dirk Wilden's avatar
Dirk Wilden committed
482 483 484 485
  //get the corresponding baseObject
  BaseObject* obj = 0;
  if ( !PluginFunctions::getObject( _id, obj) )
    return;
486
  
Dirk Wilden's avatar
Dirk Wilden committed
487 488 489 490 491 492 493 494 495 496 497 498 499
  switch ( _column ) {
    // Name
    case 0:
      obj->setName( _value.toString() );
      break;

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

    // source
    case 2:
500
      columnFromGUI_ = 2;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
501
      obj->source( _value.toBool() );
502
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
503 504 505 506
      break;

    // target
    case 3:
507
      columnFromGUI_ = 3;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
508
      obj->target( _value.toBool() );
509
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
510
      break;
Dirk Wilden's avatar
Dirk Wilden committed
511

Dirk Wilden's avatar
Dirk Wilden committed
512 513
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
514 515 516
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
517 518 519

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

Dirk Wilden's avatar
Dirk Wilden committed
520
/** \brief Gets called when an object was moved via drag n drop
521
 *
Jan Möbius's avatar
Jan Möbius committed
522 523
 * @param _id          id of the object
 * @param _newParentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
524
 */
Dirk Wilden's avatar
Dirk Wilden committed
525
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
526

Dirk Wilden's avatar
Dirk Wilden committed
527
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
528

Dirk Wilden's avatar
Dirk Wilden committed
529 530
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
531

Dirk Wilden's avatar
Dirk Wilden committed
532
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
533

Dirk Wilden's avatar
Dirk Wilden committed
534 535
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
536

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

Dirk Wilden's avatar
Dirk Wilden committed
539 540
  //set new parent
  obj->setParent( parent );
Dirk Wilden's avatar
Dirk Wilden committed
541

Dirk Wilden's avatar
Dirk Wilden committed
542 543 544
  //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
545 546 547
}


548 549
//******************************************************************************

550
void DataControlPlugin::slotShowLightSources( bool _state ) {
551 552

    int rows = model_->rowCount();
553

554 555 556
    for(int i = 0; i < rows; ++i) {
        TreeItem* item = model_->getItem(model_->index(i,0));
        if(item->dataType() == DATA_LIGHT) {
557
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), !_state);
558 559 560
        }else{
          //always show, if it is not a light
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), false);
561 562 563 564
        }
    }
}

565 566 567

void DataControlPlugin::slotShowLightSources()
{
568
  slotShowLightSources( tool_->lightSources->isChecked() );
569
}
Dirk Wilden's avatar
Dirk Wilden committed
570 571 572
//******************************************************************************

/** \brief Load Groups from ini file
573
 *
Dirk Wilden's avatar
Dirk Wilden committed
574 575
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
576
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
577

578
  if ( _ini.section_exists( "BoundingBox" ) && OpenFlipper::Options::gui() )
579 580 581 582 583 584 585 586 587 588
  {
    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);
  }

589
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
590
    return;
591

Jan Möbius's avatar
 
Jan Möbius committed
592 593
  // Names of all groups
  QStringList groupNames;
594

Jan Möbius's avatar
 
Jan Möbius committed
595 596
  // names of the primary groups
  QStringList rootGroup;
597

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

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

Dirk Wilden's avatar
Dirk Wilden committed
604 605 606
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
607 608 609 610
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
611

Jan Möbius's avatar
 
Jan Möbius committed
612 613
    QStringList groupChildren;
    QStringList elementChildren;
614

Jan Möbius's avatar
 
Jan Möbius committed
615 616
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
617

Jan Möbius's avatar
 
Jan Möbius committed
618 619 620 621 622 623
    // 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 )
624 625 626 627 628 629
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

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

Jan Möbius's avatar
 
Jan Möbius committed
633 634
    // group does not exist
    if ( !group ) {
635

636 637
      int groupId = addEmptyGroup(current, parentItem->id());
      PluginFunctions::getObject(groupId, group);
Dirk Wilden's avatar
Dirk Wilden committed
638 639 640 641 642 643 644 645

      // 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
646
    }
647

Jan Möbius's avatar
 
Jan Möbius committed
648 649 650 651 652 653 654 655 656 657
    // 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
658 659 660 661

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

/** \brief Save groups to ini file
662
 *
Dirk Wilden's avatar
Dirk Wilden committed
663 664
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
665
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
666

Jan Möbius's avatar
 
Jan Möbius committed
667 668
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
669

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

Jan Möbius's avatar
 
Jan Möbius committed
672
  // Get all groups from the tree
Jan Möbius's avatar
Jan Möbius committed
673
  while ( ! children.empty() ) {
Jan Möbius's avatar
 
Jan Möbius committed
674 675
    BaseObject* item = children.front();
    children.pop();
676 677 678 679 680

    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
681 682 683
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
684

Jan Möbius's avatar
 
Jan Möbius committed
685 686
  // Names of all groups
  QStringList groupNames;
687

Jan Möbius's avatar
 
Jan Möbius committed
688 689
  // names of the primary groups
  QStringList rootGroup;
690

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
703 704 705 706 707 708 709 710 711
    // 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() );
    }
712

Jan Möbius's avatar
 
Jan Möbius committed
713 714 715
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
716

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

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

723 724 725 726 727 728
  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 ());
  }
729

Jan Möbius's avatar
 
Jan Möbius committed
730 731 732
}


Dirk Wilden's avatar
Dirk Wilden committed
733 734 735
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
736
 *
Jan Möbius's avatar
Jan Möbius committed
737 738
 * @param _obj    Object to start with
 * @param _column Column to propagate
Dirk Wilden's avatar
Dirk Wilden committed
739 740 741
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

742
  
Dirk Wilden's avatar
Dirk Wilden committed
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
  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;

764
    case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
765 766 767 768 769 770 771 772 773

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

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

776 777 778 779 780 781 782 783
    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
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799
        changed = true;
      }

      break;

    default:
      break;
  }

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

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

/** \brief Recursively update a column up to the root of the tree
800
 *
Jan Möbius's avatar
Jan Möbius committed
801 802
 * @param _obj    object to start with
 * @param _column Column to be propagated
Dirk Wilden's avatar
Dirk Wilden committed
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
 */
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;

820
      case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
821 822 823 824

        if ( current->source() != _obj->source() ){
          current->source( _obj->source() );
        }
825 826 827
        break;

      case 3: //TARGET
Dirk Wilden's avatar
Dirk Wilden committed
828 829 830 831 832 833 834 835 836 837 838

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

        break;

      default:
        break;
    }

839
    if ( current->isGroup() ){
Dirk Wilden's avatar
Dirk Wilden committed
840 841 842 843 844 845
      propagateDownwards(current, _column);

    }
  }
}

846 847 848 849 850 851 852 853 854 855 856 857 858 859 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
//******************************************************************************

/** \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){
894 895 896
  _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
  _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
  _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
897 898
}

Jan Möbius's avatar
Jan Möbius committed
899
void DataControlPlugin::showReducedUi(bool reduced) {
900 901
    if (advancedSettingsBtn_)
        advancedSettingsBtn_->setVisible(reduced);
Jan Möbius's avatar
Jan Möbius committed
902
}
Dirk Wilden's avatar
Dirk Wilden committed
903

904 905 906 907 908 909 910 911
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) )
912
  {
913
    updateBoundingBox (obj);
914 915
    model_->objectChanged(obj->id());
  }
916 917
}

Matthias Möller's avatar
Matthias Möller committed
918
#if QT_VERSION < 0x050000
Jan Möbius's avatar
 
Jan Möbius committed
919
Q_EXPORT_PLUGIN2( datacontrolplugin , DataControlPlugin );
Matthias Möller's avatar
Matthias Möller committed
920
#endif
Jan Möbius's avatar
 
Jan Möbius committed
921