DataControlPlugin.cc 24 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  OpenFlipper is free software: you can redistribute it and/or modify       *
*  it under the terms of the GNU Lesser General Public License as            *
*  published by the Free Software Foundation, either version 3 of            *
*  the License, or (at your option) any later version with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  OpenFlipper is distributed in the hope that it will be useful,            *
*  but WITHOUT ANY WARRANTY; without even the implied warranty of            *
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
*  GNU Lesser General Public License for more details.                       *
*                                                                            *
*  You should have received a copy of the GNU LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
33 34 35
\*===========================================================================*/

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





#include <QtGui>

#include "DataControlPlugin.hh"

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

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

#include <queue>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
138 139 140

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

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

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

  model_ = new TreeModel( );

  view_ = tool_->treeView;
156

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

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

163

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

      onlyUp_--;  

    }

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

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

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

303 304 305 306 307
  BaseObjectData* object = 0;

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

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


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

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
325 326 327

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

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

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

336

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
453 454 455

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

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

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

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

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

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

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

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

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


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

void DataControlPlugin::slotShowLightSources( int _state ) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    rootGroup << groupChildren;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


  switch ( _column ){

    case 1: //VISIBILTY

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

      _obj->visible( value );

      changed = true;

      break;

    case 2: //SOURCE-TARGET

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

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

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

      break;

    default:
      break;
  }

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

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

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

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

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

    bool changed = false;

    switch ( _column ){

      case 1: //VISIBILTY

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

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

          changed = true;
        }
        break;

      case 2: //SOURCE-TARGET

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

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

        break;

      default:
        break;
    }

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

    }
  }
}

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

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

  emit updateView();
}

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

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

    ACG::Vec4f color = base_color;

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

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

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

}

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

Dirk Wilden's avatar
Dirk Wilden committed
834

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