CoreWidget.cc 36.3 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
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
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
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
#include <ACG/Scenegraph/SceneGraphAnalysis.hh>

Matthias Möller's avatar
doc    
Matthias Möller committed
71
72
73
74
// -------------------- Qt event Includes
#include <QEvent>
#include <QWhatsThisClickedEvent>

Jan Möbius's avatar
 
Jan Möbius committed
75
76
77
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

Jan Möbius's avatar
Jan Möbius committed
78
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
79

80
81
82
83
84
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
PickMode::PickMode(const std::string& _n, const bool _t, const bool _v, QCursor _c, QToolBar *_tb ) :
      name_(_n),
      tracking_(_t),
      visible_(_v),
      cursor_(_c),
      toolbar_(_tb)
{

}

void PickMode::visible(const bool _visible) {
  visible_ = _visible;
}

bool PickMode::visible() const  {
  return visible_;
}

std::string PickMode::name() const {
  return name_;
}

void PickMode::tracking(bool _tracking) {
  tracking_ = _tracking;
}

bool PickMode::tracking() const {
  return tracking_;
}

110
111
112
113
void PickMode::cursor(const QCursor _cursor) {
  cursor_ = _cursor;
}

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
QCursor PickMode::cursor() const{
  return cursor_;
}

void PickMode::toolbar(QToolBar* _toolbar) {
  toolbar_ = _toolbar;
}

QToolBar * PickMode::toolbar() const {
  return toolbar_;
}









134
/** \brief Constructor for the Core Widget
Jan Möbius's avatar
Jan Möbius committed
135
 *
Jan Möbius's avatar
 
Jan Möbius committed
136
137
*/
CoreWidget::
Dirk Wilden's avatar
Dirk Wilden committed
138
CoreWidget( QVector<ViewMode*>& _viewModes,
Dirk Wilden's avatar
Dirk Wilden committed
139
140
            std::vector<PluginInfo>& _plugins,
            QList< SlotInfo >& _coreSlots ) :
Jan Möbius's avatar
 
Jan Möbius committed
141
  QMainWindow(),
Dirk Wilden's avatar
Dirk Wilden committed
142
  coreSlots_(_coreSlots),
Dirk Wilden's avatar
Dirk Wilden committed
143
  shiftPressed_(false),
Jan Möbius's avatar
 
Jan Möbius committed
144
145
  viewModes_(_viewModes),
  viewModeButton_(0),
146
  viewModeMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
147
  splitter_(0),
148
  logWidget_(0),
Jan Möbius's avatar
 
Jan Möbius committed
149
  recentFilesMenu_(0),
150
  helpMenu_(0),
151
152
  windowMenu_(0),
  AC_ShowViewModeControls_(0),
153
  pickToolBarExternal_(0),
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
154
  cursorPainter_(0),
155
  sceneGraphDialog_(0),
156
157
158
  fileMenu_(0),
  viewMenu_(0),
  toolsMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
159
  fileMenuEnd_(0),
160
161
162
  stereoButton_(0),
  moveButton_(0),
  pickButton_(0),
Dirk Wilden's avatar
Dirk Wilden committed
163
  questionButton_(0),
164
  globalDrawMenu_(0),
165
166
  rendererMenu_(0),
  postprocessorMenu_(0),
167
  drawGroup_(0),
168
169
  rendererGroup_(0),
  postProcessorGroup_(0),
170
  viewGroup_(0),
171
  perspectiveProjectionAction_(0),
172
173
  activeDrawModes_(0),
  availableGlobalDrawModes_(0),
Jan Möbius's avatar
 
Jan Möbius committed
174
  contextMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
175
  contextSelectionMenu_(0),
176
177
  drawGroupViewer_(0),
  viewerDrawMenu_(0),
178
  coordSysMenu_(0),
179
  snapshotName_(""),
Dirk Wilden's avatar
Dirk Wilden committed
180
  snapshotCounter_(0),
Jan Möbius's avatar
 
Jan Möbius committed
181
  stackMenu_(0),
182
  helpWidget_(0),
183
  postProcessorDialog_(0),
Jan Möbius's avatar
Jan Möbius committed
184
  rendererDialog_(0),
Jan Möbius's avatar
Jan Möbius committed
185
  rendererObjectWidget_(0),
