CoreWidget.cc 30.7 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
 
Jan Möbius committed
67
68
69
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

Jan Möbius's avatar
Jan Möbius committed
70
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
71

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

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
126
127
128
129
130
  toolSplitter_ = new QSplitter(Qt::Horizontal,this);

  setCentralWidget(toolSplitter_);

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

133
134
  QGLFormat format = QGLFormat::defaultFormat();

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

  // Construct GL context & widget
146
147
148
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  // ===============================================================================
  // 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);
166
  PluginFunctions::shareGLWidget (glWidget_);
167

Jan Möbius's avatar
   
Jan Möbius committed
168
  glView_ = new QtGLGraphicsView(stackedWidget_);
169
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
   
Jan Möbius committed
170

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

Jan Möbius's avatar
   
Jan Möbius committed
174
175
176
177
  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);

178

179

Jan Möbius's avatar
   
Jan Möbius committed
180
181
182
183
184
185
186
187
188
189
  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
190
191
192
  // ======================================================================
  // Set up the logging window
  // ======================================================================
193
194
195
196

  slidingLogger_ = new QtSlideWindow ("Log Viewer", centerWidget_);
  tempLogWidget = new QWidget;

197
198
199
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setReadOnly(true);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
200
  logWidget_->resize( splitter_->width() ,240);
201
  logWidget_->setLineWrapMode( QTextEdit::NoWrap );
Jan Möbius's avatar
Jan Möbius committed
202

203
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
204
  loggerState_ = OpenFlipper::Options::Normal;
205

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

Jan Möbius's avatar
Jan Möbius committed
208
  if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene) {
209
210
    slidingLogger_->attachWidget (logWidget_);
    splitter_->insertWidget (1, tempLogWidget);
211
    wsizes[0] = 1;
Jan Möbius's avatar
 
Jan Möbius committed
212
213
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
Jan Möbius committed
214
    loggerState_ = OpenFlipper::Options::InScene;
215
    baseLayout_->setContentsMargins (0, 0, 0, 16);
Jan Möbius's avatar
Jan Möbius committed
216
217
218
219
220
221
222
223
224
225
226
  } 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
227
  }
Jan Möbius's avatar
Jan Möbius committed
228

229

Jan Möbius's avatar
 
Jan Möbius committed
230
231
232
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
233
234
235

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

Jan Möbius's avatar
   
Jan Möbius committed
236
237
    glViewer* examinerWidget = new glViewer(glScene_,
					    glWidget_,
238
                                            PluginFunctions::viewerProperties(0),
239
					    centerWidget_);
Jan Möbius's avatar
Jan Möbius committed
240

Jan Möbius's avatar
Jan Möbius committed
241
242
243
    examiner_widgets_.push_back(examinerWidget);

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

Jan Möbius's avatar
Jan Möbius committed
245
    baseLayout_->addItem(examinerWidget, 0);
Jan Möbius's avatar
Jan Möbius committed
246
247
248
249

  } else {


Jan Möbius's avatar
   
Jan Möbius committed
250
251
252
253
    // Create examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      glViewer* newWidget = new glViewer(glScene_,
					 glWidget_,
254
                                         PluginFunctions::viewerProperties(i),
255
					 centerWidget_);
Dirk Wilden's avatar
Dirk Wilden committed
256

Jan Möbius's avatar
Jan Möbius committed
257
      examiner_widgets_.push_back(newWidget);
258
259
260
261
262
263
264
265
266
267

      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
268
269
270
271
272
273
274
    }

    // Initialize all examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      examiner_widgets_[i]->sceneGraph( PluginFunctions::getSceneGraphRootNode() );
    }

Jan Möbius's avatar
Jan Möbius committed
275
276
277
278
    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
279
280
  }

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

Jan Möbius's avatar
   
Jan Möbius committed
284
  centerWidget_->setLayout(baseLayout_);
285
286


Jan Möbius's avatar
 
Jan Möbius committed
287
288
289
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
290
291
292
293
294
295
296
297
  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* )));
298
299
    connect (examiner_widgets_[i], SIGNAL(signalMakeActive ()),
             this, SLOT(slotActivateExaminer()));
300
301
302

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


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

Jan Möbius's avatar
Jan Möbius committed
310
311
312
  mainToolbar_ = new QToolBar(tr("Main Toolbar"));
  mainToolbar_->setWindowTitle(tr("Main Toolbar"));
  mainToolbar_->setObjectName(tr("MainToolbar"));
