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

#define WIDGET_HEIGHT 800
#define WIDGET_WIDTH  800

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

Jan Möbius's avatar
Jan Möbius committed
59 60
/** \brief Constuctor for the Core Widget
 *
Jan Möbius's avatar
 
Jan Möbius committed
61 62
*/
CoreWidget::
Dirk Wilden's avatar
Dirk Wilden committed
63
CoreWidget( QVector<ViewMode*>& _viewModes,
Dirk Wilden's avatar
Dirk Wilden committed
64
            std::vector<PluginInfo>& _plugins ) :
Jan Möbius's avatar
 
Jan Möbius committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
  QMainWindow(),
  viewModes_(_viewModes),
  dockViewMode_(0),
  viewModeButton_(0),
  viewModeMenu_(0),
  viewGroup_(0),
  examiner_widget_(0),
  splitter_(0),
  textedit_(0),
  recentFilesMenu_(0),
  pluginsMenu_(0),
  fileMenu_(0),
  viewMenu_(0),
  fileMenuEnd_(0),
  contextMenu_(0),
Jan Möbius's avatar
Jan Möbius committed
80
  contextSelectionMenu_(0),
Jan Möbius's avatar
 
Jan Möbius committed
81 82 83 84
  stackMenu_(0),
  stackedWidget_(0),
  helpBrowserDeveloper_(0),
  helpBrowserUser_(0),
85
  optionsWidget_(0),
Jan Möbius's avatar
 
Jan Möbius committed
86
  plugins_(_plugins)
Jan Möbius's avatar
Jan Möbius committed
87

Jan Möbius's avatar
 
Jan Möbius committed
88 89
{
  setupStatusBar();
Jan Möbius's avatar
Jan Möbius committed
90

Jan Möbius's avatar
 
Jan Möbius committed
91 92 93
  splitter_ = new QSplitter(Qt::Vertical,this);
  setCentralWidget(splitter_);
  stackedWidget_ = new QStackedWidget(splitter_);
Jan Möbius's avatar
Jan Möbius committed
94

Jan Möbius's avatar
 
Jan Möbius committed
95 96 97 98 99 100 101 102
  // ======================================================================
  // Set up the logging window
  // ======================================================================
  textedit_ = new QTextEdit(splitter_);
  textedit_->setReadOnly(true);
  textedit_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) );
  textedit_->resize( splitter_->width() ,120);
  textedit_->setLineWrapMode( QTextEdit::NoWrap );
Jan Möbius's avatar
Jan Möbius committed
103

104 105
  originalLoggerSize_ = 0;

Jan Möbius's avatar
 
Jan Möbius committed
106 107 108 109 110
  QList<int> wsizes( splitter_->sizes() );
  if (OpenFlipper::Options::hideLogger()) {
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
  }
Jan Möbius's avatar
Jan Möbius committed
111

Jan Möbius's avatar
 
Jan Möbius committed
112 113 114 115 116 117
  // ======================================================================
  // Create examiner
  // ======================================================================
  QGLFormat format;
  QGLFormat::setDefaultFormat(format);
  format.setStereo( OpenFlipper::Options::stereo() );
Jan Möbius's avatar
Jan Möbius committed
118 119 120
  examiner_widget_ = new ACG::QtWidgets::QtExaminerViewer(stackedWidget_,
                                                          "Examiner Widget",
                                                          statusBar_ ,
Jan Möbius's avatar
 
Jan Möbius committed
121
                                                          &format);
Dirk Wilden's avatar
Dirk Wilden committed
122
  examiner_widget_->sceneGraph( PluginFunctions::getSceneGraphRootNode() );
Jan Möbius's avatar
 
Jan Möbius committed
123 124
  examiner_widget_->enablePopupMenu(false);
  stackedWidget_->addWidget(examiner_widget_);
Jan Möbius's avatar
Jan Möbius committed
125

Jan Möbius's avatar
 
Jan Möbius committed
126 127 128 129 130 131 132 133 134
  // ======================================================================
  // Setup dragging for examiner widget
  // ======================================================================
  examiner_widget_->setExternalDrag(true);
  connect( examiner_widget_, SIGNAL(startDragEvent( QMouseEvent*)),
           this, SLOT(startDrag(QMouseEvent* )));
  connect( examiner_widget_, SIGNAL(dragEnterEvent( QDragEnterEvent*)),
           this, SLOT(dragEnterEvent(QDragEnterEvent* )));
  connect( examiner_widget_, SIGNAL(dropEvent( QDropEvent*)),
Jan Möbius's avatar
Jan Möbius committed
135 136
           this, SLOT(dropEvent(QDropEvent* )));

