DataControlPlugin.cc 25 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);

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

Jan Möbius's avatar
Jan Möbius committed
77 78 79 80 81 82 83 84 85 86 87 88 89


DataControlPlugin::DataControlPlugin() :
        tool_(0),
        toolIcon_(0),
        MeshDialogLayout_(0),
        objectList_(0),
        locked(false),
        model_(0),
        view_(0),
        viewHeader_(0),
        onlyDown_(0),
        onlyUp_(0),
90
        columnFromGUI_(-1),
Jan Möbius's avatar
Jan Möbius committed
91 92 93 94 95 96 97 98 99
        headerPopupType_(0),
        targetAction_(0),
        sourceAction_(0),
        removeAction_(0)
{

}


Dirk Wilden's avatar
Dirk Wilden committed
100
/** \brief Plugin initialization
101
 *
Dirk Wilden's avatar
Dirk Wilden committed
102
 */
Jan Möbius's avatar
 
Jan Möbius committed
103
void DataControlPlugin::pluginsInitialized() {
104

Jan Möbius's avatar
 
Jan Möbius committed
105 106 107
  //set the slot descriptions
  setDescriptions();

108 109 110
  if ( ! OpenFlipper::Options::gui())
    return;

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

Jan Möbius's avatar
 
Jan Möbius committed
113
  //Target Objects
Dirk Wilden's avatar
 
Dirk Wilden committed
114 115
  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
116 117 118
  hideAction->setStatusTip(tr("Hide object"));
  connect(hideAction, SIGNAL(triggered()), this, SLOT(slotContextMenuHide()) );
  contextMenu->addAction(hideAction);
119

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

Jan Möbius's avatar
 
Jan Möbius committed
128
  //Source Objects
Dirk Wilden's avatar
 
Dirk Wilden committed
129 130
  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
131 132 133
  sourceAction_->setCheckable(true);
  sourceAction_->setStatusTip(tr("Set object as source"));
  connect(sourceAction_, SIGNAL(triggered()), this, SLOT(slotContextMenuSource()) );
134 135
  contextMenu->addAction(sourceAction_);

Dirk Wilden's avatar
 
Dirk Wilden committed
136 137 138 139 140 141 142 143 144 145
  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
146
  emit addContextMenuItem(contextMenu->menuAction() , DATA_ALL , CONTEXTOBJECTMENU);
147

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

153 154 155 156
  QAction* copyMaterial = new QAction(tr("Copy Material Properties to Targeted Objects"), 0);
  connect (copyMaterial, SIGNAL( triggered() ), this, SLOT ( slotCopyMaterialToTargeted() ));
  emit addContextMenuItem(copyMaterial , DATA_ALL , CONTEXTOBJECTMENU);

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

Dirk Wilden's avatar
Dirk Wilden committed
165 166 167

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

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

183
  tool_->treeView->setModel(model_);
184

185 186 187
  view_->QTreeView::resizeColumnToContents(1);
  view_->QTreeView::resizeColumnToContents(2);
  view_->QTreeView::resizeColumnToContents(3);
188

189

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

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

196 197
  connect( view_,SIGNAL(customContextMenuRequested ( const QPoint &  )  ),
      this,SLOT(slotCustomContextMenuRequested ( const QPoint & ) ));
198

199 200 201 202 203 204
  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 ( ) ));
205 206


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

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

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

216
  emit addToolbox("Data Control", tool_, toolIcon_);
217

218 219 220 221 222 223 224 225
  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
226 227 228
}


Dirk Wilden's avatar
Dirk Wilden committed
229
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
230

Dirk Wilden's avatar
Dirk Wilden committed
231
/** \brief update drawing of objects when the active object changed
232
 *
Dirk Wilden's avatar
Dirk Wilden committed
233 234 235
 */
