예제 #1
0
QPointF RenderedItemInterface::absolutePixelPos() const
{
    QGraphicsItem * parent = parentItem();
    QPointF itemPixelpos = convertUnit(d_ptr->rect.topLeft(), d_ptr->unit, Pixel, d_ptr->dpi);

    while (parent) {
        if (parent->type() == RenderedPageInterface::Type) {
            //            QPointF pageAbsPos = parent->mapToScene(QPointF(0,0));
            QPointF itemMapped = parent->mapToScene(itemPixelpos);
            return itemMapped;
        }
        parent = parent->parentItem();
    }

    return itemPixelpos;
}
예제 #2
0
  void RotateTool::mousePressEvent(QGraphicsSceneMouseEvent *event)
  {
    QGraphicsItem * item = scene()->itemAt(event->buttonDownScenePos(Qt::LeftButton));
    if (!item)
      return;

    if (item->type() == Atom::Type)
      item = item->parentItem();
    if (item->type() == Bond::Type)
      item = item->parentItem();

    QPointF rotatePoint = item->boundingRect().center();
    QPointF rotatePointAbs = item->mapToScene(rotatePoint);

    m_rotationCenter = rotatePointAbs;
    m_rotationItem = item;
    m_lastRotationVect = event->buttonDownScenePos(Qt::LeftButton) - rotatePointAbs ; //save vector for relative rotation step
  }
