ContextMenu.cc 21.3 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.
Jan Möbius's avatar
Jan Möbius committed
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.
Jan Möbius's avatar
Jan Möbius committed
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
41
42
43
44
45
46
47
48
49
//  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$
//
//=============================================================================




//=============================================================================
//
//  CLASS CoreWidget - IMPLEMENTATION
//
//=============================================================================


//== INCLUDES =================================================================

// -------------------- mview
#include "CoreWidget.hh"

#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <OpenFlipper/common/GlobalOptions.hh>

Jan Möbius's avatar
Jan Möbius committed
50
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
51
52

void CoreWidget::slotCustomContextMenu( const QPoint& _point ) {
Jan Möbius's avatar
Jan Möbius committed
53

Jan Möbius's avatar
Jan Möbius committed
54
  QPoint   popupPosition;
Jan Möbius's avatar
Jan Möbius committed
55
  QPoint   scenePos;
Jan Möbius's avatar
Jan Möbius committed
56

Jan Möbius's avatar
Jan Möbius committed
57
58
59
60
61
62
  // Calculate popup position. Use the position from the viewer which was clicked on.
  popupPosition =  examiner_widgets_[PluginFunctions::activeExaminer()]->glMapToGlobal(_point);
  QPointF f = examiner_widgets_[PluginFunctions::activeExaminer()]->mapToScene(QPointF(_point.x(), _point.y()));
  scenePos = QPoint (f.x(), f.y());
  
  // Call function to adapt the menu to the currently used contex.
63
  updatePopupMenu(scenePos);
Jan Möbius's avatar
Jan Möbius committed
64

Jan Möbius's avatar
Jan Möbius committed
65
  // If the menu is not correctly initialized, dont try to show it.
Jan Möbius's avatar
 
Jan Möbius committed
66
  if ( !contextMenu_->isEmpty () )
Jan Möbius's avatar
Jan Möbius committed
67
68
    contextMenu_->exec( popupPosition );

Jan Möbius's avatar
 
Jan Möbius committed
69
70
}

Jan Möbius's avatar
Jan Möbius committed
71
72
73
74
75
76
77
78
79
80
81
82
83
/** \brief Update context Menu when Coordsys node has been clicked on.
 * 
 * This function is called when the coordinate system in a viewer has been clicked on.
 * This context menu will show all function relevant for the current view like the
 * projection/viewing direction...
 * 
 * @param _menu Pointer to the context Menu
 * @param _part id of the coordsys part which has been clicked on.
 */
