CoreWidget.cc 27.1 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  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.
Jan Möbius's avatar
Jan Möbius committed
15
//
Jan Möbius's avatar
 
Jan Möbius committed
16 17 18 19
//  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.
Jan Möbius's avatar
Jan Möbius committed
20
//
Jan Möbius's avatar
 
Jan Möbius committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================




//=============================================================================
//
//  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
51
#include <OpenFlipper/BasePlugin/PluginFunctionsCore.hh>
Dirk Wilden's avatar
Dirk Wilden committed
52 53
#include <OpenFlipper/BasePlugin/KeyInterface.hh>
#include <OpenFlipper/BasePlugin/LoggingInterface.hh>
Jan Möbius's avatar
 
Jan Möbius committed
54 55 56 57

#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

Jan Möbius's avatar
Jan Möbius committed
58
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
59

Jan Möbius's avatar
Jan Möbius committed
60 61
/** \brief Constuctor for the Core Widget
 *
Jan Möbius's avatar
 
Jan Möbius committed
62 63
*/
CoreWidget::
Dirk Wilden's avatar
Dirk Wilden committed
64
CoreWidget( QVector<ViewMode*>& _viewModes,
Dirk Wilden's avatar
Dirk Wilden committed
65 66
            std::vector<PluginInfo>& _plugins,
            QList< SlotInfo >& _coreSlots ) :
Jan Möbius's avatar
 
Jan Möbius committed
67
  QMainWindow(),
Dirk Wilden's avatar
Dirk Wilden committed
68
  coreSlots_(_coreSlots),
Dirk Wilden's avatar
Dirk Wilden committed
69
  shiftPressed_(false),
Jan Möbius's avatar
 
Jan Möbius committed
70 71 72 73 74 75
  viewModes_(_viewModes),
  dockViewMode_(0),
  viewModeButton_(0),
  viewModeMenu_(0),
  viewGroup_(0),
  splitter_(0),
76
  logWidget_(0),
Jan Möbius's avatar
 
Jan Möbius committed
77
  recentFilesMenu_(0),
78 79
  helpMenu_(0),
  sceneGraphDialog_(0),
Jan Möbius's avatar
 
Jan Möbius committed
80 81 82
  fileMenu_(0),
  viewMenu_(0),
  fileMenuEnd_(0),
83 84 85 86 87 88
  stereoButton_(0),
  projectionButton_(0),
  moveButton_(0),
  lightButton_(0),
  pickButton_(0),
  questionButton_(0),
Jan Möbius's avatar
 
Jan Möbius committed
89
  contextMenu_(0),
90
  functionMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
91
  contextSelectionMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
92 93 94
  stackMenu_(0),
  helpBrowserDeveloper_(0),
  helpBrowserUser_(0),
Jan Möbius's avatar
Jan Möbius committed
95
  aboutWidget_(0),
96
  optionsWidget_(0),
97 98
  plugins_(_plugins),
  stereoActive_(false)
Jan Möbius's avatar
 
