CoreWidget.cc 34.4 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
  pickToolBarExternal_(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
  globalDrawMenu_(0),
161 162
  rendererMenu_(0),
  postprocessorMenu_(0),
163
  drawGroup_(0),
164 165
  rendererGroup_(0),
  postProcessorGroup_(0),
166
  viewGroup_(0),
167
  perspectiveProjectionAction_(0),
168 169
  activeDrawModes_(0),
  availableGlobalDrawModes_(0),
Jan Möbius's avatar
 
Jan Möbius committed
170
  contextMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
171
  contextSelectionMenu_(0),
172 173
  drawGroupViewer_(0),
  viewerDrawMenu_(0),
174
  coordSysMenu_(0),
175
  snapshotName_(""),
Dirk Wilden's avatar
Dirk Wilden committed
176
  snapshotCounter_(0),
Jan Möbius's avatar
 
Jan Möbius committed
177
  stackMenu_(0),
178
  helpWidget_(0),
179
  stereoSettingsWidget_(0),
Jan Möbius's avatar
Jan Möbius committed
180
  aboutWidget_(0),
181
  optionsWidget_(0),
182
  plugins_(_plugins),
183 184 185 186 187 188
  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
189 190
{
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
191

Dirk Wilden's avatar
Dirk Wilden committed
192 193
  defaultIconSize_ = iconSize();

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
194 195 196 197 198
  toolSplitter_ = new QSplitter(Qt::Horizontal,this);

  setCentralWidget(toolSplitter_);

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

201 202
  QGLFormat format = QGLFormat::defaultFormat();

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

  // Construct GL context & widget
214 215 216
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

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

Jan Möbius's avatar
 
Jan Möbius committed
236
  glView_ = new QtGLGraphicsView(stackedWidget_);
237
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
 
Jan Möbius committed
238

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

Jan Möbius's avatar
 
Jan Möbius committed
242 243 244
  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);
245
  glView_->setFrameStyle(QFrame::NoFrame);
Jan Möbius's avatar
 
Jan Möbius committed
246

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

Jan Möbius's avatar
 
Jan Möbius committed
253 254 255 256 257 258 259 260 261 262
  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
263 264 265
  // ======================================================================
  // Set up the logging window
  // ======================================================================
266

267
  slidingLogger_ = new QtSlideWindow (tr("Log Viewer"), centerWidget_);
268

269 270
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
271
  logWidget_->resize( splitter_->width() ,240);
Jan Möbius's avatar
Jan Möbius committed
272

273
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
274
  loggerState_ = OpenFlipper::Options::Normal;
275

276 277 278 279 280
  QList<int> wsizes(splitter_->sizes());
  // Set initial values to have a usable state
  wsizes[0] = 480;
  wsizes[1] = 240;
  splitter_->setSizes(wsizes);
281

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

284
    slidingLogger_->attachWidget (logWidget_);
285
    showLoggerInSplitView(false);
Jan Möbius's avatar
Jan Möbius committed
286
    loggerState_ = OpenFlipper::Options::InScene;
287

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

290
    showLoggerInSplitView(false);
Jan Möbius's avatar
Jan Möbius committed
291 292
    loggerState_ = OpenFlipper::Options::Hidden;
  } else {
293 294

    showLoggerInSplitView(true);
Jan Möbius's avatar
 
Jan Möbius committed
295
  }
Jan Möbius's avatar
Jan Möbius committed
296

297

Jan Möbius's avatar
 
Jan Möbius committed
298 299 300
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
301

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

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

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

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

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

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

Jan Möbius's avatar
Jan Möbius committed
317 318 319
  } else {


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

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

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

338
      connect (&PluginFunctions::viewerProperties(i), SIGNAL( drawModeChanged(int)), this, SIGNAL(drawModeChanged(int)));
Jan Möbius's avatar
Jan Möbius committed
339 340 341 342 343
    }

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

Jan Möbius's avatar
Jan Möbius committed
347 348 349 350
    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
351 352
  }

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

Jan Möbius's avatar
 
Jan Möbius committed
356
  centerWidget_->setLayout(baseLayout_);
357 358


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

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


Jan Möbius's avatar
 