186
  stereoSettingsWidget_(0),
Jan Möbius's avatar
Jan Möbius committed
187
  aboutWidget_(0),
188
  optionsWidget_(0),
189
  plugins_(_plugins),
190
191
192
193
194
195
  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
196
{
Matthias Möller's avatar
doc    
Matthias Möller committed
197

Jan Möbius's avatar
 
Jan Möbius committed
198
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
199

Dirk Wilden's avatar
Dirk Wilden committed
200
201
  defaultIconSize_ = iconSize();

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
202
203
204
205
206
  toolSplitter_ = new QSplitter(Qt::Horizontal,this);

  setCentralWidget(toolSplitter_);

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

209
210
  QGLFormat format = QGLFormat::defaultFormat();

211
212
213
  #ifdef ARCH_DARWIN
  format.setStereo(false);
  #else
Jan Möbius's avatar
   
Jan Möbius committed
214
  format.setStereo( OpenFlipper::Options::stereo() );
215
  #endif
Jan Möbius's avatar
   
Jan Möbius committed
216
  format.setAlpha(true);
217
  format.setStencil(true);
218
219
  format.setSampleBuffers(true);
  QGLFormat::setDefaultFormat(format);
Jan Möbius's avatar
   
Jan Möbius committed
220
221

  // Construct GL context & widget
222
223
224
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

225
226
227
  // ===============================================================================
  // Test context capabilities ...
  // If we get stereo buffers, we use them .. which might disable multisampling
228
  // If we don't have stereo, we disable it to not interfere with multisampling
229
230
231
232
233
234
235
236
237
238
239
240
241
  // ===============================================================================
  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);
242
  PluginFunctions::shareGLWidget (glWidget_);
243

Jan Möbius's avatar
   
Jan Möbius committed
244
  glView_ = new QtGLGraphicsView(stackedWidget_);
245
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
   
Jan Möbius committed
246

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

Jan Möbius's avatar
   
Jan Möbius committed
250
251
252
  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);
253
  glView_->setFrameStyle(QFrame::NoFrame);
Jan Möbius's avatar
   
Jan Möbius committed
254

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
255
256
  // gl widget as parent to make sure that the CursorPainter will be deleted before
  cursorPainter_ = new CursorPainter (glWidget_);
Jan Möbius's avatar
Jan Möbius committed
257
  cursorPainter_->setForceNative (OpenFlipperSettings().value("Core/Gui/glViewer/nativeMouse",false).toBool() );
258
  cursorPainter_->setEnabled (stereoActive_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
259
  glScene_->setCursorPainter (cursorPainter_);
260

Jan Möbius's avatar
   
Jan Möbius committed
261
262
263
264
265
266
267
268
269
270
  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
271
272
273
  // ======================================================================
  // Set up the logging window
  // ======================================================================
274

275
  slidingLogger_ = new QtSlideWindow (tr("Log Viewer"), centerWidget_);
276

277
278
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
279
  logWidget_->resize( splitter_->width() ,240);
Jan Möbius's avatar
Jan Möbius committed
280

281
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
282
  loggerState_ = OpenFlipper::Options::Normal;
283

284
285
286
287
288
  QList<int> wsizes(splitter_->sizes());
  // Set initial values to have a usable state
  wsizes[0] = 480;
  wsizes[1] = 240;
  splitter_->setSizes(wsizes);
289

Jan Möbius's avatar
Jan Möbius committed
290
  if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene) {
291

292
    slidingLogger_->attachWidget (logWidget_);
293
    showLoggerInSplitView(false);
Jan Möbius's avatar
Jan Möbius committed
294
    loggerState_ = OpenFlipper::Options::InScene;
295

Jan Möbius's avatar
Jan Möbius committed
296
  } else if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::Hidden) {
297

298
    showLoggerInSplitView(false);
Jan Möbius's avatar
Jan Möbius committed
299
300
    loggerState_ = OpenFlipper::Options::Hidden;
  } else {
301
302

    showLoggerInSplitView(true);
Jan Möbius's avatar
 
Jan Möbius committed
303
  }
Jan Möbius's avatar
Jan Möbius committed
304

305

Jan Möbius's avatar
 
Jan Möbius committed
306
307
308
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
309