Jan Möbius's avatar
 
Jan Möbius committed
137 138 139
  // ======================================================================
  // Create main Toolbar
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
140

Jan Möbius's avatar
 
Jan Möbius committed
141
  mainToolbar_ = new QToolBar("Main Toolbar");
Dirk Wilden's avatar
Dirk Wilden committed
142
  mainToolbar_->setObjectName("MainToolbar");
Jan Möbius's avatar
 
Jan Möbius committed
143
  addToolBar(mainToolbar_);
Jan Möbius's avatar
Jan Möbius committed
144

Jan Möbius's avatar
 
Jan Möbius committed
145 146 147
  // ======================================================================
  // Get Toolbar from examiner and integrate it into main window
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
148

Jan Möbius's avatar
 
Jan Möbius committed
149 150 151 152 153 154
  // Take control over the toolbar
  viewerToolbar_ = examiner_widget_->removeToolBar();
  addToolBar(Qt::TopToolBarArea,viewerToolbar_);
  viewerToolbar_->setParent(this);
  viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
  viewerToolbar_->setIconSize(QSize(20,20));
Dirk Wilden's avatar
Dirk Wilden committed
155
  viewerToolbar_->setObjectName("ViewerToolbar");
Jan Möbius's avatar
Jan Möbius committed
156

Jan Möbius's avatar
 
Jan Möbius committed
157 158 159 160 161 162
  // Set our own Icons
  QList<QAction *> actions = viewerToolbar_->actions();
  for ( int i = 0 ; i < actions.size(); ++i ) {
    if ( actions[i]->text() == "Move" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"transform-move.png");
Jan Möbius's avatar
Jan Möbius committed
163

Jan Möbius's avatar
 
Jan Möbius committed
164 165 166 167 168
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "Home" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"go-home.png");
Jan Möbius's avatar
Jan Möbius committed
169

Jan Möbius's avatar
 
Jan Möbius committed
170 171 172 173 174
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "Set Home" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"set-home.png");
Jan Möbius's avatar
Jan Möbius committed
175

Jan Möbius's avatar
 
Jan Möbius committed
176 177 178 179 180
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "Light" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"ktip.png");
Jan Möbius's avatar
Jan Möbius committed
181

Jan Möbius's avatar
 
Jan Möbius committed
182 183 184 185 186
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "Question" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"help-about.png");
Jan Möbius's avatar
Jan Möbius committed
187

Jan Möbius's avatar
 
Jan Möbius committed
188 189 190 191 192
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "SceneGraph" ) {
      QIcon icon;
      icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png");
Jan Möbius's avatar
Jan Möbius committed
193

Jan Möbius's avatar
 
Jan Möbius committed
194 195 196 197 198
      QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
      button->setIcon(icon);
    } else if ( actions[i]->text() == "Pick" ) {
//       QIcon icon;
//       icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png");
Jan Möbius's avatar
Jan Möbius committed
199
//
Jan Möbius's avatar
 
Jan Möbius committed
200 201 202 203 204
//       QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
//       button->setIcon(icon);
    } else if ( actions[i]->text() == "View All" ) {
//       QIcon icon;
//       icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png");
Jan Möbius's avatar
Jan Möbius committed
205
//
Jan Möbius's avatar
 
Jan Möbius committed
206 207 208 209 210
//       QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
//       button->setIcon(icon);
    } else if ( actions[i]->text() == "Projection" ) {
//       QIcon icon;
//       icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png");
Jan Möbius's avatar
Jan Möbius committed
211
//
Jan Möbius's avatar
 
Jan Möbius committed
212 213 214 215 216
//       QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
//       button->setIcon(icon);
    } else if ( actions[i]->text() == "Stereo" ) {
//       QIcon icon;
//       icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png");
Jan Möbius's avatar
Jan Möbius committed
217
//
Jan Möbius's avatar
 
Jan Möbius committed
218 219 220
//       QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
//       button->setIcon(icon);
    }
Jan Möbius's avatar
Jan Möbius committed
221 222 223

