CoreWidget.cc 38 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),
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
149
  cursorPainter_(0),
150
  sceneGraphDialog_(0),
151
152
153
  fileMenu_(0),
  viewMenu_(0),
  toolsMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
154
  fileMenuEnd_(0),
155
156
157
  stereoButton_(0),
  moveButton_(0),
  pickButton_(0),
Dirk Wilden's avatar
Dirk Wilden committed
158
  questionButton_(0),
159
160
161
  globalDrawMenu_(0),
  drawGroup_(0),
  viewGroup_(0),
162
  perspectiveProjectionAction_(0),
163
164
  activeDrawModes_(0),
  availableGlobalDrawModes_(0),
Jan Möbius's avatar
 
Jan Möbius committed
165
  contextMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
166
  contextSelectionMenu_(0),
167
168
  drawGroupViewer_(0),
  viewerDrawMenu_(0),
169
  coordSysMenu_(0),
170
  snapshotName_(""),
Dirk Wilden's avatar
Dirk Wilden committed
171
  snapshotCounter_(0),
Jan Möbius's avatar
 
Jan Möbius committed
172
  stackMenu_(0),
173
  helpWidget_(0),
174
  stereoSettingsWidget_(0),
Jan Möbius's avatar
Jan Möbius committed
175
  aboutWidget_(0),
176
  optionsWidget_(0),
177
  plugins_(_plugins),
178
179
180
181
182
183
  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
184
185
{
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
186

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

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

  setCentralWidget(toolSplitter_);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

294

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

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

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

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

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

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

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

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


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

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

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

    // 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
340
      cursorPainter_->registerViewer (examiner_widgets_[i]);
Jan Möbius's avatar
Jan Möbius committed
341
342
    }

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

459
460
461
  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"), "");
462

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

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

467
  viewerToolbar_->addWidget( viewerLayoutBox_ );
468

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


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

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

Jan Möbius's avatar
 
Jan Möbius committed
500
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
501
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
502
  // ======================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
503
504
505

  toolBoxArea_ = new QWidget (toolSplitter_);

506
  viewModeControlBox_ = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
507
508
509

  QHBoxLayout *hLayout = new QHBoxLayout;

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

Jan Möbius's avatar
Jan Möbius committed
513
514
  hLayout->addWidget(vmChangeButton_);
  hLayout->addWidget(vmEditButton);
515
  viewModeControlBox_->setLayout (hLayout);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
516

Jan Möbius's avatar
Jan Möbius committed
517
518
  connect(vmChangeButton_, SIGNAL(clicked()), this, SLOT(slotViewChangeDialog()));
  connect(vmEditButton, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
519
520
521
522
523
524
525
526

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

  QVBoxLayout *vLayout = new QVBoxLayout;
527
  vLayout->addWidget(viewModeControlBox_);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
528
  vLayout->addWidget(toolBoxScroll_);
529
530
531
  
  if ( OpenFlipperSettings().value("Core/Gui/TaskSwitcher/Hide",false).toBool() )
    viewModeControlBox_->hide();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
532
533
534
535
536

  toolBoxArea_->setLayout (vLayout);

  wsizes = toolSplitter_->sizes();

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

540
541
542
543
544
    // Set relative sizes of windows
    wsizes[0] = 480;
    wsizes[1] = 240;
    toolSplitter_->setSizes(wsizes);  
  } else {
545

546
547
548
549
550
551
552
553
554
555
    // 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
556
557
558
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
559

Jan Möbius's avatar
Jan Möbius committed
560
561
562
563
  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
564

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

Jan Möbius's avatar
 
Jan Möbius committed
568
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
569

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

572
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
573

574
  setExamineMode();
575
576
577

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

578
579
580
581
  // Create stereo settings widget
  stereoSettingsWidget_ = new StereoSettingsWidget(this);
  // Make it look like a dialog
  stereoSettingsWidget_->setWindowFlags(Qt::Popup);
582
583
  // Connect combo boxes and sliders to local slots
  connect(stereoSettingsWidget_->stereoOpengl, SIGNAL(clicked()),
584
          this, SLOT(slotApplyStereoSettings()));
585
586
587
588
589
590
591
  connect(stereoSettingsWidget_->stereoAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->stereoCustomAnaglyph, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->stereoPhilips, SIGNAL(clicked()),
          this, SLOT(slotApplyStereoSettings()));

592
593
  connect(stereoSettingsWidget_->focalDistance, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
594
595
596
597
598
  connect(stereoSettingsWidget_->eyeDistance, SIGNAL(editingFinished()),
          this, SLOT(slotApplyStereoSettings()));

  connect(stereoSettingsWidget_->headerContentType, SIGNAL(currentIndexChanged(int)),
          this, SLOT(slotApplyStereoSettings(int)));
599
600
601
602
  connect(stereoSettingsWidget_->headerFactor, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
  connect(stereoSettingsWidget_->headerOffsetCC, SIGNAL(sliderReleased()),
          this, SLOT(slotApplyStereoSettings()));
603
604
605
606
607
608
  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
609
610
611
612
613
614
615
}


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


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

Jan Möbius's avatar
 
Jan Möbius committed
617
618
619
620
621
622
623
624
}

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

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

Dirk Wilden's avatar
Dirk Wilden committed
626
627
628
629
630
631
632
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
  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
667
      setViewMode( OpenFlipper::Options::currentViewMode() );
Dirk Wilden's avatar
Dirk Wilden committed
668
669
670
671
672
673
674
675
676
677
678
679

      //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
680
681
  
  OpenFlipperSettings().setValue("Core/Gui/fullscreen", bool( windowState() & Qt::WindowFullScreen) );
682

Jan Möbius's avatar
 
Jan Möbius committed
683
684
685
686
687
  show();
}

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

