CoreWidget.cc 38.7 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
71
#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

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

74
75
76
77
78
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
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_;
}

104
105
106
107
void PickMode::cursor(const QCursor _cursor) {
  cursor_ = _cursor;
}

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
QCursor PickMode::cursor() const{
  return cursor_;
}

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

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









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

Dirk Wilden's avatar
Dirk Wilden committed
188
189
  defaultIconSize_ = iconSize();

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
190
191
192
193
194
  toolSplitter_ = new QSplitter(Qt::Horizontal,this);

  setCentralWidget(toolSplitter_);

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

197
198
  QGLFormat format = QGLFormat::defaultFormat();

199
200
201
  #ifdef ARCH_DARWIN
  format.setStereo(false);
  #else
Jan Möbius's avatar
   
Jan Möbius committed
202
  format.setStereo( OpenFlipper::Options::stereo() );
203
  #endif
Jan Möbius's avatar
   
Jan Möbius committed
204
  format.setAlpha(true);
205
  format.setStencil(true);
206
207
  format.setSampleBuffers(true);
  QGLFormat::setDefaultFormat(format);
Jan Möbius's avatar
   
Jan Möbius committed
208
209

  // Construct GL context & widget
210
211
212
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

213
214
215
  // ===============================================================================
  // Test context capabilities ...
  // If we get stereo buffers, we use them .. which might disable multisampling
216
  // If we don't have stereo, we disable it to not interfere with multisampling
217
218
219
220
221
222
223
224
225
226
227
228
229
  // ===============================================================================
  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);
230
  PluginFunctions::shareGLWidget (glWidget_);
231

Jan Möbius's avatar
   
Jan Möbius committed
232
  glView_ = new QtGLGraphicsView(stackedWidget_);
233
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
   
Jan Möbius committed
234

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

Jan Möbius's avatar
   
Jan Möbius committed
238
239
240
241
  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
242
243
  // 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
244
  cursorPainter_->setForceNative (OpenFlipperSettings().value("Core/Gui/glViewer/nativeMouse",false).toBool() );
245
  cursorPainter_->setEnabled (stereoActive_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
246
  glScene_->setCursorPainter (cursorPainter_);
247

Jan Möbius's avatar
   
Jan Möbius committed
248
249
250
251
252
253
254
255
256
257
  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
258
259
260
  // ======================================================================
  // Set up the logging window
  // ======================================================================
261

262
  slidingLogger_ = new QtSlideWindow (tr("Log Viewer"), centerWidget_);
263
264
  tempLogWidget = new QWidget;

265
266
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
267
  logWidget_->resize( splitter_->width() ,240);
Jan Möbius's avatar
Jan Möbius committed
268

269
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
270
  loggerState_ = OpenFlipper::Options::Normal;
271

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

Jan Möbius's avatar
Jan Möbius committed
274
  if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene) {
275
    slidingLogger_->attachWidget (logWidget_);
276
    splitter_->insertWidget (1, tempLogWidget);
277
278
    wsizes[0] = 1;
    wsizes[1] = 0;
Jan Möbius's avatar
 
Jan Möbius committed
279
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
Jan Möbius committed
280
    loggerState_ = OpenFlipper::Options::InScene;
281
    baseLayout_->setContentsMargins (0, 0, 0, 16);
Jan Möbius's avatar
Jan Möbius committed
282
283
  } else if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::Hidden) {
    splitter_->insertWidget (1, tempLogWidget);
284
285
    wsizes[0] = 1;
    wsizes[1] = 0;
Jan Möbius's avatar
Jan Möbius committed
286
287
288
289
    splitter_->setSizes(wsizes);
    loggerState_ = OpenFlipper::Options::Hidden;
  } else {
    // Set initial values to have a usable state
290
291
    wsizes[0] = 480;
    wsizes[1] = 240;
Jan Möbius's avatar
Jan Möbius committed
292
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
293
  }
Jan Möbius's avatar
Jan Möbius committed
294

295

Jan Möbius's avatar
 
Jan Möbius committed
296
297
298
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
299

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

Jan Möbius's avatar
   