313
  slotAddToolbar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
314

Jan Möbius's avatar
 
Jan Möbius committed
315
316
317
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
318

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

320
  // Create the toolbar
Jan Möbius's avatar
Jan Möbius committed
321
  viewerToolbar_ = new QToolBar( tr("Viewer Toolbar" ), this );
322
  viewerToolbar_->setOrientation(Qt::Vertical);
Jan Möbius's avatar
 
Jan Möbius committed
323
324
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Jan Möbius's avatar
Jan Möbius committed
325
  viewerToolbar_->setObjectName(tr("ViewerToolbar"));
Jan Möbius's avatar
Jan Möbius committed
326

327
328
329
330
  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
331
332
  moveButton_->setToolTip( tr("Switch to <b>move</b> mode.") );
  moveButton_->setWhatsThis(tr(
333
334
335
                  "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
336
                  "<li><b>Zoom</b> using <b>left+middle</b> mouse buttons.</li></ul>" ));
337
338

  connect( moveButton_,SIGNAL( clicked() ), this, SLOT( setExamineMode() ) );
339
/*
340
  connect( this, SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
341
            this, SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );*/
342

Jan Möbius's avatar
Jan Möbius committed
343
  viewerToolbar_->addWidget( moveButton_ )->setText(tr("Move"));
344
345
346
347
348
349
350
  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
351
352
  lightButton_->setToolTip(tr("Switch to <b>light</b> mode."));
  lightButton_->setWhatsThis(tr(
353
                  "Switch to <b>light</b> mode.<br>"
Jan Möbius's avatar
Jan Möbius committed
354
                  "Rotate lights using left mouse button."));
355
356

  connect( lightButton_,SIGNAL( clicked() ), this, SLOT( setLightMode() ) );
Jan Möbius's avatar
Jan Möbius committed
357
  viewerToolbar_->addWidget( lightButton_)->setText(tr("Light"));
358
359
360
361
362
363


  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
364
365
  pickButton_->setToolTip(tr("Switch to <b>picking</b> mode."));
  pickButton_->setWhatsThis(tr(
366
367
368
                  "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
369
                  "context menu in the viewer."));
370
  connect( pickButton_,SIGNAL( clicked() ), this, SLOT( setPickingMode() ) );
Jan Möbius's avatar
Jan Möbius committed
371
  viewerToolbar_->addWidget( pickButton_)->setText(tr("Pick"));
372
373
374
375
376
377


  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
378
379
  questionButton_->setToolTip(tr("Switch to <b>identification</b> mode."));
  questionButton_->setWhatsThis(tr(
380
381
382
383
                  "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
384
                  "object."));
385
  connect( questionButton_,SIGNAL( clicked() ), this, SLOT( setQuestionMode() ) );
Jan Möbius's avatar
Jan Möbius committed
386
  viewerToolbar_->addWidget( questionButton_)->setText(tr("Question"));
387

388
389
390
  viewmodeBox_ = new QComboBox( viewerToolbar_ );
  viewmodeBox_->setMinimumSize( 32, 16 );
  viewmodeBox_->setMaximumSize( 64, 32 );
Jan Möbius's avatar
Jan Möbius committed
391
392
  viewmodeBox_->setToolTip(tr("Switch <b>view mode</b>."));
  viewmodeBox_->setWhatsThis(tr(
393
394
395
396
397
398
399
                  "Switch <b>view mode</b>.<br>"
                  "Select the desired view mode. "
                  "Possible modes are: "
                  "<ul> "
				  "<li>Single view mode</li>"
				  "<li>Multi view mode (grid)</li>"
				  "<li>Multi view mode (hsplit)</li>"
Jan Möbius's avatar
Jan Möbius committed
400
				  "</ul>"));
401
402
403
404
405

  viewmodeBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"singleviewmode.png"), "");
  viewmodeBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode1.png"), "");
  viewmodeBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode2.png"), "");

406
  viewmodeBox_->setIconSize(QSize(22,22));
407
408
409
410
411

  connect( viewmodeBox_,SIGNAL( activated(int) ), this, SLOT( setViewMode(int) ) );

  viewerToolbar_->addWidget( viewmodeBox_ );

412
413
414
415
416
417
418
419
420
  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
421
422
    stereoButton_->setToolTip(tr( "Toggle stereo viewing"));
    stereoButton_->setWhatsThis(tr(
423
424
425
426
                  "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
427
                  "display/projection system."));
