QVariant UBGraphicsGroupContainerItem::itemChange(GraphicsItemChange change, const QVariant &value) { QVariant newValue = mDelegate->itemChange(change, value); foreach(QGraphicsItem *child, children()) { UBGraphicsItem *item = dynamic_cast<UBGraphicsItem*>(child); if (item) { item->Delegate()->positionHandles(); } }
QList<UBGraphicsDelegateFrame *> UBGraphicsDelegateFrame::getLinkedFrames() { QList<UBGraphicsDelegateFrame*> linkedFrames; QList<QGraphicsItem*> sItems = mDelegate->delegated()->scene()->selectedItems(); if (sItems.count()) { sItems.removeAll(delegated()); foreach(QGraphicsItem *item, sItems) { UBGraphicsItem *gitem = dynamic_cast<UBGraphicsItem*>(item); if (gitem) linkedFrames << gitem->Delegate()->frame(); }
void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item,bool removeAction) { if (!item) { qWarning("UBGraphicsGroupContainerItem::addToGroup: cannot add null item"); return; } if (item == this) { qWarning("UBGraphicsGroupContainerItem::addToGroup: cannot add a group to itself"); return; } //TODO claudio UBGraphicsItem* ubGraphics = dynamic_cast<UBGraphicsItem*>(item); if(ubGraphics && ubGraphics->Delegate() && removeAction) ubGraphics->Delegate()->setAction(0); //Check if group is allready rotatable or flippable if (childItems().count()) { if (UBGraphicsItem::isFlippable(this) && !UBGraphicsItem::isFlippable(item)) { Delegate()->setFlippable(false); } if (UBGraphicsItem::isRotatable(this) && !UBGraphicsItem::isRotatable(item)) { Delegate()->setRotatable(false); } } else { Delegate()->setFlippable(UBGraphicsItem::isFlippable(item)); Delegate()->setRotatable(UBGraphicsItem::isRotatable(item)); } // COMBINE bool ok; QTransform itemTransform = item->itemTransform(this, &ok); if (!ok) { qWarning("UBGraphicsGroupContainerItem::addToGroup: could not find a valid transformation from item to group coordinates"); return; } //setting item flags to given item item->setSelected(false); item->setFlag(QGraphicsItem::ItemIsSelectable, false); item->setFlag( QGraphicsItem::ItemIsMovable, false); item->setFlag(QGraphicsItem::ItemIsFocusable, true); QTransform newItemTransform(itemTransform); item->setPos(mapFromItem(item, 0, 0)); if (item->scene()) { item->scene()->removeItem(item); } if (corescene()) corescene()->removeItemFromDeletion(item); item->setParentItem(this); // removing position from translation component of the new transform if (!item->pos().isNull()) newItemTransform *= QTransform::fromTranslate(-item->x(), -item->y()); // removing additional transformations properties applied with itemTransform() QPointF origin = item->transformOriginPoint(); QMatrix4x4 m; QList<QGraphicsTransform*> transformList = item->transformations(); for (int i = 0; i < transformList.size(); ++i) transformList.at(i)->applyTo(&m); newItemTransform *= m.toTransform().inverted(); newItemTransform.translate(origin.x(), origin.y()); newItemTransform.rotate(-item->rotation()); newItemTransform.scale(1/item->scale(), 1/item->scale()); newItemTransform.translate(-origin.x(), -origin.y()); // ### Expensive, we could maybe use dirtySceneTransform bit for optimization item->setTransform(newItemTransform); // item->d_func()->setIsMemberOfGroup(true); prepareGeometryChange(); itemsBoundingRect |= itemTransform.mapRect(item->boundingRect() | item->childrenBoundingRect()); update(); }