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),
Jan Möbius's avatar
Jan Möbius committed
85
  aboutWidget_(0),
86
  optionsWidget_(0),
Jan Möbius's avatar
 
Jan Möbius committed
87
  plugins_(_plugins)
Jan Möbius's avatar
Jan Möbius committed
88

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

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

Jan Möbius's avatar
 
Jan Möbius committed
96 97 98 99 100 101 102 103
  // ======================================================================
  // 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
104

105 106
  originalLoggerSize_ = 0;

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

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

Jan Möbius's avatar
 
Jan Möbius committed
127 128 129 130 131 132 133 134 135
  // ======================================================================
  // 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
136 137
           this, SLOT(dropEvent(QDropEvent* )));

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
150 151 152 153 154 155
  // 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
156
  viewerToolbar_->setObjectName("ViewerToolbar");
Jan Möbius's avatar
Jan Möbius committed
157

Jan Möbius's avatar
 
Jan Möbius committed
158 159 160 161 162 163
  // 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
164

Jan Möbius's avatar
 
Jan Möbius committed
165 166 167 168 169
      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
170

Jan Möbius's avatar
 
Jan Möbius committed
171 172 173 174 175
      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
176

Jan Möbius's avatar
 
Jan Möbius committed
177 178 179 180 181
      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
182

Jan Möbius's avatar
 
Jan Möbius committed
183 184 185 186 187
      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
188

Jan Möbius's avatar
 
Jan Möbius committed
189 190 191 192 193
      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
194

Jan Möbius's avatar
 
Jan Möbius committed
195 196 197 198 199
      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
200
//
Jan Möbius's avatar
 
Jan Möbius committed
201 202 203 204 205
//       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
206
//
Jan Möbius's avatar
 
Jan Möbius committed
207 208 209 210 211
//       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
212
//
Jan Möbius's avatar
 
Jan Möbius committed
213 214 215 216 217
//       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
218
//
Jan Möbius's avatar
 
Jan Möbius committed
219 220 221
//       QToolButton * button = qobject_cast<QToolButton *>( viewerToolbar_->widgetForAction ( actions[i] ) );
//       button->setIcon(icon);
    }
Jan Möbius's avatar
Jan Möbius committed
222 223 224

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

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

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

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

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

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

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

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

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

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

  //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
269
  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
270 271 272 273 274 275 276
}


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


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

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

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

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

287 288 289 290
  setWindowState( windowState() ^  Qt::WindowFullScreen);

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

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

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

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

303 304 305 306 307 308 309 310
  // 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
311
  //Hide Logger
312
  if ( _hide ) {
Jan Möbius's avatar
 
Jan Möbius committed
313
    QList<int> wsizes( splitter_->sizes() );
Jan Möbius's avatar
Jan Möbius committed
314

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

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

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

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

    if (wsizes[0] == 0)
      wsizes[0] = height();
Jan Möbius's avatar
Jan Möbius committed
330

Jan Möbius's avatar
 
Jan Möbius committed
331 332 333 334 335 336 337 338 339 340 341 342
    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
343

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
367 368 369 370 371 372
/** 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
373
    switch (_e->key())
Jan Möbius's avatar
 
Jan Möbius committed
374 375 376 377
    {
        case Qt::Key_F :
            toggleFullscreen();
          return;
Jan Möbius's avatar
Jan Möbius committed
378

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

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

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

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

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

/** Handle Key Release Events */
Jan Möbius's avatar
Jan Möbius committed
406
void
Jan Möbius's avatar
 
Jan Möbius committed
407
CoreWidget::keyReleaseEvent(QKeyEvent* _e) {
Dirk Wilden's avatar
Dirk Wilden committed
408 409 410 411 412 413 414 415 416 417 418
   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
419
      if ( plugins_[i].keys[k].key == _e->key()
Dirk Wilden's avatar
Dirk Wilden committed
420 421 422 423 424 425 426 427
        && 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
428 429 430
        //only inform further plugins if this is a multiUse key
        if (!plugins_[i].keys[k].multiUse)
          return;
Dirk Wilden's avatar
Dirk Wilden committed
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
      }
}

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

/** 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
454 455 456
        //only inform further plugins if this is a multiUse key
        if (!plugins_[i].keys[k].multiUse)
          return;
Dirk Wilden's avatar
Dirk Wilden committed
457 458 459 460 461 462 463
      }
}

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

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

  //first check if the key is already registered by the coreWidget
  bool found = false;
Dirk Wilden's avatar
Dirk Wilden committed
468
  bool multi = false;
Dirk Wilden's avatar
Dirk Wilden committed
469 470 471
  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
472
      multi = coreKeys_[i].multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
473 474 475 476 477 478 479 480
      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
481
        && plugins_[i].keys[k].modifiers == _modifiers){
Dirk Wilden's avatar
Dirk Wilden committed
482
          found = true;
Dirk Wilden's avatar
Dirk Wilden committed
483 484 485
          multi = plugins_[i].keys[k].multiUse;
          break;
        }
Dirk Wilden's avatar
Dirk Wilden committed
486 487 488 489 490 491 492 493 494 495

  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
496 497
    kb.multiUse = multi || _multiUse;

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

Dirk Wilden's avatar
Dirk Wilden committed
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
    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
521
  kb.multiUse = multi || _multiUse;
Dirk Wilden's avatar
Dirk Wilden committed
522

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

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

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

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

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

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

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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