X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fabstractgroupitem.cpp;h=79364deb60109700e0b875eacbbcf532c33f4fbd;hb=49c3f9376d4b9f7d185c4d6b22e662b127debdcb;hp=cf5717a85d520a531a3404a4908e6f34a83b3595;hpb=06300ed0224d946710a2d470929d322bb5a96703;p=kdenlive diff --git a/src/abstractgroupitem.cpp b/src/abstractgroupitem.cpp index cf5717a8..79364deb 100644 --- a/src/abstractgroupitem.cpp +++ b/src/abstractgroupitem.cpp @@ -42,6 +42,7 @@ AbstractGroupItem::AbstractGroupItem(double /* fps */) : setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptDrops(true); + m_resizeInfos = QList (); } int AbstractGroupItem::type() const @@ -56,14 +57,14 @@ int AbstractGroupItem::track() const void AbstractGroupItem::setItemLocked(bool locked) { - if (locked) { + if (locked) setSelected(false); - setFlag(QGraphicsItem::ItemIsMovable, false); - setFlag(QGraphicsItem::ItemIsSelectable, false); - } else { - setFlag(QGraphicsItem::ItemIsMovable, true); - setFlag(QGraphicsItem::ItemIsSelectable, true); - } + + setFlag(QGraphicsItem::ItemIsMovable, !locked); + setFlag(QGraphicsItem::ItemIsSelectable, !locked); + + foreach (QGraphicsItem *child, childItems()) + ((AbstractClipItem *)child)->setItemLocked(locked); } bool AbstractGroupItem::isItemLocked() const @@ -79,40 +80,27 @@ 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); - } 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() == AVWIDGET) { - QRectF r(subchildren.at(j)->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() == TRANSITIONWIDGET) { + if (subchildren.at(j)->type() == (int)type) { QRectF r(subchildren.at(j)->sceneBoundingRect()); r.translate(offset); path.addRect(r); @@ -367,7 +355,7 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant //virtual void AbstractGroupItem::dropEvent(QGraphicsSceneDragDropEvent * event) { - QString effects = QString(event->mimeData()->data("kdenlive/effectslist")); + QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist")); QDomDocument doc; doc.setContent(effects, true); QDomElement e = doc.documentElement(); @@ -383,7 +371,7 @@ void AbstractGroupItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event) void AbstractGroupItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) { - Q_UNUSED(event); + Q_UNUSED(event) } // virtual @@ -394,3 +382,89 @@ void AbstractGroupItem::mousePressEvent(QGraphicsSceneMouseEvent * event) event->ignore(); } else QGraphicsItem::mousePressEvent(event); } + +void AbstractGroupItem::resizeStart(int diff) +{ + bool info = false; + if (m_resizeInfos.isEmpty()) + info = true; + int maximum = diff; + QList children = childItems(); + QList items; + int itemcount = 0; + for (int i = 0; i < children.count(); ++i) { + AbstractClipItem *item = static_cast (children.at(i)); + if (item && item->type() == AVWIDGET) { + items << item; + if (info) + m_resizeInfos << item->info(); + item->resizeStart((int)(m_resizeInfos.at(itemcount).startPos.frames(item->fps())) + diff); + int itemdiff = (int)(item->startPos() - m_resizeInfos.at(itemcount).startPos).frames(item->fps()); + if (qAbs(itemdiff) < qAbs(maximum)) + maximum = itemdiff; + ++itemcount; + } + } + + for (int i = 0; i < items.count(); ++i) + items.at(i)->resizeStart((int)(m_resizeInfos.at(i).startPos.frames(items.at(i)->fps())) + maximum); +} + +void AbstractGroupItem::resizeEnd(int diff) +{ + bool info = false; + if (m_resizeInfos.isEmpty()) + info = true; + int maximum = diff; + QList children = childItems(); + QList items; + int itemcount = 0; + for (int i = 0; i < children.count(); ++i) { + AbstractClipItem *item = static_cast (children.at(i)); + if (item && item->type() == AVWIDGET) { + items << item; + if (info) + m_resizeInfos << item->info(); + item->resizeEnd((int)(m_resizeInfos.at(itemcount).endPos.frames(item->fps())) + diff); + int itemdiff = (int)(item->endPos() - m_resizeInfos.at(itemcount).endPos).frames(item->fps()); + if (qAbs(itemdiff) < qAbs(maximum)) + maximum = itemdiff; + ++itemcount; + } + } + + for (int i = 0; i < items.count(); ++i) + items.at(i)->resizeEnd((int)(m_resizeInfos.at(i).endPos.frames(items.at(i)->fps())) + maximum); +} + +QList< ItemInfo > AbstractGroupItem::resizeInfos() +{ + return m_resizeInfos; +} + +void AbstractGroupItem::clearResizeInfos() +{ + // m_resizeInfos.clear() will crash in some cases for unknown reasons - ttill + m_resizeInfos = QList (); +} + +GenTime AbstractGroupItem::duration() +{ + QList children = childItems(); + GenTime start = GenTime(-1.0); + GenTime end = GenTime(); + for (int i = 0; i < children.count(); ++i) { + if (children.at(i)->type() != GROUPWIDGET) { + AbstractClipItem *item = static_cast (children.at(i)); + if (item) { + if (start < GenTime() || item->startPos() < start) + start = item->startPos(); + if (item->endPos() > end) + end = item->endPos(); + } + } else { + children << children.at(i)->childItems(); + } + } + return end - start; +}