CoreWidget.cc 31.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           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/>.                                      *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
34

35
36
37
38
39
40
41
/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60



//=============================================================================
//
//  CLASS MViewWidget - IMPLEMENTATION
//
//=============================================================================


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

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

// -------------------- OpenFlipper Includes
#include <OpenFlipper/common/GlobalOptions.hh>
#include <OpenFlipper/common/RecentFiles.hh>
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Jan Möbius's avatar
   
Jan Möbius committed
61
#include <OpenFlipper/BasePlugin/PluginFunctionsCore.hh>
Dirk Wilden's avatar
Dirk Wilden committed
62
63
#include <OpenFlipper/BasePlugin/KeyInterface.hh>
#include <OpenFlipper/BasePlugin/LoggingInterface.hh>
Jan Möbius's avatar
 
Jan Möbius committed
64

Dirk Wilden's avatar
Dirk Wilden committed
65
66
#include <OpenFlipper/widgets/videoCaptureDialog/VideoCaptureDialog.hh>

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
67
68
#include <OpenFlipper/widgets/glWidget/CursorPainter.hh>

Jan Möbius's avatar
 
Jan Möbius committed
69
70
71
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

Jan Möbius's avatar
Jan Möbius committed
72
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
73

Jan Möbius's avatar
Jan Möbius committed
74
75
/** \brief Constuctor for the Core Widget
 *
Jan Möbius's avatar
 
Jan Möbius committed
76
77
*/
CoreWidget::
Dirk Wilden's avatar
Dirk Wilden committed
78
CoreWidget( QVector<ViewMode*>& _viewModes,
Dirk Wilden's avatar
Dirk Wilden committed
79
80
            std::vector<PluginInfo>& _plugins,
            QList< SlotInfo >& _coreSlots ) :
Jan Möbius's avatar
 
Jan Möbius committed
81
  QMainWindow(),
Dirk Wilden's avatar
Dirk Wilden committed
82
  coreSlots_(_coreSlots),
Dirk Wilden's avatar
Dirk Wilden committed
83
  shiftPressed_(false),
Jan Möbius's avatar
 
Jan Möbius committed
84
85
  viewModes_(_viewModes),
  viewModeButton_(0),
86
  viewModeMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
87
  splitter_(0),
88
  logWidget_(0),
Jan Möbius's avatar
 
Jan Möbius committed
89
  recentFilesMenu_(0),
90
  helpMenu_(0),
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
91
  cursorPainter_(0),
92
  sceneGraphDialog_(0),
93
94
95
  fileMenu_(0),
  viewMenu_(0),
  toolsMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
96
  fileMenuEnd_(0),
97
98
99
100
  stereoButton_(0),
  moveButton_(0),
  lightButton_(0),
  pickButton_(0),
Dirk Wilden's avatar
Dirk Wilden committed
101
  questionButton_(0),
102
103
104
  globalDrawMenu_(0),
  drawGroup_(0),
  viewGroup_(0),
105
  perspectiveProjectionAction_(0),
106
107
  activeDrawModes_(0),
  availableGlobalDrawModes_(0),
Jan Möbius's avatar
 
Jan Möbius committed
108
  contextMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
109
  contextSelectionMenu_(0),
110
111
  drawGroupViewer_(0),
  viewerDrawMenu_(0),
112
  coordSysMenu_(0),
Dirk Wilden's avatar
Dirk Wilden committed
113
114
  snapshotName_("snap.png"),
  snapshotCounter_(0),
Jan Möbius's avatar
 
Jan Möbius committed
115
  stackMenu_(0),
116
  helpWidget_(0),
Jan Möbius's avatar
Jan Möbius committed
117
  aboutWidget_(0),
118
  optionsWidget_(0),
119
  plugins_(_plugins),
120
121
122
123
124
125
  stereoActive_(false),
  actionMode_(Viewer::PickingMode),
  lastActionMode_(Viewer::ExamineMode),
  pickMenu_(0),
  pick_mode_name_(""),
  pick_mode_idx_(-1)
Jan Möbius's avatar
 