//     else
//       std::cerr << actions[i]->text().toStdString() << std::endl;
Jan Möbius's avatar
 
Jan Möbius committed
224
  }
Jan Möbius's avatar
Jan Möbius committed
225

Jan Möbius's avatar
 
Jan Möbius committed
226
  stackWidgetList_.push_back( StackWidgetInfo( false, "3D Examiner Widget", examiner_widget_ ) );
Jan Möbius's avatar
Jan Möbius committed
227

Jan Möbius's avatar
 
Jan Möbius committed
228 229 230
  // Remember logger size
  wsizes = splitter_->sizes();
  originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
231

Jan Möbius's avatar
 
Jan Möbius committed
232 233
  // ======================================================================
  // Create Upper DockWidget for ToolWidget control
Jan Möbius's avatar
Jan Möbius committed
234
  // ======================================================================
Jan Möbius's avatar
 
Jan Möbius committed
235
  dockViewMode_ = new QDockWidget("ViewMode" , this );
Dirk Wilden's avatar
Dirk Wilden committed
236
  dockViewMode_->setObjectName("DockViewMode");
Jan Möbius's avatar
 
Jan Möbius committed
237 238 239 240 241 242 243 244
  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
245

Jan Möbius's avatar
 
Jan Möbius committed
246 247 248
  // ======================================================================
  // Context menu setup
  // ======================================================================
Jan Möbius's avatar
Jan Möbius committed
249 250

  connect( examiner_widget_ , SIGNAL(signalCustomContextMenuRequested( const QPoint&) ) ,
Jan Möbius's avatar
 
Jan Möbius committed
251
           this             , SLOT( slotCustomContextMenu( const QPoint&) ) );
Jan Möbius's avatar
Jan Möbius committed
252

Jan Möbius's avatar
 
Jan Möbius committed
253 254
  contextMenu_ = new QMenu(0);
  contextSelectionMenu_ = new QMenu("Selection",0);
Jan Möbius's avatar
Jan Möbius committed
255

Jan Möbius's avatar
 
Jan Möbius committed
256
  setupMenuBar();
Jan Möbius's avatar
Jan Möbius committed
257

Jan Möbius's avatar
 
Jan Möbius committed
258
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
259

Jan Möbius's avatar
 
Jan Möbius committed
260
  statusBar_->showMessage("Ready", 5000);
Dirk Wilden's avatar
Dirk Wilden committed
261 262 263 264 265 266 267

  //register keys for coreWidget
  connect(this,SIGNAL( registerKey(int, Qt::KeyboardModifiers, QString) ),
                this,SLOT(slotRegisterKey(int, Qt::KeyboardModifiers, QString)) );

  emit registerKey(Qt::Key_S,Qt::ControlModifier, "Save Object");
  emit registerKey(Qt::Key_O,Qt::ControlModifier, "Open Object");
Jan Möbius's avatar
Jan Möbius committed
268
  emit registerKey(Qt::Key_Escape,Qt::NoModifier, "Switch to last action mode ( Move,Picking,Light or Info Mode)");
Jan Möbius's avatar
 
Jan Möbius committed
269 270 271 272 273 274 275
}


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


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

Jan Möbius's avatar
 
Jan Möbius committed
277 278 279 280 281 282 283 284
}

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

/** Set viewer to Fullscreen Mode and back
  */
void
CoreWidget::toggleFullscreen() {
285 286 287 288 289
  
  setWindowState( windowState() ^  Qt::WindowFullScreen);

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

Jan Möbius's avatar
 
Jan Möbius committed
290 291 292 293 294 295 296 297 298 299 300
  show();
}

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

/** Hide or show logger
  */
void
CoreWidget::toggleLogger() {
  // toggle
  OpenFlipper::Options::hideLogger( !OpenFlipper::Options::hideLogger() );
Jan Möbius's avatar
Jan Möbius committed
301

302 303 304 305 306 307 308 309
  // Hide/Show Logger
  hideLogger( OpenFlipper::Options::hideLogger() );
}

/** Hide or show logger
  */
