QList< QGraphicsItem * > UMLScene::getGroupingList() { QList< QGraphicsItem * > selectedList( this->selectedItems() ); QSet< QGraphicsItem * > roots; QListIterator < QGraphicsItem * > iter( selectedList ); while( iter.hasNext() ) { QGraphicsItem * item = iter.next(); QGraphicsItemGroup * itemGroup = item->group(); while( itemGroup && itemGroup->group() ) { itemGroup = itemGroup->group(); } roots.insert( itemGroup ? itemGroup : item ); } return roots.toList(); }
void MainWindow::contextMenu(const QPoint &p) { // mostra o menu de contexto para o item na posicao "p" QGraphicsItem *item = ui->graphicsView->itemAt(p); if (item) { // o menu deve ser mostrado na posicao onde o mouse foi clicado QPoint globalPos = ui->graphicsView->mapToGlobal(p); QMenu menu; QMenu *linha = new QMenu("Linha/Texto", &menu); QMenu *preenchimento = new QMenu("Preenchimento", &menu); QMenu *menuLinha = new QMenu("Estilo", linha); QMenu *menuPadroes = new QMenu("Padrões", preenchimento); QMenu *menuEspessura = new QMenu("Espessura", linha); QAction* estilo1 = new QAction(" - - - - - ", menuLinha); QAction* estilo2 = new QAction(" - . - . - ", menuLinha); QAction* estilo3 = new QAction(" - .. - .. - ", menuLinha); menuLinha->addAction(estilo1); menuLinha->addAction(estilo2); menuLinha->addAction(estilo3); QAction* estiloPadrao1 = new QAction("Linhas horizontais", menuPadroes); QAction* estiloPadrao2 = new QAction("Linhas verticais", menuPadroes); QAction* estiloPadrao3 = new QAction("Quadriculado", menuPadroes); menuPadroes->addAction(estiloPadrao1); menuPadroes->addAction(estiloPadrao2); menuPadroes->addAction(estiloPadrao3); QAction* espessura1 = new QAction("2", menuEspessura); QAction* espessura2 = new QAction("3", menuEspessura); QAction* espessura3 = new QAction("4", menuEspessura); menuEspessura->addAction(espessura1); menuEspessura->addAction(espessura2); menuEspessura->addAction(espessura3); QAction* corLinha = new QAction("Cor", linha); QAction* corPreen = new QAction("Cor", preenchimento); linha->addAction(corLinha); linha->addAction(menuLinha->menuAction()); linha->addAction(menuEspessura->menuAction()); preenchimento->addAction(menuPadroes->menuAction()); preenchimento->addAction(corPreen); menu.addAction(linha->menuAction()); menu.addAction(preenchimento->menuAction()); QAction* selectedItem; int tipoItem = item->type(); // seleciona o que vai ficar Habilitado/Desabilitado no menu baseado no item selecionado if (tipoItem == MainWindow::Line) { if (QGraphicsItemGroup *g = item->group()) { preenchimento->setEnabled(false); menuLinha->setEnabled(false); // pega a entrada do menu que foi selecionada selectedItem = menu.exec(globalPos); if (selectedItem) { // Alterar Cor da Linha if (selectedItem == corLinha) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) foreach (QGraphicsItem* i, g->childItems()) (static_cast<QGraphicsLineItem*>(i))->setPen(QPen(cor)); // Alterar Espessura da Linha: 2 } else if (selectedItem == espessura1) { QList<QGraphicsItem*> itens = g->childItems(); QPen currentPen = (static_cast<QGraphicsLineItem*>(itens[0]))->pen(); foreach (QGraphicsItem* i, itens) (static_cast<QGraphicsLineItem*>(i))->setPen(QPen(currentPen.brush(), 2)); // Alterar Espessura da Linha: 3 } else if (selectedItem == espessura2) { QList<QGraphicsItem*> itens = g->childItems(); QPen currentPen = (static_cast<QGraphicsLineItem*>(itens[0]))->pen(); foreach (QGraphicsItem* i, itens) (static_cast<QGraphicsLineItem*>(i))->setPen(QPen(currentPen.brush(), 3)); // Alterar Espessura da Linha: 4 } else if (selectedItem == espessura3) { QList<QGraphicsItem*> itens = g->childItems(); QPen currentPen = (static_cast<QGraphicsLineItem*>(itens[0]))->pen(); foreach (QGraphicsItem* i, itens) (static_cast<QGraphicsLineItem*>(i))->setPen(QPen(currentPen.brush(), 4)); } } } else { preenchimento->setEnabled(false); // devo recuperar aqui dentro, pois preciso desabilitar algumas opções selectedItem = menu.exec(globalPos); if (selectedItem) { if (selectedItem == estilo1) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); currentPen.setStyle(Qt::DashLine); (static_cast<QGraphicsLineItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo2) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotLine); (static_cast<QGraphicsLineItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo3) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotDotLine); (static_cast<QGraphicsLineItem*>(item))->setPen(currentPen); } else if (selectedItem == corLinha) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); currentPen.setColor(cor); (static_cast<QGraphicsLineItem*>(item))->setPen(currentPen); } } else if (selectedItem == espessura1) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); (static_cast<QGraphicsLineItem*>(item))->setPen(QPen(currentPen.brush(), 2)); } else if (selectedItem == espessura2) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); (static_cast<QGraphicsLineItem*>(item))->setPen(QPen(currentPen.brush(), 3)); } else if (selectedItem == espessura3) { QPen currentPen = (static_cast<QGraphicsLineItem*>(item))->pen(); (static_cast<QGraphicsLineItem*>(item))->setPen(QPen(currentPen.brush(), 4)); } } } } else { if (tipoItem == MainWindow::Quadrado) { selectedItem = menu.exec(globalPos); if (selectedItem) { if (selectedItem == corLinha) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setColor(cor); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } } else if (selectedItem == estilo1) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setStyle(Qt::DashLine); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo2) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotLine); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo3) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotLine); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura1) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setWidth(2); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura2) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setWidth(3); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura3) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); currentPen.setWidth(4); (static_cast<QGraphicsRectItem*>(item))->setPen(currentPen); } else if (selectedItem == corPreen) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) { QPen currentPen = (static_cast<QGraphicsRectItem*>(item))->pen(); QBrush b = currentPen.brush(); b.setColor(cor); b.setStyle(Qt::SolidPattern); (static_cast<QGraphicsRectItem*>(item))->setBrush(b); } } else if (selectedItem == estiloPadrao1) { QBrush b = (static_cast<QGraphicsRectItem*>(item))->brush(); b.setStyle(Qt::HorPattern); (static_cast<QGraphicsRectItem*>(item))->setBrush(b); } else if (selectedItem == estiloPadrao2) { QBrush b = (static_cast<QGraphicsRectItem*>(item))->brush(); b.setStyle(Qt::VerPattern); (static_cast<QGraphicsRectItem*>(item))->setBrush(b); } else if (selectedItem == estiloPadrao3) { QBrush b = (static_cast<QGraphicsRectItem*>(item))->brush(); b.setStyle(Qt::CrossPattern); (static_cast<QGraphicsRectItem*>(item))->setBrush(b); } } } else if (tipoItem == MainWindow::Texto) { preenchimento->setEnabled(false); menuLinha->setEnabled(false); menuEspessura->setEnabled(false); selectedItem = menu.exec(globalPos); if (selectedItem && selectedItem == corLinha) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) (static_cast<QGraphicsTextItem*>(item))->setDefaultTextColor(cor); } } else if (tipoItem == MainWindow::Circulo) { selectedItem = menu.exec(globalPos); if (selectedItem) { if (selectedItem == corLinha) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setColor(cor); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } } else if (selectedItem == estilo1) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setStyle(Qt::DashLine); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo2) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotLine); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == estilo3) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setStyle(Qt::DashDotLine); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura1) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setWidth(2); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura2) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setWidth(3); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == espessura3) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); currentPen.setWidth(4); (static_cast<QGraphicsEllipseItem*>(item))->setPen(currentPen); } else if (selectedItem == corPreen) { QColor cor = QColorDialog::getColor(); if (cor.isValid()) { QPen currentPen = (static_cast<QGraphicsEllipseItem*>(item))->pen(); QBrush b = currentPen.brush(); b.setColor(cor); b.setStyle(Qt::SolidPattern); (static_cast<QGraphicsEllipseItem*>(item))->setBrush(b); } } else if (selectedItem == estiloPadrao1) { QBrush b = (static_cast<QGraphicsEllipseItem*>(item))->brush(); b.setStyle(Qt::HorPattern); (static_cast<QGraphicsEllipseItem*>(item))->setBrush(b); } else if (selectedItem == estiloPadrao2) { QBrush b = (static_cast<QGraphicsEllipseItem*>(item))->brush(); b.setStyle(Qt::VerPattern); (static_cast<QGraphicsEllipseItem*>(item))->setBrush(b); } else if (selectedItem == estiloPadrao3) { QBrush b = (static_cast<QGraphicsEllipseItem*>(item))->brush(); b.setStyle(Qt::CrossPattern); (static_cast<QGraphicsEllipseItem*>(item))->setBrush(b); } } } } } }
bool Binding::callMethod(Smoke::Index method, void *ptr, Smoke::Stack args, bool isAbstract) { // don't call anything if the application has already terminated if (application_terminated) return false; void * obj = (*GetInstance)(ptr, false); if (obj == 0 && !isAbstract) { return false; } Smoke::Method & meth = smoke->methods[method]; QByteArray signature(smoke->methodNames[meth.name]); signature += "("; for (int i = 0; i < meth.numArgs; i++) { if (i != 0) signature += ", "; signature += smoke->types[smoke->argumentList[meth.args + i]].name; } signature += ")"; if (meth.flags & Smoke::mf_const) { signature += " const"; } if (obj == 0) { printf( "Fatal error: C# instance has been wrongly GC'd for virtual %p->%s::%s call\n", ptr, smoke->classes[smoke->methods[method].classId].className, (const char *) signature ); std::exit(1); } if (do_debug & qtdb_virtual) { printf( "virtual %p->%s::%s called\n", ptr, smoke->classes[smoke->methods[method].classId].className, (const char *) signature ); fflush(stdout); } #if QT_VERSION >= 0x40200 static Smoke::Index qgraphicsitem_class = Smoke::classMap["QGraphicsItem"].index; #endif smokeqyoto_object *sqo = (smokeqyoto_object*) (*GetSmokeObject)(obj); if (strcmp(signature, "qt_metacall(QMetaObject::Call, int, void**)") == 0) { QMetaObject::Call _c = (QMetaObject::Call)args[1].s_int; int _id = args[2].s_int; void** _o = (void**)args[3].s_voidp; args[0].s_int = qyoto_qt_metacall(obj, _c, _id, _o); (*FreeGCHandle)(obj); return true; #if QT_VERSION >= 0x40200 } else if (strcmp(signature, "itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&)") == 0 && smoke->isDerivedFrom(smoke, sqo->classId, qtgui_Smoke, qgraphicsitem_class)) { int change = args[1].s_int; if (change == QGraphicsItem::ItemSceneChange) { QGraphicsScene *scene = ((QVariant*) args[2].s_voidp)->value<QGraphicsScene*>(); if (scene) { (*AddGlobalRef)(obj, ptr); } else { QGraphicsItem *item = (QGraphicsItem*) sqo->smoke->cast(ptr, sqo->classId, qgraphicsitem_class); if (!item->group()) { // only remove the global ref if the item doesn't belong to a group (*RemoveGlobalRef)(obj, ptr); } } } #endif } void * overridenMethod = (*OverridenMethod)(obj, (const char *) signature); if (overridenMethod == 0) { (*FreeGCHandle)(obj); return false; } Qyoto::VirtualMethodCall c(smoke, method, args, obj, overridenMethod); c.next(); return true; }