//============================================================================= // // 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. // // OpenFlipper is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with OpenFlipper. If not, see . // //----------------------------------------------------------------------------- // // $Revision$ // $Author$ // $Date$ // //============================================================================= //============================================================================= // // CLASS MViewWidget - IMPLEMENTATION // //============================================================================= //== INCLUDES ================================================================= // -------------------- mview #include "CoreWidget.hh" // -------------------- OpenFlipper Includes #include #include #include #include #include #define WIDGET_HEIGHT 800 #define WIDGET_WIDTH 800 //== IMPLEMENTATION ========================================================== /** \brief Constuctor for the Core Widget * */ CoreWidget:: CoreWidget( QVector& _viewModes, std::vector& _plugins, QList< SlotInfo >& _coreSlots ) : QMainWindow(), coreSlots_(_coreSlots), viewModes_(_viewModes), dockViewMode_(0), viewModeButton_(0), viewModeMenu_(0), viewGroup_(0), splitter_(0), logWidget_(0), recentFilesMenu_(0), pluginsMenu_(0), fileMenu_(0), viewMenu_(0), fileMenuEnd_(0), contextMenu_(0), contextSelectionMenu_(0), stackMenu_(0), stackedWidget_(0), helpBrowserDeveloper_(0), helpBrowserUser_(0), aboutWidget_(0), optionsWidget_(0), plugins_(_plugins) { setupStatusBar(); splitter_ = new QSplitter(Qt::Vertical,this); setCentralWidget(splitter_); stackedWidget_ = new QStackedWidget(splitter_); // ====================================================================== // Set up the logging window // ====================================================================== logWidget_ = new LoggerWidget(splitter_); logWidget_->setReadOnly(true); logWidget_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Preferred ) ); logWidget_->resize( splitter_->width() ,120); logWidget_->setLineWrapMode( QTextEdit::NoWrap ); originalLoggerSize_ = 0; QList wsizes( splitter_->sizes() ); if (OpenFlipper::Options::hideLogger()) { wsizes[1] = 0; splitter_->setSizes(wsizes); } // ====================================================================== // Create examiner // ====================================================================== QGLFormat format; QGLFormat::setDefaultFormat(format); format.setStereo( OpenFlipper::Options::stereo() ); QWidget* tmp = 0; if ( !OpenFlipper::Options::multiView() ) { QtExaminerViewer* examinerWidget = new QtExaminerViewer(stackedWidget_, "Examiner Widget", statusBar_ , &format); examiner_widgets_.push_back(examinerWidget); examinerWidget->disableKeyHandling(true); examinerWidget->sceneGraph( PluginFunctions::getSceneGraphRootNode() ); examinerWidget->enablePopupMenu(false); stackedWidget_->addWidget(examinerWidget); } else { // Create collector widget which holds all viewers tmp = new QWidget(stackedWidget_); // Create master examiner widget QtExaminerViewer* examinerWidget = new QtExaminerViewer(tmp, "Examiner Widget", statusBar_ , &format, 0, QtExaminerViewer::Nothing); examiner_widgets_.push_back(examinerWidget); // Create all other examiners using the same gl context as the others for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) { QtExaminerViewer* newWidget = new QtExaminerViewer(tmp, "Examiner Widget", statusBar_ , &format, examinerWidget, QtExaminerViewer::Nothing); examiner_widgets_.push_back(newWidget); } // Initialize all examiners for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) { examiner_widgets_[i]->sceneGraph( PluginFunctions::getSceneGraphRootNode() ); examiner_widgets_[i]->enablePopupMenu(false); examiner_widgets_[i]->disableKeyHandling(true); } QGridLayout* layout = new QGridLayout(tmp); layout->addWidget(examiner_widgets_[0],0,0); layout->addWidget(examiner_widgets_[1],0,1); layout->addWidget(examiner_widgets_[2],1,0); layout->addWidget(examiner_widgets_[3],1,1); for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) examiner_widgets_[i]->hide(); stackedWidget_->addWidget(tmp); } // ====================================================================== // Setup dragging for examiner widget // ====================================================================== for ( uint i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) { examiner_widgets_[i]->setExternalDrag(true); 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* ))); } // ====================================================================== // Create main Toolbar // ====================================================================== mainToolbar_ = new QToolBar("Main Toolbar"); mainToolbar_->setWindowTitle("Main Toolbar"); mainToolbar_->setObjectName("MainToolbar"); slotAddToolbar(mainToolbar_); // ====================================================================== // Get Toolbar from examiner and integrate it into main window // ====================================================================== // Take control over the toolbar viewerToolbar_ = examiner_widgets_[0]->removeToolBar(); for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) { examiner_widgets_[i]->removeToolBar(); } addToolBar(Qt::TopToolBarArea,viewerToolbar_); viewerToolbar_->setParent(this); viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas); viewerToolbar_->setIconSize(QSize(20,20)); viewerToolbar_->setObjectName("ViewerToolbar"); // Set our own Icons and connect to additional examiner widgets QList 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"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( examineMode() ) ); } else if ( actions[i]->text() == "Home" ) { QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"go-home.png"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( home() ) ); } else if ( actions[i]->text() == "Set Home" ) { QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"set-home.png"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( setHome() ) ); } else if ( actions[i]->text() == "Light" ) { QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"light-mode.png"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( lightMode() ) ); } else if ( actions[i]->text() == "Question" ) { QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"help-about.png"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( questionMode() ) ); } else if ( actions[i]->text() == "SceneGraph" ) { QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"scenegraph.png"); QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); button->setIcon(icon); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( showSceneGraphDialog() ) ); } else if ( actions[i]->text() == "Pick" ) { QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( pickingMode() ) ); } else if ( actions[i]->text() == "View All" ) { QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( viewAll() ) ); } else if ( actions[i]->text() == "Projection" ) { QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( toggleProjectionMode() ) ); } else if ( actions[i]->text() == "Stereo" ) { QToolButton * button = qobject_cast( viewerToolbar_->widgetForAction ( actions[i] ) ); // Connect action to all other widgets ( First widget provides the toolbar so dont connect twice!) for ( unsigned int i = 1 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) connect( button,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( toggleStereoMode() ) ); } } if ( !OpenFlipper::Options::multiView() ) { stackWidgetList_.push_back( StackWidgetInfo( false, "3D Examiner Widget", examiner_widgets_[0] ) ); } else { stackWidgetList_.push_back( StackWidgetInfo( false, "3D Examiner Widget", tmp ) ); } // Remember logger size wsizes = splitter_->sizes(); originalLoggerSize_ = wsizes[1]; // ====================================================================== // Create Upper DockWidget for ToolWidget control // ====================================================================== dockViewMode_ = new QDockWidget("ViewMode" , this ); dockViewMode_->setObjectName("DockViewMode"); 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); // ====================================================================== // Context menu setup // ====================================================================== for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) { connect( examiner_widgets_[i] , SIGNAL(signalCustomContextMenuRequested( const QPoint&) ) , this , SLOT( slotCustomContextMenu( const QPoint&) ) ); } contextMenu_ = new QMenu(this); contextSelectionMenu_ = new QMenu("Selection",0); setupMenuBar(); updateRecent(); statusBar_->showMessage("Ready", 5000); registerCoreKeys(); } //----------------------------------------------------------------------------- CoreWidget::~CoreWidget() { } //----------------------------------------------------------------------------- /** Set viewer to Fullscreen Mode and back */ void CoreWidget::toggleFullscreen() { setWindowState( windowState() ^ Qt::WindowFullScreen); OpenFlipper::Options::fullScreen( bool( windowState() & Qt::WindowFullScreen) ); show(); } //----------------------------------------------------------------------------- /** 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(); } //----------------------------------------------------------------------------- /** Hide or show logger */ void CoreWidget::toggleLogger() { // toggle OpenFlipper::Options::hideLogger( !OpenFlipper::Options::hideLogger() ); // Hide/Show Logger showLogger( !OpenFlipper::Options::hideLogger() ); } /** Hide or show logger */ void CoreWidget::showLogger(bool _state) { //Hide Logger if ( !_state ) { QList wsizes( splitter_->sizes() ); // Remember old size originalLoggerSize_ = wsizes[1]; wsizes[0] = wsizes[0]+wsizes[1]; wsizes[1] = 0; splitter_->setSizes(wsizes); } else { if ( originalLoggerSize_ == 0) originalLoggerSize_ = 240; QList wsizes( splitter_->sizes() ); if (wsizes[0] == 0) wsizes[0] = height(); wsizes[0] = wsizes[0]+wsizes[1] - originalLoggerSize_; wsizes[1] = originalLoggerSize_; splitter_->setSizes(wsizes); } } //----------------------------------------------------------------------------- /** Hide or show toolbox */ void CoreWidget::toggleToolbox() { //toggle showToolbox( OpenFlipper::Options::hideToolbox() ); } //----------------------------------------------------------------------------- /** Hide or show toolbox */ void CoreWidget::showToolbox( bool _state ) { //toggle OpenFlipper::Options::hideToolbox( !_state ); if ( OpenFlipper::Options::hideToolbox() ){ //hide all toolWidgets for (uint p=0; p < plugins_.size(); p++) if (plugins_[p].widget) plugins_[p].widget->setVisible(false); //hide ViewMode Selection Widget dockViewMode_->setVisible(false); }else{ //reset last ViewMode if (OpenFlipper::Options::defaultToolboxMode().trimmed() == "") setViewMode("All"); else setViewMode( OpenFlipper::Options::defaultToolboxMode() ); } } //============================================================================= void CoreWidget::addRecent(QString _filename, DataType _type) { //dont add objects to recentMenu while loadind Settings if ( OpenFlipper::Options::loadingSettings() ) return; OpenFlipper::Options::addRecentFile(_filename, _type); updateRecent(); } //============================================================================= void CoreWidget::updateRecent() { if ( recentFilesMenu_ == NULL) return; 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(); path += typeIcon( recentFiles[i].type ); recentFilesMenu_->addAction(QIcon(path), recentFiles[i].filename); } } void CoreWidget::closeEvent ( QCloseEvent * /* event */ ) { emit exit(); } void CoreWidget::showOptionsWidget() { if ( OpenFlipper::Options::nogui() ) return; if ( optionsWidget_ == 0 ) { optionsWidget_ = new OptionsWidget(plugins_, coreKeys_, invKeys_, 0); connect(optionsWidget_,SIGNAL(applyOptions()),this,SIGNAL(applyOptions())); connect(optionsWidget_,SIGNAL(saveOptions()),this,SIGNAL(saveOptions())); connect(optionsWidget_,SIGNAL(addKeyMapping(int,Qt::KeyboardModifiers,QObject*,int)), this, SLOT(slotAddKeyMapping(int,Qt::KeyboardModifiers,QObject*,int))); } //show the optionsWidget centered QPoint center; center.setX( x() + width() / 2 ); center.setY( y() + height() / 2 ); optionsWidget_->setGeometry(center.x() - optionsWidget_->width() / 2, center.y() - optionsWidget_->height()/ 2, optionsWidget_->width(), optionsWidget_->height()); optionsWidget_->show(); } //=============================================================================