Jan Möbius committed
126
127
{
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
128

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
129
130
131
132
133
  toolSplitter_ = new QSplitter(Qt::Horizontal,this);

  setCentralWidget(toolSplitter_);

  splitter_ = new QSplitter(Qt::Vertical,toolSplitter_);
Jan Möbius's avatar
 
Jan Möbius committed
134
  stackedWidget_ = new QStackedWidget(splitter_);
Jan Möbius's avatar
Jan Möbius committed
135

136
137
  QGLFormat format = QGLFormat::defaultFormat();

138
139
140
  #ifdef ARCH_DARWIN
  format.setStereo(false);
  #else
Jan Möbius's avatar
   
Jan Möbius committed
141
  format.setStereo( OpenFlipper::Options::stereo() );
142
  #endif
Jan Möbius's avatar
   
Jan Möbius committed
143
  format.setAlpha(true);
144
  format.setStencil(true);
145
146
  format.setSampleBuffers(true);
  QGLFormat::setDefaultFormat(format);
Jan Möbius's avatar
   
Jan Möbius committed
147
148

  // Construct GL context & widget
149
150
151
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  // ===============================================================================
  // Test context capabilities ...
  // If we get stereo buffers, we use them .. which might disable multisampling
  // If we dont have stereo, we disable it to not interfere with multisampling
  // ===============================================================================
  QGLWidget* test = new QGLWidget(format);
  if ( ! test->format().stereo() ) {
    //     std::cerr << "No stereo ... disabling stereo for real context!" << std::endl;
    format.setStereo(false);
    QGLFormat::setDefaultFormat(format);
  }/* else {
    std::cerr << "Stereo found ok" << std::endl;
  }*/

  delete test;

  glWidget_ = new QGLWidget(format,0);
169
  PluginFunctions::shareGLWidget (glWidget_);
170

Jan Möbius's avatar
   
Jan Möbius committed
171
  glView_ = new QtGLGraphicsView(stackedWidget_);
172
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
   
Jan Möbius committed
173

Jan Möbius's avatar
Jan Möbius committed
174
  // is stereo possible, use it?
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
175
  OpenFlipper::Options::glStereo(glWidget_->format().stereo());
Jan Möbius's avatar
Jan Möbius committed
176

Jan Möbius's avatar
   
Jan Möbius committed
177
178
179
180
  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
181
182
  // gl widget as parent to make sure that the CursorPainter will be deleted before
  cursorPainter_ = new CursorPainter (glWidget_);
183
184
  cursorPainter_->setForceNative (!OpenFlipper::Options::glMouse ());
  cursorPainter_->setEnabled (stereoActive_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
185
  glScene_->setCursorPainter (cursorPainter_);
186

Jan Möbius's avatar
   
Jan Möbius committed
187
188
189
190
191
192
193
194
195
196
  centerWidget_ = new QGraphicsWidget;
  glScene_->addItem(centerWidget_);
  centerWidget_->setGeometry (glScene_->sceneRect ());

  connect ( glView_, SIGNAL( sceneRectChanged( const QRectF & ) ),
            this, SLOT( sceneRectChanged( const QRectF & ) ) );

  stackedWidget_->addWidget(glView_);
  stackWidgetList_.push_back( StackWidgetInfo( false, "3D Examiner Widget", glView_ ) );

Jan Möbius's avatar
 
Jan Möbius committed
197
198
199
  // ======================================================================
  // Set up the logging window
  // ======================================================================
200

201
  slidingLogger_ = new QtSlideWindow (tr("Log Viewer"), centerWidget_);
202
203
  tempLogWidget = new QWidget;

204
205
206
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setReadOnly(true);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
207
  logWidget_->resize( splitter_->width() ,240);
208
  logWidget_->setLineWrapMode( QTextEdit::NoWrap );
Jan Möbius's avatar
Jan Möbius committed
209

210
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
211
  loggerState_ = OpenFlipper::Options::Normal;
212

Jan Möbius's avatar
 
Jan Möbius committed
213
  QList<int> wsizes( splitter_->sizes() );
214

Jan Möbius's avatar
Jan Möbius committed
215
  if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene) {
216
217
    slidingLogger_->attachWidget (logWidget_);
    splitter_->insertWidget (1, tempLogWidget);
218
    wsizes[0] = 1;
Jan Möbius's avatar
 
Jan Möbius committed
219
220
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
Jan Möbius committed
221
    loggerState_ = OpenFlipper::Options::InScene;
222
    baseLayout_->setContentsMargins (0, 0, 0, 16);
Jan Möbius's avatar
Jan Möbius committed
223
224
225
226
227
228
229
230
231
232
233
  } else if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::Hidden) {
    splitter_->insertWidget (1, tempLogWidget);
    wsizes[0] = 1;
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
    loggerState_ = OpenFlipper::Options::Hidden;
  } else {
    // Set initial values to have a usable state
    wsizes[0] = 480;
    wsizes[1] = 240;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
234
  }
Jan Möbius's avatar
Jan Möbius committed
235

236

Jan Möbius's avatar
 