void
CoreWidget::hideLogger(bool _hide) {
Jan Möbius's avatar
 
Jan Möbius committed
310
  //Hide Logger
311
  if ( _hide ) {
Jan Möbius's avatar
 
Jan Möbius committed
312
    QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
313

Jan Möbius's avatar
 
Jan Möbius committed
314 315
    // Remember old size
    originalLoggerSize_  = wsizes[1];
Jan Möbius's avatar
Jan Möbius committed
316

Jan Möbius's avatar
 
Jan Möbius committed
317 318 319 320
    wsizes[0] = wsizes[0]+wsizes[1];
    wsizes[1] = 0;
    splitter_->setSizes(wsizes);
  } else {
Jan Möbius's avatar
Jan Möbius committed
321 322

    if ( originalLoggerSize_ == 0)
Jan Möbius's avatar
 
Jan Möbius committed
323
        originalLoggerSize_ = 240;
Jan Möbius's avatar
Jan Möbius committed
324

Jan Möbius's avatar
 
Jan Möbius committed
325
    QList<int> wsizes( splitter_->sizes() );
326 327 328 329

    if (wsizes[0] == 0)
      wsizes[0] = height();
    
Jan Möbius's avatar
 
Jan Möbius committed
330 331 332 333 334 335 336 337 338 339 340 341
    wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_;
    wsizes[1] = originalLoggerSize_;
    splitter_->setSizes(wsizes);
  }
}

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

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

Jan Möbius's avatar
 
Jan Möbius committed
343 344 345
  //toggle
  OpenFlipper::Options::hideToolbox(!OpenFlipper::Options::hideToolbox());

Jan Möbius's avatar
Jan Möbius committed
346
  if ( OpenFlipper::Options::hideToolbox() ){
Jan Möbius's avatar
 
Jan Möbius committed
347 348 349 350 351 352
    //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
353
    dockViewMode_->setVisible(false);
Jan Möbius's avatar
 
Jan Möbius committed
354 355 356 357 358 359 360 361 362

  }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
363

Jan Möbius's avatar
 
Jan Möbius committed
364
//-----------------------------------------------------------------------------
Jan Möbius's avatar
Jan Möbius committed
365

Jan Möbius's avatar
 
Jan Möbius committed
366 367 368 369 370 371
/** Handles keypress events or passes them to plugins
  */
void
CoreWidget::keyPressEvent(QKeyEvent* _e)
{
  if (_e->modifiers() == Qt::ControlModifier ) {
Jan Möbius's avatar
Jan Möbius committed
372
    switch (_e->key())
Jan Möbius's avatar
 
Jan Möbius committed
373 374 375 376
    {
        case Qt::Key_F :
            toggleFullscreen();
          return;
Jan Möbius's avatar
Jan Möbius committed
377

Jan Möbius's avatar
 
Jan Möbius committed
378 379 380
        case Qt::Key_L :
            toggleLogger();
          return;
Jan Möbius's avatar
Jan Möbius committed
381

Jan Möbius's avatar
 
Jan Möbius committed
382 383 384
        case Qt::Key_T :
            toggleToolbox();
          return;
Jan Möbius's avatar
Jan Möbius committed
385

Jan Möbius's avatar
 
Jan Möbius committed
386
        // Send remaining events to plugins
Jan Möbius's avatar
Jan Möbius committed
387
        default:
Dirk Wilden's avatar
Dirk Wilden committed
388
           mapKeyPressEvent(_e);
Jan Möbius's avatar
 
Jan Möbius committed
389
        return;
Jan Möbius's avatar
Jan Möbius committed
390
    }
Jan Möbius's avatar
 
Jan Möbius committed
391
  }
Jan Möbius's avatar
Jan Möbius committed
392 393

   switch (_e->key())
Jan Möbius's avatar
 
Jan Möbius committed
394 395 396
   {
      // Send remaining events to plugins
      default:
Dirk Wilden's avatar
Dirk Wilden committed
397
          mapKeyPressEvent(_e);
Jan Möbius's avatar
 
Jan Möbius committed
398 399 400 401 402 403 404
      break;
  }
}

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

/** Handle Key Release Events */
Jan Möbius's avatar
Jan Möbius committed
405
void
Jan Möbius's avatar
 
Jan Möbius committed
406
CoreWidget::keyReleaseEvent(QKeyEvent* _e) {
Dirk Wilden's avatar
Dirk Wilden committed
407 408 409 410 411 412 413 414 415 416 417
   mapKeyReleaseEvent(_e);
}

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