Jan Möbius committed
302
303
    glViewer* examinerWidget = new glViewer(glScene_,
					    glWidget_,
304
                                            PluginFunctions::viewerProperties(0),
305
					    centerWidget_);
Jan Möbius's avatar
Jan Möbius committed
306

Jan Möbius's avatar
Jan Möbius committed
307
308
309
    examiner_widgets_.push_back(examinerWidget);

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

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

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

Jan Möbius's avatar
Jan Möbius committed
315
316
317
  } else {


Jan Möbius's avatar
   
Jan Möbius committed
318
319
320
321
    // Create examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      glViewer* newWidget = new glViewer(glScene_,
					 glWidget_,
322
                                         PluginFunctions::viewerProperties(i),
323
					 centerWidget_);
Dirk Wilden's avatar
Dirk Wilden committed
324

Jan Möbius's avatar
Jan Möbius committed
325
      examiner_widgets_.push_back(newWidget);
326
327
328
329
330
331
332
333
334
335

      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
336
337
338
339
340
    }

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

Jan Möbius's avatar
Jan Möbius committed
344
345
346
347
    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
348
349
  }

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

Jan Möbius's avatar
   
Jan Möbius committed
353
  centerWidget_->setLayout(baseLayout_);
354
355


Jan Möbius's avatar
 
Jan Möbius committed
356
357
358
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
359
360
361
362
363
364
365
366
  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* )));
367
368
    connect (examiner_widgets_[i], SIGNAL(signalMakeActive ()),
             this, SLOT(slotActivateExaminer()));
369
370
371

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


Jan Möbius's avatar
 
Jan Möbius committed
375
376
377
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
378

Jan Möbius's avatar
Jan Möbius committed
379
380
381
  mainToolbar_ = new QToolBar(tr("Main Toolbar"));
  mainToolbar_->setWindowTitle(tr("Main Toolbar"));
  mainToolbar_->setObjectName(tr("MainToolbar"));
382
  slotAddToolbar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
383

Jan Möbius's avatar
 
Jan Möbius committed
384
385
386
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
387

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

389
  // Create the toolbar
Jan Möbius's avatar
Jan Möbius committed
390
  viewerToolbar_ = new QToolBar( tr("Viewer Toolbar" ), this );
391
  viewerToolbar_->setOrientation(Qt::Vertical);
Jan Möbius's avatar
 
Jan Möbius committed
392
393
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Jan Möbius's avatar
Jan Möbius committed
394
  viewerToolbar_->setObjectName(tr("ViewerToolbar"));
395

Jan Möbius's avatar
Jan Möbius committed
396
  slotAddToolbar(viewerToolbar_);
Jan Möbius's avatar
Jan Möbius committed
397

398
399
400
401
  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
402
403
  moveButton_->setToolTip( tr("Switch to <b>move</b> mode.") );
  moveButton_->setWhatsThis(tr(
404
405
406
                  "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
407
                  "<li><b>Zoom</b> using <b>left+middle</b> mouse buttons.</li></ul>" ));
408
409

  connect( moveButton_,SIGNAL( clicked() ), this, SLOT( setExamineMode() ) );
410
/*
411
  connect( this, SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
412
            this, SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );*/
413

Jan Möbius's avatar
Jan Möbius committed
414
  viewerToolbar_->addWidget( moveButton_ )->setText(tr("Move"));
415
416
  moveButton_->setDown(true);

417
  
418
419
420
421
  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
422
423
  pickButton_->setToolTip(tr("Switch to <b>picking</b> mode."));
  pickButton_->setWhatsThis(tr(
424
425
426
                  "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
427
                  "context menu in the viewer."));
428
  connect( pickButton_,SIGNAL( clicked() ), this, SLOT( setPickingMode() ) );
Jan Möbius's avatar
Jan Möbius committed
429
  viewerToolbar_->addWidget( pickButton_)->setText(tr("Pick"));
430
431
432
433
434
435


  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
436
437
  questionButton_->setToolTip(tr("Switch to <b>identification</b> mode."));
  questionButton_->setWhatsThis(tr(
438
439
440
441
                  "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
442
                  "object."));
