DataControlPlugin.cc 20.5 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  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.
15
//
Jan Möbius's avatar
 
Jan Möbius committed
16 17 18 19
//  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.
20
//
Jan Möbius's avatar
 
Jan Möbius committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================





#include <QtGui>

#include "DataControlPlugin.hh"

#include <QLayout>
41
#include <QGridLayout>
Jan Möbius's avatar
 
Jan Möbius committed
42
#include <QItemSelectionModel>
43

Jan Möbius's avatar
 
Jan Möbius committed
44 45 46 47
#include <iostream>
#include <ACG/GL/GLState.hh>
#include <QStringList>
#include <ACG/Scenegraph/BaseNode.hh>
Dirk Wilden's avatar
Dirk Wilden committed
48
#include <ACG/QtWidgets/QtMaterialDialog.hh>
Jan Möbius's avatar
 
Jan Möbius committed
49 50 51 52 53
#include <QModelIndexList>

#include <queue>

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

Dirk Wilden's avatar
Dirk Wilden committed
56
//******************************************************************************
Dirk Wilden's avatar
Dirk Wilden committed
57

58 59 60 61 62 63
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
64
/** \brief Plugin initialization
65
 *
Dirk Wilden's avatar
Dirk Wilden committed
66
 */
Jan Möbius's avatar
 
Jan Möbius committed
67
void DataControlPlugin::pluginsInitialized() {
68

Jan Möbius's avatar
 
Jan Möbius committed
69 70 71
  //set the slot descriptions
  setDescriptions();

Jan Möbius's avatar
 
Jan Möbius committed
72
  QMenu* contextMenu = new QMenu("Object selection");
73

Jan Möbius's avatar
 
Jan Möbius committed
74 75 76 77 78
  //Target Objects
  QAction* hideAction = new QAction(tr("&Hide"), this);
  hideAction->setStatusTip(tr("Hide object"));
  connect(hideAction, SIGNAL(triggered()), this, SLOT(slotContextMenuHide()) );
  contextMenu->addAction(hideAction);
79

Jan Möbius's avatar
 
Jan Möbius committed
80 81 82 83 84 85
  //Target Objects
  targetAction_ = new QAction(tr("&target"), this);
  targetAction_->setCheckable(true);
  targetAction_->setStatusTip(tr("Set object as target"));
  connect(targetAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuTarget()) );
  contextMenu->addAction(targetAction_);
86

Jan Möbius's avatar
 
Jan Möbius committed
87 88 89 90 91
  //Source Objects
  sourceAction_ = new QAction(tr("&source"), this);
  sourceAction_->setCheckable(true);
  sourceAction_->setStatusTip(tr("Set object as source"));
  connect(sourceAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuSource()) );
92 93
  contextMenu->addAction(sourceAction_);

Jan Möbius's avatar
 
Jan Möbius committed
94
  emit addContextMenuItem(contextMenu->menuAction() , DATA_ALL , CONTEXTOBJECTMENU);
95

96 97 98 99 100
  QIcon icon = QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"datacontrol-material.png");
  QAction* material = new QAction(icon, "Material Properties", 0);
  connect (material, SIGNAL( triggered() ), this, SLOT ( slotMaterialProperties() ));

  emit addContextMenuItem(material , DATA_ALL , CONTEXTOBJECTMENU);
Jan Möbius's avatar
 
Jan Möbius committed
101 102
}

Dirk Wilden's avatar
Dirk Wilden committed
103 104 105 106

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

/** \brief initialize the toolBox
107
 *
Dirk Wilden's avatar
Dirk Wilden committed
108 109 110
 * @param _widget a reference to the toolBox
 * @return returns if the toolbox was created successfully
 */
Jan Möbius's avatar
 
Jan Möbius committed
111 112 113
bool DataControlPlugin::initializeToolbox(QWidget*& _widget)
{
   locked = false;
114 115 116
   tool_ = new DatacontrolToolboxWidget();
   connect( tool_ , SIGNAL( keyEvent( QKeyEvent* ) ),
            this  , SLOT(slotKeyEvent ( QKeyEvent* ) ));
Jan Möbius's avatar
 
Jan Möbius committed
117 118
   _widget = tool_;
   QSize size(300, 300);
119 120
   tool_->resize(size);

Jan Möbius's avatar
 
Jan Möbius committed
121
   model_ = new TreeModel( );
122

123
   view_ = tool_->treeView;
124

125
   tool_->treeView->setModel(model_);
126

Jan Möbius's avatar
 
Jan Möbius committed
127 128 129
   view_->QTreeView::resizeColumnToContents(1);
   view_->QTreeView::resizeColumnToContents(2);
   view_->QTreeView::resizeColumnToContents(3);
130

Dirk Wilden's avatar
Dirk Wilden committed
131

Dirk Wilden's avatar
Dirk Wilden committed
132 133
   connect( model_,SIGNAL(dataChangedInside(int,int,const QVariant&) ),
            this,  SLOT(    slotDataChanged(int,int,const QVariant&)) );
134

Dirk Wilden's avatar
Dirk Wilden committed
135 136
   connect( model_,SIGNAL(   moveBaseObject(int,int) ),
            this,  SLOT( slotMoveBaseObject(int,int) ) );
137

Jan Möbius's avatar
 
Jan Möbius committed
138 139
   connect( view_,SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
            this,SLOT(slotCustomContextMenuRequested ( const QPoint & ) ));
140

141 142 143 144 145 146
   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 ( ) ));