Jan Möbius committed
99 100
{
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
101

Jan Möbius's avatar
 
Jan Möbius committed
102 103 104
  splitter_ = new QSplitter(Qt::Vertical,this);
  setCentralWidget(splitter_);
  stackedWidget_ = new QStackedWidget(splitter_);
Jan Möbius's avatar
Jan Möbius committed
105

Jan Möbius's avatar
 
Jan Möbius committed
106 107 108 109 110 111 112
  QGLFormat format;
  QGLFormat::setDefaultFormat(format);
  format.setStereo( OpenFlipper::Options::stereo() );
  format.setAlpha(true);

  // Construct GL context & widget

113 114 115
  baseLayout_ = new QtMultiViewLayout;
  baseLayout_->setContentsMargins(0,0,0,0);

Jan Möbius's avatar
 
Jan Möbius committed
116 117
  glWidget_ = new QGLWidget(format);
  glView_ = new QtGLGraphicsView(stackedWidget_);
118
  glScene_ = new QtGLGraphicsScene (&examiner_widgets_, baseLayout_);
Jan Möbius's avatar
 
Jan Möbius committed
119

Jan Möbius's avatar
Jan Möbius committed
120 121 122 123 124 125
  // is stereo possible, use it?
  if (format.stereo()) {
    std::cerr << "Stereo buffer requested: " << (glWidget_->format().stereo() ? "ok\n" : "failed\n");
    OpenFlipper::Options::stereo(glWidget_->format().stereo());
  }

Jan Möbius's avatar
 
Jan Möbius committed
126 127 128 129 130

  glView_->setViewport(glWidget_);
  glView_->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  glView_->setScene(glScene_);

131

Jan Möbius's avatar
 
Jan Möbius committed
132 133 134 135 136 137 138 139 140 141
  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
142 143 144
  // ======================================================================
  // Set up the logging window
  // ======================================================================
145 146 147 148

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

149 150 151
  logWidget_ = new LoggerWidget(splitter_);
  logWidget_->setReadOnly(true);
  logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
152
  logWidget_->resize( splitter_->width() ,240);
153
  logWidget_->setLineWrapMode( QTextEdit::NoWrap );
Jan Möbius's avatar
Jan Möbius committed
154

155
  originalLoggerSize_ = 0;
Jan Möbius's avatar
Jan Möbius committed
156
  loggerState_ = OpenFlipper::Options::Normal;
157

Jan Möbius's avatar
 
Jan Möbius committed
158
  QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
159 160
  
  if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene) {
161 162
    slidingLogger_->attachWidget (logWidget_);
    splitter_->insertWidget (1, tempLogWidget);
163
    wsizes[0] = 1;
Jan Möbius's avatar
 
Jan Möbius committed
164 165
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
Jan Möbius committed
166 167 168 169 170 171 172 173 174 175 176 177
    loggerState_ = OpenFlipper::Options::InScene;
  } else if (OpenFlipper::Options::loggerState() == OpenFlipper::Options::Hidden) {
    splitter_->insertWidget (1, tempLogWidget);
    wsizes[0] = 1;
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
    loggerState_ = OpenFlipper::Options::Hidden;
  } else {
    // Set initial values to have a usable state
    wsizes[0] = 480;
    wsizes[1] = 240;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
178
  }
Jan Möbius's avatar
Jan Möbius committed
179

Jan Möbius's avatar
 
Jan Möbius committed
180 181 182
  // ======================================================================
  // Create examiner
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
183 184 185

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

Jan Möbius's avatar
 
Jan Möbius committed
186 187
    glViewer* examinerWidget = new glViewer(glScene_,
					    glWidget_,
Dirk Wilden's avatar
Dirk Wilden committed
188
              PluginFunctions::viewerProperties(0),
Jan Möbius's avatar
 
Jan Möbius committed
189 190 191
					    centerWidget_,
                                            "Examiner Widget",
                                            statusBar_);
Jan Möbius's avatar
Jan Möbius committed
192

Jan Möbius's avatar
Jan Möbius committed
193 194 195
    examiner_widgets_.push_back(examinerWidget);

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

Jan Möbius's avatar
Jan Möbius committed
197
    baseLayout_->addItem(examinerWidget, 0);
Jan Möbius's avatar
Jan Möbius committed
198 199 200 201

  } else {


Jan Möbius's avatar
 
Jan Möbius committed
202 203 204 205
    // Create examiners
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
      glViewer* newWidget = new glViewer(glScene_,
					 glWidget_,
Dirk Wilden's avatar
Dirk Wilden committed
206
           PluginFunctions::viewerProperties(i),
Jan Möbius's avatar
 
Jan Möbius committed
207 208
					 centerWidget_,
					 "Examiner Widget",
Dirk Wilden's avatar
Dirk Wilden committed
209 210
           statusBar_);

Jan Möbius's avatar
Jan Möbius committed
211 212 213 214 215 216 217 218
      examiner_widgets_.push_back(newWidget);
    }

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