/** Map Key Press Events to Plugins */
void
CoreWidget::mapKeyPressEvent(QKeyEvent* _e){
  //find the first plugin which wants to handle that key
  for (uint i=0; i < plugins_.size(); i++)
    for (int k=0; k < plugins_[i].keys.count(); k++)
Jan Möbius's avatar
Jan Möbius committed
418
      if ( plugins_[i].keys[k].key == _e->key()
Dirk Wilden's avatar
Dirk Wilden committed
419 420 421 422 423 424 425 426
        && plugins_[i].keys[k].modifiers == _e->modifiers() ){

        KeyInterface* keyPlugin = qobject_cast< KeyInterface * >(plugins_[i].plugin);

        if (keyPlugin){
//           if ( checkSlot( plugins_[i].plugin , "slotKeyEvent(QKeyEvent*)" ) )
            keyPlugin->slotKeyEvent(_e);
        }
Dirk Wilden's avatar
Dirk Wilden committed
427 428 429
        //only inform further plugins if this is a multiUse key
        if (!plugins_[i].keys[k].multiUse)
          return;
Dirk Wilden's avatar
Dirk Wilden committed
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
      }
}

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

/** Map Key Release Events to Plugins */
void
CoreWidget::mapKeyReleaseEvent(QKeyEvent* _e){

  if (_e->isAutoRepeat()) return; //consider only "real" release events

  //find the first plugin which wants to handle that key
  for (uint i=0; i < plugins_.size(); i++)
    for (int k=0; k < plugins_[i].keys.count(); k++)
      if ( plugins_[i].keys[k].key == _e->key()
        && plugins_[i].keys[k].modifiers == _e->modifiers() ){

        KeyInterface* keyPlugin = qobject_cast< KeyInterface * >(plugins_[i].plugin);

        if (keyPlugin){
//           if ( checkSlot( plugins_[i].plugin , "slotKeyReleaseEvent(QKeyEvent*)" ) )
            keyPlugin->slotKeyReleaseEvent(_e);
        }
Dirk Wilden's avatar
Dirk Wilden committed
453 454 455
        //only inform further plugins if this is a multiUse key
        if (!plugins_[i].keys[k].multiUse)
          return;
Dirk Wilden's avatar
Dirk Wilden committed
456 457 458 459 460 461 462
      }
}

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

/** Register a key to a plugin */
void
Dirk Wilden's avatar
Dirk Wilden committed
463
CoreWidget::slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description, bool _multiUse){
Dirk Wilden's avatar
Dirk Wilden committed
464 465 466

  //first check if the key is already registered by the coreWidget
  bool found = false;
Dirk Wilden's avatar
Dirk Wilden committed
467
  bool multi = false;
Dirk Wilden's avatar
Dirk Wilden committed
468 469 470
  for (uint i=0; i < coreKeys_.size(); i++)
    if (coreKeys_[i].key == _key && coreKeys_[i].modifiers == _modifiers){
      found = true;
Dirk Wilden's avatar
Dirk Wilden committed
471
      multi = coreKeys_[i].multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
472 473 474 475 476 477 478 479
      break;
    }

  //then check if the key is already registered by a different plugin
  if (!found)
    for (uint i=0; i < plugins_.size(); i++)
      for (int k=0; k < plugins_[i].keys.count(); k++)
        if (plugins_[i].keys[k].key == _key
Dirk Wilden's avatar
Dirk Wilden committed
480
        && plugins_[i].keys[k].modifiers == _modifiers){
Dirk Wilden's avatar
Dirk Wilden committed
481
          found = true;
Dirk Wilden's avatar
Dirk Wilden committed
482 483 484
          multi = plugins_[i].keys[k].multiUse;
          break;
        }
Dirk Wilden's avatar
Dirk Wilden committed
485 486 487 488 489 490 491 492 493 494

  if (found)
    emit log(LOGERR, "Key already registered elsewhere.");

  //check if its a key for the core
  if (sender() == this){
    KeyBinding kb;
    kb.key = _key;
    kb.modifiers = _modifiers;
    kb.description = _description;
Dirk Wilden's avatar
Dirk Wilden committed
495 496
    kb.multiUse = multi || _multiUse;

497 498 499
    if (multi && !_multiUse)
      log(LOGWARN, "Key registered as multiUse key.");

Dirk Wilden's avatar
Dirk Wilden committed
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
    coreKeys_.push_back( kb );
    return;
  }

  //find plugin
 PluginInfo* pluginInfo = 0;

  for (uint i=0; i < plugins_.size(); i++)
    if (plugins_[i].plugin == sender())
      pluginInfo = &plugins_[i];

  if (pluginInfo == 0){
    emit log(LOGERR, "Unable to register key. Plugin not found!");
    return;
  }

  KeyBinding kb;
  kb.key = _key;
  kb.modifiers = _modifiers;
  kb.description = _description;
Dirk Wilden's avatar
Dirk Wilden committed
520
  kb.multiUse = multi || _multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
521

522 523 524
  if (multi && !_multiUse)
    log(LOGWARN, "Key registered as multiUse key.");

Dirk Wilden's avatar
Dirk Wilden committed
525
  pluginInfo->keys.append( kb );
Jan Möbius's avatar
 
Jan Möbius committed
526 527 528 529
}

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