147

148

149
   viewHeader_ = tool_->treeView->header();
Jan Möbius's avatar
 
Jan Möbius committed
150
   viewHeader_->setContextMenuPolicy(Qt::CustomContextMenu);
151

Jan Möbius's avatar
 
Jan Möbius committed
152 153 154
   // connect the slot for the context menu
   connect( viewHeader_, SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
            this,        SLOT(slotHeaderCustomContextMenuRequested ( const QPoint & ) ));
155

Jan Möbius's avatar
 
Jan Möbius committed
156 157 158 159
   return true;
}


Dirk Wilden's avatar
Dirk Wilden committed
160
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
161

Dirk Wilden's avatar
Dirk Wilden committed
162
/** \brief update drawing of objects when the active object changed
163
 *
Dirk Wilden's avatar
Dirk Wilden committed
164 165 166 167 168 169 170 171
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{

  BaseObjectData* obj = 0;

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

172 173
    updateBoundingBox (obj);

Dirk Wilden's avatar
Dirk Wilden committed
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
    if ( obj->target() ) {
      obj->materialNode()->disable_blending();
      OpenMesh::Vec4f base_color = obj->materialNode()->base_color();
      base_color[3] = 1.0;
      obj->materialNode()->set_base_color(base_color);
      OpenMesh::Vec4f ambient_color = obj->materialNode()->ambient_color();
      ambient_color[3] = 1.0;
      obj->materialNode()->set_ambient_color(ambient_color);
      OpenMesh::Vec4f diffuse_color = obj->materialNode()->diffuse_color();
      diffuse_color[3] = 1.0;
      obj->materialNode()->set_diffuse_color(diffuse_color);
    }  else {
      obj->materialNode()->enable_blending();
      OpenMesh::Vec4f base_color = obj->materialNode()->base_color();
      base_color[3] = 0.4;
      obj->materialNode()->set_base_color(base_color);
      OpenMesh::Vec4f ambient_color = obj->materialNode()->ambient_color();
      ambient_color[3] = 0.4;
      obj->materialNode()->set_ambient_color(ambient_color);
      OpenMesh::Vec4f diffuse_color = obj->materialNode()->diffuse_color();
      diffuse_color[3] = 0.4;
      obj->materialNode()->set_diffuse_color(diffuse_color);
    }
  }

  model_->objectChanged( _identifier );

Dirk Wilden's avatar
Dirk Wilden committed
201 202 203 204 205 206 207 208 209 210
  //check for changes in the tree
  BaseObject* object = 0;

  if ( PluginFunctions::getObject( _identifier, object) ){
    propagateUpwards(object->parent(), 2); // 2 = source-target

    if ( object->isGroup() )
      propagateDownwards(object, 2); // 2 = source-target
  }

Dirk Wilden's avatar
Dirk Wilden committed
211 212 213 214 215 216 217
  emit updateView();
}


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

/** \brief Update the model if the visibility of an object changed
218
 *
Dirk Wilden's avatar
Dirk Wilden committed
219 220
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
221
void DataControlPlugin::slotVisibilityChanged( int _identifier ){
Dirk Wilden's avatar
Dirk Wilden committed
222
  //inform the model
Dirk Wilden's avatar
Dirk Wilden committed
223
  model_->objectChanged( _identifier );
Dirk Wilden's avatar
Dirk Wilden committed
224 225 226 227 228 229 230 231 232 233 234

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

  if ( PluginFunctions::getObject( _identifier, obj) ){
    propagateUpwards(obj->parent(), 1); // 1 = visibilty

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

235 236 237 238 239
  BaseObjectData* object = 0;

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

Jan Möbius's avatar
 
Jan Möbius committed
240 241 242
}


Dirk Wilden's avatar
Dirk Wilden committed
243
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
244

Dirk Wilden's avatar
Dirk Wilden committed
245
/** \brief Update the model if properties of an object changed
246
 *
Dirk Wilden's avatar
Dirk Wilden committed
247
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
248
 */