443
  connect( questionButton_,SIGNAL( clicked() ), this, SLOT( setQuestionMode() ) );
Jan Möbius's avatar
Jan Möbius committed
444
  viewerToolbar_->addWidget( questionButton_)->setText(tr("Question"));
445

446
447
448
449
450
451
452
453
  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: "
454
                  "<ul> "
455
456
457
				  "<li>Single viewer</li>"
				  "<li>Multiple viewers (grid)</li>"
				  "<li>Multiple viewers (hsplit)</li>"
Jan Möbius's avatar
Jan Möbius committed
458
				  "</ul>"));
459

460
461
462
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"singleviewmode.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode1.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode2.png"), "");
463

464
  viewerLayoutBox_->setIconSize(QSize(22,22));
465

466
  connect( viewerLayoutBox_,SIGNAL( activated(int) ), this, SLOT( setViewerLayout(int) ) );
467

468
  viewerToolbar_->addWidget( viewerLayoutBox_ );
469

470
471
472
473
474
475
476
477
478
  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
479
    stereoButton_->setToolTip(tr( "Toggle stereo viewing"));
480
481
    // We want a custom context menu
    stereoButton_->setContextMenuPolicy(Qt::CustomContextMenu);
Jan Möbius's avatar
Jan Möbius committed
482
    stereoButton_->setWhatsThis(tr(
483
484
485
486
                  "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
487
                  "display/projection system."));
488
489
490
    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
491
    viewerToolbar_->addWidget( stereoButton_ )->setText( tr("Stereo"));
492
  }
493
494


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

Jan Möbius's avatar
 
Jan Möbius committed
497
498
499
  // Remember logger size
  wsizes = splitter_->sizes();
  originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
500

501
502
503
504
505
506
  // ======================================================================
  // Create pickmode toolbar
  // ======================================================================

  pickToolbar_ = new QtPickToolbar(this, centerWidget_, OpenFlipperSettings().value("Core/Gui/ToolBars/PickToolbarInScene",true).toBool());

Jan Möbius's avatar
 
Jan Möbius committed
507
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
508
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
509
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
510
511
512

  toolBoxArea_ = new QWidget (toolSplitter_);

513
  viewModeControlBox_ = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
514
515
516

  QHBoxLayout *hLayout = new QHBoxLayout;

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

Jan Möbius's avatar
Jan Möbius committed
520
521
  hLayout->addWidget(vmChangeButton_);
  hLayout->addWidget(vmEditButton);
522
  viewModeControlBox_->setLayout (hLayout);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
523

