setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
#endif
setAcceptDrops(true);
+ m_resizeInfos = QList <ItemInfo>();
}
int AbstractGroupItem::type() const
QPainterPath AbstractGroupItem::clipGroupShape(QPointF offset) const
{
- QPainterPath path;
- QList<QGraphicsItem *> 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<QGraphicsItem *> 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<QGraphicsItem *> 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<QGraphicsItem *> 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);
event->ignore();
} else QGraphicsItem::mousePressEvent(event);
}
+
+void AbstractGroupItem::resizeStart(int diff)
+{
+ bool info = false;
+ if (m_resizeInfos.isEmpty())
+ info = true;
+ int maximum = diff;
+ QList <QGraphicsItem *> children = childItems();
+ QList <AbstractClipItem *> items;
+ int itemcount = 0;
+ for (int i = 0; i < children.count(); ++i) {
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(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 <QGraphicsItem *> children = childItems();
+ QList <AbstractClipItem *> items;
+ int itemcount = 0;
+ for (int i = 0; i < children.count(); ++i) {
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(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 <ItemInfo>();
+}
+
+GenTime AbstractGroupItem::duration()
+{
+ QList <QGraphicsItem *> 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 <AbstractClipItem *>(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;
+}