Jan Möbius committed
378 379 380
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
381

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

Jan Möbius's avatar
 
Jan Möbius committed
387 388 389
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
390

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

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

Jan Möbius's avatar
Jan Möbius committed
399
  slotAddToolbar(viewerToolbar_);
Jan Möbius's avatar
Jan Möbius committed
400

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

  connect( moveButton_,SIGNAL( clicked() ), this, SLOT( setExamineMode() ) );
413
/*
414
  connect( this, SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
415
            this, SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );*/
416

Jan Möbius's avatar
Jan Möbius committed
417
  viewerToolbar_->addWidget( moveButton_ )->setText(tr("Move"));
418 419
  moveButton_->setDown(true);

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


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

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

464
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"singleviewmode.png"), "");
Jan Möbius's avatar
Jan Möbius committed
465
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"doubleviewmode.png"), "");
466 467
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode1.png"), "");
  viewerLayoutBox_->addItem(QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"multiviewmode2.png"), "");
468

469
  viewerLayoutBox_->setIconSize(QSize(22,22));
470

471
  connect( viewerLayoutBox_,SIGNAL( activated(int) ), this, SLOT( setViewerLayout(int) ) );
472

473
  viewerToolbar_->addWidget( viewerLayoutBox_ );
474

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


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

Jan Möbius's avatar
 
Jan Möbius committed
502 503
  // Remember logger size
  wsizes = splitter_->sizes();
504 505 506 507 508 509

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

Jan Möbius's avatar
 
Jan Möbius committed
511
  // ======================================================================
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
512
  // Create ToolBox area
Jan Möbius's avatar
Jan Möbius committed
513
  // ======================================================================
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
514 515 516

  toolBoxArea_ = new QWidget (toolSplitter_);

517
  viewModeControlBox_ = new QGroupBox (tr("ViewMode"));
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
518 519 520

  QHBoxLayout *hLayout = new QHBoxLayout;

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

Jan Möbius's avatar
Jan Möbius committed
524 525
  hLayout->addWidget(vmChangeButton_);
  hLayout->addWidget(vmEditButton);
526
  viewModeControlBox_->setLayout (hLayout);
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
527

Jan Möbius's avatar
Jan Möbius committed
528 529
  connect(vmChangeButton_, SIGNAL(clicked()), this, SLOT(slotViewChangeDialog()));
  connect(vmEditButton, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
530 531 532 533 534 535 536 537

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

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

  toolBoxArea_->setLayout (vLayout);

  wsizes = toolSplitter_->sizes();

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

551 552 553 554 555
    // Set relative sizes of windows
    wsizes[0] = 480;
    wsizes[1] = 240;
    toolSplitter_->setSizes(wsizes);  
  } else {
556

557 558 559 560 561 562 563 564 565 566
    // 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
567 568 569
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
570

Jan Möbius's avatar
Jan Möbius committed
571 572 573 574
  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
575

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

Jan Möbius's avatar
 
Jan Möbius committed
579
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
580

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

583
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
584

585
  setExamineMode();
586 587 588

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

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

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

  // 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
  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++)
641 642 643 644
        for ( uint j = 0 ; j < plugins_[p].toolbars.size(); ++j ) {
          if ( ! plugins_[p].toolbars[j].second->isFloating() )
            plugins_[p].toolbars[j].second->hide();
        }
Dirk Wilden's avatar
Dirk Wilden committed
645 646

      //hide main toolbar
647 648
      if ( ! mainToolbar_->isFloating() )
        mainToolbar_->hide();
Dirk Wilden's avatar
Dirk Wilden committed
649 650

      //hide viewer toolbar
651 652
      if ( ! viewerToolbar_->isFloating() )
        viewerToolbar_->hide();
Dirk Wilden's avatar
Dirk Wilden committed
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667

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

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

      break;

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

      //show toolbars
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
668
      setViewMode( OpenFlipper::Options::currentViewMode() );
Dirk Wilden's avatar
Dirk Wilden committed
669 670 671 672 673 674 675 676 677 678

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

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

  }

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

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

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

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

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

  show();
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
730 731 732 733 734 735
//-----------------------------------------------------------------------------

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

Jan Möbius's avatar
 
