setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
#endif
setAcceptDrops(true);
+ m_resizeInfos = QList <ItemInfo>();
}
int AbstractGroupItem::type() 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
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);
// virtual
void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *)
{
- const double scale = option->matrix.m11();
QColor bgcolor(100, 100, 200, 100);
QRectF bound = option->exposedRect.adjusted(0, 0, 1, 1);
p->setClipRect(bound);
- p->fillRect(option->exposedRect, bgcolor);
+ const QRectF mapped = p->worldTransform().mapRect(option->exposedRect);
+ p->setWorldMatrixEnabled(false);
+ p->setBrush(bgcolor);
QPen pen = p->pen();
pen.setColor(QColor(200, 90, 90));
pen.setStyle(Qt::DashLine);
pen.setWidthF(0.0);
- //pen.setCosmetic(true);
p->setPen(pen);
- p->drawRect(boundingRect().adjusted(0, 0, - 1 / scale, 0));
+ p->drawRoundedRect(mapped, 3, 3);
}
//virtual
//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();
+ e.setAttribute("kdenlive_ix", 0);
CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
if (view) view->slotAddGroupEffect(e, this);
}
void AbstractGroupItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
- Q_UNUSED(event);
+ Q_UNUSED(event)
}
// virtual
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;
+}