Jan Möbius committed
237
238
239
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
240
241
242

  if ( !OpenFlipper::Options::multiView() ) {

Jan Möbius's avatar
   
Jan Möbius committed
243
244
    glViewer* examinerWidget = new glViewer(glScene_,
					    glWidget_,
245
                                            PluginFunctions::viewerProperties(0),
246
					    centerWidget_);
Jan Möbius's avatar
Jan Möbius committed
247

Jan Möbius's avatar
Jan Möbius committed
248
249
250
    examiner_widgets_.push_back(examinerWidget);

    examinerWidget->sceneGraph( PluginFunctions::getSceneGraphRootNode() );
Jan Möbius's avatar
Jan Möbius committed
251

Jan Möbius's avatar
Jan Möbius committed
252
    baseLayout_->addItem(examinerWidget, 0);
Jan Möbius's avatar
Jan Möbius committed
253

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
254
255
    cursorPainter_->registerViewer (examinerWidget);

Jan Möbius's avatar
Jan Möbius committed
256
257
258
  } else {


Jan Möbius's avatar
   
Jan Möbius committed
259
260
261
262
    // Create examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      glViewer* newWidget = new glViewer(glScene_,
					 glWidget_,
263
                                         PluginFunctions::viewerProperties(i),
264
					 centerWidget_);
Dirk Wilden's avatar
Dirk Wilden committed
265

Jan Möbius's avatar
Jan Möbius committed
266
      examiner_widgets_.push_back(newWidget);
267
268
269
270
271
272
273
274
275
276

      connect (&PluginFunctions::viewerProperties(i), SIGNAL( getPickMode(std::string&) ),
               this,                                   SLOT( getPickMode(std::string&) ),Qt::DirectConnection );
      connect (&PluginFunctions::viewerProperties(i), SIGNAL( setPickMode(const std::string) ),
               this,                                   SLOT( setPickMode(const std::string) ),Qt::DirectConnection );
      connect (&PluginFunctions::viewerProperties(i), SIGNAL( getActionMode(Viewer::ActionMode&) ),
               this,                                   SLOT( getActionMode(Viewer::ActionMode&) ),Qt::DirectConnection );
      connect (&PluginFunctions::viewerProperties(i), SIGNAL( setActionMode(const Viewer::ActionMode) ),
               this,                                   SLOT( setActionMode(const Viewer::ActionMode)), Qt::DirectConnection );

Jan Möbius's avatar
Jan Möbius committed
277
278
279
280
281
    }

    // Initialize all examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      examiner_widgets_[i]->sceneGraph( PluginFunctions::getSceneGraphRootNode() );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
282
      cursorPainter_->registerViewer (examiner_widgets_[i]);
Jan Möbius's avatar
Jan Möbius committed
283
284
    }

Jan Möbius's avatar
Jan Möbius committed
285
286
287
288
    baseLayout_->addItem(examiner_widgets_[0],0);
    baseLayout_->addItem(examiner_widgets_[1],1);
    baseLayout_->addItem(examiner_widgets_[2],2);
    baseLayout_->addItem(examiner_widgets_[3],3);
Jan Möbius's avatar
Jan Möbius committed
289
290
  }

Jan Möbius's avatar
   
Jan Möbius committed
291
292
293
  // Make examiner available to the plugins ( defined in PluginFunctions.hh)
  PluginFunctions::setViewers( examiner_widgets_ );

Jan Möbius's avatar
   
Jan Möbius committed
294
  centerWidget_->setLayout(baseLayout_);
295
296


Jan Möbius's avatar
 
Jan Möbius committed
297
298
299
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
300
301
302
303
304
305
306
307
  for ( uint i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {

    connect( examiner_widgets_[i], SIGNAL(startDragEvent( QMouseEvent*)),
             this, SLOT(startDrag(QMouseEvent* )));
    connect( examiner_widgets_[i], SIGNAL(dragEnterEvent( QDragEnterEvent*)),
            this, SLOT(dragEnterEvent(QDragEnterEvent* )));
    connect( examiner_widgets_[i], SIGNAL(dropEvent( QDropEvent*)),
            this, SLOT(dropEvent(QDropEvent* )));
308
309
    connect (examiner_widgets_[i], SIGNAL(signalMakeActive ()),
             this, SLOT(slotActivateExaminer()));
310
311
312

    connect (examiner_widgets_[i], SIGNAL(statusMessage(QString, int)),
             statusBar_, SLOT(showMessage(const QString&, int)));
Jan Möbius's avatar
Jan Möbius committed
313
314
315
  }


Jan Möbius's avatar
 
Jan Möbius committed
316
317
318
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
319

Jan Möbius's avatar
Jan Möbius committed
320
321
322
  mainToolbar_ = new QToolBar(tr("Main Toolbar"));
  mainToolbar_->setWindowTitle(tr("Main Toolbar"));
  mainToolbar_->setObjectName(tr("MainToolbar"));
323
  slotAddToolbar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
324

Jan Möbius's avatar
 
Jan Möbius committed
325
326
327
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
328

Jan Möbius's avatar
Jan Möbius committed
329

330
  // Create the toolbar
Jan Möbius's avatar
Jan Möbius committed
331
  viewerToolbar_ = new QToolBar( tr("Viewer Toolbar" ), this );
332
  viewerToolbar_->setOrientation(Qt::Vertical);
Jan Möbius's avatar
 
Jan Möbius committed
333
334
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Jan Möbius's avatar
Jan Möbius committed
335
  viewerToolbar_->setObjectName(tr("ViewerToolbar"));
Jan Möbius's avatar
Jan Möbius committed
336

337
338
339
340
  moveButton_ = new QToolButton( viewerToolbar_ );
  moveButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"transform-move.png") );
  moveButton_->setMinimumSize( 16, 16 );
  moveButton_->setMaximumSize( 32, 32 );