Dirk Wilden's avatar
Dirk Wilden committed
249 250 251
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
252

Dirk Wilden's avatar
Dirk Wilden committed
253 254 255

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

256
/** \brief Update the model if an object was deleted
257
 *
Dirk Wilden's avatar
Dirk Wilden committed
258 259 260 261
 * @param _identifier id of an object
 */
void DataControlPlugin::slotObjectUpdated( int _identifier ){

Dirk Wilden's avatar
Dirk Wilden committed
262
}
Dirk Wilden's avatar
Dirk Wilden committed
263

264

Dirk Wilden's avatar
Dirk Wilden committed
265 266 267
//******************************************************************************

/** \brief Update the model if a file has been opened
268
 *
Dirk Wilden's avatar
Dirk Wilden committed
269 270
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
271 272 273 274 275 276
void DataControlPlugin::fileOpened(int _id){

  BaseObject* obj = 0;

  if ( PluginFunctions::getObject(_id, obj) )
    model_->objectAdded(obj);
Dirk Wilden's avatar
Dirk Wilden committed
277 278 279 280 281 282
}


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

/** \brief Update the model if an empty object has been added
283
 *
Dirk Wilden's avatar
Dirk Wilden committed
284 285
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
286 287 288 289 290 291 292
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

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

/** \brief an object was deleted. delete it internally
293
 *
Dirk Wilden's avatar
Dirk Wilden committed
294 295 296 297
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
298 299
}

Dirk Wilden's avatar
Dirk Wilden committed
300 301 302
//******************************************************************************

/** \brief a key event occurred
303
 *
Dirk Wilden's avatar
Dirk Wilden committed
304 305
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
306 307 308 309 310
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
311
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
312 313 314 315 316 317
          setAllTarget();
        return;
      default:
        return;
    }
  }
318

319 320 321 322 323 324 325
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
326

Jan Möbius's avatar
 
Jan Möbius committed
327 328
}

Dirk Wilden's avatar
Dirk Wilden committed
329 330 331 332

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

/** \brief emit the right updates when the model changed
333
 *
Dirk Wilden's avatar
Dirk Wilden committed
334
 * @param topLeft index in the model
Dirk Wilden's avatar
Dirk Wilden committed
335
 * @param _column hmm
Dirk Wilden's avatar
Dirk Wilden committed
336
 */