Jan Möbius committed
737
  //toggle
Jan Möbius's avatar
Jan Möbius committed
738
  showToolbox( OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
739 740 741 742 743 744 745 746 747 748
}

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

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

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

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

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
754
    toolBoxArea_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
755 756 757

  }else{
    //reset last ViewMode
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
758
    if (OpenFlipper::Options::currentViewMode().trimmed() == "")
Jan Möbius's avatar
 
Jan Möbius committed
759 760
      setViewMode("All");
    else
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
761
      setViewMode( OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
762
    toolBoxArea_->setVisible(true);
Jan Möbius's avatar
 
Jan Möbius committed
763 764
  }
}
Jan Möbius's avatar
Jan Möbius committed
765

766

767 768
//=============================================================================

769
void CoreWidget::setToolBoxOrientationOnTheRight(bool _toolBoxRight) {
770
  QList<int> wsizes;
Jan Möbius's avatar
Jan Möbius committed
771
  
772 773
  // Is toolbox currently on the right hand side?
  bool currentstate = toolSplitter_->widget(1) == toolBoxArea_;
Jan Möbius's avatar
Jan Möbius committed
774 775
  
  if ( _toolBoxRight != currentstate ) {
776
    
Jan Möbius's avatar
Jan Möbius committed
777 778 779 780 781 782 783 784 785 786 787
    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_);
    }
788
    
Jan Möbius's avatar
Jan Möbius committed
789
    // Store new setting
Jan Möbius's avatar
Jan Möbius committed
790
    OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/ToolBoxOnTheRight",_toolBoxRight);
791
    
Jan Möbius's avatar
Jan Möbius committed
792 793
    // remove the windowstates definition for the toolboxes, as it changed anyway.
    QSettings windowStates(QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() + ".OpenFlipper" +
794
                            OpenFlipper::Options::dirSeparator() +  "WindowStates.dat", QSettings::IniFormat);
Jan Möbius's avatar
Jan Möbius committed
795 796
    
    windowStates.value("Core/ToolSplitter");
797 798 799
    
  }
  
Jan Möbius's avatar
Jan Möbius committed
800

801 802 803 804 805
    
  toolSplitter_->refresh();
}
      

Jan Möbius's avatar
 
Jan Möbius committed
806 807
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
808 809
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
810
{
811 812
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
813

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

Jan Möbius's avatar
 
Jan Möbius committed
816
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
817 818 819 820 821 822 823

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
824 825 826
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
827

Jan Möbius's avatar
 
Jan Möbius committed
828 829
  recentFilesMenu_->clear();

830 831
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
832

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

835
    QFileInfo fi(recentFiles[i]);
836

837 838 839 840 841 842 843 844 845
    QAction* newAction = 0;

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

Jan Möbius's avatar
 
Jan Möbius committed
847 848
  }

Jan Möbius's avatar
Jan Möbius committed
849 850 851
}

void
Jan Möbius's avatar
 
Jan Möbius committed
852 853 854
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
855 856

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

858 859
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
860

861
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
862
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
863
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
864
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
865 866
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
867 868

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

Jan Möbius's avatar
Jan Möbius committed
871
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
872
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
873
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
874 875
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
876 877
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
878

879
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
880

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

883
void CoreWidget::nextViewerLayout() {
884

Jan Möbius's avatar
Jan Möbius committed
885 886 887 888 889
  if ( OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() ) {

    switch (baseLayout_->mode()) {
      case QtMultiViewLayout::SingleView:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
Jan Möbius's avatar
Jan Möbius committed
890
              baseLayout_->setMode(QtMultiViewLayout::DoubleView);
Jan Möbius's avatar
Jan Möbius committed
891 892 893 894

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(1);
              break;
Jan Möbius's avatar
Jan Möbius committed
895 896 897 898 899 900 901
      case QtMultiViewLayout::DoubleView:
              baseLayout_->setPrimary (PluginFunctions::activeExaminer ());
              baseLayout_->setMode(QtMultiViewLayout::Grid);

              // Update combo box in the toolbar
              viewerLayoutBox_->setCurrentIndex(2);
              break;
Jan Möbius's avatar
Jan Möbius committed
902 903 904 905 906