428
    connect( stereoButton_,SIGNAL( clicked() ), this , SLOT( slotToggleStereoMode() ) );
Jan Möbius's avatar
Jan Möbius committed
429
    viewerToolbar_->addWidget( stereoButton_ )->setText( tr("Stereo"));
430
  }
431
432


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

Jan Möbius's avatar
 
Jan Möbius committed
435
436
437
  // Remember logger size
  wsizes = splitter_->sizes();
  originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
438

Jan Möbius's avatar
 
Jan Möbius committed
439
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
440
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
441
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
442
443
444

  toolBoxArea_ = new QWidget (toolSplitter_);

Jan Möbius's avatar
Jan Möbius committed
445
  QGroupBox *gb = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
446
447
448

  QHBoxLayout *hLayout = new QHBoxLayout;

Jan Möbius's avatar
Jan Möbius committed
449
  QPushButton* vmButton = new QPushButton(tr("Change View Mode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  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
473
474
475
476
477
  // ======================================================================
  // Create pick ToolBar
  // ======================================================================

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

Jan Möbius's avatar
 
Jan Möbius committed
479
480
481
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
482

Jan Möbius's avatar
Jan Möbius committed
483
484
485
486
  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
487

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

Jan Möbius's avatar
 
Jan Möbius committed
491
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
492

Jan Möbius's avatar
 
Jan Möbius committed
493
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
494

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

497
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
498

499
  setExamineMode();
500
501
502

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

Jan Möbius's avatar
 
Jan Möbius committed
503
504
505
506
507
508
509
}


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


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

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

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

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

520
521
522
523
  setWindowState( windowState() ^  Qt::WindowFullScreen);

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

Jan Möbius's avatar
 
Jan Möbius committed
524
525
526
527
528
  show();
}

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

529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
/** 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
547
548
549
550
/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
Jan Möbius's avatar
Jan Möbius committed
551
552
553
554
555
556
557
558
559
560
561
562
563

  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
564

565
  // Hide/Show Logger
Jan Möbius's avatar
Jan Möbius committed
566
  showLogger( OpenFlipper::Options::loggerState() );
567
568
569
570
571
}

/** Hide or show logger
  */
void
Jan Möbius's avatar
Jan Möbius committed
572
CoreWidget::showLogger(OpenFlipper::Options::LoggerState _state) {
Jan Möbius's avatar
 
Jan Möbius committed
573
  //Hide Logger
Jan Möbius's avatar
Jan Möbius committed
574
575
576
  if (_state == loggerState_)
    return;

577
578
579
  qreal left, top, right, bottom;
  baseLayout_->getContentsMargins (&left, &top, &right, &bottom);

Jan Möbius's avatar
Jan Möbius committed
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
  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_);
599
        baseLayout_->setContentsMargins (left, top, right, 16);
Jan Möbius's avatar
Jan Möbius committed
600
601
602
603
604
605
606
607
608
609
610
611
612
613
      }
      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_);
614
        logWidget_->show ();
Jan Möbius's avatar
Jan Möbius committed
615
616
617
618

        wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
        wsizes[1] = originalLoggerSize_;
        splitter_->setSizes(wsizes);
619
        baseLayout_->setContentsMargins (left, top, right, 0);
Jan Möbius's avatar
Jan Möbius committed
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
      }
      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);
640
        baseLayout_->setContentsMargins (left, top, right, 0);
Jan Möbius's avatar
Jan Möbius committed
641
642
643
644
645
646
      }
      break;
  }
  loggerState_ = _state;

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

Jan Möbius's avatar
 
Jan Möbius committed
650
651
    // Remember old size
    originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
652

653
654
655
    int height = logWidget_->height ();

    splitter_->insertWidget (1, tempLogWidget);
Jan Möbius's avatar
 
Jan Möbius committed
656
657
658
    wsizes[0] = wsizes[0]+wsizes[1];
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
    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
675
  } else {
Jan Möbius's avatar
Jan Möbius committed
676

677
678
679
680
681
682
683
684
685
686
    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
687
  }
Jan Möbius's avatar
Jan Möbius committed
688
  */
Jan Möbius's avatar
 
Jan Möbius committed
689
690
691
692
693
694
695
696
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
698
  //toggle
699
700
701
702
703
704
705
706
707
708
709
710
  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
711

Jan Möbius's avatar
Jan Möbius committed
712
  if ( OpenFlipper::Options::hideToolbox() ){
Jan Möbius's avatar
 
Jan Möbius committed
713
714

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
715
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
716
717
718
719
720
721
722

  }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