void CoreWidget::updatePopupMenuCoordsysNode(QMenu* _menu  , const int _part) {
  std::cerr << "Coordsys part was : " << _part << std::endl;
  QAction* typeEntry = new QAction("Viewer Settings",_menu);
  _menu->addAction( typeEntry );
84
  _menu->addSeparator();
Jan Möbius's avatar
Jan Möbius committed
85
86
  
  //====================================================================================================
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
  // DrawModes
  //====================================================================================================
  slotUpdateViewerDrawMenu();
  _menu->addMenu( viewerDrawMenu_ );
  
  //====================================================================================================
  // RenderingOptions
  //====================================================================================================
  
  QMenu* renderingOptionsMenu = new QMenu("Rendering Options",_menu);
  renderingOptionsMenu->setIcon(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"renderingOptions.png"));
  _menu->addMenu(renderingOptionsMenu);
  
  QAction* projectionAction = 0;
  if ( examiner_widgets_[PluginFunctions::activeExaminer() ]->projectionMode() == glViewer::PERSPECTIVE_PROJECTION ) {
    projectionAction = new QAction( "Switch to Orthogonal Projection", renderingOptionsMenu );
    projectionAction->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"orthogonal.png") );
    projectionAction->setToolTip(   "Switch to perspective orthogonal mode.");
  } else {
    projectionAction = new QAction( "Switch to Perspective Projection", renderingOptionsMenu );
    projectionAction->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"perspective.png") );
    projectionAction->setToolTip(   "Switch to perspective projection mode.");
  }
  
  projectionAction->setCheckable( false );
  projectionAction->setToolTip(   "Switch between <b>perspective</b> and "
      "<b>parrallel</b> projection mode.");
  projectionAction->setWhatsThis( "Switch projection modes<br><br>"
      "Switch between <b>perspective</b> and "
      "<b>parrallel</b> projection mode.");
  connect( projectionAction,SIGNAL( triggered() ), this, SLOT( slotContextSwitchProjection() ) );
  renderingOptionsMenu->addAction( projectionAction );
  
  
  QAction* animation = renderingOptionsMenu->addAction("Animation");
  
  animation->setToolTip("Animate rotation of objects");
  animation->setCheckable( true );
  animation->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"animation.png") );
  animation->setChecked( PluginFunctions::viewerProperties(PluginFunctions::activeExaminer()).animation() );
  connect(animation, SIGNAL(triggered(bool)), this , SLOT( slotLocalChangeAnimation(bool) ) );
  
  
  //====================================================================================================

  QAction* backfaceCulling = renderingOptionsMenu->addAction("Backface Culling");
  backfaceCulling->setToolTip("Enable backface culling");
  backfaceCulling->setCheckable( true );
  backfaceCulling->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"backFaceCulling.png") );
  backfaceCulling->setChecked( PluginFunctions::viewerProperties().backFaceCulling() );
  connect(backfaceCulling, SIGNAL(triggered(bool)), this , SLOT( slotLocalChangeBackFaceCulling(bool) ) );

  //====================================================================================================

  QAction* twoSidedLighting = renderingOptionsMenu->addAction("Two-sided Lighting");
  twoSidedLighting->setToolTip("Enable two-sided lighting");
  twoSidedLighting->setCheckable( true );
  twoSidedLighting->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"twosidedLighting.png") );
  twoSidedLighting->setChecked( PluginFunctions::viewerProperties().twoSidedLighting() );
  connect(twoSidedLighting, SIGNAL(triggered(bool)), this , SLOT( slotLocalChangeTwoSidedLighting(bool) ) );
  
  //====================================================================================================
  // Other Toplevel Action
  //====================================================================================================
  
  _menu->addSeparator();
  
  //====================================================================================================
  
  QAction* homeAction = new QAction("Restore home view",_menu);
  homeAction->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"go-home.png") );
  homeAction->setCheckable( false );
  homeAction->setToolTip("Restore <b>home</b> view.");
  homeAction->setWhatsThis( "Restore home view<br><br>"
                            "Resets the view to the home view");
  _menu->addAction( homeAction );
  connect( homeAction,SIGNAL( triggered() ), this, SLOT( slotContextHomeView() ) );
  
  QAction* setHomeAction = new QAction( "Set Home View" , _menu );
  setHomeAction->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"set-home.png") );
  setHomeAction->setCheckable( false );
  setHomeAction->setToolTip("Set <b>home</b> view");
  setHomeAction->setWhatsThis( "Store home view<br><br>"
                               "Stores the current view as the home view");
  _menu->addAction( setHomeAction);
  connect( setHomeAction,SIGNAL( triggered() ), this, SLOT( slotContextSetHomeView() ) );  
  
  QAction* viewAllAction = new QAction( "View all", _menu );
  viewAllAction->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"viewall.png") );
  viewAllAction->setCheckable( false );
  viewAllAction->setToolTip("View all.");
  viewAllAction->setWhatsThis( "View all<br><br>"
                               "Move the objects in the scene so that"
                               " the whole scene is visible.");
  connect( viewAllAction,SIGNAL( triggered() ), this, SLOT( slotContextViewAll() ) );
  _menu->addAction( viewAllAction);
  
  
  _menu->addSeparator();
  
  //====================================================================================================
  
  QAction* copyView = _menu->addAction("Copy View");
  copyView->setToolTip("Copy current view to clipboard");
  copyView->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"copyView.png") );
  connect(copyView, SIGNAL(triggered()), this, SLOT(slotCopyView()) );

  //====================================================================================================

  QAction* pasteView = _menu->addAction("Paste View");
  pasteView->setToolTip("Paste current view from clipboard");
  pasteView->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"pasteView.png") );
  connect(pasteView, SIGNAL(triggered()), this , SLOT( slotPasteView( ) ) );
  
  //====================================================================================================
  
  QAction* snapshot = _menu->addAction("Snapshot");
  snapshot->setToolTip("Make a snapshot");
  snapshot->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"snapshot.png") );
  connect(snapshot, SIGNAL(triggered()), this, SLOT( slotSnapshot() ) );
  
  //====================================================================================================

  QAction* snapshotName = _menu->addAction("Set Snapshot Name");
  snapshotName->setToolTip("Set a name for snapshots");
  snapshotName->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"snapshotName.png") );
  connect(snapshotName, SIGNAL(triggered()), this, SLOT(slotSnapshotName()) );
    