Jan Möbius's avatar
Jan Möbius committed
219 220 221 222
    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
223 224
  }

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

Jan Möbius's avatar
 
Jan Möbius committed
228
  centerWidget_->setLayout(baseLayout_);
229 230


Jan Möbius's avatar
 
Jan Möbius committed
231 232 233
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
234 235 236 237 238 239 240 241
  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* )));
Jan Möbius's avatar
Jan Möbius committed
242 243 244
  }


Jan Möbius's avatar
 
Jan Möbius committed
245 246 247
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
248

Jan Möbius's avatar
 
Jan Möbius committed
249
  mainToolbar_ = new QToolBar("Main Toolbar");
250
  mainToolbar_->setWindowTitle("Main Toolbar");
Dirk Wilden's avatar
Dirk Wilden committed
251
  mainToolbar_->setObjectName("MainToolbar");
252
  slotAddToolbar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
253

Jan Möbius's avatar
 
Jan Möbius committed
254 255 256
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
257

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

259 260 261
  // Create the toolbar
  viewerToolbar_ = new QToolBar( "Viewer Toolbar", this );
  viewerToolbar_->setOrientation(Qt::Vertical);
Jan Möbius's avatar
 
Jan Möbius committed
262 263
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Dirk Wilden's avatar
Dirk Wilden committed
264
  viewerToolbar_->setObjectName("ViewerToolbar");
Jan Möbius's avatar
Jan Möbius committed
265

266 267 268 269 270 271 272 273 274 275 276
  moveButton_ = new QToolButton( viewerToolbar_ );
  moveButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"transform-move.png") );
  moveButton_->setMinimumSize( 16, 16 );
  moveButton_->setMaximumSize( 32, 32 );
  moveButton_->setToolTip( "Switch to <b>move</b> mode." );
  moveButton_->setWhatsThis(
                  "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>"
                  "<li><b>Zoom</b> using <b>left+middle</b> mouse buttons.</li></ul>" );
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
Jan Möbius's avatar
 
Jan Möbius committed
277
    connect( moveButton_,SIGNAL( clicked() ), &PluginFunctions::viewerProperties(i), SLOT( setExamineMode() ) );
Jan Möbius's avatar
Jan Möbius committed
278
    connect( &PluginFunctions::viewerProperties(i) , SIGNAL( actionModeChanged( Viewer::ActionMode ) ),
Jan Möbius's avatar
Jan Möbius committed
279
             this                                  , SLOT(   slotActionModeChanged(Viewer::ActionMode) ) );
280
  }
281

282 283 284 285 286 287 288 289 290 291 292 293 294
  viewerToolbar_->addWidget( moveButton_ )->setText("Move");
  moveButton_->setDown(true);


  lightButton_ = new QToolButton( viewerToolbar_ );
  lightButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"light-mode.png") );
  lightButton_->setMinimumSize( 16, 16 );
  lightButton_->setMaximumSize( 32, 32 );
  lightButton_->setToolTip("Switch to <b>light</b> mode.");
  lightButton_->setWhatsThis(
                  "Switch to <b>light</b> mode.<br>"
                  "Rotate lights using left mouse button.");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
 
Jan Möbius committed
295
        connect( lightButton_,SIGNAL( clicked() ), &PluginFunctions::viewerProperties(i), SLOT( setLightMode() ) );
296 297 298 299 300 301 302 303 304 305 306 307 308 309
  viewerToolbar_->addWidget( lightButton_)->setText("Light");


  pickButton_ = new QToolButton( viewerToolbar_ );
  pickButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"pick.png") );
  pickButton_->setMinimumSize( 16, 16 );
  pickButton_->setMaximumSize( 32, 32 );
  pickButton_->setToolTip("Switch to <b>picking</b> mode.");
  pickButton_->setWhatsThis(
                  "Switch to <b>picking</b> mode.<br>"
                  "Use picking functions like flipping edges.<br>"
                  "To change the mode use the right click<br>"
                  "context menu in the viewer.");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
 
