//============================================================================= // // 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 CoreWidget - IMPLEMENTATION // //============================================================================= //== INCLUDES ================================================================= // -------------------- mview #include "CoreWidget.hh" #include #include //== IMPLEMENTATION ========================================================== void CoreWidget::slotCustomContextMenu( const QPoint& _point ) { updatePopupMenu(_point); // If not initialized, dont show it!! if ( !contextMenu_->isEmpty () ) contextMenu_->exec( examiner_widget_->mapToGlobal(_point) ); } void CoreWidget::updatePopupMenu(const QPoint& _point) { contextMenu_->clear(); contextSelectionMenu_->clear(); QIcon icon; QAction* typeEntry = new QAction("No type",contextMenu_); contextMenu_->addAction( typeEntry ); QAction* entrySeparator = contextMenu_->addSeparator( ); QAction* contextSelectionAction = contextMenu_->addMenu( contextSelectionMenu_ ); // -1 if no object id found for the current picking position // otherwise the id of the object int objectId = -1; // Do picking in the gl area to find an object unsigned int node_idx, target_idx; ACG::Vec3d hit_point; BaseObjectData* object; if (PluginFunctions::scenegraph_pick(ACG::SceneGraph::PICK_ANYTHING, _point,node_idx, target_idx, &hit_point)) { if ( PluginFunctions::get_picked_object(node_idx, object) ) objectId = object->id(); } int topLevelAdded = 0; if ( objectId != -1) { emit updateContextMenu(objectId); // Add an empty Menu defining the current Type if ( object->dataType() == DATA_POLY_MESH ){ typeEntry->setText("Poly Mesh"); icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"PolyType.png"); typeEntry->setIcon(icon); } else if ( object->dataType() == DATA_TRIANGLE_MESH ) { typeEntry->setText("Triangle Mesh"); icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"TriangleType.png"); typeEntry->setIcon(icon); } else if ( object->dataType() == DATA_POLY_LINE ) { typeEntry->setText("Poly Line"); icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"PolyLineType.png"); typeEntry->setIcon(icon); } else if ( object->dataType() == DATA_BSPLINE_CURVE ) { typeEntry->setText("BSpline Curve"); icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"BSplineCurveType.png"); typeEntry->setIcon(icon); } // Add real context Menus first for ( uint i = 0 ; i < contextMenus_.size(); ++i ) { // check if the dataType of the object matches the context type if ( object->dataType( contextMenus_[i].contextType ) ) { if ( contextMenus_[i].position == CONTEXTTOPLEVELMENU ) { contextMenu_->addMenu( contextMenus_[i].menu ); topLevelAdded++; } else if ( contextMenus_[i].position == CONTEXTSELECTIONMENU ) { contextSelectionMenu_->addMenu(contextMenus_[i].menu); } // Get all Actions in the menu and its submenus. // Set their data to the picked Object id QList< QAction *> allActions = contextMenus_[i].menu->actions(); while ( !allActions.empty() ) { QList< QAction *> tmpList; // Set userdata of all actions to the picked Object Id for ( int j = 0 ; j < allActions.size(); ++j ) { allActions[j]->setData( QVariant( objectId ) ); if ( allActions[j]->menu() != 0 ) tmpList << allActions[j]->menu()->actions(); } allActions = tmpList; } } } } else { emit updateContextMenu(-1); // Add real context Menus first for ( uint i = 0 ; i < contextMenus_.size(); ++i ) { if ( contextMenus_[i].contextType == DATA_NONE ) { contextMenu_->addMenu( contextMenus_[i].menu ); topLevelAdded++; } } if ( topLevelAdded == 0 ) { contextMenu_->removeAction(typeEntry); contextMenu_->removeAction(entrySeparator); } } if ( contextSelectionMenu_->isEmpty() ) contextMenu_->removeAction( contextSelectionAction ); if ( topLevelAdded > 0 ) contextMenu_->addSeparator(); // Add persistent context Menus as second part for ( uint i = 0 ; i < persistentContextMenus_.size(); ++i ) { contextMenu_->addMenu( persistentContextMenus_[i].menu ); // Get all Actions in the menu and its submenus. // Set their data to the picked Object id QList< QAction *> allActions = persistentContextMenus_[i].menu->actions(); while ( !allActions.empty() ) { QList< QAction *> tmpList; // Set userdata of all actions to the picked Object Id for ( int j = 0 ; j < allActions.size(); ++j ) { allActions[j]->setData( QVariant( objectId ) ); if ( allActions[j]->menu() != 0 ) tmpList << allActions[j]->menu()->actions(); } allActions = tmpList; } } // Only add Separator if we had plugin context menus if ( persistentContextMenus_.size() > 0 ) contextMenu_->addSeparator(); if (examiner_widget_->getPickMenu() != NULL) { examiner_widget_->getPickMenu()->setTitle("&Picking"); contextMenu_->addMenu(examiner_widget_->getPickMenu() ); examiner_widget_->getPickMenu()->setTearOffEnabled(true); } if (examiner_widget_->getFuncMenu() != NULL) { examiner_widget_->getFuncMenu()->setTitle("&Functions"); contextMenu_->addMenu(examiner_widget_->getFuncMenu() ); examiner_widget_->getFuncMenu()->setTearOffEnabled(true); } if ( ( examiner_widget_->getDrawMenu() != NULL ) && OpenFlipper::Options::drawModesInContextMenu() ) { examiner_widget_->getDrawMenu()->setTitle("&DrawModes"); QAction* drawMenuAction = contextMenu_->addMenu(examiner_widget_->getDrawMenu() ); QIcon icon; icon.addFile(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"drawModes.png"); drawMenuAction->setIcon(icon); examiner_widget_->getDrawMenu()->setTearOffEnabled(true); } } void CoreWidget::slotAddContextMenu(QMenu* _menu) { MenuInfo info; info.menu = _menu; persistentContextMenus_.push_back(info); } void CoreWidget::slotAddContextMenu( QMenu* _menu , DataType _dataType ,ContextMenuType _type ) { MenuInfo info; info.menu = _menu; info.contextType = _dataType; info.position = _type; contextMenus_.push_back(info); } //=============================================================================