Jan Möbius's avatar
Jan Möbius committed
524
525
  connect(vmChangeButton_, SIGNAL(clicked()), this, SLOT(slotViewChangeDialog()));
  connect(vmEditButton, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
526
527
528
529
530
531
532
533

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

  QVBoxLayout *vLayout = new QVBoxLayout;
534
  vLayout->addWidget(viewModeControlBox_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
535
  vLayout->addWidget(toolBoxScroll_);
536
537
538
  
  if ( OpenFlipperSettings().value("Core/Gui/TaskSwitcher/Hide",false).toBool() )
    viewModeControlBox_->hide();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
539
540
541
542
543

  toolBoxArea_->setLayout (vLayout);

  wsizes = toolSplitter_->sizes();

544
  // 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
545
  if ( OpenFlipperSettings().value("Core/Gui/ToolBoxes/ToolBoxOnTheRight", true).toBool() ) {
546

547
548
549
550
551
    // Set relative sizes of windows
    wsizes[0] = 480;
    wsizes[1] = 240;
    toolSplitter_->setSizes(wsizes);  
  } else {
552

553
554
555
556
557
558
559
560
561
562
    // 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
563
564
565
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
566

Jan Möbius's avatar
Jan Möbius committed
567
568
569
570
  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
571

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

Jan Möbius's avatar
 
Jan Möbius committed
575
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
576

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

579
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
580

581
  setExamineMode();
582
583
584

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

585
586
587
588
  // Create stereo settings widget
  stereoSettingsWidget_ = new StereoSettingsWidget(this);
  // Make it look like a dialog
  stereoSettingsWidget_->setWindowFlags(Qt::Popup);
589
590
  // Connect combo boxes and sliders to local slots
  connect(stereoSettingsWidget_->stereoOpengl, SIGNAL(clicked()),
591
          this, SLOT(slotApplyStereoSettings()));
592
593
594
595
596
597
598
  connect(stereoSettingsWidget_->stereoAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->stereoCustomAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->stereoPhilips, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));

599
600
  connect(stereoSettingsWidget_->focalDistance, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
601
602
603
604
605
  connect(stereoSettingsWidget_->eyeDistance, SIGNAL(editingFinished()),
          this, SLOT(slotApplyStereoSettings()));

  connect(stereoSettingsWidget_->headerContentType, SIGNAL(currentIndexChanged(int)),
          this, SLOT(slotApplyStereoSettings(int)));
606
607
608
609
  connect(stereoSettingsWidget_->headerFactor, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->headerOffsetCC, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
610
611
612
613
614
615
  connect(stereoSettingsWidget_->headerSelect, SIGNAL(currentIndexChanged(int)),
          this, SLOT(slotApplyStereoSettings(int)));

  // Close button
  connect(stereoSettingsWidget_->closeButton, SIGNAL(clicked()),
          stereoSettingsWidget_, SLOT(hide()));
Jan Möbius's avatar
 
Jan Möbius committed
616
617
618
619
620
621
622
}


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


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

Jan Möbius's avatar
 
Jan Möbius committed
624
625
626
627
628
629
630
631
}

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

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

Dirk Wilden's avatar
Dirk Wilden committed
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
  switch (fullscreenState_){

    case 0:
      //switch to fullscreen
      setWindowState( windowState() | Qt::WindowFullScreen);
      break;

    case 1:

      //fullscreen without toolbars
      if ( ! (windowState() & Qt::WindowFullScreen) )
        setWindowState( windowState() | Qt::WindowFullScreen);

      //hide plugin toolbars
      for (uint p=0; p < plugins_.size(); p++)
        for ( uint j = 0 ; j < plugins_[p].toolbars.size(); ++j )
          plugins_[p].toolbars[j].second->hide();

      //hide main toolbar
      mainToolbar_->hide();

      //hide viewer toolbar
      viewerToolbar_->hide();

      //hide the menubar
      menuBar()->hide();

      //hide the statusbar
      statusBar()->hide();

      //remove viewer frame
      glView_->setFrameStyle(QFrame::NoFrame);

      break;

    default:
      //disable fullscreen
      if ( windowState() & Qt::WindowFullScreen )
        setWindowState( windowState() ^  Qt::WindowFullScreen);

      //show toolbars
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
674
      setViewMode( OpenFlipper::Options::currentViewMode() );
Dirk Wilden's avatar
Dirk Wilden committed
675
676
677
678
679
680
681
682
683
684
685
686

      //show the menubar
      menuBar()->show();

      //show the statusbar
      statusBar()->show();

      //add viewer frame
      glView_->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
  }

  fullscreenState_ = (fullscreenState_ + 1) % 3;
Jan Möbius's avatar
Jan Möbius committed
687
688
  
  OpenFlipperSettings().setValue("Core/Gui/fullscreen", bool( windowState() & Qt::WindowFullScreen) );
689

Jan Möbius's avatar
 
Jan Möbius committed
690
691
692
693
694
  show();
}

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

695
696
697
698
699
700
701
702
703
704
705
/** 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);
  }

Dirk Wilden's avatar
Dirk Wilden committed
706
707
  fullscreenState_ = (uint) _state;

Jan Möbius's avatar
Jan Möbius committed
708
  OpenFlipperSettings().setValue("Core/Gui/fullscreen", bool( windowState() & Qt::WindowFullScreen) );
709
710
711
712

  show();
}

713
714
715
716
717
718
719
720
721
722
//-----------------------------------------------------------------------------

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);
    
723
724
725
726
727
    // Update The Checkbox in the Menu
    AC_ShowViewModeControls_->blockSignals(true);
    AC_ShowViewModeControls_->setChecked( _show  );
    AC_ShowViewModeControls_->blockSignals(false);
    
728
729
730
731
732
733
734
735
736
737
738
    if ( _show ) {
      viewModeControlBox_->show();
    } else {
      viewModeControlBox_->hide();
    }
    
  }
  
}


739
740
//-----------------------------------------------------------------------------

Jan Möbius's avatar
 
Jan Möbius committed
741
742
743
744
/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
Jan Möbius's avatar
Jan Möbius committed
745
746
747
748
749
750
751
752
753
754
755
756
757

  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
758

759
  // Hide/Show Logger
Jan Möbius's avatar
Jan Möbius committed
760
  showLogger( OpenFlipper::Options::loggerState() );
761
762
763
764
765
}

/** Hide or show logger
  */
void
Jan Möbius's avatar
Jan Möbius committed
766
CoreWidget::showLogger(OpenFlipper::Options::LoggerState _state) {
767
768
769
  //Hide Logger
  if (_state == loggerState_)
    return;
Jan Möbius's avatar
Jan Möbius committed
770

771
772
  qreal left, top, right, bottom;
  baseLayout_->getContentsMargins (&left, &top, &right, &bottom);
773

774
775
776
777
778
  switch (_state)
  {
    case OpenFlipper::Options::InScene:
      {
        QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
779
780
781

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
782
          originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
783

784
785
	if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;
Jan Möbius's avatar
Jan Möbius committed
786

787
788
        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
789
790
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
791
792
793
794
795
796
797
798
799
        logWidget_->resize (logWidget_->width (), originalLoggerSize_);
        slidingLogger_->attachWidget (logWidget_);
        baseLayout_->setContentsMargins (left, top, right, 16);
      }
      break;
    case OpenFlipper::Options::Normal:
      {
        if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;
Jan Möbius's avatar
Jan Möbius committed
800

801
        QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
802
803

        if (loggerState_ == OpenFlipper::Options::InScene)
804
          originalLoggerSize_ = logWidget_->height ();
Jan Möbius's avatar
Jan Möbius committed
805

806
807
808
        slidingLogger_->detachWidget ();
        splitter_->insertWidget (1, logWidget_);
        logWidget_->show ();
Jan Möbius's avatar
Jan Möbius committed
809

810
        wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
Jan Möbius's avatar
Jan Möbius committed
811
812
        wsizes[1] = originalLoggerSize_;
        splitter_->setSizes(wsizes);
813
814
815
816
817
818
        baseLayout_->setContentsMargins (left, top, right, 0);
      }
      break;
    case OpenFlipper::Options::Hidden:
      {
        QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
819
820
821

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
822
          originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
823

824
825
826
827
828
	if (loggerState_ == OpenFlipper::Options::InScene)
	{
	  slidingLogger_->detachWidget ();
	  originalLoggerSize_ = logWidget_->height ();
	}
Jan Möbius's avatar
Jan Möbius committed
829

830
831
        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
832
833
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
834
835
836
837
838
        baseLayout_->setContentsMargins (left, top, right, 0);
      }
      break;
  }
  loggerState_ = _state;
Jan Möbius's avatar
Jan Möbius committed
839

840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
/*
  if ( !_state ) {
    QList<int> wsizes( splitter_->sizes() );

    // Remember old size
    originalLoggerSize_  = wsizes[1];

    int height = logWidget_->height ();

    splitter_->insertWidget (1, tempLogWidget);
    wsizes[0] = wsizes[0]+wsizes[1];
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
    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);
  } else {

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

    int height = logWidget_->height ();
874

875
876
877
878
879
880
881
882
    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
883
884
885
886
887
888
889
890
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
892
  //toggle
Jan Möbius's avatar
Jan Möbius committed
893
  showToolbox( OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
894
895
896
897
898
899
900
901
902
903
}

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

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

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

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

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
909
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
910
911
912

  }else{
    //reset last ViewMode
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
913
    if (OpenFlipper::Options::currentViewMode().trimmed() == "")
Jan Möbius's avatar
 
Jan Möbius committed
914
915
      setViewMode("All");
    else
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
916
      setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
917
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
918
919
  }
}
Jan Möbius's avatar
Jan Möbius committed
920

921
922
//=============================================================================

923
void CoreWidget::setToolBoxOrientationOnTheRight(bool _toolBoxRight) {
924
  QList<int> wsizes;
Jan Möbius's avatar
Jan Möbius committed
925
  
926
927
  // Is toolbox currently on the right hand side?
  bool currentstate = toolSplitter_->widget(1) == toolBoxArea_;
Jan Möbius's avatar
Jan Möbius committed
928
929
  
  if ( _toolBoxRight != currentstate ) {
930
    
Jan Möbius's avatar
Jan Möbius committed
931
932
933
934
935
936
937
938
939
940
941
    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_);
    }
942
    
Jan Möbius's avatar
Jan Möbius committed
943
    // Store new setting
Jan Möbius's avatar
Jan Möbius committed
944
    OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/ToolBoxOnTheRight",_toolBoxRight);
945
    
Jan Möbius's avatar
Jan Möbius committed
946
947
    // remove the windowstates definition for the toolboxes, as it changed anyway.
    QSettings windowStates(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
948
                            OpenFlipper::Options::dirSeparator() +  "WindowStates.dat", QSettings::IniFormat);
Jan Möbius's avatar
Jan Möbius committed
949
950
    
    windowStates.value("Core/ToolSplitter");
951
952
953
    
  }
  
Jan Möbius's avatar
Jan Möbius committed
954

955
956
957
958
959
    
  toolSplitter_->refresh();
}
      

Jan Möbius's avatar
 
Jan Möbius committed
960
961
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
962
963
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
964
{
965
966
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
967

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

Jan Möbius's avatar
 
Jan Möbius committed
970
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
971
972
973
974
975
976
977

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
978
979
980
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
981

Jan Möbius's avatar
 
Jan Möbius committed
982
983
  recentFilesMenu_->clear();

984
985
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
986

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

989
    QFileInfo fi(recentFiles[i]);
990
991

    if (fi.suffix() == "ini")
992
      recentFilesMenu_->addAction(QIcon(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator()+"Settings-Icon.png"), recentFiles[i]);
993
    else
994
      recentFilesMenu_->addAction(typeIcon( typeId(recentTypes[i]) ), recentFiles[i]);
995

Jan Möbius's avatar
 
Jan Möbius committed
996
997
  }

Jan Möbius's avatar
Jan Möbius committed
998
999
1000
}

void
Jan Möbius's avatar
 
Jan Möbius committed
1001
1002
1003
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
1004
1005

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

1007
1008
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
1009

1010
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
1011
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
1012
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
1013
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
1014
1015
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
1016
1017

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

Jan Möbius's avatar
Jan Möbius committed
1020
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
1021
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
1022
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
1023
1024
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
1025
1026
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
1027

1028
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
1029

1030
}
Jan Möbius's avatar
Jan Möbius committed
1031

1032
void CoreWidget::nextViewerLayout() {
1033

Jan Möbius's avatar
Jan Möbius committed
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {

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

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(1);
              break;
      case QtMultiViewLayout::Grid:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::HSplit);

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(2);
              break;
      case QtMultiViewLayout::HSplit:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::SingleView);

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(0);
              break;
      }
  }
1060
1061
1062
1063
}


void
1064
CoreWidget::setViewerLayout(int _idx) {
1065

Jan Möbius's avatar
Jan Möbius committed
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {

  switch (_idx) {
    case 0:
            baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
            baseLayout_->setMode(QtMultiViewLayout::SingleView);
            break;
    case 1:
            baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
            baseLayout_->setMode(QtMultiViewLayout::Grid);
            break;
    case 2:
            baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
            baseLayout_->setMode(QtMultiViewLayout::HSplit);
            break;
  }
1082
1083

    viewerLayoutBox_->setCurrentIndex(_idx);