Jan Möbius's avatar
Jan Möbius committed
215
216
  
  
217
218
}

Jan Möbius's avatar
Jan Möbius committed
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/** \brief Update context Menu when background has been clicked on.
 * 
 * This function is called when the background in a viewer has been clicked on.
 * This context menu will show functions which are related to the background of the 
 * viewer.
 * 
 * @param _menu Pointer to the context Menu
 * @param _point position in the viewer where the user clicked.
 */
void CoreWidget::updatePopupMenuBackground(QMenu* _menu , const QPoint& _point) {
  
  QAction* action = _menu->addAction("Set Background Color");
  action->setToolTip("Set the background color for the current viewer");
  action->setStatusTip(tr("Set the background color for the current viewer"));
  action->setWhatsThis(tr("Set the background color for the current viewer"));  
234
  action->setIcon(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"BackgroundColor.png") );
235
  connect(action, SIGNAL(triggered()), this, SLOT(slotSetContextBackgroundColor()) );
Jan Möbius's avatar
Jan Möbius committed
236
237
238
239
  
  //====================================================================================================
  
}
Jan Möbius's avatar
Jan Möbius committed
240

Jan Möbius's avatar
Jan Möbius committed
241
242
243
244
245
246
247
248
249
250
251
/** \brief Update context Menu an object has been clicked on.
 * 
 * This function is called when an object has been clicked on.
 * This context menu will show all properties for the given object.
 * 
 * @param _menu Pointer to the context Menu
 * @param _objectId Id of the object that has been clicked on.
 */
void CoreWidget::updatePopupMenuObject(QMenu* _menu , const int _objectId ) {
  std::cerr << "Object Context Menu for id: " << _objectId << std::endl;
}
Jan Möbius's avatar
Jan Möbius committed
252
253
254



Jan Möbius's avatar
Jan Möbius committed
255
256
257
258
259
260
261
/** \brief check current context and initialize context menu according to this context. 
 * 
 * This function is called whenever a context menu for the corewidget is requested. 
 * It will decide about the current context, collect all menus for plugins and
 * construct the final context menu.
 */