void DataControlPlugin::slotObjectSelectionChanged( int _identifier )
{
236 237 238
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
239 240
  BaseObjectData* obj = 0;

241
  if ( PluginFunctions::getObject( _identifier, obj) )
242 243
    updateBoundingBox (obj);

Dirk Wilden's avatar
Dirk Wilden committed
244
  BaseObject* object = 0;
245 246
  if ( !PluginFunctions::getObject( _identifier, object) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
247

248 249 250 251 252 253 254
  //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;
255

256 257 258 259 260 261 262
    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
  }
263

Dirk Wilden's avatar
Dirk Wilden committed
264

265
  model_->objectChanged( _identifier );
266

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

270
    onlyDown_++;
271

272 273
    if ( object->isGroup() )
      propagateDownwards(object, column); // 2: source 3: target
274

275 276
    onlyDown_--;
  }
277

278 279
  // if we are allowed to propagate up
  if ( onlyDown_ == 0 ){
Dirk Wilden's avatar
Dirk Wilden committed
280

281 282 283 284 285
    onlyUp_++;

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

    onlyUp_--;
286
  }
Dirk Wilden's avatar
Dirk Wilden committed
287 288 289 290 291 292
}


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

/** \brief Update the model if the visibility of an object changed
293
 *
Dirk Wilden's avatar
Dirk Wilden committed
294 295
 * @param _identifier id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
296
void DataControlPlugin::slotVisibilityChanged( int _identifier ){
297

298 299 300
  if ( ! OpenFlipper::Options::gui())
    return;

301 302 303 304 305 306
  // 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
307 308 309 310 311 312

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

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

313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
    // 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
334 335
  }

336 337 338 339 340
  BaseObjectData* object = 0;

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

Jan Möbius's avatar
 
Jan Möbius committed
341 342 343
}


Dirk Wilden's avatar
Dirk Wilden committed
344
//******************************************************************************
Jan Möbius's avatar
 
Jan Möbius committed
345

Dirk Wilden's avatar
Dirk Wilden committed
346
/** \brief Update the model if properties of an object changed
347
 *
Dirk Wilden's avatar
Dirk Wilden committed
348
 * @param _identifier id of an object
Dirk Wilden's avatar
Dirk Wilden committed
349
 */
Dirk Wilden's avatar
Dirk Wilden committed
350
void DataControlPlugin::slotObjectPropertiesChanged( int _identifier ){
351 352 353 354

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

Dirk Wilden's avatar
Dirk Wilden committed
355 356
  model_->objectChanged( _identifier );
}
Jan Möbius's avatar
 
Jan Möbius committed
357

Dirk Wilden's avatar
Dirk Wilden committed
358

Dirk Wilden's avatar
Dirk Wilden committed
359 360 361
//******************************************************************************

/** \brief Update the model if a file has been opened
362
 *
Dirk Wilden's avatar
Dirk Wilden committed
363 364
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
365 366
void DataControlPlugin::fileOpened(int _id){

367 368 369
  if ( ! OpenFlipper::Options::gui())
    return;

Dirk Wilden's avatar
Dirk Wilden committed
370 371 372 373
  BaseObject* obj = 0;

  if ( PluginFunctions::getObject(_id, obj) )
    model_->objectAdded(obj);
374 375 376 377 378

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

Dirk Wilden's avatar
Dirk Wilden committed
379
  view_->resizeColumnToContents(0);
Dirk Wilden's avatar
Dirk Wilden committed
380 381 382 383 384 385
}


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

/** \brief Update the model if an empty object has been added
386
 *
Dirk Wilden's avatar
Dirk Wilden committed
387 388
 * @param _id id of an object
 */
Dirk Wilden's avatar
Dirk Wilden committed
389 390 391 392 393 394 395
void DataControlPlugin::addedEmptyObject(int _id){
  fileOpened(_id);
}

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

/** \brief an object was deleted. delete it internally
396
 *
Dirk Wilden's avatar
Dirk Wilden committed
397 398 399
 * @param _id id of the object
 */
