//=============================================================================
//
// 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),
stereoActive_(false)
{
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
// ======================================================================
// Create the toolbar
viewerToolbar_ = new QToolBar( "Viewer Toolbar", this );
viewerToolbar_->setOrientation(Qt::Vertical);
viewerToolbar_->setAllowedAreas(Qt::AllToolBarAreas);
viewerToolbar_->setIconSize(QSize(20,20));
viewerToolbar_->setObjectName("ViewerToolbar");
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 move mode." );
moveButton_->setWhatsThis(
"Switch to move mode.
"
"- Rotate using left mouse button.
"
"- Translate using middle mouse button.
"
"- Zoom using left+middle mouse buttons.
" );
for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
connect( moveButton_,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( examineMode() ) );
connect( examiner_widgets_[i],SIGNAL( actionModeChanged( QtBaseViewer::ActionMode ) ),this , SLOT( slotActionModeChanged(QtBaseViewer::ActionMode) ) );
}
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 light mode.");
lightButton_->setWhatsThis(
"Switch to light mode.
"
"Rotate lights using left mouse button.");
for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
connect( lightButton_,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( lightMode() ) );
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 picking mode.");
pickButton_->setWhatsThis(
"Switch to picking mode.
"
"Use picking functions like flipping edges.
"
"To change the mode use the right click
"
"context menu in the viewer.");
for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
connect( pickButton_,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( pickingMode() ) );
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 identification mode.");
questionButton_->setWhatsThis(
"Switch to identification mode.
"
"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 )
connect( questionButton_,SIGNAL( clicked() ), examiner_widgets_[i], SLOT( questionMode() ) );
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 home view.");
homeButton->setWhatsThis(
"Restore home view
"
"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 home view");
setHomeButton->setWhatsThis(
"Store home view
"
"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
"
"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 perspective and "
"parrallel projection mode.");
projectionButton_->setWhatsThis(
"Switch projection modes
"
"Switch between perspective and "
"parrallel 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 ) ) );
}
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
"
"The scene graph viewer enables you to examine the "
"displayed scene graph and to modify certain nodes.
"
"There are three modi for the scene graph viewer:"
"- hidden
"
"- split: share space
"
"- dialog: own dialog window
"
"This button toggles between these modi.");
QObject::connect( sceneGraphButton, SIGNAL( clicked() ),
examiner_widgets_[0], SLOT( showSceneGraphDialog() ) );
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
"
"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");
}
addToolBar(Qt::TopToolBarArea,viewerToolbar_);
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();
}
//=============================================================================