Jan Möbius's avatar
Jan Möbius committed
530 531
void
CoreWidget::addRecent(QString _filename, DataType _type)
Jan Möbius's avatar
 
Jan Möbius committed
532 533
{
  //dont add objects within INI files to recentMenu
Jan Möbius's avatar
Jan Möbius committed
534 535
  if ( OpenFlipper::Options::openingIni() ) return;

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

Jan Möbius's avatar
 
Jan Möbius committed
538
  updateRecent();
Jan Möbius's avatar
Jan Möbius committed
539 540 541 542 543 544 545

}

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

void
CoreWidget::updateRecent()
Jan Möbius's avatar
 
Jan Möbius committed
546 547 548
{
  if ( recentFilesMenu_ == NULL)
    return;
Jan Möbius's avatar
Jan Möbius committed
549

Jan Möbius's avatar
 
Jan Möbius committed
550 551 552 553 554 555
  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();
    switch(recentFiles[i].type){
Jan Möbius's avatar
Jan Möbius committed
556
      case DATA_TRIANGLE_MESH:
Jan Möbius's avatar
 
Jan Möbius committed
557
        path += "TriangleType.png"; break;
Jan Möbius's avatar
Jan Möbius committed
558
      case DATA_POLY_MESH:
Jan Möbius's avatar
 
Jan Möbius committed
559
        path += "PolyType.png"; break;
Jan Möbius's avatar
Jan Möbius committed
560
      case DATA_POLY_LINE:
Jan Möbius's avatar
 
Jan Möbius committed
561
        path += "PolyLineType.png"; break;
Jan Möbius's avatar
Jan Möbius committed
562
      case DATA_BSPLINE_CURVE:
Jan Möbius's avatar
 
Jan Möbius committed
563
        path += "BSplineCurveType.png"; break;
Jan Möbius's avatar
 
Jan Möbius committed
564 565
      default: path = "";
    }
Jan Möbius's avatar
Jan Möbius committed
566
    recentFilesMenu_->addAction(QIcon(path), recentFiles[i].filename);
Jan Möbius's avatar
 
Jan Möbius committed
567 568
  }

Jan Möbius's avatar
Jan Möbius committed
569 570 571
}

void
Jan Möbius's avatar
 
Jan Möbius committed
572 573 574
CoreWidget::closeEvent ( QCloseEvent * /* event */ ) {
  emit exit();
}
575 576

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

578 579
  if ( OpenFlipper::Options::nogui() )
    return;
Jan Möbius's avatar
Jan Möbius committed
580

581
  if ( optionsWidget_ == 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
582
    optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, 0);
583
    connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions()));
Dirk Wilden's avatar
Dirk Wilden committed
584
    connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions()));
585
  }
Dirk Wilden's avatar
Dirk Wilden committed
586

Jan Möbius's avatar
Jan Möbius committed
587
  //show the optionsWidget centered
Dirk Wilden's avatar
Dirk Wilden committed
588
  QPoint center;
Jan Möbius's avatar
Jan Möbius committed
589
  center.setX( x() + width() / 2 );
Dirk Wilden's avatar
Dirk Wilden committed
590 591
  center.setY( y() + height() / 2 );

Dirk Wilden's avatar
Dirk Wilden committed
592 593
  optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2,
                              center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height());
Dirk Wilden's avatar
Dirk Wilden committed
594

595
  optionsWidget_->show();
Jan Möbius's avatar
Jan Möbius committed
596

597
}
Jan Möbius's avatar
Jan Möbius committed
598

Jan Möbius's avatar
 
Jan Möbius committed
599 600

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