void CoreWidget::updatePopupMenu(const QPoint& _point) {
Jan Möbius's avatar
Jan Möbius committed
262

Jan Möbius's avatar
Jan Möbius committed
263
264
265
266
267
  // Clear the complete context menu.
  contextMenu_->clear();
  
  // Clear the selection context menu part.
  contextSelectionMenu_->clear();
Jan Möbius's avatar
Jan Möbius committed
268

Jan Möbius's avatar
Jan Möbius committed
269
270
271
  // =============================================================================
  // First do a picking on the current position to check which context we are in.
  // =============================================================================
Jan Möbius's avatar
 
Jan Möbius committed
272
  int objectId = -1;
Jan Möbius's avatar
Jan Möbius committed
273
274
275
276
  
  enum CONTEXTTYPE {
    COORDSYSCONTEXT ,BACKGROUNDCONTEXT ,OBJECTCONTEXT
  } context = BACKGROUNDCONTEXT;
Jan Möbius's avatar
Jan Möbius committed
277

Jan Möbius's avatar
 
Jan Möbius committed
278
279
280
281
  // Do picking in the gl area to find an object
  unsigned int    node_idx, target_idx;
  ACG::Vec3d      hit_point;
  BaseObjectData* object;
Jan Möbius's avatar
Jan Möbius committed
282
  
283
  if (examiner_widgets_[PluginFunctions::activeExaminer()]->pick( ACG::SceneGraph::PICK_ANYTHING,_point,node_idx, target_idx, &hit_point ) ) {
284

Jan Möbius's avatar
Jan Möbius committed
285
    if ( PluginFunctions::getPickedObject(node_idx, object) ) {
Jan Möbius's avatar
 
Jan Möbius committed
286
      objectId = object->id();
Jan Möbius's avatar
Jan Möbius committed
287
288
      context  = OBJECTCONTEXT;
    } else {
289
      ACG::SceneGraph::BaseNode* node = ACG::SceneGraph::find_node( PluginFunctions::getSceneGraphRootNode() , node_idx );
Jan Möbius's avatar
Jan Möbius committed
290
291
      if ( node != 0 && ( node->name() == "Core Coordsys Node") ) 
        context = COORDSYSCONTEXT;
292
    }
Jan Möbius's avatar
Jan Möbius committed
293
294
295
296
297
298
299
300
301
302
303
  } 
  
  // =============================================================================
  // Depending on the context create the basic context menu.
  // =============================================================================
  
  QIcon icon;
  QAction* typeEntry = 0;      
  switch (context) {
    case BACKGROUNDCONTEXT:
      updatePopupMenuBackground(contextMenu_,_point);
304
      return;
Jan Möbius's avatar
Jan Möbius committed
305
306
307
308
309
310
311
      break;
    case OBJECTCONTEXT:
      typeEntry = new QAction("Object",contextMenu_);
      contextMenu_->addAction( typeEntry );
      break;
    case COORDSYSCONTEXT:
      updatePopupMenuCoordsysNode(contextMenu_,target_idx);
312
      return;
Jan Möbius's avatar
Jan Möbius committed
313
      break;
Jan Möbius's avatar
 
Jan Möbius committed
314
  }
Jan Möbius's avatar
Jan Möbius committed
315
316
317
318
319
  
  // Add the global entry to the context menu.
  QAction* entrySeparator = contextMenu_->addSeparator( );

  QAction* contextSelectionAction = contextMenu_->addMenu( contextSelectionMenu_ );
Jan Möbius's avatar
Jan Möbius committed
320

Jan Möbius's avatar
 
Jan Möbius committed
321
  int topLevelAdded  = 0;
Jan Möbius's avatar
Jan Möbius committed
322

Jan Möbius's avatar
 
Jan Möbius committed
323
  if ( objectId != -1) {
Jan Möbius's avatar
Jan Möbius committed
324

325
326
    emit updateContextMenu(objectId);

Jan Möbius's avatar
 
Jan Möbius committed
327
    // Add an empty Menu defining the current Type
328
329
330
    typeEntry->setText( typeName(object->dataType()) );
    icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+ typeIcon(object->dataType()) );
    typeEntry->setIcon(icon);
Jan Möbius's avatar
Jan Möbius committed
331
332


Jan Möbius's avatar
 
Jan Möbius committed
333
334
    // Add real context Menus first
    for ( uint i = 0 ; i < contextMenus_.size(); ++i ) {
Jan Möbius's avatar
Jan Möbius committed
335

Jan Möbius's avatar
 
Jan Möbius committed
336
337
338
339
340
341
342
343
      // check if the dataType of the object matches the context type
      if ( object->dataType(  contextMenus_[i].contextType ) ) {
        if ( contextMenus_[i].position == CONTEXTTOPLEVELMENU ) {
          contextMenu_->addMenu( contextMenus_[i].menu );
          topLevelAdded++;
        } else if ( contextMenus_[i].position == CONTEXTSELECTIONMENU ) {
          contextSelectionMenu_->addMenu(contextMenus_[i].menu);
        }
Jan Möbius's avatar
Jan Möbius committed
344
345

        // Get all Actions in the menu and its submenus.
Jan Möbius's avatar
 
Jan Möbius committed
346
347
348
349
        // Set their data to the picked Object id
        QList< QAction *> allActions = contextMenus_[i].menu->actions();
        while ( !allActions.empty() ) {
          QList< QAction *> tmpList;
Jan Möbius's avatar
Jan Möbius committed
350

Jan Möbius's avatar
 
Jan Möbius committed
351
352
          // Set userdata of all actions to the picked Object Id
          for ( int j = 0 ; j < allActions.size(); ++j ) {
Jan Möbius's avatar
Jan Möbius committed
353
354
            allActions[j]->setData( QVariant( objectId ) );
            if ( allActions[j]->menu() != 0 )
Jan Möbius's avatar
 
Jan Möbius committed
355
356
              tmpList << allActions[j]->menu()->actions();
          }
Jan Möbius's avatar
Jan Möbius committed
357

Jan Möbius's avatar
 
Jan Möbius committed
358
359
360
361
362
          allActions = tmpList;
        }
      }
    }
  } else {
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377

    emit updateContextMenu(-1);

    // Add real context Menus first
    for ( uint i = 0 ; i < contextMenus_.size(); ++i ) {
      if ( contextMenus_[i].contextType == DATA_NONE ) {
        contextMenu_->addMenu( contextMenus_[i].menu );
        topLevelAdded++;
      }
    }

    if ( topLevelAdded == 0 ) {
      contextMenu_->removeAction(typeEntry);
      contextMenu_->removeAction(entrySeparator);
    }
Jan Möbius's avatar
 
Jan Möbius committed
378
  }
