/*===========================================================================*\ * * * OpenFlipper * * Copyright (C) 2001-2010 by Computer Graphics Group, RWTH Aachen * * www.openflipper.org * * * *---------------------------------------------------------------------------* * This file is part of OpenFlipper. * * * * 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 with the * * following exceptions: * * * * If other files instantiate templates or use macros * * or inline functions from this file, or you compile this file and * * link it with other files to produce an executable, this file does * * not by itself cause the resulting executable to be covered by the * * GNU Lesser General Public License. This exception does not however * * invalidate any other reasons why the executable file might be * * covered by the GNU Lesser General Public License. * * * * 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 LesserGeneral Public * * License along with OpenFlipper. If not, * * see . * * * \*===========================================================================*/ /*===========================================================================*\ * * * $Revision$ * * $Author$ * * $Date$ * * * \*===========================================================================*/ #include "CoreWidget.hh" #include #include #include "OpenFlipper/common/GlobalOptions.hh" //============================================================================= /// init ViewModes that were loaded via ini-file void CoreWidget::initViewModes(){ //init viewMode subMenu if (!viewModeMenu_){ viewModeMenu_ = new QMenu(tr("View Modes")); viewMenu_->addMenu(viewModeMenu_); viewGroup_ = new QActionGroup(0); viewGroup_->setExclusive(true); connect( viewGroup_, SIGNAL( triggered( QAction* ) ), this, SLOT( slotSetViewMode( QAction* ) ) ); } viewModeMenu_->clear(); bool seenCustom = false; for (int i=0; i < viewModes_.size(); i++){ //Add Separator above the custom widgets if (viewModes_[i]->custom && !seenCustom){ viewModeMenu_->addSeparator(); seenCustom = true; } //add Action to viewMenu QAction* acViewMode = new QAction(viewModes_[i]->name, this); acViewMode->setStatusTip(tr("Change ViewMode")); viewGroup_->addAction(acViewMode); viewModeMenu_->addAction(acViewMode); //add Separator after viewMode 'all' if (viewModes_[i]->name == "All") viewModeMenu_->addSeparator(); } } void CoreWidget::slotAddViewModeToolboxes(QString _mode, QStringList _usedWidgets){ slotAddViewModeToolboxes(_mode, false, _usedWidgets); } void CoreWidget::slotAddViewModeToolboxes(QString _mode, bool _custom, QStringList _usedWidgets){ int id = -1; // Check if it already exists for ( int i = 0 ; i < viewModes_.size(); i++) { if ( viewModes_[i]->name == _mode ) { id = i; break; } } ViewMode* vm = 0; if ( id == -1 ) { vm = new ViewMode(); vm->name = _mode; vm->custom = _custom; vm->icon = "Unknown.png"; vm->visibleToolbars = QString("Main Toolbar;Viewer Toolbar").split(";"); vm->visibleContextMenus = QString("ALL_THAT_EXIST").split(" "); if (_custom) { viewModes_.push_back(vm); } else { //insert before custom viewModes int i = viewModes_.size(); for (int k=0; k < viewModes_.size(); k++) if (viewModes_[k]->custom == true){ i = k; break; } viewModes_.insert(i,vm); } } else { vm = viewModes_[id]; } vm->visibleToolboxes = _usedWidgets; initViewModes(); } void CoreWidget::slotAddViewModeToolbars(QString _mode, QStringList _usedToolbars) { slotAddViewModeToolbars(_mode,false,_usedToolbars); } void CoreWidget::slotAddViewModeToolbars(QString _mode, bool _custom, QStringList _usedToolbars) { int id = -1; // Check if it already exists for ( int i = 0 ; i < viewModes_.size(); i++) { if ( viewModes_[i]->name == _mode ) { id = i; break; } } ViewMode* vm = 0; if ( id == -1 ) { vm = new ViewMode(); vm->name = _mode; vm->custom = _custom; vm->icon = "Unknown.png"; vm->visibleContextMenus = QString("ALL_THAT_EXIST").split(" "); if (_custom) { viewModes_.push_back(vm); } else { //insert before custom viewModes int i = viewModes_.size(); for (int k=0; k < viewModes_.size(); k++) if (viewModes_[k]->custom == true){ i = k; break; } viewModes_.insert(i,vm); } } else { vm = viewModes_[id]; } // Always add the viewer Toolbar if ( ! _usedToolbars.contains("Viewer Toolbar") ) _usedToolbars.prepend("Viewer Toolbar"); // Always add the main Toolbar if ( ! _usedToolbars.contains("Main Toolbar") ) _usedToolbars.prepend("Main Toolbar"); vm->visibleToolbars = _usedToolbars; initViewModes(); } void CoreWidget::slotAddViewModeContextMenus(QString _mode, QStringList _usedContextMenus){ slotAddViewModeContextMenus(_mode, false, _usedContextMenus); } void CoreWidget::slotAddViewModeContextMenus(QString _mode, bool _custom, QStringList _usedContextMenus){ int id = -1; // Check if it already exists for ( int i = 0 ; i < viewModes_.size(); i++) { if ( viewModes_[i]->name == _mode ) { id = i; break; } } ViewMode* vm = 0; if ( id == -1 ) { vm = new ViewMode(); vm->name = _mode; vm->custom = _custom; vm->icon = "Unknown.png"; vm->visibleToolbars = QString("Main Toolbar;Viewer Toolbar").split(";"); if (_custom) { viewModes_.push_back(vm); } else { //insert before custom viewModes int i = viewModes_.size(); for (int k=0; k < viewModes_.size(); k++) if (viewModes_[k]->custom == true){ i = k; break; } viewModes_.insert(i,vm); } } else { vm = viewModes_[id]; } vm->visibleContextMenus = _usedContextMenus; initViewModes(); } /// Sets the Icon for a given View Mode void CoreWidget::slotSetViewModeIcon(QString _mode, QString _iconName) { slotSetViewModeIcon(_mode,false,_iconName); } /// Sets the Icon for a given View Mode void CoreWidget::slotSetViewModeIcon(QString _mode, bool _custom, QString _iconName) { int id = -1; // Check if it already exists for ( int i = 0 ; i < viewModes_.size(); i++) { if ( viewModes_[i]->name == _mode ) { id = i; break; } } ViewMode* vm = 0; if ( id == -1 ) { vm = new ViewMode(); vm->name = _mode; vm->custom = _custom; vm->icon = _iconName; if (_custom) { viewModes_.push_back(vm); } else { //insert before custom viewModes int i = viewModes_.size(); for (int k=0; k < viewModes_.size(); k++) if (viewModes_[k]->custom == true){ i = k; break; } viewModes_.insert(i,vm); } } else { vm = viewModes_[id]; } vm->icon = _iconName; initViewModes(); } /// Remove a viewMode void CoreWidget::slotRemoveViewMode(QString _name){ for (int i=0; i < viewModes_.size(); i++) if (viewModes_[i]->name == _name && viewModes_[i]->custom == true){ //remove only userdefined viewModes viewModes_.remove(i); //remove action from menu for (int a=0; a < viewModeMenu_->actions().size(); a++) if (viewModeMenu_->actions()[a]->text() == _name){ QAction* action = viewModeMenu_->actions()[a]; viewModeMenu_->removeAction(action); viewGroup_->removeAction(action); delete action; } break; } } /// Slot for setting the viewMode from menu void CoreWidget::slotSetViewMode( QAction* action){ setViewMode( action->text() ); } /// Slot for setting the viewMode from menu void CoreWidget::setViewMode( QString _mode ){ slotChangeView(_mode, QStringList(), QStringList(), QStringList()); } void CoreWidget::slotAddViewModeComplete(QString _mode , bool _custom, QStringList _toolboxes, QStringList _toolbars, QStringList _contextmenus) { slotAddViewModeToolbars(_mode,_custom,_toolbars); slotAddViewModeToolboxes(_mode,_custom,_toolboxes); slotAddViewModeContextMenus(_mode,_custom,_contextmenus); } /// show dialog for changing ViewMode void CoreWidget::slotViewModeDialog(){ //init widget static viewModeWidget* widget = 0; if ( !widget ){ widget = new viewModeWidget(viewModes_); widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() ); connect(widget, SIGNAL(changeView(QString, QStringList, QStringList, QStringList)), this, SLOT(slotChangeView(QString, QStringList, QStringList, QStringList)) ); connect(widget, SIGNAL(saveMode(QString, bool, QStringList, QStringList, QStringList)), this, SLOT(slotAddViewModeComplete(QString, bool, QStringList, QStringList, QStringList)) ); connect(widget, SIGNAL(removeMode(QString)), this, SLOT(slotRemoveViewMode(QString)) ); } widget->show( OpenFlipper::Options::currentViewMode() ); } void CoreWidget::slotViewChangeDialog() { //init widget static viewModeChangeWidget* modeChangeWidget = 0; if ( !modeChangeWidget ){ modeChangeWidget = new viewModeChangeWidget(viewModes_, this); modeChangeWidget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() ); connect(modeChangeWidget, SIGNAL(changeView(QString, QStringList, QStringList, QStringList)), this, SLOT(slotChangeView(QString, QStringList, QStringList, QStringList)) ); } // Make it look like a dialog modeChangeWidget->setWindowFlags(Qt::Popup); modeChangeWidget->show( OpenFlipper::Options::currentViewMode() ); // Move it to the position of the push button QPoint posButton = vmChangeButton_->mapToGlobal(vmChangeButton_->pos()); modeChangeWidget->move( posButton); } /// Slot for Changing visible toolWidgets void CoreWidget::slotChangeView(QString _mode, QStringList _toolboxWidgets, QStringList _toolbars, QStringList _contextmenus ){ //try to find Widgets if they aren't given if (_mode != "" && _toolboxWidgets.size() == 0 && _toolbars.size() == 0) for (int i=0; i < viewModes_.size(); i++) if (viewModes_[i]->name == _mode) { _toolboxWidgets = viewModes_[i]->visibleToolboxes; _toolbars = viewModes_[i]->visibleToolbars; _contextmenus = viewModes_[i]->visibleContextMenus; } // Remove all toolbox entries toolBox_->clear (); //find all widgets that should be visible for (int i=0; i < _toolboxWidgets.size(); i++) for (uint p=0; p < plugins_.size(); p++){ for ( uint j = 0 ; j < plugins_[p].toolboxWidgets.size(); ++j ) if (_toolboxWidgets[i] == plugins_[p].toolboxWidgets[j].first ) toolBox_->addItem (plugins_[p].toolboxWidgets[j].second, plugins_[p].toolboxWidgets[j].first); } //find all Toolbars that should be visible and hide the others for (uint p=0; p < plugins_.size(); p++) for ( uint j = 0 ; j < plugins_[p].toolbars.size(); ++j ) if (_toolbars.contains( plugins_[p].toolbars[j].first ) ) plugins_[p].toolbars[j].second->show(); else plugins_[p].toolbars[j].second->hide(); // Check the Main Toolbar: if ( _toolbars.contains(tr("Main Toolbar")) ) mainToolbar_->show(); else mainToolbar_->hide(); // Check the Main Toolbar: if ( _toolbars.contains(tr("Viewer Toolbar")) ) viewerToolbar_->show(); else viewerToolbar_->hide(); if (_mode != "") OpenFlipper::Options::currentViewMode(_mode); } void CoreWidget::stereoButtonContextMenu(const QPoint& _pos) { // Grey out OpenGL stereo mode option if not available if(!OpenFlipper::Options::glStereo()) { stereoSettingsWidget_->stereoOpengl->setDisabled(true); } else { stereoSettingsWidget_->stereoOpengl->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::OpenGL); } // Set values stereoSettingsWidget_->stereoAnaglyph->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphRedCyan); stereoSettingsWidget_->stereoCustomAnaglyph->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphCustom); stereoSettingsWidget_->stereoPhilips->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::Philips); stereoSettingsWidget_->eyeDistance->setValue( OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() ); stereoSettingsWidget_->focalDistance->setValue( OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble() * 1000); // Philips stereo mode part // Block signals such that slotApplyStereoSettings // won't be called when setting the initial values here... stereoSettingsWidget_->headerContentType->blockSignals(true); stereoSettingsWidget_->headerSelect->blockSignals(true); stereoSettingsWidget_->headerContentType->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Content").toInt()); stereoSettingsWidget_->headerFactor->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt()); stereoSettingsWidget_->headerOffsetCC->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt()); stereoSettingsWidget_->factorCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt()); stereoSettingsWidget_->offsetCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt()); stereoSettingsWidget_->headerSelect->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Select").toInt()); // Unblock signals stereoSettingsWidget_->headerContentType->blockSignals(false); stereoSettingsWidget_->headerSelect->blockSignals(false); // Show right stacked widget if (stereoSettingsWidget_->stereoPhilips->isChecked()) { stereoSettingsWidget_->stackedWidget->setCurrentIndex(1); } else { stereoSettingsWidget_->stackedWidget->setCurrentIndex(0); } // Move widget to the position of the cursor stereoSettingsWidget_->move(stereoButton_->mapToGlobal(_pos) - QPoint((int)(stereoSettingsWidget_->width()/2), 0)); // Show widget stereoSettingsWidget_->show(); } void CoreWidget::slotApplyStereoSettings(int /*_tmpParam*/) { // Update values if (stereoSettingsWidget_->stereoCustomAnaglyph->isChecked()) { // Update option entry OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphCustom); // Show right stacked widget stereoSettingsWidget_->stackedWidget->setCurrentIndex(0); } else if (stereoSettingsWidget_->stereoAnaglyph->isChecked()) { OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphRedCyan); stereoSettingsWidget_->stackedWidget->setCurrentIndex(0); } else if (stereoSettingsWidget_->stereoPhilips->isChecked()) { OpenFlipper::Options::stereoMode(OpenFlipper::Options::Philips); stereoSettingsWidget_->stackedWidget->setCurrentIndex(1); } else { OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL); stereoSettingsWidget_->stackedWidget->setCurrentIndex(0); } // Save everything OpenFlipperSettings().setValue("Core/Stereo/EyeDistance",stereoSettingsWidget_->eyeDistance->value()); OpenFlipperSettings().setValue("Core/Stereo/FocalDistance",double(stereoSettingsWidget_->focalDistance->value()/1000.0)); // Update labels that display the current values stereoSettingsWidget_->factorCounter->setNum(stereoSettingsWidget_->headerFactor->value()); stereoSettingsWidget_->offsetCounter->setNum(stereoSettingsWidget_->headerOffsetCC->value()); // Set option entries OpenFlipperSettings().setValue("Core/Stereo/Philips/Content",stereoSettingsWidget_->headerContentType->currentIndex()); OpenFlipperSettings().setValue("Core/Stereo/Philips/Factor",stereoSettingsWidget_->headerFactor->value()); OpenFlipperSettings().setValue("Core/Stereo/Philips/Offset",stereoSettingsWidget_->headerOffsetCC->value()); OpenFlipperSettings().setValue("Core/Stereo/Philips/Select",stereoSettingsWidget_->headerSelect->currentIndex()); // Update all views for (unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i) { examiner_widgets_[i]->updateGL(); } }