Jan Möbius's avatar
Jan Möbius committed
310
311
312
313
314
  // First we analyze the scenegraph
  unsigned int maxPases = 1;
  ACG::Vec3d bbmin,bbmax;
  ACG::SceneGraph::analyzeSceneGraph(PluginFunctions::getSceneGraphRootNode(),maxPases,bbmin,bbmax);

Jan Möbius's avatar
Jan Möbius committed
315
  if ( !OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {
Jan Möbius's avatar
Jan Möbius committed
316

Jan Möbius's avatar
   
Jan Möbius committed
317
    glViewer* examinerWidget = new glViewer(glScene_,
Jan Möbius's avatar
Jan Möbius committed
318
319
320
					                                  glWidget_,
					                                  PluginFunctions::viewerProperties(0),
					                                  centerWidget_);
Jan Möbius's avatar
Jan Möbius committed
321

Jan Möbius's avatar
Jan Möbius committed
322
323
    examiner_widgets_.push_back(examinerWidget);

Jan Möbius's avatar
Jan Möbius committed
324
    examinerWidget->sceneGraph( PluginFunctions::getSceneGraphRootNode(), maxPases,bbmin,bbmax );
Jan Möbius's avatar
Jan Möbius committed
325

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

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

Jan Möbius's avatar
Jan Möbius committed
330
331
332
  } else {


Jan Möbius's avatar
   
Jan Möbius committed
333
334
335
    // Create examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      glViewer* newWidget = new glViewer(glScene_,
Jan Möbius's avatar
Jan Möbius committed
336
					                               glWidget_,
337
                                         PluginFunctions::viewerProperties(i),
Jan Möbius's avatar
Jan Möbius committed
338
                                         centerWidget_);
Dirk Wilden's avatar
Dirk Wilden committed
339

Jan Möbius's avatar
Jan Möbius committed
340
      examiner_widgets_.push_back(newWidget);
341
342
343
344
345
346
347
348
349
350

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

351
      connect (&PluginFunctions::viewerProperties(i), SIGNAL( drawModeChanged(int)), this, SIGNAL(drawModeChanged(int)));
Jan Möbius's avatar
Jan Möbius committed
352
353
354
355
    }

    // Initialize all examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
Jan Möbius's avatar
Jan Möbius committed
356
      examiner_widgets_[i]->sceneGraph( PluginFunctions::getSceneGraphRootNode(), maxPases,bbmin,bbmax );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
357
      cursorPainter_->registerViewer (examiner_widgets_[i]);
Jan Möbius's avatar
Jan Möbius committed
358
359
    }

Jan Möbius's avatar
Jan Möbius committed
360
361
362
363
    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
364
365
  }

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

Jan Möbius's avatar
   
Jan Möbius committed
369
  centerWidget_->setLayout(baseLayout_);
370
371


Jan Möbius's avatar
 
Jan Möbius committed
372
373
374
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
375
376
377
378
379
380
381
382
  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* )));
383
384
    connect (examiner_widgets_[i], SIGNAL(signalMakeActive ()),
             this, SLOT(slotActivateExaminer()));
385
386
387

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


Jan Möbius's avatar
 
Jan Möbius committed
391
392
393
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
394

Jan Möbius's avatar
Jan Möbius committed
395
396
397
  mainToolbar_ = new QToolBar(tr("Main Toolbar"));
  mainToolbar_->setWindowTitle(tr("Main Toolbar"));
  mainToolbar_->setObjectName(tr("MainToolbar"));
398
  slotAddToolbar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
399

Jan Möbius's avatar
 
Jan Möbius committed
400
401
402
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
403

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

405
  // Create the toolbar
Jan Möbius's avatar
Jan Möbius committed
406
  viewerToolbar_ = new QToolBar( tr("Viewer Toolbar" ), this );
407
  viewerToolbar_->setOrientation(Qt::Vertical);
Jan Möbius's avatar
 
Jan Möbius committed
408
409
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Jan Möbius's avatar
Jan Möbius committed
410
  viewerToolbar_->setObjectName(tr("ViewerToolbar"));
411

Jan Möbius's avatar
Jan Möbius committed
412
  slotAddToolbar(viewerToolbar_);
Jan Möbius's avatar
Jan Möbius committed
413