void DataControlPlugin::objectDeleted(int _id){
400 401 402 403

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

Dirk Wilden's avatar
Dirk Wilden committed
404
  model_->objectDeleted(_id);
Jan Möbius's avatar
 
Jan Möbius committed
405 406
}

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

/** \brief a key event occurred
410
 *
Dirk Wilden's avatar
Dirk Wilden committed
411 412
 * @param _event the event that occurred
 */
Jan Möbius's avatar
 
Jan Möbius committed
413 414 415 416 417
void DataControlPlugin::slotKeyEvent( QKeyEvent* _event )
{

  if ( _event->modifiers() == Qt::ControlModifier ) {
    switch (_event->key()) {
418
      case Qt::Key_A :
Jan Möbius's avatar
 
Jan Möbius committed
419 420 421 422 423 424
          setAllTarget();
        return;
      default:
        return;
    }
  }
425

426 427 428 429 430 431 432
  switch (_event->key()) {
    case Qt::Key_Delete :
        slotPopupRemove();
      return;
    default:
      return;
  }
433

Jan Möbius's avatar
 
Jan Möbius committed
434 435
}

Dirk Wilden's avatar
Dirk Wilden committed
436 437 438 439

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

/** \brief emit the right updates when the model changed
440
 *
Jan Möbius's avatar
Jan Möbius committed
441 442 443
 * @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
444
 */
Dirk Wilden's avatar
Dirk Wilden committed
445
void DataControlPlugin::slotDataChanged ( int _id, int _column, const QVariant& _value)
Jan Möbius's avatar
 
Jan Möbius committed
446
{
447

Dirk Wilden's avatar
Dirk Wilden committed
448 449 450 451
  //get the corresponding baseObject
  BaseObject* obj = 0;
  if ( !PluginFunctions::getObject( _id, obj) )
    return;
452
  
Dirk Wilden's avatar
Dirk Wilden committed
453 454 455 456 457 458 459 460 461 462 463 464 465
  switch ( _column ) {
    // Name
    case 0:
      obj->setName( _value.toString() );
      break;

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

    // source
    case 2:
466
      columnFromGUI_ = 2;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
467
      obj->source( _value.toBool() );
468
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
469 470 471 472
      break;

    // target
    case 3:
473
      columnFromGUI_ = 3;//set information, which information will be changed
Dirk Wilden's avatar
Dirk Wilden committed
474
      obj->target( _value.toBool() );
475
      columnFromGUI_ = -1;
Dirk Wilden's avatar
Dirk Wilden committed
476
      break;
Dirk Wilden's avatar
Dirk Wilden committed
477

Dirk Wilden's avatar
Dirk Wilden committed
478 479
    default:
      break;
Jan Möbius's avatar
 
Jan Möbius committed
480 481 482
  }
}

Dirk Wilden's avatar
Dirk Wilden committed
483 484 485

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

Dirk Wilden's avatar
Dirk Wilden committed
486
/** \brief Gets called when an object was moved via drag n drop
487
 *
Jan Möbius's avatar
Jan Möbius committed
488 489
 * @param _id          id of the object
 * @param _newParentId id of the new parent
Dirk Wilden's avatar
Dirk Wilden committed
490
 */