Jan Möbius's avatar
Jan Möbius committed
341
342
  moveButton_->setToolTip( tr("Switch to <b>move</b> mode.") );
  moveButton_->setWhatsThis(tr(
343
344
345
                  "Switch to <b>move</b> mode.<br>"
                  "<ul><li><b>Rotate</b> using <b>left</b> mouse button.</li>"
                  "<li><b>Translate</b> using <b>middle</b> mouse button.</li>"
Jan Möbius's avatar
Jan Möbius committed
346
                  "<li><b>Zoom</b> using <b>left+middle</b> mouse buttons.</li></ul>" ));
347
348

  connect( moveButton_,SIGNAL( clicked() ), this, SLOT( setExamineMode() ) );
349
/*
350
  connect( this, SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
351
            this, SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );*/
352

Jan Möbius's avatar
Jan Möbius committed
353
  viewerToolbar_->addWidget( moveButton_ )->setText(tr("Move"));
354
355
356
357
358
359
360
  moveButton_->setDown(true);


  lightButton_ = new QToolButton( viewerToolbar_ );
  lightButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"light-mode.png") );
  lightButton_->setMinimumSize( 16, 16 );
  lightButton_->setMaximumSize( 32, 32 );
Jan Möbius's avatar
Jan Möbius committed
361
362
  lightButton_->setToolTip(tr("Switch to <b>light</b> mode."));
  lightButton_->setWhatsThis(tr(
363
                  "Switch to <b>light</b> mode.<br>"
Jan Möbius's avatar
Jan Möbius committed
364
                  "Rotate lights using left mouse button."));
365
366

  connect( lightButton_,SIGNAL( clicked() ), this, SLOT( setLightMode() ) );
Jan Möbius's avatar
Jan Möbius committed
367
  viewerToolbar_->addWidget( lightButton_)->setText(tr("Light"));
368
369
370
371
372
373


  pickButton_ = new QToolButton( viewerToolbar_ );
  pickButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"pick.png") );
  pickButton_->setMinimumSize( 16, 16 );
  pickButton_->setMaximumSize( 32, 32 );
Jan Möbius's avatar
Jan Möbius committed
374
375
  pickButton_->setToolTip(tr("Switch to <b>picking</b> mode."));
  pickButton_->setWhatsThis(tr(
376
377
378
                  "Switch to <b>picking</b> mode.<br>"
                  "Use picking functions like flipping edges.<br>"
                  "To change the mode use the right click<br>"
Jan Möbius's avatar
Jan Möbius committed
379
                  "context menu in the viewer."));
380
  connect( pickButton_,SIGNAL( clicked() ), this, SLOT( setPickingMode() ) );
Jan Möbius's avatar
Jan Möbius committed
381
  viewerToolbar_->addWidget( pickButton_)->setText(tr("Pick"));
382
383
384
385
386
387


  questionButton_ = new QToolButton( viewerToolbar_ );
  questionButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"help-about.png") );
  questionButton_->setMinimumSize( 16, 16 );
  questionButton_->setMaximumSize( 32, 32 );
Jan Möbius's avatar
Jan Möbius committed
388
389
  questionButton_->setToolTip(tr("Switch to <b>identification</b> mode."));
  questionButton_->setWhatsThis(tr(
390
391
392
393
                  "Switch to <b>identification</b> mode.<br>"
                  "Use identification mode to get information "
                  "about objects. Click on an object and see "
                  "the log output for information about the "
Jan Möbius's avatar
Jan Möbius committed
394
                  "object."));
395
  connect( questionButton_,SIGNAL( clicked() ), this, SLOT( setQuestionMode() ) );
Jan Möbius's avatar
Jan Möbius committed
396
  viewerToolbar_->addWidget( questionButton_)->setText(tr("Question"));
397