Jan Möbius's avatar
Jan Möbius committed
379
380

  if ( contextSelectionMenu_->isEmpty()  )
Jan Möbius's avatar
 
Jan Möbius committed
381
    contextMenu_->removeAction( contextSelectionAction );
Jan Möbius's avatar
Jan Möbius committed
382

Jan Möbius's avatar
 
Jan Möbius committed
383
384
  if ( topLevelAdded > 0 )
    contextMenu_->addSeparator();
Jan Möbius's avatar
Jan Möbius committed
385

Jan Möbius's avatar
 
Jan Möbius committed
386
387
388
  // Add persistent context Menus as second part
  for ( uint i = 0 ; i < persistentContextMenus_.size(); ++i ) {
    contextMenu_->addMenu( persistentContextMenus_[i].menu );
Jan Möbius's avatar
Jan Möbius committed
389
390

    // Get all Actions in the menu and its submenus.
Jan Möbius's avatar
 
Jan Möbius committed
391
392
393
394
    // Set their data to the picked Object id
    QList< QAction *> allActions = persistentContextMenus_[i].menu->actions();
    while ( !allActions.empty() ) {
      QList< QAction *> tmpList;
Jan Möbius's avatar
Jan Möbius committed
395

Jan Möbius's avatar
 
Jan Möbius committed
396
397
      // Set userdata of all actions to the picked Object Id
      for ( int j = 0 ; j < allActions.size(); ++j ) {
Jan Möbius's avatar
Jan Möbius committed
398
399
        allActions[j]->setData( QVariant( objectId ) );
        if ( allActions[j]->menu() != 0 )
Jan Möbius's avatar
 
Jan Möbius committed
400
401
          tmpList << allActions[j]->menu()->actions();
      }
Jan Möbius's avatar
Jan Möbius committed
402

Jan Möbius's avatar
 
Jan Möbius committed
403
404
      allActions = tmpList;
    }
Jan Möbius's avatar
Jan Möbius committed
405

Jan Möbius's avatar
 
Jan Möbius committed
406
  }
Jan Möbius's avatar
Jan Möbius committed
407

Jan Möbius's avatar
 
Jan Möbius committed
408
409
410
  // Only add Separator if we had plugin context menus
  if ( persistentContextMenus_.size() > 0 )
    contextMenu_->addSeparator();
Jan Möbius's avatar
Jan Möbius committed
411

412
  if (examiner_widgets_[0]->getPickMenu() != NULL) {
413
414
415
416
417
    if ( examiner_widgets_[0]->getPickMenu()->actions().size() > 0 ) {
      examiner_widgets_[0]->getPickMenu()->setTitle("&Picking");
      contextMenu_->addMenu(examiner_widgets_[0]->getPickMenu() );
      examiner_widgets_[0]->getPickMenu()->setTearOffEnabled(true);
    }
Jan Möbius's avatar
 
Jan Möbius committed
418
  }
Jan Möbius's avatar
Jan Möbius committed
419

Jan Möbius's avatar
 
Jan Möbius committed
420
421
}

422

423
424
void CoreWidget::slotSnapshotName() {
  std::cerr << "Todo : slotSnapShotName only sets name for current viewer" << std::endl;
425
426
427
428
429
430
431
432
433
434
435
436
437
438

  QString fname = PluginFunctions::viewerProperties().snapshotName();

  fname.replace('%', '$');
  fname = QFileDialog::getSaveFileName ( 0, "Save snapshot name" );
  if (!fname.isEmpty())
  {
    fname.replace('$', '%');

    PluginFunctions::viewerProperties().snapshotBaseFileName(fname);
    QString msg="next snapshot: ";
    statusBar()->showMessage(msg);
  }

439
440
}