Dirk Wilden's avatar
Dirk Wilden committed
491
void DataControlPlugin::slotMoveBaseObject(int _id, int _newParentId){
Dirk Wilden's avatar
Dirk Wilden committed
492

Dirk Wilden's avatar
Dirk Wilden committed
493
  BaseObject* obj = 0;
Dirk Wilden's avatar
Dirk Wilden committed
494

Dirk Wilden's avatar
Dirk Wilden committed
495 496
  if ( !PluginFunctions::getObject(_id, obj) )
    return;
Jan Möbius's avatar
 
Jan Möbius committed
497

Dirk Wilden's avatar
Dirk Wilden committed
498
  BaseObject* parent = 0;
Dirk Wilden's avatar
Dirk Wilden committed
499

Dirk Wilden's avatar
Dirk Wilden committed
500 501
  if ( !PluginFunctions::getObject(_newParentId, parent) )
    return;
Dirk Wilden's avatar
Dirk Wilden committed
502

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

Dirk Wilden's avatar
Dirk Wilden committed
505 506
  //set new parent
  obj->setParent( parent );
Dirk Wilden's avatar
Dirk Wilden committed
507

Dirk Wilden's avatar
Dirk Wilden committed
508 509 510
  //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
511 512 513
}


514 515 516 517 518
//******************************************************************************

void DataControlPlugin::slotShowLightSources( int _state ) {

    int rows = model_->rowCount();
519

520 521 522
    for(int i = 0; i < rows; ++i) {
        TreeItem* item = model_->getItem(model_->index(i,0));
        if(item->dataType() == DATA_LIGHT) {
523 524 525 526
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), !(_state == Qt::Checked));
        }else{
          //always show, if it is not a light
          view_->setRowHidden(i, model_->parent(model_->index(i,0)), false);
527 528 529 530
        }
    }
}

531 532 533 534 535

void DataControlPlugin::slotShowLightSources()
{
  slotShowLightSources( tool_->lightSources->checkState() );
}
Dirk Wilden's avatar
Dirk Wilden committed
536 537 538
//******************************************************************************

/** \brief Load Groups from ini file
539
 *
Dirk Wilden's avatar
Dirk Wilden committed
540 541
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
542
void DataControlPlugin::loadIniFileOptionsLast( INIFile& _ini ) {
543

544
  if ( _ini.section_exists( "BoundingBox" ) && OpenFlipper::Options::gui() )
545 546 547 548 549 550 551 552 553 554
  {
    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);
  }

555
  if ( !_ini.section_exists( "Groups" ) )
Jan Möbius's avatar
 
Jan Möbius committed
556
    return;
557

Jan Möbius's avatar
 
Jan Möbius committed
558 559
  // Names of all groups
  QStringList groupNames;
560

Jan Möbius's avatar
 
Jan Möbius committed
561 562
  // names of the primary groups
  QStringList rootGroup;
563

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

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

Dirk Wilden's avatar
Dirk Wilden committed
570 571 572
  //list of groups
  QVector< BaseObject* > groups;

Jan Möbius's avatar
 
Jan Möbius committed
573 574 575 576
  // Go over one level of the groups
  while ( rootGroup.size() > 0 ) {
    QString current = rootGroup[0];
    rootGroup.removeFirst();
577

Jan Möbius's avatar
 
Jan Möbius committed
578 579
    QStringList groupChildren;
    QStringList elementChildren;
580

Jan Möbius's avatar
 
Jan Möbius committed
581 582
    _ini.get_entry(elementChildren ,current,"children");
    _ini.get_entry(groupChildren ,current,"subgroups");
583

Jan Möbius's avatar
 
Jan Möbius committed
584 585 586 587 588 589
    // 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 )
590 591 592 593 594 595
        parentItem = PluginFunctions::objectRoot();
    } else
      parentItem = PluginFunctions::objectRoot();

    rootGroup << groupChildren;

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

Jan Möbius's avatar
 
Jan Möbius committed
599 600
    // group does not exist
    if ( !group ) {
601

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

Dirk Wilden's avatar
Dirk Wilden committed
604 605 606 607 608 609 610 611 612
      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
613
    }
614

Jan Möbius's avatar
 
Jan Möbius committed
615 616 617 618 619 620 621 622 623 624
    // 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
625 626 627 628

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

/** \brief Save groups to ini file
629
 *
Dirk Wilden's avatar
Dirk Wilden committed
630 631
 * @param _ini an ini file
 */
Jan Möbius's avatar
 