Jan Möbius committed
310
    connect( pickButton_,SIGNAL( clicked() ), &PluginFunctions::viewerProperties(i), SLOT( setPickingMode() ) );
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
  viewerToolbar_->addWidget( pickButton_)->setText("Pick");


  questionButton_ = new QToolButton( viewerToolbar_ );
  questionButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"help-about.png") );
  questionButton_->setMinimumSize( 16, 16 );
  questionButton_->setMaximumSize( 32, 32 );
  questionButton_->setToolTip("Switch to <b>identification</b> mode.");
  questionButton_->setWhatsThis(
                  "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 "
                  "object.");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
Jan Möbius's avatar
 
Jan Möbius committed
326
    connect( questionButton_,SIGNAL( clicked() ), &PluginFunctions::viewerProperties(i), SLOT( setQuestionMode() ) );
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
  viewerToolbar_->addWidget( questionButton_)->setText("Question");

  viewerToolbar_->addSeparator();

  QToolButton* homeButton = new QToolButton( viewerToolbar_ );
  homeButton->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"go-home.png") );
  homeButton->setMinimumSize( 16, 16 );
  homeButton->setMaximumSize( 32, 32 );
  homeButton->setCheckable( false );
  homeButton->setToolTip("Restore <b>home</b> view.");
  homeButton->setWhatsThis(
                  "Restore home view<br><br>"
                  "Resets the view to the home view");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
    connect( homeButton,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( home() ) );
  viewerToolbar_->addWidget( homeButton)->setText("Home");


  QToolButton* setHomeButton = new QToolButton( viewerToolbar_ );
  setHomeButton->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"set-home.png") );
  setHomeButton->setMinimumSize( 16, 16 );
  setHomeButton->setMaximumSize( 32, 32 );
  setHomeButton->setCheckable( false );
  setHomeButton->setToolTip("Set <b>home</b> view");
  setHomeButton->setWhatsThis(
                  "Store home view<br><br>"
                  "Stores the current view as the home view");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
    connect( setHomeButton,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( setHome() ) );
  viewerToolbar_->addWidget( setHomeButton)->setText("Set Home");


  QToolButton* viewAllButton = new QToolButton( viewerToolbar_ );
  viewAllButton->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"viewall.png") );
  viewAllButton->setMinimumSize( 16, 16 );
  viewAllButton->setMaximumSize( 32, 32 );
  viewAllButton->setCheckable( false );
  viewAllButton->setToolTip("View all.");
  viewAllButton->setWhatsThis(
                  "View all<br><br>"
                  "Move the objects in the scene so that"
                  " the whole scene is visible.");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
    connect( viewAllButton,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( viewAll() ) );
  viewerToolbar_->addWidget( viewAllButton)->setText("View all");


  projectionButton_ = new QToolButton( viewerToolbar_ );
  projectionButton_->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"perspective.png") );
  projectionButton_->setMinimumSize( 16, 16 );
  projectionButton_->setMaximumSize( 32, 32 );
  projectionButton_->setCheckable( false );
  projectionButton_->setToolTip(
                "Switch between <b>perspective</b> and "
                "<b>parrallel</b> projection mode.");
  projectionButton_->setWhatsThis(
                "Switch projection modes<br><br>"
                "Switch between <b>perspective</b> and "
                "<b>parrallel</b> projection mode.");
  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
    connect( projectionButton_,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( toggleProjectionMode() ) );
    connect( examiner_widgets_[i],SIGNAL( projectionModeChanged( bool ) ), this , SLOT( slotProjectionModeChanged( bool ) ) );
  }
390 391