414
415
416
417
  moveButton_ = new QToolButton( viewerToolbar_ );
  moveButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"transform-move.png") );
  moveButton_->setMinimumSize( 16, 16 );
  moveButton_->setMaximumSize( 32, 32 );
418
  moveButton_->setCheckable(true);
Jan Möbius's avatar
Jan Möbius committed
419
420
  moveButton_->setToolTip( tr("Switch to <b>move</b> mode.") );
  moveButton_->setWhatsThis(tr(
421
422
423
                  "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
424
                  "<li><b>Zoom</b> using <b>left+middle</b> mouse buttons.</li></ul>" ));
425
426

  connect( moveButton_,SIGNAL( clicked() ), this, SLOT( setExamineMode() ) );
427
/*
428
  connect( this, SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
429
            this, SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );*/
430

Jan Möbius's avatar
Jan Möbius committed
431
  viewerToolbar_->addWidget( moveButton_ )->setText(tr("Move"));
432
  moveButton_->setChecked(true);
433

434
  
435
436
437
438
  pickButton_ = new QToolButton( viewerToolbar_ );
  pickButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"pick.png") );
  pickButton_->setMinimumSize( 16, 16 );
  pickButton_->setMaximumSize( 32, 32 );
439
  pickButton_->setCheckable(true);
Jan Möbius's avatar
Jan Möbius committed
440
441
  pickButton_->setToolTip(tr("Switch to <b>picking</b> mode."));
  pickButton_->setWhatsThis(tr(
442
443
444
                  "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
445
                  "context menu in the viewer."));
446
  connect( pickButton_,SIGNAL( clicked() ), this, SLOT( setPickingMode() ) );
Jan Möbius's avatar
Jan Möbius committed
447
  viewerToolbar_->addWidget( pickButton_)->setText(tr("Pick"));
448
449
450
451
452
453


  questionButton_ = new QToolButton( viewerToolbar_ );
  questionButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"help-about.png") );
  questionButton_->setMinimumSize( 16, 16 );
  questionButton_->setMaximumSize( 32, 32 );
454
  questionButton_->setCheckable(true);
Jan Möbius's avatar
Jan Möbius committed
455
456
  questionButton_->setToolTip(tr("Switch to <b>identification</b> mode."));
  questionButton_->setWhatsThis(tr(
457
458
459
460
                  "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
461
                  "object."));
462
  connect( questionButton_,SIGNAL( clicked() ), this, SLOT( setQuestionMode() ) );
Jan Möbius's avatar
Jan Möbius committed
463
  viewerToolbar_->addWidget( questionButton_)->setText(tr("Question"));
464

465
466
467
468
469
470
471
472
  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: "
473
                  "<ul> "
474
				  "<li>Single viewer</li>"
Jan Möbius's avatar
Jan Möbius committed
475
          "<li>Double viewer</li>"
476
477
				  "<li>Multiple viewers (grid)</li>"
				  "<li>Multiple viewers (hsplit)</li>"
Jan Möbius's avatar
Jan Möbius committed
478
				  "</ul>"));
479

480
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"singleviewmode.png"), "");
Jan Möbius's avatar
Jan Möbius committed
481
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"doubleviewmode.png"), "");
482
483
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode1.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode2.png"), "");
484

485
  viewerLayoutBox_->setIconSize(QSize(22,22));
486

487
  connect( viewerLayoutBox_,SIGNAL( activated(int) ), this, SLOT( setViewerLayout(int) ) );
488

489
  viewerToolbar_->addWidget( viewerLayoutBox_ );
490

491
492
493
494
495
496
497
498
499
  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
500
    stereoButton_->setToolTip(tr( "Toggle stereo viewing"));
501
502
    // We want a custom context menu
    stereoButton_->setContextMenuPolicy(Qt::CustomContextMenu);
Jan Möbius's avatar
Jan Möbius committed
503
    stereoButton_->setWhatsThis(tr(
504
505
506
507
                  "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
508
                  "display/projection system."));
509
510
511
    connect( stereoButton_, SIGNAL( clicked() ), this , SLOT( slotToggleStereoMode() ) );
    // Custom context menu
    connect( stereoButton_, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(stereoButtonContextMenu(const QPoint &)));