Jan Möbius committed
632
void DataControlPlugin::saveIniFileOptions( INIFile& _ini ) {
633

Jan Möbius's avatar
 
Jan Möbius committed
634 635
  std::queue< BaseObject* > children;
  children.push( PluginFunctions::objectRoot() );
636

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

Jan Möbius's avatar
 
Jan Möbius committed
639
  // Get all groups from the tree
Jan Möbius's avatar
Jan Möbius committed
640
  while ( ! children.empty() ) {
Jan Möbius's avatar
 
Jan Möbius committed
641 642
    BaseObject* item = children.front();
    children.pop();
643 644 645 646 647

    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
648 649 650
    if ( item->dataType(DATA_GROUP) && (item != PluginFunctions::objectRoot() ) )
      groups.push_back(item);
  }
651

Jan Möbius's avatar
 
Jan Möbius committed
652 653
  // Names of all groups
  QStringList groupNames;
654

Jan Möbius's avatar
 
Jan Möbius committed
655 656
  // names of the primary groups
  QStringList rootGroup;
657

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
670 671 672 673 674 675 676 677 678
    // 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() );
    }
679

Jan Möbius's avatar
 
Jan Möbius committed
680 681 682
    _ini.add_entry(groups[i]->name(),"subgroups",groupchildren);
    _ini.add_entry(groups[i]->name(),"children",elementchildren);
  }
683

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

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

690 691 692 693 694 695
  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 ());
  }
696

Jan Möbius's avatar
 
Jan Möbius committed
697 698 699
}


Dirk Wilden's avatar
Dirk Wilden committed
700 701 702
//******************************************************************************

/** \brief Recursively update a column up to the root of the tree
703
 *
Jan Möbius's avatar
Jan Möbius committed
704 705
 * @param _obj    Object to start with
 * @param _column Column to propagate
Dirk Wilden's avatar
Dirk Wilden committed
706 707 708
 */
void DataControlPlugin::propagateUpwards(BaseObject* _obj, int _column ){

709
  
Dirk Wilden's avatar
Dirk Wilden committed
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;


  switch ( _column ){

    case 1: //VISIBILTY

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

      _obj->visible( value );

      changed = true;

      break;

731
    case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
732 733 734 735 736 737 738 739 740

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

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

743 744 745 746 747 748 749 750
    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
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
        changed = true;
      }

      break;

    default:
      break;
  }

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

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

/** \brief Recursively update a column up to the root of the tree
767
 *
Jan Möbius's avatar
Jan Möbius committed
768 769
 * @param _obj    object to start with
 * @param _column Column to be propagated
Dirk Wilden's avatar
Dirk Wilden committed
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
 */
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;

787
      case 2: //SOURCE
Dirk Wilden's avatar
Dirk Wilden committed
788 789 790 791

        if ( current->source() != _obj->source() ){
          current->source( _obj->source() );
        }
792 793 794
        break;

      case 3: //TARGET
Dirk Wilden's avatar
Dirk Wilden committed
795 796 797 798 799 800 801 802 803 804 805

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

        break;

      default:
        break;
    }

806
    if ( current->isGroup() ){
Dirk Wilden's avatar
Dirk Wilden committed
807 808 809 810 811 812
      propagateDownwards(current, _column);

    }
  }
}

813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
//******************************************************************************

/** \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){
861 862 863
  _ini.add_entry("BoundingBox","notSelected",tool_->notSelected->isChecked ());
  _ini.add_entry("BoundingBox","sourceSelected",tool_->sourceSelected->isChecked ());
  _ini.add_entry("BoundingBox","targetSelected",tool_->targetSelected->isChecked ());
864 865
}

Dirk Wilden's avatar
Dirk Wilden committed
866

Jan Möbius's avatar
 
Jan Möbius committed
867 868
Q_EXPORT_PLUGIN2( datacontrolplugin , DataControlPlugin );