示例#1
0
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);
                   }
               }
           }
       }
    }
}
示例#3
0
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;
}