398
399
400
401
402
403
404
405
  viewerLayoutBox_ = new QComboBox( viewerToolbar_ );
  viewerLayoutBox_->setMinimumSize( 32, 16 );
  viewerLayoutBox_->setMaximumSize( 64, 32 );
  viewerLayoutBox_->setToolTip(tr("Switch <b>viewer layout</b>."));
  viewerLayoutBox_->setWhatsThis(tr(
                  "Switch <b>viewer layout</b>.<br>"
                  "Select the desired viewer layout. "
                  "Possible layouts are: "
406
                  "<ul> "
407
408
409
				  "<li>Single viewer</li>"
				  "<li>Multiple viewers (grid)</li>"
				  "<li>Multiple viewers (hsplit)</li>"
Jan Möbius's avatar
Jan Möbius committed
410
				  "</ul>"));
411

412
413
414
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"singleviewmode.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode1.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode2.png"), "");
415

416
  viewerLayoutBox_->setIconSize(QSize(22,22));
417

418
  connect( viewerLayoutBox_,SIGNAL( activated(int) ), this, SLOT( setViewerLayout(int) ) );
419

420
  viewerToolbar_->addWidget( viewerLayoutBox_ );
421

422
423
424
425
426
427
428
429
430
  viewerToolbar_->addSeparator();

  if (OpenFlipper::Options::stereo())
  {
    stereoButton_ = new QToolButton( viewerToolbar_ );
    stereoButton_->setIcon(  QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"mono.png")  );
    stereoButton_->setMinimumSize( 16, 16 );
    stereoButton_->setMaximumSize( 32, 32 );
    stereoButton_->setCheckable( true );
Jan Möbius's avatar
Jan Möbius committed
431
432
    stereoButton_->setToolTip(tr( "Toggle stereo viewing"));
    stereoButton_->setWhatsThis(tr(
433
434
435
436
                  "Toggle stereo mode<br><br>"
                  "Use this button to switch between stereo "
                  "and mono view. To use this feature you need "
                  "a stereo capable graphics card and a stereo "
Jan Möbius's avatar
Jan Möbius committed
437
                  "display/projection system."));
438
    connect( stereoButton_,SIGNAL( clicked() ), this , SLOT( slotToggleStereoMode() ) );
Jan Möbius's avatar
Jan Möbius committed
439
    viewerToolbar_->addWidget( stereoButton_ )->setText( tr("Stereo"));
440
  }
441
442


443
  addToolBar(Qt::TopToolBarArea,viewerToolbar_);
Jan Möbius's avatar
Jan Möbius committed
444

Jan Möbius's avatar
 
Jan Möbius committed
445
446
447
  // Remember logger size
  wsizes = splitter_->sizes();
  originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
448

Jan Möbius's avatar
 
Jan Möbius committed
449
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
450
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
451
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
452
453
454

  toolBoxArea_ = new QWidget (toolSplitter_);

Jan Möbius's avatar
Jan Möbius committed
455
  QGroupBox *gb = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
456
457
458

  QHBoxLayout *hLayout = new QHBoxLayout;

Jan Möbius's avatar
Jan Möbius committed
459
  QPushButton* vmButton = new QPushButton(tr("Change View Mode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
  hLayout->addWidget (vmButton);
  gb->setLayout (hLayout);

  connect(vmButton, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));

  toolBoxScroll_ = new QScrollArea ();
  toolBox_ = new SideArea ();
  toolBoxScroll_->setWidget (toolBox_);
  toolBoxScroll_->setWidgetResizable (true);
  toolBoxScroll_->setFrameStyle (QFrame::StyledPanel);

  QVBoxLayout *vLayout = new QVBoxLayout;
  vLayout->addWidget(gb);
  vLayout->addWidget(toolBoxScroll_);

  toolBoxArea_->setLayout (vLayout);

  wsizes = toolSplitter_->sizes();

  wsizes[0] = 480;
  wsizes[1] = 240;
  toolSplitter_->setSizes(wsizes);

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
483
484
485
486
487
  // ======================================================================
  // Create pick ToolBar
  // ======================================================================

  pickToolbar_ = new QtPickToolbar (this, centerWidget_);
Jan Möbius's avatar
Jan Möbius committed
488

Jan Möbius's avatar
 
Jan Möbius committed
489
490
491
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
492

Jan Möbius's avatar
Jan Möbius committed
493
494
495
496
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
    connect( examiner_widgets_[i] , SIGNAL(signalCustomContextMenuRequested( const QPoint&) ) ,
             this                 , SLOT( slotCustomContextMenu( const QPoint&) ) );
  }
Jan Möbius's avatar
Jan Möbius committed
497

Dirk Wilden's avatar
   
Dirk Wilden committed
498
  contextMenu_ = new QMenu(this);
Jan Möbius's avatar
Jan Möbius committed
499
  contextSelectionMenu_ = new QMenu(tr("Selection"),0);
Jan Möbius's avatar
Jan Möbius committed
500

Jan Möbius's avatar
 
Jan Möbius committed
501
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
502

Jan Möbius's avatar
 
Jan Möbius committed
503
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
504