688
689
690
691
692
693
694
695
696
697
698
/** 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
699
700
  fullscreenState_ = (uint) _state;

Jan Möbius's avatar
Jan Möbius committed
701
  OpenFlipperSettings().setValue("Core/Gui/fullscreen", bool( windowState() & Qt::WindowFullScreen) );
702
703
704
705

  show();
}

706
707
708
709
710
711
712
713
714
715
//-----------------------------------------------------------------------------

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);
    
716
717
718
719
720
    // Update The Checkbox in the Menu
    AC_ShowViewModeControls_->blockSignals(true);
    AC_ShowViewModeControls_->setChecked( _show  );
    AC_ShowViewModeControls_->blockSignals(false);
    
721
722
723
724
725
726
727
728
729
730
731
    if ( _show ) {
      viewModeControlBox_->show();
    } else {
      viewModeControlBox_->hide();
    }
    
  }
  
}


732
733
//-----------------------------------------------------------------------------

Jan Möbius's avatar
 
Jan Möbius committed
734
735
736
737
/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
Jan Möbius's avatar
Jan Möbius committed
738
739
740
741
742
743
744
745
746
747
748
749
750

  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
751

752
  // Hide/Show Logger
Jan Möbius's avatar
Jan Möbius committed
753
  showLogger( OpenFlipper::Options::loggerState() );
754
755
756
757
758
}

/** Hide or show logger
  */
void
Jan Möbius's avatar
Jan Möbius committed
759
CoreWidget::showLogger(OpenFlipper::Options::LoggerState _state) {
760
761
762
  //Hide Logger
  if (_state == loggerState_)
    return;
Jan Möbius's avatar
Jan Möbius committed
763

764
765
  qreal left, top, right, bottom;
  baseLayout_->getContentsMargins (&left, &top, &right, &bottom);
766

767
768
769
770
771
  switch (_state)
  {
    case OpenFlipper::Options::InScene:
      {
        QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
772
773
774

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

777
778
	if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;
Jan Möbius's avatar
Jan Möbius committed
779

780
781
        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
782
783
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
784
785
786
787
788
789
790
791
792
        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
793

794
        QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
795
796

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

799
800
801
        slidingLogger_->detachWidget ();
        splitter_->insertWidget (1, logWidget_);
        logWidget_->show ();
Jan Möbius's avatar
Jan Möbius committed
802

803
        wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
Jan Möbius's avatar
Jan Möbius committed
804
805
        wsizes[1] = originalLoggerSize_;
        splitter_->setSizes(wsizes);
806
807
808
809
810
811
        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
812
813
814

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

817
818
819
820
821
	if (loggerState_ == OpenFlipper::Options::InScene)
	{
	  slidingLogger_->detachWidget ();
	  originalLoggerSize_ = logWidget_->height ();
	}
Jan Möbius's avatar
Jan Möbius committed
822

823
824
        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
825
826
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
827
828
829
830
831
        baseLayout_->setContentsMargins (left, top, right, 0);
      }
      break;
  }
  loggerState_ = _state;
Jan Möbius's avatar
Jan Möbius committed
832

833
834
835
836
837
838
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
/*
  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 ();
867

868
869
870
871
872
873
874
875
    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
876
877
878
879
880
881
882
883
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
885
  //toggle
Jan Möbius's avatar
Jan Möbius committed
886
  showToolbox( OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
887
888
889
890
891
892
893
894
895
896
}

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

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

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

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

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
902
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
903
904
905

  }else{
    //reset last ViewMode
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
906
    if (OpenFlipper::Options::currentViewMode().trimmed() == "")
Jan Möbius's avatar
 
Jan Möbius committed
907
908
      setViewMode("All");
    else
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
909
      setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
910
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
911
912
  }
}
Jan Möbius's avatar
Jan Möbius committed
913

914
915
//=============================================================================

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

948
949
950
951
952
    
  toolSplitter_->refresh();
}
      

Jan Möbius's avatar
 
Jan Möbius committed
953
954
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
955
956
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
957
{
958
959
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
960

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

Jan Möbius's avatar
 
Jan Möbius committed
963
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
964
965
966
967
968
969
970

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
971
972
973
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
974

Jan Möbius's avatar
 
Jan Möbius committed
975
976
  recentFilesMenu_->clear();

977
978
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
979

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

982
    QFileInfo fi(recentFiles[i]);
983
984

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

Jan Möbius's avatar
 
Jan Möbius committed
989
990
  }

Jan Möbius's avatar
Jan Möbius committed
991
992
993
}

void
Jan Möbius's avatar
 
Jan Möbius committed
994
995
996
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
997
998

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

1000
1001
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
1002

1003
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
1004
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
1005
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
1006
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
1007
1008
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
1009
1010

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

Jan Möbius's avatar
Jan Möbius committed
1013
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
1014
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
1015
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
1016
1017
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
1018
1019
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
1020

1021
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
1022

1023
}
Jan Möbius's avatar
Jan Möbius committed
1024

1025
void CoreWidget::nextViewerLayout() {
1026

Jan Möbius's avatar
Jan Möbius committed
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
  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;
      }
  }
1053
1054
1055
1056
}


void
1057
CoreWidget::setViewerLayout(int _idx) {
1058

Jan Möbius's avatar
Jan Möbius committed
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
  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;
  }
1075
1076

    viewerLayoutBox_->setCurrentIndex(_idx);
Jan Möbius's avatar
Jan Möbius committed
1077
  }
1078
}
Jan Möbius's avatar
 
Jan Möbius committed
1079

Jan Möbius's avatar