Jan Möbius's avatar
Jan Möbius committed
512
    viewerToolbar_->addWidget( stereoButton_ )->setText( tr("Stereo"));
513
  }
514
515


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

Jan Möbius's avatar
 
Jan Möbius committed
518
519
  // Remember logger size
  wsizes = splitter_->sizes();
520
521
522
523
524
525

  if(wsizes.size() > 1) {
    originalLoggerSize_  = wsizes[1];
  } else {
    originalLoggerSize_ = 240;
  }
Jan Möbius's avatar
Jan Möbius committed
526

Jan Möbius's avatar
 
Jan Möbius committed
527
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
528
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
529
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
530
531
532

  toolBoxArea_ = new QWidget (toolSplitter_);

533
  viewModeControlBox_ = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
534
535
536

  QHBoxLayout *hLayout = new QHBoxLayout;

Jan Möbius's avatar
Jan Möbius committed
537
538
  vmChangeButton_ = new QPushButton(tr("Change View Mode"));
  QPushButton* vmEditButton   = new QPushButton(tr("Edit View Modes"));
539

Jan Möbius's avatar
Jan Möbius committed
540
541
  hLayout->addWidget(vmChangeButton_);
  hLayout->addWidget(vmEditButton);
542
  viewModeControlBox_->setLayout (hLayout);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
543

Jan Möbius's avatar
Jan Möbius committed
544
545
  connect(vmChangeButton_, SIGNAL(clicked()), this, SLOT(slotViewChangeDialog()));
  connect(vmEditButton, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
546
547
548
549
550
551
552
553

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

  QVBoxLayout *vLayout = new QVBoxLayout;
554
  vLayout->addWidget(viewModeControlBox_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
555
  vLayout->addWidget(toolBoxScroll_);
556
557
558
  
  if ( OpenFlipperSettings().value("Core/Gui/TaskSwitcher/Hide",false).toBool() )
    viewModeControlBox_->hide();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
559
560
561
562
563

  toolBoxArea_->setLayout (vLayout);

  wsizes = toolSplitter_->sizes();

564
  // if the toolbox should be on the right, use the defaults. Otherwise, we have to reorder them.
Jan Möbius's avatar
Jan Möbius committed
565
  if ( OpenFlipperSettings().value("Core/Gui/ToolBoxes/ToolBoxOnTheRight", true).toBool() ) {
566

567
568
569
570
571
    // Set relative sizes of windows
    wsizes[0] = 480;
    wsizes[1] = 240;
    toolSplitter_->setSizes(wsizes);  
  } else {
572

573
574
575
576
577
578
579
580
581
582
    // Show tool box on the left side of the main window
    toolSplitter_->insertWidget(0, toolBoxArea_);
    toolSplitter_->insertWidget(1, splitter_);

    // Default sizes are swaped when toolbox is on the left.
    wsizes[0] = 240;
    wsizes[1] = 480;
    toolSplitter_->setSizes(wsizes);
  }
  
Jan Möbius's avatar
 
Jan Möbius committed
583
584
585
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
586

Jan Möbius's avatar
Jan Möbius committed
587
588
589
590
  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
591

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

Jan Möbius's avatar
 
Jan Möbius committed
595
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
596

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

599
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
600

601
  setExamineMode();
602
603
604

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

605
606
607
608
  // Create stereo settings widget
  stereoSettingsWidget_ = new StereoSettingsWidget(this);
  // Make it look like a dialog
  stereoSettingsWidget_->setWindowFlags(Qt::Popup);
609
610
  // Connect combo boxes and sliders to local slots
  connect(stereoSettingsWidget_->stereoOpengl, SIGNAL(clicked()),
611
          this, SLOT(slotApplyStereoSettings()));
612
613
614
615
616
  connect(stereoSettingsWidget_->stereoAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->stereoCustomAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));

617
618
  connect(stereoSettingsWidget_->focalDistance, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
619
620
621
622
623
624
  connect(stereoSettingsWidget_->eyeDistance, SIGNAL(editingFinished()),
          this, SLOT(slotApplyStereoSettings()));

  // Close button
  connect(stereoSettingsWidget_->closeButton, SIGNAL(clicked()),
          stereoSettingsWidget_, SLOT(hide()));
625
626
627
628
629
630


  // ======================================================================
  // Help Browser start up
  // ======================================================================

631
  helpWidget_ = new HelpWidget(this,homePage_,false);
Matthias Möller's avatar
doc    
Matthias Möller committed
632
633
  connect(this, SIGNAL(changeHelpSite(QUrl)), helpWidget_, SLOT(activateLink(QUrl)));
  helpWidget_->hide();
634

Jan Möbius's avatar
Jan Möbius committed
635
636
637
638

  // Add the core license information about used libraries
  addCoreLicenseInfo();

Jan Möbius's avatar
 
Jan Möbius committed
639
640
641
642
643
644
645
}


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


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

Jan Möbius's avatar
 
Jan Möbius committed
647
648
649
650
651
652
653
654
}

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

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