Jan Möbius's avatar
Jan Möbius committed
505
  statusBar_->showMessage(tr("Ready"), 5000);
Dirk Wilden's avatar
Dirk Wilden committed
506

507
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
508

509
  setExamineMode();
510
511
512

  setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );

Jan Möbius's avatar
 
Jan Möbius committed
513
514
515
516
517
518
519
}


//-----------------------------------------------------------------------------


CoreWidget::~CoreWidget() {
Jan Möbius's avatar
Jan Möbius committed
520

Jan Möbius's avatar
 
Jan Möbius committed
521
522
523
524
525
526
527
528
}

//-----------------------------------------------------------------------------

/** Set viewer to Fullscreen Mode and back
  */
void
CoreWidget::toggleFullscreen() {
Jan Möbius's avatar
Jan Möbius committed
529

530
531
532
533
  setWindowState( windowState() ^  Qt::WindowFullScreen);

  OpenFlipper::Options::fullScreen( bool( windowState() & Qt::WindowFullScreen) );

Jan Möbius's avatar
 
Jan Möbius committed
534
535
536
537
538
  show();
}

//-----------------------------------------------------------------------------

539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
/** Enable or disable Fullscreen Mode
  */
void
CoreWidget::setFullscreen(bool _state ) {
  if ( _state )
    setWindowState( windowState() | Qt::WindowFullScreen);
  else {
    if ( windowState() & Qt::WindowFullScreen )
      setWindowState( windowState() ^  Qt::WindowFullScreen);
  }

  OpenFlipper::Options::fullScreen( bool( windowState() & Qt::WindowFullScreen) );

  show();
}

//-----------------------------------------------------------------------------

Jan Möbius's avatar
 
Jan Möbius committed
557
558
559
560
/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
Jan Möbius's avatar
Jan Möbius committed
561
562
563
564
565
566
567
568
569
570
571
572
573

  switch (OpenFlipper::Options::loggerState ())
  {
    case OpenFlipper::Options::InScene:
      OpenFlipper::Options::loggerState(OpenFlipper::Options::Normal);
      break;
    case OpenFlipper::Options::Normal:
      OpenFlipper::Options::loggerState(OpenFlipper::Options::Hidden);
      break;
    case OpenFlipper::Options::Hidden:
      OpenFlipper::Options::loggerState(OpenFlipper::Options::InScene);
      break;
  }
Jan Möbius's avatar
Jan Möbius committed
574

575
  // Hide/Show Logger
Jan Möbius's avatar
Jan Möbius committed
576
  showLogger( OpenFlipper::Options::loggerState() );
577
578
579
580
581
}

/** Hide or show logger
  */
void
Jan Möbius's avatar
Jan Möbius committed
582
CoreWidget::showLogger(OpenFlipper::Options::LoggerState _state) {
Jan Möbius's avatar
 
Jan Möbius committed
583
  //Hide Logger
Jan Möbius's avatar
Jan Möbius committed
584
585
586
  if (_state == loggerState_)
    return;

587
588
589
  qreal left, top, right, bottom;
  baseLayout_->getContentsMargins (&left, &top, &right, &bottom);

Jan Möbius's avatar
Jan Möbius committed
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
  switch (_state)
  {
    case OpenFlipper::Options::InScene:
      {
        QList<int> wsizes( splitter_->sizes() );

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
          originalLoggerSize_  = wsizes[1];

	if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;

        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
        logWidget_->resize (logWidget_->width (), originalLoggerSize_);
        slidingLogger_->attachWidget (logWidget_);
609
        baseLayout_->setContentsMargins (left, top, right, 16);
Jan Möbius's avatar
Jan Möbius committed
610
611
612
613
614
615
616
617
618
619
620
621
622
623
      }
      break;
    case OpenFlipper::Options::Normal:
      {
        if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;

        QList<int> wsizes( splitter_->sizes() );

        if (loggerState_ == OpenFlipper::Options::InScene)
          originalLoggerSize_ = logWidget_->height ();

        slidingLogger_->detachWidget ();
        splitter_->insertWidget (1, logWidget_);
624
        logWidget_->show ();
Jan Möbius's avatar
Jan Möbius committed
625
626
627
628

        wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
        wsizes[1] = originalLoggerSize_;
        splitter_->setSizes(wsizes);
629
        baseLayout_->setContentsMargins (left, top, right, 0);
Jan Möbius's avatar
Jan Möbius committed
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
      }
      break;
    case OpenFlipper::Options::Hidden:
      {
        QList<int> wsizes( splitter_->sizes() );

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
          originalLoggerSize_  = wsizes[1];

	if (loggerState_ == OpenFlipper::Options::InScene)
	{
	  slidingLogger_->detachWidget ();
	  originalLoggerSize_ = logWidget_->height ();
	}

        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
650
        baseLayout_->setContentsMargins (left, top, right, 0);
Jan Möbius's avatar
Jan Möbius committed
651
652
653
654
655
656
      }
      break;
  }
  loggerState_ = _state;

/*
657
  if ( !_state ) {
Jan Möbius's avatar
 
Jan Möbius committed
658
    QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
659

Jan Möbius's avatar
 
Jan Möbius committed
660
661
    // Remember old size
    originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
662

663
664
665
    int height = logWidget_->height ();

    splitter_->insertWidget (1, tempLogWidget);
Jan Möbius's avatar
 
Jan Möbius committed
666
667
668
    wsizes[0] = wsizes[0]+wsizes[1];
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
    logWidget_->resize (logWidget_->width (), height);
    slidingLogger_->attachWidget (logWidget_);

  } else if (splitter_->widget (1) == logWidget_) {

    if ( originalLoggerSize_ == 0)
        originalLoggerSize_ = 240;

    QList<int> wsizes( splitter_->sizes() );

    if (wsizes[0] == 0)
      wsizes[0] = height();

    wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
    wsizes[1] = originalLoggerSize_;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
685
  } else {
Jan Möbius's avatar
Jan Möbius committed
686

687
688
689
690
691
692
693
694
695
696
    QList<int> wsizes( splitter_->sizes() );

    int height = logWidget_->height ();

    slidingLogger_->detachWidget ();
    splitter_->insertWidget (1, logWidget_);

    wsizes[0] = wsizes[0]+wsizes[1] - height;
    wsizes[1] = height;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
697
  }
Jan Möbius's avatar
Jan Möbius committed
698
  */
Jan Möbius's avatar
 
Jan Möbius committed
699
700
701
702
703
704
705
706
}