723
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
724
725
  }
}
Jan Möbius's avatar
Jan Möbius committed
726

Jan Möbius's avatar
 
Jan Möbius committed
727
728
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
729
730
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
731
{
732
733
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
734

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

Jan Möbius's avatar
 
Jan Möbius committed
737
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
738
739
740
741
742
743
744

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
745
746
747
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
748

Jan Möbius's avatar
 
Jan Möbius committed
749
750
751
752
753
  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();
754
755
756
757
758
759
760
    
    QFileInfo fi(recentFiles[i].filename); 

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

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

Jan Möbius's avatar
Jan Möbius committed
765
766
767
}

void
Jan Möbius's avatar
 
Jan Möbius committed
768
769
770
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
771
772

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

774
775
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
776

777
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
778
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
779
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
780
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
781
782
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
783
784

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

Jan Möbius's avatar
Jan Möbius committed
787
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
788
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
789
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
790
791
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
792
793
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
794

795
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
796

797
}
Jan Möbius's avatar
Jan Möbius committed
798

799
800
801
void CoreWidget::nextViewMode() {

	if (OpenFlipper::Options::multiView()) {
Jan Möbius's avatar
Jan Möbius committed
802
		emit log(tr("Switch MultiView mode"));
803
804
805

		switch (baseLayout_->mode()) {
		case QtMultiViewLayout::SingleView:
806
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
807
			baseLayout_->setMode(QtMultiViewLayout::Grid);
808
809
810

			// Update combo box in the toolbar
			viewmodeBox_->setCurrentIndex(1);
811
812
			break;
		case QtMultiViewLayout::Grid:
813
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
814
			baseLayout_->setMode(QtMultiViewLayout::HSplit);
815
816
817

			// Update combo box in the toolbar
			viewmodeBox_->setCurrentIndex(2);
818
819
			break;
		case QtMultiViewLayout::HSplit:
820
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
821
			baseLayout_->setMode(QtMultiViewLayout::SingleView);
822
823
824

			// Update combo box in the toolbar
			viewmodeBox_->setCurrentIndex(0);
825
826
827
828
829
830
831
832
833
834
			break;
		}
	}
}


void
CoreWidget::setViewMode(int _idx) {

	if (OpenFlipper::Options::multiView()) {
Jan Möbius's avatar
Jan Möbius committed
835
		emit log(tr("Switch MultiView mode"));
836
837
838

		switch (_idx) {
		case 0:
839
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
840
841
842
			baseLayout_->setMode(QtMultiViewLayout::SingleView);
			break;
		case 1:
843
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
844
845
846
			baseLayout_->setMode(QtMultiViewLayout::Grid);
			break;
		case 2:
847
                        baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
848
849
850
851
852
			baseLayout_->setMode(QtMultiViewLayout::HSplit);
			break;
		}
	}
}
Jan Möbius's avatar
 
Jan Möbius committed
853

854
855
856
857
858
859
860
861
862
863
864
865
866
867
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*)),
868
                examiner_widgets_[i], SLOT(updateGL()));
869
870
871
872
873
874
875
876
      }

    }

    sceneGraphDialog_->show();
  }
}

Jan Möbius's avatar
   
Jan Möbius committed
877
878
879
880
881
882
//-----------------------------------------------------------------------------

void
CoreWidget::sceneRectChanged(const QRectF &rect)
{
  centerWidget_->setGeometry (rect);
883
  slidingLogger_->updateGeometry ();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
884
  pickToolbar_->updateGeometry ();
Jan Möbius's avatar
   
Jan Möbius committed
885
886
}

Dirk Wilden's avatar
Dirk Wilden committed
887
888
889
890
891
892
//-----------------------------------------------------------------------------

void
CoreWidget::startVideoCaptureDialog(){

  VideoCaptureDialog* dialog = new VideoCaptureDialog();
893
  dialog->setModal(false);
Dirk Wilden's avatar
Dirk Wilden committed
894
895

  connect(dialog, SIGNAL(startVideoCapture(QString,int,bool)), this, SIGNAL(startVideoCapture(QString,int,bool)) );
896
897
898
  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
899
900
  dialog->show();
}
Jan Möbius's avatar
   
Jan Möbius committed
901

902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
//-----------------------------------------------------------------------------

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


Jan Möbius's avatar
 
Jan Möbius committed
922
//=============================================================================
923