コード例 #1
0
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);
        }
    }
コード例 #2
0
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;
}
コード例 #3
0
ファイル: ObjectWidget.cpp プロジェクト: alon/bhuman2009fork
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;
    }
}