Jan Möbius's avatar
 
Jan Möbius committed
441
442
443
void CoreWidget::slotAddContextMenu(QMenu* _menu) {
  MenuInfo info;
  info.menu = _menu;
Jan Möbius's avatar
Jan Möbius committed
444

Jan Möbius's avatar
 
Jan Möbius committed
445
446
447
448
449
450
451
452
  persistentContextMenus_.push_back(info);
}

void CoreWidget::slotAddContextMenu( QMenu* _menu , DataType _dataType ,ContextMenuType _type ) {
  MenuInfo info;
  info.menu        = _menu;
  info.contextType = _dataType;
  info.position    = _type;
Jan Möbius's avatar
Jan Möbius committed
453

Jan Möbius's avatar
 
Jan Möbius committed
454
455
456
  contextMenus_.push_back(info);
}

457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
void CoreWidget::slotUpdateViewerDrawMenu() {
  if ( drawGroupViewer_ ) {
    
    disconnect( drawGroupViewer_ , SIGNAL( triggered( QAction * ) ),
                this             , SLOT( slotViewerDrawMenu( QAction * ) ) );
    delete( drawGroupViewer_ );
    drawGroupViewer_ = 0;
    
  }
  
  // Recreate drawGroup
  drawGroupViewer_ = new QActionGroup( this );
  drawGroupViewer_->setExclusive( false );
  
  connect( drawGroupViewer_ , SIGNAL( triggered( QAction * ) ),
           this       , SLOT( slotViewerDrawMenu( QAction * ) ) );  
  
  if ( !viewerDrawMenu_ ) {
    
    QIcon icon;
    icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"drawModes.png");
    viewerDrawMenu_  = new QMenu("Set Draw Mode"); 
    viewerDrawMenu_->setTearOffEnabled(true);
    viewerDrawMenu_->setIcon(icon);
    
    connect(viewerDrawMenu_,SIGNAL(aboutToShow () ) , this, SLOT(slotUpdateGlobalDrawMenu() ) );
  }
  
  // Collect available draw Modes 
  ACG::SceneGraph::CollectDrawModesAction actionAvailable;
  ACG::SceneGraph::traverse( PluginFunctions::getRootNode() , actionAvailable);
  availableGlobalDrawModes_ = actionAvailable.drawModes();
  
  // Get currently active drawModes (first viewer only )
  // TODO: create combination from all viewers!
  int activeDrawModes = PluginFunctions::drawMode();
  
  // Convert to ids
  std::vector< unsigned int > availDrawModeIds;
  availDrawModeIds = ACG::SceneGraph::DrawModes::getDrawModeIDs( availableGlobalDrawModes_ );
  
  viewerDrawMenu_->clear();
  
  for ( unsigned int i = 0; i < availDrawModeIds.size(); ++i )
  {
    unsigned int id    = availDrawModeIds[i];
    std::string  descr = ACG::SceneGraph::DrawModes::description( id );

    QAction * action = new QAction( descr.c_str(), drawGroupViewer_ );
    action->setCheckable( true );
    action->setChecked( ACG::SceneGraph::DrawModes::containsId( activeDrawModes, id ) );
  }

  viewerDrawMenu_->addActions( drawGroupViewer_->actions() );

}

void CoreWidget::slotViewerDrawMenu(QAction * _action) {
  
  //======================================================================================
  // Get the mode toggled
  //======================================================================================
  unsigned int mode = 0;
  std::vector< unsigned int > availDrawModeIds;
  availDrawModeIds = ACG::SceneGraph::DrawModes::getDrawModeIDs( availableGlobalDrawModes_ );
  for ( unsigned int i = 0; i < availDrawModeIds.size(); ++i )
  {
    QString descr = QString( ACG::SceneGraph::DrawModes::description( availDrawModeIds[i] ).c_str() );

    if ( descr == _action->text() ) {
      mode = availDrawModeIds[i];
      break;
    }
  }
  
  if ( qApp->keyboardModifiers() & Qt::ShiftModifier )
    PluginFunctions::viewerProperties().drawMode(  PluginFunctions::viewerProperties().drawMode() ^ mode );
  else
    PluginFunctions::viewerProperties().drawMode(mode );
  
}

Jan Möbius's avatar
 
Jan Möbius committed
539
//=============================================================================