392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
  viewerToolbar_->addWidget( projectionButton_)->setText( "Projection" );


  viewerToolbar_->addSeparator();

  QToolButton* sceneGraphButton = new QToolButton( viewerToolbar_ );
  sceneGraphButton->setIcon( QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png") );
  sceneGraphButton->setMinimumSize( 16, 16 );
  sceneGraphButton->setMaximumSize( 32, 32 );
  sceneGraphButton->setCheckable( false );
  sceneGraphButton->setToolTip("Toggle scene graph viewer.");
  sceneGraphButton->setWhatsThis(
                  "Toggle scene graph viewer<br><br>"
                  "The scene graph viewer enables you to examine the "
                  "displayed scene graph and to modify certain nodes.<br><br>"
                  "There are three modi for the scene graph viewer:"
                  "<ul><li><b>hidden</b></li>"
                  "<li><b>split</b>: share space</li>"
                  "<li><b>dialog</b>: own dialog window</li></ul>"
                  "This button toggles between these modi.");
  QObject::connect( sceneGraphButton, SIGNAL( clicked() ),
413
                    this, SLOT( slotShowSceneGraphDialog() ) );
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
  viewerToolbar_->addWidget( sceneGraphButton)->setText( "SceneGraph" );


  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 );
    stereoButton_->setToolTip( "Toggle stereo viewing");
    stereoButton_->setWhatsThis(
                  "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 "
                  "display/projection system.");
    connect( stereoButton_,SIGNAL( clicked() ), this , SLOT( slotToggleStereoMode() ) );
    viewerToolbar_->addWidget( stereoButton_ )->setText( "Stereo");
  }
434 435


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

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

Jan Möbius's avatar
 
Jan Möbius committed
442 443
  // ======================================================================
  // Create Upper DockWidget for ToolWidget control
Jan Möbius's avatar
Jan Möbius committed
444
  // ======================================================================
Jan Möbius's avatar
 
Jan Möbius committed
445
  dockViewMode_ = new QDockWidget("ViewMode" , this );
Dirk Wilden's avatar
Dirk Wilden committed
446
  dockViewMode_->setObjectName("DockViewMode");
Jan Möbius's avatar
 
Jan Möbius committed
447 448 449 450 451 452 453 454
  QPushButton* button = new QPushButton("Change View Mode");
  dockViewMode_->setWidget(button);
  button->setParent(dockViewMode_);
  dockViewMode_->setFeatures( QDockWidget::NoDockWidgetFeatures );
  button->show();
  addDockWidget(Qt::RightDockWidgetArea,dockViewMode_);
  connect(button, SIGNAL(clicked()), this, SLOT(slotViewModeDialog()));
  dockViewMode_->setVisible(false);
Jan Möbius's avatar
Jan Möbius committed
455

Jan Möbius's avatar
 
Jan Möbius committed
456 457 458
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
459

Jan Möbius's avatar
Jan Möbius committed
460 461 462 463
  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
464

Dirk Wilden's avatar
 
Dirk Wilden committed
465
  contextMenu_ = new QMenu(this);
Jan Möbius's avatar
 
Jan Möbius committed
466
  contextSelectionMenu_ = new QMenu("Selection",0);
Jan Möbius's avatar
Jan Möbius committed
467

Jan Möbius's avatar
 
Jan Möbius committed
468
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
469

Jan Möbius's avatar
 
Jan Möbius committed
470
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
471

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

474
  registerCoreKeys();
Dirk Wilden's avatar
Dirk Wilden committed
475

476 477 478

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

Jan Möbius's avatar
 
Jan Möbius committed
479 480 481 482 483 484 485
}


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


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

Jan Möbius's avatar
 
Jan Möbius committed
487 488 489 490 491 492 493 494
}

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

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

496 497 498 499
  setWindowState( windowState() ^  Qt::WindowFullScreen);

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

Jan Möbius's avatar
 
Jan Möbius committed
500 501 502 503 504
  show();
}

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

505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
/** Enable or disable Fullscreen Mode
  */
void
CoreWidget::setFullscreen(bool _state ) {
  if ( _state )
    setWindowState( windowState() | Qt::WindowFullScreen);
  else {
    if ( windowState() & Qt::WindowFullScreen )
      setWindowState( windowState() ^  Qt::WindowFullScreen);
  }

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

  show();
}

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