예제 #3
0
파일: CUtils.cpp 프로젝트: jetcodes/JetMind
QPoint Utils::getPopupPoint(QGraphicsScene *scene, QWidget *hostedWidget, QToolButton *button, QWidget *widget)
{
    qreal                   x, y;
    QRectF                  sc, r0;
    QRect                   menuRect, buttonRect;
    QPoint                  p;
    CDiagram                *diagram = NULL;
    QGraphicsView           *v = NULL;
    QWidget                 *parent = NULL;
    CDiagramHostedWidget    *hosted = NULL;
    QGraphicsItem           *item = NULL;

    diagram = dynamic_cast<CDiagram*>(scene);
    hosted = dynamic_cast<CDiagramHostedWidget*>( hostedWidget );
    parent = button->parentWidget();
    if (!diagram || !widget || !parent || !hosted)
        return QPoint();

    v = diagram->getMainView();
    if (!v)
        return QPoint();

    item = hosted->diagramWidget();
    menuRect = widget->geometry();
    buttonRect = button->geometry();
    p = parent->mapTo(hostedWidget, button->pos());
    sc = v->mapToScene(v->viewport()->geometry()).boundingRect();
    r0 = item->mapToScene( item->boundingRect() ).boundingRect();
    r0 = QRectF(r0.topLeft() + QPointF(p.x(), p.y()), QSizeF(buttonRect.width(), buttonRect.height()));

    // determine x
    if (sc.right() - menuRect.width() > r0.left())
        x = r0.left();
    else
        x = sc.right() - menuRect.width();

    // determine y
    if (sc.bottom() - menuRect.height() > r0.bottom() )
        y = r0.bottom();
    else
        y = sc.bottom() - menuRect.height();

    return v->mapToGlobal( v->mapFromScene( QPointF(x, y) ) );
}
void CustomGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* _event)
{
	//
	// Обработку производим только после перемещения мыши
	//
	if (m_afterMoving) {
		//
		// 1. Перемещение карточки на связь
		//
		QList<Shape*> selected = selectedShapes();
		CardShape* selectedCard = nullptr;
		ArrowFlow* selectedFlow = nullptr;
		if (selected.size() == 2) {
			if (dynamic_cast<CardShape*>(selected.first())) {
				selectedCard = dynamic_cast<CardShape*>(selected.first());
				selectedFlow = dynamic_cast<ArrowFlow*>(selected.last());
			} else {
				selectedCard = dynamic_cast<CardShape*>(selected.last());
				selectedFlow = dynamic_cast<ArrowFlow*>(selected.first());
			}
			//
			// Если это действительно перемещение карточки на связь
			//
			if (selectedCard != nullptr
				&& selectedFlow != nullptr
				&& selectedFlow->startShape() != selectedCard
				&& selectedFlow->endShape() != selectedCard) {
				//
				// Изымаем карточку из сцены
				//
				takeShape(selectedCard);

				//
				// Определяем элементы к которым теперь будет присоединена карточка
				//
				CardShape* previousCard = dynamic_cast<CardShape*>(selectedFlow->startShape());
				CardShape* nextCard = dynamic_cast<CardShape*>(selectedFlow->endShape());
				//
				// Заменяем старую связь на новые
				//
				removeShape(selectedFlow);
				appendShape(new ArrowFlow(previousCard, selectedCard));
				if (hasCards(selectedCard)) {
					appendShape(new ArrowFlow(lastCard(selectedCard), nextCard));
				} else {
					appendShape(new ArrowFlow(selectedCard, nextCard));
				}

				//
				// Меняем порядок следования фигур
				//
				insertShape(selectedCard, previousCard);

				//
				// Если предыдущая карточка вложена в группирующий элемент
				//
				QGraphicsItem* previousParentItem = previousCard->parentItem();
				QGraphicsItem* nextParentItem = nextCard->parentItem();
				bool handled = false;
				if (previousParentItem != nullptr) {
					const QRectF selectedCardRect = selectedCard->mapToScene(selectedCard->boundingRect()).boundingRect();
					const QRectF parentCardRect = previousParentItem->mapToScene(previousParentItem->boundingRect()).boundingRect();
					//
					// ... и если текущая карточка тоже помещена внутрь группирующего элемента
					//
					if (parentCardRect.contains(selectedCardRect)) {
						//
						// ... поместим её внутрь
						//
						const QPointF lastPos = selectedCard->scenePos();
						selectedCard->setParentItem(previousParentItem);
						selectedCard->setPos(previousParentItem->mapFromScene(lastPos));
						handled = true;
					}
				}
				//
				// Если следующая карточка вложена в группирующий элемент
				//
				if (!handled
					&& nextParentItem != nullptr) {
					const QRectF selectedCardRect = selectedCard->mapToScene(selectedCard->boundingRect()).boundingRect();
					const QRectF parentCardRect = nextParentItem->mapToScene(nextParentItem->boundingRect()).boundingRect();
					//
					// ... и если текущая карточка тоже помещена внутрь группирующего элемента
					//
					if (parentCardRect.contains(selectedCardRect)) {
						//
						// ... поместим её внутрь
						//
						const QPointF lastPos = selectedCard->scenePos();
						selectedCard->setParentItem(nextParentItem);
						selectedCard->setPos(nextParentItem->mapFromScene(lastPos));
						handled = true;
					}
				}
				//
				// Если не удалось вложить, то убираем родителя у элемента
				//
				if (!handled
					&& selectedCard->parentItem() != nullptr) {
					const QPointF lastPos = selectedCard->scenePos();
					selectedCard->setParentItem(nullptr);
					selectedCard->setPos(lastPos);
				}
			}
		}

		//
		// 2. Обработка вложения и вытаскивания элементов из групп сцен и папок
		//
		selected = selectedShapes();
		if (selected.size() == 1) {
			selectedCard = dynamic_cast<CardShape*>(selected.first());
			if (selectedCard != nullptr) {
				//
				// Определим, есть ли группирующий элемент, помеченный на вложение
				//
				CardShape* parentCard = nullptr;
				for (Shape* shape : shapes()) {
					if (CardShape* card = dynamic_cast<CardShape*>(shape)) {
						if (card->isOnInstertionState()) {
							parentCard = card;
							break;
						}
					}
				}

				//
				// Если это перемещение карточки внутри своего родителя, просто снимем режим выделения
				//
				if (parentCard != nullptr
					&& selectedCard->parentItem() == parentCard) {
					parentCard->setOnInstertionState(false);
				}
				//
				// В противном случае
				//
				else {
					//
					// Вложение
					//
					if (parentCard != nullptr) {
						//
						// Изымаем карточку из сцены
						//
						takeShape(selectedCard);

						//
						// Если у группирующего элемента есть дети, то связываем с последней карточкой
						//
						if (hasCards(parentCard)) {
							//
							// Определяем элементы к которым теперь будет присоединена карточка
							//
							CardShape* previousCard = dynamic_cast<CardShape*>(lastCard(parentCard));
							Flow* previousCardFlow = cardFlow(previousCard, CARD_ON_FLOW_START);
							if (previousCardFlow != nullptr) {
								CardShape* nextCard = dynamic_cast<CardShape*>(previousCardFlow->endShape());
								//
								// Заменяем старую связь на новые
								//
								removeShape(previousCardFlow);
								if (hasCards(selectedCard)) {
									appendShape(new ArrowFlow(lastCard(selectedCard), nextCard));
								} else {
									appendShape(new ArrowFlow(selectedCard, nextCard));
								}
							}
							appendShape(new ArrowFlow(previousCard, selectedCard));

							//
							// Меняем порядок следования фигур
							//
							insertShape(selectedCard, previousCard);
						}
						//
						// Если детей нет, то связываем непосредственно с группирующим элементом
						//
						else {
							//
							// Определяем элементы к которым теперь будет присоединена карточка
							//
							CardShape* previousCard = parentCard;
							Flow* previousCardFlow = cardFlow(previousCard, CARD_ON_FLOW_START);
							if (previousCardFlow != nullptr) {
								CardShape* nextCard = dynamic_cast<CardShape*>(previousCardFlow->endShape());
								//
								// Заменяем старую связь на новые
								//
								removeShape(previousCardFlow);
								if (hasCards(selectedCard)) {
									appendShape(new ArrowFlow(lastCard(selectedCard), nextCard));
								} else {
									appendShape(new ArrowFlow(selectedCard, nextCard));
								}
							}
							appendShape(new ArrowFlow(previousCard, selectedCard));

							//
							// Меняем порядок следования фигур
							//
							insertShape(selectedCard, previousCard);
						}

						//
						// Назначаем нового родителя
						//
						const QPointF lastPos = selectedCard->scenePos();
						selectedCard->setParentItem(parentCard);
						selectedCard->setPos(parentCard->mapFromScene(lastPos));
						parentCard->setOnInstertionState(false);
					}
					//
					// Вытаскивание - соединяем с последней карточкой в сценарии
					//
					else if (selectedCard->parentItem() != nullptr) {
						//
						// Изымаем карточку из сцены
						//
						takeShape(selectedCard);

						//
						// Определяем элемент к которому теперь будет присоединена карточка
						//
						CardShape* previousCard =  dynamic_cast<CardShape*>(lastCard());
						//
						// Добавляем связь
						//
						appendShape(new ArrowFlow(previousCard, selectedCard));

						//
						// Меняем порядок следования фигур
						//
						insertShape(selectedCard, previousCard);

						//
						// Убираем родителя
						//
						const QPointF lastPos = selectedCard->scenePos();
						selectedCard->setParentItem(nullptr);
						selectedCard->setPos(lastPos);
					}
				}
			}
		}
	}

	update();

	QGraphicsScene::mouseReleaseEvent(_event);

	m_afterMoving = false;
}