void SCgView::contextMenuEvent(QContextMenuEvent *event) { if (event->reason() == QContextMenuEvent::Keyboard || event->reason() == QContextMenuEvent::Other) return; // get scg-object under mouse QPointF mousePos = mapToScene(event->pos());/* + QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value()) - scene()->sceneRect().topLeft();*/ SCgObject *object = static_cast<SCgScene*>(scene())->objectAt(mousePos); // create context menu if (mContextMenu) { delete mContextMenu; mContextMenu = 0; } // selection by right mouse click if(object && !object->isSelected()) { scene()->clearSelection(); object->setSelected(true); } // create new context menu mContextMenu = new QMenu; mContextMenu->addActions(mActionsList); mContextMenu->exec(event->globalPos()); }
void SCgView::contextMenuEvent(QContextMenuEvent *event) { if (event->reason() == QContextMenuEvent::Keyboard || event->reason() == QContextMenuEvent::Other) return; // get scg-object under mouse QPointF mousePos = mapToScene(event->pos());/* + QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value()) - scene()->sceneRect().topLeft();*/ SCgObject *object = static_cast<SCgScene*>(scene())->objectAt(mousePos); // create context menu if (mContextMenu) { delete mContextMenu; mContextMenu = 0; } // selection by right mouse click if(object && !object->isSelected()) { scene()->clearSelection(); object->setSelected(true); } // create new context menu mContextMenu = new QMenu; if (mContextObject) { // creating menu actions depending on object type if (mContextObject->type() == SCgNode::Type || mContextObject->type() == SCgPair::Type) { // type changing QMenu *menu = mContextMenu->addMenu(tr("Change type")); connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(changeType(QAction*))); QMenu* constSub = menu->addMenu(tr("Const")); QMenu* varSub = menu->addMenu(tr("Var")); QString stype; SCgAlphabet::SCgObjectTypesMap types; SCgAlphabet::SCgObjectTypesMap::const_iterator iter; if (mContextObject->type() == SCgNode::Type) stype = "node"; else if (mContextObject->type() == SCgPair::Type) stype = "pair"; SCgAlphabet::getInstance().getObjectTypes(stype, SCgAlphabet::Const, types); for (iter = types.begin(); iter != types.end(); ++iter) constSub->addAction(iter.value(), iter.key())->setData(QVariant(iter.key())); types.clear(); SCgAlphabet::getInstance().getObjectTypes(stype, SCgAlphabet::Var, types); for (iter = types.begin(); iter != types.end(); ++iter) varSub->addAction(iter.value(), iter.key())->setData(QVariant(iter.key())); types.clear(); SCgAlphabet::getInstance().getObjectTypes(stype, SCgAlphabet::ConstUnknown, types); for (iter = types.begin(); iter != types.end(); ++iter) menu->addAction(iter.value(), iter.key())->setData(QVariant(iter.key())); types.clear(); } }