X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fabstractgroupitem.cpp;h=7d2cc39a1b829bc20f65ad90e05ffd20f6d8b6bf;hb=b93295675e9670f26ebca37e56960ab84ab94cc8;hp=aed9c10837da7393ee33ca90ba8891723d678511;hpb=fec4b6aba639dac658d35475512c6f232c8aebe3;p=kdenlive diff --git a/src/abstractgroupitem.cpp b/src/abstractgroupitem.cpp index aed9c108..7d2cc39a 100644 --- a/src/abstractgroupitem.cpp +++ b/src/abstractgroupitem.cpp @@ -38,6 +38,9 @@ AbstractGroupItem::AbstractGroupItem(double /* fps */) : { setZValue(1); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); +#if QT_VERSION >= 0x040600 + setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); +#endif setAcceptDrops(true); } @@ -51,6 +54,23 @@ int AbstractGroupItem::track() const return (int)(scenePos().y() / KdenliveSettings::trackheight()); } +void AbstractGroupItem::setItemLocked(bool locked) +{ + if (locked) { + setSelected(false); + setFlag(QGraphicsItem::ItemIsMovable, false); + setFlag(QGraphicsItem::ItemIsSelectable, false); + } else { + setFlag(QGraphicsItem::ItemIsMovable, true); + setFlag(QGraphicsItem::ItemIsSelectable, true); + } +} + +bool AbstractGroupItem::isItemLocked() const +{ + return !(flags() & (QGraphicsItem::ItemIsSelectable)); +} + CustomTrackScene* AbstractGroupItem::projectScene() { if (scene()) return static_cast (scene()); @@ -59,27 +79,32 @@ CustomTrackScene* AbstractGroupItem::projectScene() QPainterPath AbstractGroupItem::clipGroupShape(QPointF offset) const { - QPainterPath path; - QList children = childItems(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == AVWIDGET) { - QRectF r(children.at(i)->sceneBoundingRect()); - r.translate(offset); - path.addRect(r); - } - } - return path; + return groupShape(AVWIDGET, offset); } QPainterPath AbstractGroupItem::transitionGroupShape(QPointF offset) const +{ + return groupShape(TRANSITIONWIDGET, offset); +} + +QPainterPath AbstractGroupItem::groupShape(GRAPHICSRECTITEM type, QPointF offset) const { QPainterPath path; QList children = childItems(); for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == TRANSITIONWIDGET) { + if (children.at(i)->type() == (int)type) { QRectF r(children.at(i)->sceneBoundingRect()); r.translate(offset); path.addRect(r); + } else if (children.at(i)->type() == GROUPWIDGET) { + QList subchildren = children.at(i)->childItems(); + for (int j = 0; j < subchildren.count(); j++) { + if (subchildren.at(j)->type() == (int)type) { + QRectF r(subchildren.at(j)->sceneBoundingRect()); + r.translate(offset); + path.addRect(r); + } + } } } return path; @@ -127,12 +152,15 @@ void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *optio //virtual QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemSelectedChange) { + if (value.toBool()) setZValue(10); + else setZValue(1); + } if (change == ItemPositionChange && scene() && parentItem() == 0) { // calculate new position. const int trackHeight = KdenliveSettings::trackheight(); QPointF start = sceneBoundingRect().topLeft(); QPointF newPos = value.toPointF(); - //kDebug()<<"REAL:"<getSnapPointForPos((int)(start.x() + newPos.x() - pos().x()), KdenliveSettings::snaptopoints()); xpos = qMax(xpos, 0); @@ -195,17 +223,27 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant return QPointF(pos().x() - start.x(), pos().y()); }*/ - QPainterPath shape = clipGroupShape(newPos - pos()); - QList collindingItems = scene()->items(shape, Qt::IntersectsItemShape); - for (int i = 0; i < children.count(); i++) { - collindingItems.removeAll(children.at(i)); + QList collidingItems; + QPainterPath shape; + if (projectScene()->editMode() == NORMALEDIT) { + shape = clipGroupShape(newPos - pos()); + collidingItems = scene()->items(shape, Qt::IntersectsItemShape); + collidingItems.removeAll(this); + for (int i = 0; i < children.count(); i++) { + if (children.at(i)->type() == GROUPWIDGET) { + QList subchildren = children.at(i)->childItems(); + for (int j = 0; j < subchildren.count(); j++) { + collidingItems.removeAll(subchildren.at(j)); + } + } + collidingItems.removeAll(children.at(i)); + } } - - if (!collindingItems.isEmpty()) { + if (!collidingItems.isEmpty()) { bool forwardMove = xpos > start.x(); int offset = 0; - for (int i = 0; i < collindingItems.count(); i++) { - QGraphicsItem *collision = collindingItems.at(i); + for (int i = 0; i < collidingItems.count(); i++) { + QGraphicsItem *collision = collidingItems.at(i); if (collision->type() == AVWIDGET) { // Collision if (newPos.y() != pos().y()) { @@ -235,27 +273,42 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant newPos.setX(newPos.x() + offset); } // If there is still a collision after our position adjust, restore original pos - collindingItems = scene()->items(clipGroupShape(newPos - pos()), Qt::IntersectsItemShape); + collidingItems = scene()->items(clipGroupShape(newPos - pos()), Qt::IntersectsItemShape); + collidingItems.removeAll(this); for (int i = 0; i < children.count(); i++) { - collindingItems.removeAll(children.at(i)); + if (children.at(i)->type() == GROUPWIDGET) { + QList subchildren = children.at(i)->childItems(); + for (int j = 0; j < subchildren.count(); j++) { + collidingItems.removeAll(subchildren.at(j)); + } + } + collidingItems.removeAll(children.at(i)); } - for (int i = 0; i < collindingItems.count(); i++) - if (collindingItems.at(i)->type() == AVWIDGET) return pos(); + for (int i = 0; i < collidingItems.count(); i++) + if (collidingItems.at(i)->type() == AVWIDGET) return pos(); } } - - shape = transitionGroupShape(newPos - pos()); - collindingItems = scene()->items(shape, Qt::IntersectsItemShape); - for (int i = 0; i < children.count(); i++) { - collindingItems.removeAll(children.at(i)); + if (projectScene()->editMode() == NORMALEDIT) { + shape = transitionGroupShape(newPos - pos()); + collidingItems = scene()->items(shape, Qt::IntersectsItemShape); + collidingItems.removeAll(this); + for (int i = 0; i < children.count(); i++) { + if (children.at(i)->type() == GROUPWIDGET) { + QList subchildren = children.at(i)->childItems(); + for (int j = 0; j < subchildren.count(); j++) { + collidingItems.removeAll(subchildren.at(j)); + } + } + collidingItems.removeAll(children.at(i)); + } } - if (collindingItems.isEmpty()) return newPos; + if (collidingItems.isEmpty()) return newPos; else { bool forwardMove = xpos > start.x(); int offset = 0; - for (int i = 0; i < collindingItems.count(); i++) { - QGraphicsItem *collision = collindingItems.at(i); + for (int i = 0; i < collidingItems.count(); i++) { + QGraphicsItem *collision = collidingItems.at(i); if (collision->type() == TRANSITIONWIDGET) { // Collision if (newPos.y() != pos().y()) { @@ -285,12 +338,12 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant newPos.setX(newPos.x() + offset); } // If there is still a collision after our position adjust, restore original pos - collindingItems = scene()->items(transitionGroupShape(newPos - pos()), Qt::IntersectsItemShape); + collidingItems = scene()->items(transitionGroupShape(newPos - pos()), Qt::IntersectsItemShape); for (int i = 0; i < children.count(); i++) { - collindingItems.removeAll(children.at(i)); + collidingItems.removeAll(children.at(i)); } - for (int i = 0; i < collindingItems.count(); i++) - if (collindingItems.at(i)->type() == TRANSITIONWIDGET) return pos(); + for (int i = 0; i < collidingItems.count(); i++) + if (collidingItems.at(i)->type() == TRANSITIONWIDGET) return pos(); } } return newPos;