Jan Möbius's avatar
 
Jan Möbius committed
523 524 525 526
/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
Jan Möbius's avatar
Jan Möbius committed
527 528 529 530 531 532 533 534 535 536 537 538 539

  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
540

541
  // Hide/Show Logger
Jan Möbius's avatar
Jan Möbius committed
542
  showLogger( OpenFlipper::Options::loggerState() );
543 544 545 546 547
}

/** Hide or show logger
  */
void
Jan Möbius's avatar
Jan Möbius committed
548
CoreWidget::showLogger(OpenFlipper::Options::LoggerState _state) {
Jan Möbius's avatar
 
Jan Möbius committed
549
  //Hide Logger
Jan Möbius's avatar
Jan Möbius committed
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
  if (_state == loggerState_)
    return;

  switch (_state)
  {
    case OpenFlipper::Options::InScene:
      {
        QList<int> wsizes( splitter_->sizes() );

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
          originalLoggerSize_  = wsizes[1];

	if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;

        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
        logWidget_->resize (logWidget_->width (), originalLoggerSize_);
        slidingLogger_->attachWidget (logWidget_);
      }
      break;
    case OpenFlipper::Options::Normal:
      {
        if ( originalLoggerSize_ == 0)
          originalLoggerSize_ = 240;

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

        if (loggerState_ == OpenFlipper::Options::InScene)
          originalLoggerSize_ = logWidget_->height ();

        slidingLogger_->detachWidget ();
        splitter_->insertWidget (1, logWidget_);

        wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
        wsizes[1] = originalLoggerSize_;
        splitter_->setSizes(wsizes);
      }
      break;
    case OpenFlipper::Options::Hidden:
      {
        QList<int> wsizes( splitter_->sizes() );

        // Remember old size
        if (loggerState_ == OpenFlipper::Options::Normal)
          originalLoggerSize_  = wsizes[1];

	if (loggerState_ == OpenFlipper::Options::InScene)
	{
	  slidingLogger_->detachWidget ();
	  originalLoggerSize_ = logWidget_->height ();
	}

        splitter_->insertWidget (1, tempLogWidget);
        wsizes[0] = wsizes[0]+wsizes[1];
        wsizes[1] = 0;
        splitter_->setSizes(wsizes);
      }
      break;
  }
  loggerState_ = _state;

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

Jan Möbius's avatar
 
Jan Möbius committed
619 620
    // Remember old size
    originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
621

622 623 624
    int height = logWidget_->height ();

    splitter_->insertWidget (1, tempLogWidget);
Jan Möbius's avatar
 
Jan Möbius committed
625 626 627
    wsizes[0] = wsizes[0]+wsizes[1];
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
    logWidget_->resize (logWidget_->width (), height);
    slidingLogger_->attachWidget (logWidget_);

  } else if (splitter_->widget (1) == logWidget_) {

    if ( originalLoggerSize_ == 0)
        originalLoggerSize_ = 240;

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

    if (wsizes[0] == 0)
      wsizes[0] = height();

    wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
    wsizes[1] = originalLoggerSize_;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
644
  } else {
Jan Möbius's avatar
Jan Möbius committed
645

646 647 648 649 650 651 652 653 654 655
    QList<int> wsizes( splitter_->sizes() );

    int height = logWidget_->height ();

    slidingLogger_->detachWidget ();
    splitter_->insertWidget (1, logWidget_);

    wsizes[0] = wsizes[0]+wsizes[1] - height;
    wsizes[1] = height;
    splitter_->setSizes(wsizes);
Jan Möbius's avatar
 
Jan Möbius committed
656
  }
Jan Möbius's avatar
Jan Möbius committed
657
  */
Jan Möbius's avatar
 
Jan Möbius committed
658 659 660 661 662 663 664 665
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
667
  //toggle
