static PyObject *meth_QSignalMapper_mapping(PyObject *sipSelf, PyObject *sipArgs) { PyObject *sipParseErr = NULL; { int a0; QSignalMapper *sipCpp; if (sipParseArgs(&sipParseErr, sipArgs, "Bi", &sipSelf, sipType_QSignalMapper, &sipCpp, &a0)) { QObject *sipRes; Py_BEGIN_ALLOW_THREADS sipRes = sipCpp->mapping(a0); Py_END_ALLOW_THREADS return sipConvertFromType(sipRes,sipType_QObject,NULL); } }
QMenu* SimObjectWidget::createUserMenu() const { QMenu* menu = new QMenu(tr(&object == Simulation::simulation->scene ? "S&cene" : "&Object")); QSignalMapper* flagsSignalMapper = new QSignalMapper(menu); connect(flagsSignalMapper, SIGNAL(mapped(int)), SLOT(toggleRenderFlag(int))); { QMenu* subMenu = menu->addMenu(tr("&Drag and Drop")); QAction* action = subMenu->menuAction(); action->setIcon(QIcon(":/Icons/DragPlane.png")); action->setStatusTip(tr("Select the drag and drop dynamics mode and plane along which operations are performed")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDragPlane(int))); action = subMenu->addAction(tr("X/Y Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::xyPlane); action->setShortcut(QKeySequence(Qt::Key_Z)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("X/Z Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::xzPlane); action->setShortcut(QKeySequence(Qt::Key_Y)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Y/Z Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::yzPlane); action->setShortcut(QKeySequence(Qt::Key_X)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getDragPlane()))->setChecked(true); subMenu->addSeparator(); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDragMode(int))); action = subMenu->addAction(tr("&Keep Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::keepDynamics); action->setShortcut(QKeySequence(Qt::Key_7)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Reset Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::resetDynamics); action->setShortcut(QKeySequence(Qt::Key_8)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("A&dopt Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::adoptDynamics); action->setShortcut(QKeySequence(Qt::Key_9)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Apply Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::applyDynamics); action->setShortcut(QKeySequence(Qt::Key_0)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getDragMode()))->setChecked(true); } menu->addSeparator(); { QMenu* subMenu = menu->addMenu(tr("&Camera")); QAction* action = subMenu->menuAction(); action->setIcon(QIcon(":/Icons/camera.png")); action->setStatusTip(tr("Select different camera modes for displaying the scene")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setCameraMode(int))); action = subMenu->addAction(tr("&Target Mode")); action->setCheckable(true); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::targetCam); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Free Mode")); action->setCheckable(true); actionGroup->addAction(action); signalMapper->setMapping(action, SimRobotCore2::Renderer::freeCam); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getCameraMode()))->setChecked(true); subMenu->addSeparator(); action = subMenu->addAction(tr("&Reset")); action->setShortcut(QKeySequence(Qt::Key_R)); connect(action, SIGNAL(triggered()), this, SLOT(resetCamera())); action = subMenu->addAction(tr("&Toggle")); action->setShortcut(QKeySequence(Qt::Key_T)); connect(action, SIGNAL(triggered()), this, SLOT(toggleCameraMode())); /* action = subMenu->addAction(tr("&Fit")); action->setShortcut(QKeySequence(Qt::Key_F)); connect(action, SIGNAL(triggered()), this, SLOT(fitCamera())); subMenu->addSeparator(); */ } { QMenu* subMenu = menu->addMenu(tr("&Vertical Opening Angle")); QAction* action = subMenu->menuAction(); action->setIcon(QIcon(":/Icons/opening_angle.png")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setFovY(int))); action = subMenu->addAction(tr("&20°")); actionGroup->addAction(action); signalMapper->setMapping(action, 20); action->setShortcut(QKeySequence(Qt::Key_1)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&40°")); actionGroup->addAction(action); signalMapper->setMapping(action, 40); action->setShortcut(QKeySequence(Qt::Key_2)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&60°")); actionGroup->addAction(action); signalMapper->setMapping(action, 60); action->setShortcut(QKeySequence(Qt::Key_3)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&80°")); actionGroup->addAction(action); signalMapper->setMapping(action, 80); action->setShortcut(QKeySequence(Qt::Key_4)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("100°")); actionGroup->addAction(action); signalMapper->setMapping(action, 100); action->setShortcut(QKeySequence(Qt::Key_5)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("120°")); actionGroup->addAction(action); signalMapper->setMapping(action, 120); action->setShortcut(QKeySequence(Qt::Key_6)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getFovY()))->setChecked(true); } menu->addSeparator(); { QMenu* subMenu = menu->addMenu(tr("&Appearances Rendering")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setSurfaceShadeMode(int))); QAction* action = subMenu->menuAction(); action->setIcon(QIcon(":/Icons/layers.png")); action->setStatusTip(tr("Select different shading techniques for displaying the scene")); action = subMenu->addAction(tr("&Off")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::noShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Wire Frame")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::wireframeShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Flat Shading")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::flatShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Smooth Shading")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::smoothShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getSurfaceShadeMode()))->setChecked(true); } { QMenu* subMenu = menu->addMenu(tr("&Physics Rendering")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setPhysicsShadeMode(int))); QAction* action = subMenu->menuAction(); //action->setIcon(QIcon(":/Icons/layers.png")); action->setStatusTip(tr("Select different shading techniques for displaying the physical representation of objects")); action = subMenu->addAction(tr("&Off")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::noShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Wire Frame")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::wireframeShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Flat Shading")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::flatShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Smooth Shading")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::smoothShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getPhysicsShadeMode()))->setChecked(true); } { QMenu* subMenu = menu->addMenu(tr("&Drawings Rendering")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDrawingsShadeMode(int))); QAction* action = subMenu->menuAction(); action->setIcon(QIcon(":/Icons/chart_line.png")); action->setStatusTip(tr("Select different shading techniques for displaying controller drawings")); action = subMenu->addAction(tr("&Off")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::noShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Wire Frame")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::wireframeShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Flat Shading")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::flatShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Smooth Shading")); actionGroup->addAction(action); //action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::smoothShading); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getDrawingsShadeMode()))->setChecked(true); subMenu->addSeparator(); subMenu = subMenu->addMenu(tr("&Occlusion")); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDrawingsOcclusion(int))); action = subMenu->menuAction(); action->setStatusTip(tr("Select different drawings occlusion modes")); action = subMenu->addAction(tr("&On")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::enableDrawingsOcclusion); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("O&ff")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, 0); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Transparent")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, SimRobotCore2::Renderer::enableDrawingsTransparentOcclusion); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getRenderFlags() & (SimRobotCore2::Renderer::enableDrawingsOcclusion | SimRobotCore2::Renderer::enableDrawingsTransparentOcclusion)))->setChecked(true); } menu->addSeparator(); QAction* action = menu->addAction(tr("Enable &Lights")); action->setStatusTip(tr("Enable lightning")); action->setCheckable(true); action->setChecked(objectRenderer.getRenderFlags() & SimRobotCore2::Renderer::enableLights); flagsSignalMapper->setMapping(action, SimRobotCore2::Renderer::enableLights); connect(action, SIGNAL(triggered()), flagsSignalMapper, SLOT(map())); action = menu->addAction(tr("Enable &Textures")); action->setStatusTip(tr("Enable textures")); action->setCheckable(true); action->setChecked(objectRenderer.getRenderFlags() & SimRobotCore2::Renderer::enableTextures); flagsSignalMapper->setMapping(action, SimRobotCore2::Renderer::enableTextures); connect(action, SIGNAL(triggered()), flagsSignalMapper, SLOT(map())); action = menu->addAction(tr("Enable &Multisample")); action->setStatusTip(tr("Enable multisampling")); action->setCheckable(true); action->setChecked(objectRenderer.getRenderFlags() & SimRobotCore2::Renderer::enableMultisample); flagsSignalMapper->setMapping(action, SimRobotCore2::Renderer::enableMultisample); connect(action, SIGNAL(triggered()), flagsSignalMapper, SLOT(map())); menu->addSeparator(); action = menu->addAction(tr("Show &Coordinate System")); action->setStatusTip(tr("Show the coordinate system of the displayed object")); action->setCheckable(true); action->setChecked(objectRenderer.getRenderFlags() & SimRobotCore2::Renderer::showCoordinateSystem); flagsSignalMapper->setMapping(action, SimRobotCore2::Renderer::showCoordinateSystem); connect(action, SIGNAL(triggered()), flagsSignalMapper, SLOT(map())); action = menu->addAction(QIcon(":/Icons/transmit_go.png"), tr("Show &Sensors")); action->setStatusTip(tr("Show the values of the sensors in the scene view")); action->setCheckable(true); action->setChecked(objectRenderer.getRenderFlags() & SimRobotCore2::Renderer::showSensors); flagsSignalMapper->setMapping(action, SimRobotCore2::Renderer::showSensors); connect(action, SIGNAL(triggered()), flagsSignalMapper, SLOT(map())); menu->addSeparator(); { QMenu* subMenu = menu->addMenu(tr("Export as Image...")); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(exportAsImage(int))); action = subMenu->addAction(tr("3840x2160")); signalMapper->setMapping(action, (3840 << 16) | 2160); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("2880x1620")); signalMapper->setMapping(action, (2880 << 16) | 1620); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("1920x1080")); signalMapper->setMapping(action, (1920 << 16) | 1080); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("1280x1024")); signalMapper->setMapping(action, (1280 << 16) | 1024); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); } return menu; }
QMenu* ObjectWidget::createPopupMenu() { QMenu* menu = new QMenu(tr("&Object")); QAction* action; action = menu->addAction(QIcon(":/icons/page_copy.png"), tr("&Copy")); action->setShortcut(QKeySequence(QKeySequence::Copy)); action->setStatusTip(tr("Copy the current selection's contents or view to the clipboard")); connect(action, SIGNAL(triggered()), this, SLOT(copy())); menu->addSeparator(); QMenu* subMenu = menu->addMenu(tr("&Drag and Drop")); action = subMenu->menuAction(); action->setIcon(QIcon(":/icons/DragPlane.png")); action->setStatusTip(tr("Select the drag and drop dynamics mode and plane along which operations are performed")); QActionGroup* actionGroup = new QActionGroup(subMenu); QSignalMapper* signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDragPlane(int))); action = subMenu->addAction(tr("X/Y Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, XY_PLANE); action->setShortcut(QKeySequence(Qt::Key_Z)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("X/Z Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, XZ_PLANE); action->setShortcut(QKeySequence(Qt::Key_Y)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Y/Z Plane")); actionGroup->addAction(action); signalMapper->setMapping(action, YZ_PLANE); action->setShortcut(QKeySequence(Qt::Key_X)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getDragPlane()))->setChecked(true); subMenu->addSeparator(); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setDragMode(int))); action = subMenu->addAction(tr("&Keep Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, KEEP_DYNAMICS); action->setShortcut(QKeySequence(Qt::Key_8)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Reset Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, RESET_DYNAMICS); action->setShortcut(QKeySequence(Qt::Key_9)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Apply Dynamics")); actionGroup->addAction(action); signalMapper->setMapping(action, APPLY_DYNAMICS); action->setShortcut(QKeySequence(Qt::Key_0)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getDragMode()))->setChecked(true); menu->addSeparator(); subMenu = menu->addMenu(tr("&Camera")); action = subMenu->menuAction(); action->setIcon(QIcon(":/icons/camera.png")); action->setStatusTip(tr("Select different camera modes for displaying the scene")); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setCameraMode(int))); action = subMenu->addAction(tr("&Target Mode")); action->setCheckable(true); actionGroup->addAction(action); signalMapper->setMapping(action, VisualizationParameterSet::TARGETCAM); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Free Mode")); action->setCheckable(true); actionGroup->addAction(action); signalMapper->setMapping(action, VisualizationParameterSet::FREECAM); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&Presentation Mode")); action->setCheckable(true); actionGroup->addAction(action); signalMapper->setMapping(action, VisualizationParameterSet::PRESENTATION); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getCameraMode()))->setChecked(true); subMenu->addSeparator(); action = subMenu->addAction(tr("&Reset")); action->setShortcut(QKeySequence(Qt::Key_R)); connect(action, SIGNAL(triggered()), this, SLOT(resetCamera())); action = subMenu->addAction(tr("&Toggle")); action->setShortcut(QKeySequence(Qt::Key_T)); connect(action, SIGNAL(triggered()), this, SLOT(toggleCameraMode())); action = subMenu->addAction(tr("&Fit")); action->setShortcut(QKeySequence(Qt::Key_F)); connect(action, SIGNAL(triggered()), this, SLOT(fitCamera())); subMenu->addSeparator(); action = subMenu->addAction(tr("&Snap To Root")); action->setCheckable(true); action->setChecked(objectRenderer.hasSnapToRoot()); connect(action, SIGNAL(triggered()), this, SLOT(snapToRoot())); subMenu = menu->addMenu(tr("&Vertical Opening Angle")); action = subMenu->menuAction(); action->setIcon(QIcon(":/icons/opening_angle.png")); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setFovY(int))); action = subMenu->addAction(tr("&20°")); actionGroup->addAction(action); signalMapper->setMapping(action, 20); action->setShortcut(QKeySequence(Qt::Key_1)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&40°")); actionGroup->addAction(action); signalMapper->setMapping(action, 40); action->setShortcut(QKeySequence(Qt::Key_2)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&60°")); actionGroup->addAction(action); signalMapper->setMapping(action, 60); action->setShortcut(QKeySequence(Qt::Key_3)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("&80°")); actionGroup->addAction(action); signalMapper->setMapping(action, 80); action->setShortcut(QKeySequence(Qt::Key_4)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("100°")); actionGroup->addAction(action); signalMapper->setMapping(action, 100); action->setShortcut(QKeySequence(Qt::Key_5)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("120°")); actionGroup->addAction(action); signalMapper->setMapping(action, 120); action->setShortcut(QKeySequence(Qt::Key_6)); action->setCheckable(true); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getFovY()))->setChecked(true); subMenu = menu->addMenu(tr("&Surface Rendering")); actionGroup = new QActionGroup(subMenu); signalMapper = new QSignalMapper(subMenu); connect(signalMapper, SIGNAL(mapped(int)), SLOT(setSurfaceStyle(int))); action = subMenu->menuAction(); action->setIcon(QIcon(":/icons/layers.png")); action->setStatusTip(tr("Select different rendering techniques for displaying the scene")); action = subMenu->addAction(tr("Appearance &Wire Frame")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::WIREFRAME); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Appearance &Flat Shading")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F)); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::FLAT_SHADING); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Appearance &Smooth Shading")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::SMOOTH_SHADING); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Appearance &Texture Shading")); actionGroup->addAction(action); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::TEXTURE_SHADING); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Appearance &Camera Simulation")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::CAMERA_SIMULATION); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); subMenu->addSeparator(); action = subMenu->addAction(tr("Physics &Wire Frame")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::PHYSICS_WIREFRAME); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Physics &Flat Shading")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::PHYSICS_FLAT); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Physics &Smooth Shading")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::PHYSICS_SMOOTH); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); subMenu->addSeparator(); action = subMenu->addAction(tr("Mixed Mode &1 (Shaded Physics)")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::MIXED_PHYSICS); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); action = subMenu->addAction(tr("Mixed Mode &2 (Shaded Appearance)")); actionGroup->addAction(action); action->setCheckable(true); signalMapper->setMapping(action, VisualizationParameterSet::MIXED_APPEARANCE); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); qobject_cast<QAction*>(signalMapper->mapping(objectRenderer.getSurfaceStyle()))->setChecked(true); menu->addSeparator(); if(!showSensorsAct) { showSensorsAct = new QAction(QIcon(":/icons/transmit_go.png"), tr("Show &Sensors"), this); showSensorsAct->setStatusTip(tr("Show the values of the sensors in the scene view")); showSensorsAct->setCheckable(true); showSensorsAct->setChecked(objectRenderer.hasShowDetailSensors()); connect(showSensorsAct, SIGNAL(triggered()), this, SLOT(showDetailSensors())); } menu->addAction(showSensorsAct); if(!showDrawingsAct) { showDrawingsAct = new QAction(QIcon(":/icons/chart_line.png"), tr("Show Controller &Drawings"), this); showDrawingsAct->setStatusTip(tr("Show the controller 3D drawings in the scene view")); showDrawingsAct->setCheckable(true); showDrawingsAct->setChecked(objectRenderer.hasShowControllerDrawings()); connect(showDrawingsAct, SIGNAL(triggered()), this, SLOT(showControllerDrawings())); } menu->addAction(showDrawingsAct); return menu; }
void RackWindow::createPluginHost(int position) { //layout settings widget: QWidget *settingsWidget = new QWidget; settingsWidget->setPalette(QPalette(QColor(0,0,0,160))); settingsWidget->setAutoFillBackground(true); RPushButton *leftButton = new RPushButton; leftButton->setObjectName("rackSettingsLeftArrowButton"); RPushButton *rightButton = new RPushButton; rightButton->setObjectName("rackSettingsRightArrowButton"); RPushButton *topButton = new RPushButton; topButton->setObjectName("rackSettingsTopArrowButton"); RPushButton *bottomButton = new RPushButton; bottomButton->setObjectName("rackSettingsBottomArrowButton"); RPushButton *closeButton = new RPushButton; closeButton->setObjectName("rackSettingsCloseButton"); //vertical toolbar for plugin buttons: QToolBar *pluginHostToolBar = new QToolBar; pluginHostToolBar->setObjectName("rackPluginHostToolBar"); pluginHostToolBar->setOrientation(Qt::Vertical); //actiongroup for exclusive handling of buttons: QActionGroup *ag = new QActionGroup(pluginHostToolBar); ag->setExclusive(true); RPushButton *addPluginWidgetButton = new RPushButton(tr("Add Widget ...")); addPluginWidgetButton->setObjectName("rackAddPluginWidgetButton"); QWidget *middleWidget = new QWidget; QVBoxLayout *middleLayout = new QVBoxLayout(middleWidget); middleLayout->setSpacing(0); middleLayout->setContentsMargins(0,0,0,0); middleLayout->addWidget(pluginHostToolBar, 0, Qt::AlignHCenter); middleLayout->addWidget(addPluginWidgetButton, 0, Qt::AlignHCenter); QGridLayout *settingsLayout = new QGridLayout(settingsWidget); settingsLayout->setSpacing(0); settingsLayout->setContentsMargins(0,0,0,0); settingsLayout->addWidget(topButton,0,1, Qt::AlignTop | Qt::AlignHCenter); settingsLayout->addWidget(closeButton,0,2, Qt::AlignTop | Qt::AlignRight); settingsLayout->addWidget(leftButton,1,0, Qt::AlignLeft); settingsLayout->addWidget(rightButton,1,2, Qt::AlignRight); settingsLayout->addWidget(bottomButton,2,1, Qt::AlignBottom| Qt::AlignHCenter); settingsLayout->addWidget(middleWidget,1,1); QStackedWidget *pluginStack = new QStackedWidget; pluginStack->setObjectName("rackPluginStack"); pluginStack->setAutoFillBackground(true); QWidget *pluginHost = new QWidget; pluginHost->setMinimumSize(200,80); QStackedLayout *overlayLayout = new QStackedLayout(pluginHost); overlayLayout->setStackingMode(QStackedLayout::StackAll); overlayLayout->addWidget(pluginStack); overlayLayout->addWidget(settingsWidget); overlayLayout->setCurrentIndex(1); //enter/leave settings signals: QSignalMapper *mapperShowSettingsMode = new QSignalMapper(pluginHost); QObject::connect(this, SIGNAL(enterSettingsMode()), mapperShowSettingsMode, SLOT(map())); mapperShowSettingsMode->setMapping(this, 1); QSignalMapper *mapperHideSettingsMode = new QSignalMapper(pluginHost); QObject::connect(this, SIGNAL(leaveSettingsMode()), mapperHideSettingsMode, SLOT(map())); mapperHideSettingsMode->setMapping(this, 0); QObject::connect(mapperShowSettingsMode, SIGNAL(mapped(int)), overlayLayout, SLOT(setCurrentIndex(int))); QObject::connect(mapperHideSettingsMode, SIGNAL(mapped(int)), overlayLayout, SLOT(setCurrentIndex(int))); //create plugin host widget signals: QSignalMapper *mapperCreatePluginHost = new QSignalMapper(pluginHost); QObject::connect(leftButton, SIGNAL(clicked()), mapperCreatePluginHost, SLOT(map())); QObject::connect(rightButton, SIGNAL(clicked()), mapperCreatePluginHost, SLOT(map())); QObject::connect(topButton, SIGNAL(clicked()), mapperCreatePluginHost, SLOT(map())); QObject::connect(bottomButton, SIGNAL(clicked()), mapperCreatePluginHost, SLOT(map())); mapperCreatePluginHost->setMapping(leftButton, NewSplitterLeft); mapperCreatePluginHost->setMapping(rightButton, NewSplitterRight); mapperCreatePluginHost->setMapping(topButton, NewSplitterTop); mapperCreatePluginHost->setMapping(bottomButton, NewSplitterBottom); QObject::connect(mapperCreatePluginHost, SIGNAL(mapped(int)), SLOT(createPluginHost(int))); //load plugin signal: QObject::connect(addPluginWidgetButton, SIGNAL(clicked()), m_mapperLoadNewPlugin, SLOT(map())); m_mapperLoadNewPlugin->setMapping(addPluginWidgetButton, pluginHost); //close plugin host signal: QObject::connect(closeButton, SIGNAL(clicked()), m_mapperClosePluginHost, SLOT(map())); m_mapperClosePluginHost->setMapping(closeButton, pluginHost); //create plugin switch signalmapper QSignalMapper *mapperSwitchPlugin = new QSignalMapper(pluginHost); mapperSwitchPlugin->setObjectName("rackPluginSwitchMapper"); QObject::connect(mapperSwitchPlugin, SIGNAL(mapped(QWidget *)), pluginStack, SLOT(setCurrentWidget(QWidget *))); ////test show/hide plugin widget ////QObject::connect(mapperSwitchPlugin, SIGNAL(mapped(QWidget *)), this, SLOT(showHidePluginWidget(QWidget*))); ////// //create plugin toolbar for mainwindow QToolBar *pluginToolBar = new QToolBar; pluginToolBar->setObjectName("rackPluginToolBar"); pluginToolBar->setMovable(false); pluginToolBar->hide(); addToolBar(Qt::BottomToolBarArea, pluginToolBar); //store the toolbar pointer as dynamic property to access later when creating plugin toolbar buttons pluginHost->setProperty("pluginToolBar", qVariantFromValue((QWidget *)pluginToolBar)); //plugin bar signals & slots: QObject::connect(this, SIGNAL(enterSettingsMode()), pluginToolBar, SLOT(hide())); QObject::connect(this, SIGNAL(leaveSettingsMode()), pluginToolBar, SLOT(show())); //insert new pluginhost widget in splitter, create new splitter if necessary if (position == 0) { m_mainSplitter->addWidget(pluginHost); return; } QSignalMapper *sm = qobject_cast<QSignalMapper *>(sender()); QWidget *senderPluginHost = qobject_cast<QWidget *>(sm->mapping(position)->parent()->parent()); RSplitter *parentSplitter = qobject_cast<RSplitter *>(senderPluginHost->parent()); QList<int> widgetsizes; int senderpos = parentSplitter->indexOf(senderPluginHost); int newposition; if ((position == NewSplitterLeft) or (position == NewSplitterTop)) newposition = senderpos; else newposition = senderpos + 1; switch (position + parentSplitter->orientation()) { //horizontal=1 vertical=2 case 0: //left horizontal / top vertical case 2: //right horizontal case 4: //bottom vertical widgetsizes = parentSplitter->sizes(); widgetsizes.replace(senderpos, int(widgetsizes.at(senderpos)/2)); widgetsizes.insert(senderpos + 1, widgetsizes.at(senderpos)); parentSplitter->insertWidget(newposition, pluginHost); parentSplitter->setSizes(widgetsizes); break; case 1: //left vertical case 3: //right vertical / bottom horizontal case -1: //top horizontal if (parentSplitter->count() == 1) { parentSplitter->setOrientation(Qt::Orientation(abs(position))); widgetsizes = parentSplitter->sizes(); widgetsizes.replace(0, int(widgetsizes.at(0)/2)); widgetsizes.append(widgetsizes.at(0)); parentSplitter->insertWidget(newposition, pluginHost); parentSplitter->setSizes(widgetsizes); } else if (parentSplitter->count() > 1) { RSplitter *newSplitter = new RSplitter(Qt::Orientation(abs(position))); QObject::connect(this, SIGNAL(enterSettingsMode()), newSplitter, SIGNAL(enterSettingsMode())); QObject::connect(this, SIGNAL(leaveSettingsMode()), newSplitter, SIGNAL(leaveSettingsMode())); widgetsizes = parentSplitter->sizes(); parentSplitter->insertWidget(parentSplitter->indexOf(senderPluginHost), newSplitter); newSplitter->addWidget(senderPluginHost); QList<int> newsizes = newSplitter->sizes(); newsizes.replace(0, int(newsizes.at(0)/2)); newsizes.append(newsizes.at(0)); if ((position == NewSplitterLeft) or (position == NewSplitterTop)) newSplitter->insertWidget(0, pluginHost); else newSplitter->addWidget(pluginHost); newSplitter->setSizes(newsizes); parentSplitter->setSizes(widgetsizes); } break; } }