Dirk Wilden's avatar
Dirk Wilden committed
337
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
338
{
339

Dirk Wilden's avatar
Dirk Wilden committed
340 341 342 343
  //get the corresponding baseObject
  BaseObject* obj = 0;
  if ( !PluginFunctions::getObject( _id, obj) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
344

Dirk Wilden's avatar
Dirk Wilden committed
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
  switch ( _column ) {
    // Name
    case 0:
      obj->setName( _value.toString() );
      emit objectPropertiesChanged( obj->id() );
      break;

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

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

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

Dirk Wilden's avatar
Dirk Wilden committed
370 371
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
372 373 374
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
375 376 377

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

Dirk Wilden's avatar
Dirk Wilden committed
378
/** \brief Gets called when an object was moved via drag n drop
379
 *
Dirk Wilden's avatar
Dirk Wilden committed
380 381
 * @param _id id of the object
 * @param _parentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
382
 */
Dirk Wilden's avatar
Dirk Wilden committed
383
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
384

Dirk Wilden's avatar
Dirk Wilden committed
385
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
386

Dirk Wilden's avatar
Dirk Wilden committed
387 388
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
389

Dirk Wilden's avatar
Dirk Wilden committed
390
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
391

Dirk Wilden's avatar
Dirk Wilden committed
392 393
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
394

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

Dirk Wilden's avatar
Dirk Wilden committed
397 398
  //remove from old parent
  oldParent->removeChild( obj );
Dirk Wilden's avatar
Dirk Wilden committed
399

Dirk Wilden's avatar
Dirk Wilden committed
400 401 402
  //set new parent
  obj->setParent( parent );
  parent->appendChild( obj );
Dirk Wilden's avatar
Dirk Wilden committed
403

Dirk Wilden's avatar
Dirk Wilden committed
404 405
  // and inform everyone that the parent changed
  emit objectPropertiesChanged( _id );
Dirk Wilden's avatar
Dirk Wilden committed
406

Dirk Wilden's avatar
Dirk Wilden committed
407 408 409
  //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
410 411 412 413 414 415
}


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

/** \brief Load Groups from ini file
416
 *
Dirk Wilden's avatar
Dirk Wilden committed
417 418
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
419
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
420 421 422 423 424 425 426 427 428 429 430 431

  if ( _ini.section_exists( "BoundingBox" ) )
  {
    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);
  }

432
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
433
    return;
434

Jan Möbius's avatar
 
Jan Möbius committed
435 436
  // Names of all groups
  QStringList groupNames;
437

Jan Möbius's avatar
 
Jan Möbius committed
438 439
  // names of the primary groups
  QStringList rootGroup;
440

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

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

Dirk Wilden's avatar
Dirk Wilden committed
447 448 449
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
450 451 452 453
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
454

Jan Möbius's avatar
 
Jan Möbius committed
455 456
    QStringList groupChildren;
    QStringList elementChildren;
457

Jan Möbius's avatar
 
Jan Möbius committed
458 459
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
460

Jan Möbius's avatar
 
Jan Möbius committed
461 462 463 464 465 466
    // 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 )
467 468 469 470 471 472
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

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

Jan Möbius's avatar
 
Jan Möbius committed
476 477
    // group does not exist
    if ( !group ) {
478

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

Jan Möbius's avatar
 
Jan Möbius committed
481 482
      parentItem->appendChild(group);
      group->setParent(parentItem);
Dirk Wilden's avatar
Dirk Wilden committed
483 484 485 486 487 488 489 490 491 492

      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
493
    }
494

Jan Möbius's avatar
 
Jan Möbius committed
495 496 497 498 499 500 501
    // process children
    for ( int i = 0 ; i < elementChildren.size() ; ++i ) {
      BaseObject* childItem =  PluginFunctions::objectRoot()->childExists( elementChildren[i] );
      if ( childItem ) {
        childItem->parent()->removeChild(childItem);
        childItem->setParent(group);
        group->appendChild(childItem);
Dirk Wilden's avatar
Dirk Wilden committed
502 503 504

        //inform everyone that the parent changed
        emit objectPropertiesChanged( childItem->id() );
Jan Möbius's avatar
 
Jan Möbius committed
505 506 507
      }
    }
  }
508

Dirk Wilden's avatar
Dirk Wilden committed
509 510 511 512
  for (int i=0; i < groups.count(); i++){
    propagateUpwards( groups[i], 1);
    propagateUpwards( groups[i], 2);
  }
Jan Möbius's avatar
 
Jan Möbius committed
513 514
}

Dirk Wilden's avatar
Dirk Wilden committed
515 516 517 518

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

/** \brief Save groups to ini file
519
 *
Dirk Wilden's avatar
Dirk Wilden committed
520 521
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
522
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
523

524 525 526
  if ( !_ini.section_exists( "Groups" ) )
    _ini.add_section("Groups");

Jan Möbius's avatar
 
Jan Möbius committed
527 528
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
529

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

Jan Möbius's avatar
 
Jan Möbius committed
532 533 534 535
  // Get all groups from the tree
  while ( children.size() > 0 ) {
    BaseObject* item = children.front();
    children.pop();
536 537 538 539 540

    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
541 542 543
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
544

Jan Möbius's avatar
 
Jan Möbius committed
545 546
  // Names of all groups
  QStringList groupNames;
547

Jan Möbius's avatar
 
Jan Möbius committed
548 549
  // names of the primary groups
  QStringList rootGroup;
550

Jan Möbius's avatar
 
Jan Möbius committed
551
  for ( uint i = 0 ; i < groups.size() ; ++i ) {
552 553 554 555 556
    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
557
    _ini.add_entry(groups[i]->name(),"groupname",groups[i]->name());
558 559

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

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

Jan Möbius's avatar
 
Jan Möbius committed
566 567 568 569 570 571 572 573 574
    // 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() );
    }
575

Jan Möbius's avatar
 
Jan Möbius committed
576 577 578
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
579

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

Jan Möbius's avatar
 
Jan Möbius committed
583 584
  // Write the primary group names to the file
  _ini.add_entry("Groups","rootGroup",rootGroup);
585 586 587 588 589 590 591

  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 ());

Jan Möbius's avatar
 
Jan Möbius committed
592 593 594
}


Dirk Wilden's avatar
Dirk Wilden committed
595 596 597
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
598
 *
Dirk Wilden's avatar
Dirk Wilden committed
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
 * @param _obj object to start with
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

  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
655
 *
Dirk Wilden's avatar
Dirk Wilden committed
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
 * @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);

    }
  }
}

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 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
//******************************************************************************

/** \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){

}

Dirk Wilden's avatar
Dirk Wilden committed
754

Jan Möbius's avatar
 
Jan Möbius committed
755 756
Q_EXPORT_PLUGIN2( datacontrolplugin , DataControlPlugin );