668 669 670 671 672 673 674 675 676 677 678 679
  showToolbox( OpenFlipper::Options::hideToolbox() );
}

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

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

  //toggle
  OpenFlipper::Options::hideToolbox( !_state );
Jan Möbius's avatar
 
Jan Möbius committed
680

Jan Möbius's avatar
Jan Möbius committed
681
  if ( OpenFlipper::Options::hideToolbox() ){
Jan Möbius's avatar
 
Jan Möbius committed
682 683 684 685 686 687
    //hide all toolWidgets
    for (uint p=0; p < plugins_.size(); p++)
      if (plugins_[p].widget)
        plugins_[p].widget->setVisible(false);

    //hide ViewMode Selection Widget
Jan Möbius's avatar
Jan Möbius committed
688
    dockViewMode_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
689 690 691 692 693 694 695 696 697

  }else{
    //reset last ViewMode
    if (OpenFlipper::Options::defaultToolboxMode().trimmed() == "")
      setViewMode("All");
    else
      setViewMode( OpenFlipper::Options::defaultToolboxMode() );
  }
}
Jan Möbius's avatar
Jan Möbius committed
698

Jan Möbius's avatar
 
Jan Möbius committed
699 700
//=============================================================================

Jan Möbius's avatar
Jan Möbius committed
701 702
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
703
{
704 705
  //dont add objects to recentMenu while loadind Settings
  if ( OpenFlipper::Options::loadingSettings() ) return;
Jan Möbius's avatar
Jan Möbius committed
706

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

Jan Möbius's avatar
 
Jan Möbius committed
709
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
710 711 712 713 714 715 716

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
717 718 719
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
720

Jan Möbius's avatar
 
Jan Möbius committed
721 722 723 724 725
  recentFilesMenu_->clear();

  QVector< OpenFlipper::Options::RecentFile > recentFiles = OpenFlipper::Options::recentFiles();
  for (int i = 0 ; i < recentFiles.size() ; ++i ) {
    QString path = OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator();
726 727
    path += typeIcon( recentFiles[i].type );

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

Jan Möbius's avatar
Jan Möbius committed
731 732 733
}

void
Jan Möbius's avatar
 
Jan Möbius committed
734 735 736
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
737 738

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

740 741
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
742

743
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
744
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0);
745
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
746
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
747 748
    connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)),
            this,          SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)));
749 750

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

Jan Möbius's avatar
Jan Möbius committed
753
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
754
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
755
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
756 757
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
758 759
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
760

761
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
762

763
}
Jan Möbius's avatar
Jan Möbius committed
764

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

766 767 768 769 770 771 772 773 774 775 776 777 778 779
void
CoreWidget::slotShowSceneGraphDialog()
{
  if ( PluginFunctions::getSceneGraphRootNode() )
  {
    if (!sceneGraphDialog_)
    {
      sceneGraphDialog_ = new ACG::QtWidgets::QtSceneGraphDialog( this, PluginFunctions::getSceneGraphRootNode() );

      for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
        connect(examiner_widgets_[i], SIGNAL(signalSceneGraphChanged(ACG::SceneGraph::BaseNode*)),
                sceneGraphDialog_,    SLOT(update(ACG::SceneGraph::BaseNode*)));

        connect(sceneGraphDialog_, SIGNAL(signalNodeChanged(ACG::SceneGraph::BaseNode*)),
780
                examiner_widgets_[i], SLOT(updateGL()));
781 782 783 784 785 786 787 788
      }

    }

    sceneGraphDialog_->show();
  }
}

Jan Möbius's avatar
 
Jan Möbius committed
789 790 791 792 793 794
//-----------------------------------------------------------------------------

void
CoreWidget::sceneRectChanged(const QRectF &rect)
{
  centerWidget_->setGeometry (rect);
795
  slidingLogger_->updateGeometry ();
Jan Möbius's avatar
 
Jan Möbius committed
796 797 798
}


799 800


Jan Möbius's avatar
 
Jan Möbius committed
801
//=============================================================================