656
  bool fullScreen = OpenFlipperSettings().value("Core/Gui/fullscreen", false ).toBool();
Dirk Wilden's avatar
Dirk Wilden committed
657

658
  setFullscreen( !fullScreen );
Jan Möbius's avatar
 
Jan Möbius committed
659
660
661
662
}

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

663
664
665
666
667
668
669
670
671
672
673
/** 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);
  }

Jan Möbius's avatar
Jan Möbius committed
674
  OpenFlipperSettings().setValue("Core/Gui/fullscreen", bool( windowState() & Qt::WindowFullScreen) );
675
676

  show();
677
678

  emit fullScreenChanged( _state );
679
680
}

681
682
683
684
685
686
687
688
689
690
//-----------------------------------------------------------------------------

void 
CoreWidget::showViewModeControls(bool _show) {
  // Only change if the actual setting has changed!
  if ( OpenFlipper::Options::gui() && ( !_show != OpenFlipperSettings().value("Core/Gui/TaskSwitcher/Hide",false).toBool() ) ) {
  
    // Update setting in Conf storage
    OpenFlipperSettings().setValue("Core/Gui/TaskSwitcher/Hide",!_show);
    
691
692
693
694
695
    // Update The Checkbox in the Menu
    AC_ShowViewModeControls_->blockSignals(true);
    AC_ShowViewModeControls_->setChecked( _show  );
    AC_ShowViewModeControls_->blockSignals(false);
    
696
697
698
699
700
701
702
703
704
705
    if ( _show ) {
      viewModeControlBox_->show();
    } else {
      viewModeControlBox_->hide();
    }
    
  }
  
}

Jan Möbius's avatar
 
Jan Möbius committed
706
707
708
709
710
711
//-----------------------------------------------------------------------------

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

Jan Möbius's avatar
 
Jan Möbius committed
713
  //toggle
Jan Möbius's avatar
Jan Möbius committed
714
  showToolbox( OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
715

716
717
718
719
720
721
722
723
724
725
}

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

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

  //toggle
Jan Möbius's avatar
Jan Möbius committed
726
  OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/hidden",!_state);
Jan Möbius's avatar
 
Jan Möbius committed
727

Jan Möbius's avatar
Jan Möbius committed
728
  if ( OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() ){
Jan Möbius's avatar
 
Jan Möbius committed
729
730

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
731
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
732
733

  }else{
734
    //show last view mode
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
735
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
736
  }
737
  emit toolBoxVisChanged(_state);
Jan Möbius's avatar
 
Jan Möbius committed
738
}
739
//-----------------------------------------------------------------------------
740
void CoreWidget::showMenuBar( bool _state )
741
{
742
743
744
745
746
  OpenFlipperSettings().setValue("Core/Gui/MenuBar/hidden",!_state);

  if ( _state ){

    //hide ViewMode Selection Widget
747
    menuBar()->show();
748
749
750

  }else{
    //show last view mode
751
    menuBar()->hide();
752
753
  }
  emit menuBarVisChanged(_state);
754
755
}
//-----------------------------------------------------------------------------
756
757
/// Show or hide toolbar
void CoreWidget::showToolBar( bool _state )
758
{
759
760
  OpenFlipperSettings().setValue("Core/Gui/Toolbar/hidden",!_state);
  if ( !_state )
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
  {
    //hide main toolbar
    if ( ! mainToolbar_->isFloating() )
      mainToolbar_->hide();

    //hide viewer toolbar
    if ( ! viewerToolbar_->isFloating() )
      viewerToolbar_->hide();

    for (uint p=0; p < plugins_.size(); p++)
      for ( uint j = 0 ; j < plugins_[p].toolbars.size(); ++j ) {
        if ( ! plugins_[p].toolbars[j].second->isFloating() )
          plugins_[p].toolbars[j].second->hide();
      }
  }
  else
  {
    //show toolbars
    setViewMode( OpenFlipper::Options::currentViewMode() );
  }
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
  emit toolBarVisChanged(_state);
}
//-----------------------------------------------------------------------------
/// Hide or show menubar
void CoreWidget::toggleMenuBar()
{
  bool hidden = OpenFlipperSettings().value("Core/Gui/MenuBar/hidden",false).toBool();
  showMenuBar( hidden );
}

//-----------------------------------------------------------------------------
/// Hide or show current toolbar
void CoreWidget::toggleToolBar()
{
  bool hidden = OpenFlipperSettings().value("Core/Gui/Toolbar/hidden",false).toBool();
  showToolBar( hidden );
797
}
Jan Möbius's avatar
Jan Möbius committed
798

799

800
801
//=============================================================================

802
void CoreWidget::setToolBoxOrientationOnTheRight(bool _toolBoxRight) {
803
  QList<int> wsizes;
Jan Möbius's avatar
Jan Möbius committed
804
  
805
806
  // Is toolbox currently on the right hand side?
  bool currentstate = toolSplitter_->widget(1) == toolBoxArea_;
Jan Möbius's avatar
Jan Möbius committed
807
808
  
  if ( _toolBoxRight != currentstate ) {
809
    
Jan Möbius's avatar
Jan Möbius committed
810
811
812
813
814
815
816
817
818
819
820
    if(_toolBoxRight ) {
      
      // Show tool box on the right side of the main window
      toolSplitter_->insertWidget(0, splitter_);
      toolSplitter_->insertWidget(1, toolBoxArea_);
    } else {
      
      // Show tool box on the left side of the main window
      toolSplitter_->insertWidget(0, toolBoxArea_);
      toolSplitter_->insertWidget(1, splitter_);
    }
821
    
Jan Möbius's avatar
Jan Möbius committed
822
    // Store new setting
Jan Möbius's avatar
Jan Möbius committed
823
    OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/ToolBoxOnTheRight",_toolBoxRight);
824
    
Jan Möbius's avatar
Jan Möbius committed
825
826
    // remove the windowstates definition for the toolboxes, as it changed anyway.
    QSettings windowStates(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
827
                            OpenFlipper::Options::dirSeparator() +  "WindowStates.dat", QSettings::IniFormat);
Jan Möbius's avatar
Jan Möbius committed
828
829
    
    windowStates.value("Core/ToolSplitter");
830
831
832
    
  }
  
Jan Möbius's avatar
Jan Möbius committed
833

834
835
836
837
838
    
  toolSplitter_->refresh();
}
      

Jan Möbius's avatar
 
Jan Möbius committed
839
840
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
841
842
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
843
{
844
  //dont add objects to recentMenu while loadind Settings
845
  if ( OpenFlipper::Options::sceneGraphUpdatesBlocked() ) return;
Jan Möbius's avatar
Jan Möbius committed
846

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

Jan Möbius's avatar
 
Jan Möbius committed
849
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
850
851
852
853
854
855
856

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
857
858
859
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
860

Jan Möbius's avatar
 
Jan Möbius committed
861
862
  recentFilesMenu_->clear();

863
864
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
865

Jan Möbius's avatar
 
Jan Möbius committed
866
  for (int i = 0 ; i < recentFiles.size() ; ++i ) {
867

868
    QFileInfo fi(recentFiles[i]);
869

870
871
872
873
    QAction* newAction = 0;

    if (fi.suffix() == "ini") {
      newAction = recentFilesMenu_->addAction(QIcon(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator()+"Settings-Icon.png"), recentFiles[i]);
874
      newAction->setData( QVariant( QString("Unknown") ) );
875
876
877
878
    } else {
      newAction = recentFilesMenu_->addAction(typeIcon( typeId(recentTypes[i]) ), recentFiles[i]);
      newAction->setData( QVariant( recentTypes[i]) );
    }
879

Jan Möbius's avatar
 
Jan Möbius committed
880
881
  }

Jan Möbius's avatar
Jan Möbius committed
882
883
884
}

void
Jan Möbius's avatar
 
Jan Möbius committed
885
886
887
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
888
889

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

891
892
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
893

894
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
895
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
896
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
897
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
898
899
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
900
901

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

Jan Möbius's avatar
Jan Möbius committed
904
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
905
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
906
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
907
908
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
909
910
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
911

912
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
913

914
}
Jan Möbius's avatar
Jan Möbius committed
915

916
void CoreWidget::nextViewerLayout() {
917

Jan Möbius's avatar
Jan Möbius committed
918
919
920
921
922
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {

    switch (baseLayout_->mode()) {
      case QtMultiViewLayout::SingleView:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
Jan Möbius's avatar
Jan Möbius committed
923
              baseLayout_->setMode(QtMultiViewLayout::DoubleView);
Jan Möbius's avatar
Jan Möbius committed
924
925
926
927

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(1);
              break;
Jan Möbius's avatar
Jan Möbius committed
928
929
930
931
932
933
934
      case QtMultiViewLayout::DoubleView:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::Grid);

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(2);
              break;
Jan Möbius's avatar
Jan Möbius committed
935
936
937
938
939
      case QtMultiViewLayout::Grid:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::HSplit);

              // Update combo box in the toolbar
Jan Möbius's avatar
Jan Möbius committed
940
              viewerLayoutBox_->setCurrentIndex(3);
Jan Möbius's avatar
Jan Möbius committed
941
942
943
944
945
946
947
948
949
950
              break;
      case QtMultiViewLayout::HSplit:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::SingleView);

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(0);
              break;
      }
  }
951
952
953
954
}


void
955
CoreWidget::setViewerLayout(int _idx) {
956

Jan Möbius's avatar
Jan Möbius committed
957
958
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {

959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
    switch (_idx) {
      case 0:
        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
        baseLayout_->setMode(QtMultiViewLayout::SingleView);
        break;
      case 1:
        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
        baseLayout_->setMode(QtMultiViewLayout::DoubleView);
        break;
      case 2:
        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
        baseLayout_->setMode(QtMultiViewLayout::Grid);
        break;
      case 3:
        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
        baseLayout_->setMode(QtMultiViewLayout::HSplit);
        break;
      default:
        emit log(LOGERR,tr("Requested illegal multiview mode!"));
    }
979
980

    viewerLayoutBox_->setCurrentIndex(_idx);
Jan Möbius's avatar
Jan Möbius committed
981
  }
982

983
}
Jan Möbius's avatar
 
Jan Möbius committed
984

985
986
987
988
989
990
991
992
993
994
995
996
997
998
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*)),
999
                examiner_widgets_[i], SLOT(updateGL()));
1000
1001
1002
1003
      }

    }

1004
    sceneGraphDialog_->setGeneratorMap(PluginFunctions::getSceneGraphGeneratorList() );
1005
1006
1007
1008
    sceneGraphDialog_->show();
  }
}

Jan Möbius's avatar
   
Jan Möbius committed
1009
1010
1011
//-----------------------------------------------------------------------------

void
1012
CoreWidget::sceneRectChanged(const QRectF &rect)
Jan Möbius's avatar
   
Jan Möbius committed
1013
{
1014
1015
  centerWidget_->setGeometry (rect);
  slidingLogger_->updateGeometry ();
Jan Möbius's avatar
   
Jan Möbius committed
1016
1017
}

Dirk Wilden's avatar
Dirk Wilden committed
1018
1019
1020
1021
1022
1023
//-----------------------------------------------------------------------------

void
CoreWidget::startVideoCaptureDialog(){

  VideoCaptureDialog* dialog = new VideoCaptureDialog();
1024
  dialog->setModal(false);
Dirk Wilden's avatar
Dirk Wilden committed
1025
1026

  connect(dialog, SIGNAL(startVideoCapture(QString,int,bool)), this, SIGNAL(startVideoCapture(QString,int,bool)) );
1027
1028
1029
  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
1030
1031
  dialog->show();
}
Jan Möbius's avatar
   
Jan Möbius committed
1032

1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
//-----------------------------------------------------------------------------

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;
    }
  }
}