//-----------------------------------------------------------------------------

/** Hide or show toolbox
  */
void
CoreWidget::toggleToolbox() {
Jan Möbius's avatar
Jan Möbius committed
707

Jan Möbius's avatar
 
Jan Möbius committed
708
  //toggle
709
710
711
712
713
714
715
716
717
718
719
720
  showToolbox( OpenFlipper::Options::hideToolbox() );
}

//-----------------------------------------------------------------------------

/** Hide or show toolbox
  */
void
CoreWidget::showToolbox( bool _state ) {

  //toggle
  OpenFlipper::Options::hideToolbox( !_state );
Jan Möbius's avatar
 
Jan Möbius committed
721

Jan Möbius's avatar
Jan Möbius committed
722
  if ( OpenFlipper::Options::hideToolbox() ){
Jan Möbius's avatar
 
Jan Möbius committed
723
724

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
725
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
726
727
728
729
730
731
732

  }else{
    //reset last ViewMode
    if (OpenFlipper::Options::defaultToolboxMode().trimmed() == "")
      setViewMode("All");
    else
      setViewMode( OpenFlipper::Options::defaultToolboxMode() );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
733
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
734
735
  }
}
Jan Möbius's avatar
Jan Möbius committed
736

Jan Möbius's avatar
 
Jan Möbius committed
737
738
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
739
740
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
741
{
742
743
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
744

Jan Möbius's avatar
 
Jan Möbius committed
745
  OpenFlipper::Options::addRecentFile(_filename, _type);
Jan Möbius's avatar
Jan Möbius committed
746

Jan Möbius's avatar
 
Jan Möbius committed
747
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
748
749
750
751
752
753
754

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
755
756
757
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
758

Jan Möbius's avatar
 
Jan Möbius committed
759
760
761
762
763
  recentFilesMenu_->clear();

  QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles();
  for (int i = 0 ; i < recentFiles.size() ; ++i ) {
    QString path = OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator();
764
765
766
767
768
769
770
    
    QFileInfo fi(recentFiles[i].filename); 

    if (fi.suffix() == "ini")
      path += "Settings-Icon.png";
    else
      path += typeIcon( recentFiles[i].type );
771

Jan Möbius's avatar
Jan Möbius committed
772
    recentFilesMenu_->addAction(QIcon(path), recentFiles[i].filename);
Jan Möbius's avatar
 
Jan Möbius committed
773
774
  }

Jan Möbius's avatar
Jan Möbius committed
775
776
777
}

void
Jan Möbius's avatar
 
Jan Möbius committed
778
779
780
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
781
782

void CoreWidget::showOptionsWidget() {
Jan Möbius's avatar
Jan Möbius committed
783

784
785
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
786

787
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
788
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
789
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
790
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
791
792
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
793
794

    optionsWidget_->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );
795
  }
Dirk Wilden's avatar
Dirk Wilden committed
796

Jan Möbius's avatar
Jan Möbius committed
797
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
798
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
799
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
800
801
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
802
803
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
804

805
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
806

807
}
Jan Möbius's avatar
Jan Möbius committed
808

809
void CoreWidget::nextViewerLayout() {
810
811
812
813
814

	if (OpenFlipper::Options::multiView()) {

		switch (baseLayout_->mode()) {
		case QtMultiViewLayout::SingleView:
815
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
816
			baseLayout_->setMode(QtMultiViewLayout::Grid);
817
818

			// Update combo box in the toolbar
819
			viewerLayoutBox_->setCurrentIndex(1);
820
821
			break;
		case QtMultiViewLayout::Grid:
822
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
823
			baseLayout_->setMode(QtMultiViewLayout::HSplit);
824
825

			// Update combo box in the toolbar
826
			viewerLayoutBox_->setCurrentIndex(2);
827
828
			break;
		case QtMultiViewLayout::HSplit:
829
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
830
			baseLayout_->setMode(QtMultiViewLayout::SingleView);
831
832

			// Update combo box in the toolbar
833
			viewerLayoutBox_->setCurrentIndex(0);
834
835
836
837
838
839
840
			break;
		}
	}
}


void
841
CoreWidget::setViewerLayout(int _idx) {
842
843
844
845
846

	if (OpenFlipper::Options::multiView()) {

		switch (_idx) {
		case 0:
847
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
848
849
850
			baseLayout_->setMode(QtMultiViewLayout::SingleView);
			break;
		case 1:
851
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
852
853
854
			baseLayout_->setMode(QtMultiViewLayout::Grid);
			break;
		case 2:
855
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
856
857
858
			baseLayout_->setMode(QtMultiViewLayout::HSplit);
			break;
		}
859
860

    viewerLayoutBox_->setCurrentIndex(_idx);
861
862
	}
}
Jan Möbius's avatar
 
Jan Möbius committed
863

864
865
866
867
868
869
870
871
872
873
874
875
876
877
void
CoreWidget::slotShowSceneGraphDialog()
{
  if ( PluginFunctions::getSceneGraphRootNode() )
  {
    if (!sceneGraphDialog_)
    {
      sceneGraphDialog_ = new ACG::QtWidgets::QtSceneGraphDialog( this, PluginFunctions::getSceneGraphRootNode() );

      for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
        connect(examiner_widgets_[i], SIGNAL(signalSceneGraphChanged(ACG::SceneGraph::BaseNode*)),
                sceneGraphDialog_,    SLOT(update(ACG::SceneGraph::BaseNode*)));

        connect(sceneGraphDialog_, SIGNAL(signalNodeChanged(ACG::SceneGraph::BaseNode*)),
878
                examiner_widgets_[i], SLOT(updateGL()));
879
880
881
882
883
884
885
886
      }

    }

    sceneGraphDialog_->show();
  }
}

Jan Möbius's avatar
   
Jan Möbius committed
887
888
889
890
891
892
//-----------------------------------------------------------------------------

void
CoreWidget::sceneRectChanged(const QRectF &rect)
{
  centerWidget_->setGeometry (rect);
893
  slidingLogger_->updateGeometry ();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
894
  pickToolbar_->updateGeometry ();
Jan Möbius's avatar
   
Jan Möbius committed
895
896
}

Dirk Wilden's avatar
Dirk Wilden committed
897
898
899
900
901
902
//-----------------------------------------------------------------------------

void
CoreWidget::startVideoCaptureDialog(){

  VideoCaptureDialog* dialog = new VideoCaptureDialog();
903
  dialog->setModal(false);
Dirk Wilden's avatar
Dirk Wilden committed
904
905

  connect(dialog, SIGNAL(startVideoCapture(QString,int,bool)), this, SIGNAL(startVideoCapture(QString,int,bool)) );
906
907
908
  connect(dialog, SIGNAL(resizeViewers(int,int)), this, SIGNAL(resizeViewers(int,int)) );
  connect(dialog, SIGNAL(resizeApplication(int,int)), this, SIGNAL(resizeApplication(int,int)) );

Dirk Wilden's avatar
Dirk Wilden committed
909
910
  dialog->show();
}
Jan Möbius's avatar
   
Jan Möbius committed
911

912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
//-----------------------------------------------------------------------------

void CoreWidget::slotActivateExaminer()
{
  glViewer* examiner = dynamic_cast<glViewer*>(QObject::sender());

  if (!examiner)
    return;

  for ( uint i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {

    if (examiner == examiner_widgets_[i])
    {
      PluginFunctions::setActiveExaminer (i);
      break;
    }
  }
}
930

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
931
932
933
934
935
//-----------------------------------------------------------------------------

/// Use native or gl painted cursor
void CoreWidget::setGlCursor ( bool _state )
{
936
  cursorPainter_->setForceNative (!_state);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
937
}
938

Jan Möbius's avatar
 
Jan Möbius committed
939
//=============================================================================
940