From 79b7658c19e230a6d217b67a70daaa95ddfbabf3 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 4 Oct 2008 22:11:52 +0000 Subject: [PATCH] Fix group move (not perfect but no more crashes) svn path=/branches/KDE4/; revision=2431 --- src/abstractgroupitem.cpp | 73 +++++++++++++++++++++++++-------------- src/abstractgroupitem.h | 2 +- src/customtrackview.cpp | 14 +++++--- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/src/abstractgroupitem.cpp b/src/abstractgroupitem.cpp index dc5573d5..41d05583 100644 --- a/src/abstractgroupitem.cpp +++ b/src/abstractgroupitem.cpp @@ -44,15 +44,16 @@ CustomTrackScene* AbstractGroupItem::projectScene() { } -QPainterPath AbstractGroupItem::groupShape(QPointF offset) { +QPolygonF AbstractGroupItem::groupShape(QPointF offset) { QList children = childItems(); - QPainterPath path; + QPolygonF path; for (int i = 0; i < children.count(); i++) { - QRectF r = children.at(i)->sceneBoundingRect(); - //kDebug()<<"// GROUP CHild: "<type() == AVWIDGET) { + QPolygonF r = QPolygonF(children.at(i)->sceneBoundingRect()); + path = path.united(r); + } } + path.translate(offset); return path; } @@ -79,27 +80,53 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant if (change == ItemPositionChange && scene()) { // calculate new position. QPointF newPos = value.toPointF(); - QPainterPath sceneShape = groupShape(newPos); QPointF start = sceneBoundingRect().topLeft(); - QPointF sc = mapToScene(pos()); int posx = start.x() + newPos.x(); //projectScene()->getSnapPointForPos(start.x() + sc.x(), KdenliveSettings::snaptopoints()); - //int startx = projectScene()->getSnapPointForPos(start.x(), false); - //int startx = projectScene()->getSnapPointForPos(start.x(), false); - kDebug() << "------------------------------------"; - kDebug() << "BRect: " << start.x() << "diff: " << newPos.x() << ",mapd: " << start.x() - sc.x(); - return newPos; - //kDebug()<<"BR: "<sceneBoundingRect(); - return pos(); + + int startTrack = (start.y()) / KdenliveSettings::trackheight(); + int newTrack = (start.y() + newPos.y()) / KdenliveSettings::trackheight(); + //kDebug()<<"// GROUP NEW TRACK: "<tracksCount() - 1); + newTrack = qMax(newTrack, 0); + newPos.setY((int)((newTrack - startTrack) * KdenliveSettings::trackheight())); + + //kDebug() << "------------------------------------GRUOP MOVE"; + + if (start.x() + newPos.x() - pos().x() < 0) { + // If group goes below 0, adjust position to 0 + return QPointF(pos().x() - start.x(), pos().y()); } + + QPolygonF sceneShape = groupShape(newPos - pos()); + QList collindingItems = scene()->items(sceneShape, Qt::IntersectsItemShape); + QList children = childItems(); + for (int i = 0; i < children.count(); i++) { + collindingItems.removeAll(children.at(i)); + } + if (collindingItems.isEmpty()) return newPos; + else { + for (int i = 0; i < collindingItems.count(); i++) { + QGraphicsItem *collision = collindingItems.at(i); + if (collision->type() == AVWIDGET) { + // Collision + return pos(); + //TODO: improve movement when collision happens + /*if (startTrack != newTrack) return pos(); + if (collision->pos().x() > pos().x()) { + return QPointF(collision->sceneBoundingRect().x() - sceneBoundingRect().width() + pos().x() - start.x() - 1, newPos.y()); + }*/ + } + } + return newPos; + } + //else posx -= startx; //posx = qMax(posx, 0); - newPos.setX(posx); + //newPos.setX(posx); //kDebug()<<"Y POS: "< items = scene()->items(sceneShape, Qt::IntersectsItemShape); - QList children = childItems(); - for (int i = 0; i < children.count(); i++) { - items.removeAll(children.at(i)); - } - - if (!items.isEmpty()) { for (int i = 0; i < items.count(); i++) { diff --git a/src/abstractgroupitem.h b/src/abstractgroupitem.h index 1945722e..ec4268cf 100644 --- a/src/abstractgroupitem.h +++ b/src/abstractgroupitem.h @@ -40,7 +40,7 @@ protected: virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); private: - QPainterPath groupShape(QPointF); + QPolygonF groupShape(QPointF); void fixItemRect(); double m_fps; }; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index be2539f0..45a1084a 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -522,7 +522,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { if (m_dragItem) { if (!m_dragItem->isSelected()) { m_scene->clearSelection(); - if (m_selectionGroup) scene()->destroyItemGroup(m_selectionGroup); + if (m_selectionGroup) { + scene()->destroyItemGroup(m_selectionGroup); + m_selectionGroup = NULL; + } m_dragItem->setSelected(true); } } @@ -536,7 +539,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { // No item under click if (m_dragItem == NULL) { - if (m_selectionGroup) scene()->destroyItemGroup(m_selectionGroup); + if (m_selectionGroup) { + scene()->destroyItemGroup(m_selectionGroup); + m_selectionGroup = NULL; + } setCursor(Qt::ArrowCursor); m_scene->clearSelection(); setCursorPos((int)(mapToScene(event->x(), 0).x())); @@ -564,14 +570,14 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { if (m_dragItem && m_dragItem->type() == AVWIDGET) emit clipItemSelected((ClipItem*) m_dragItem); else emit clipItemSelected(NULL); - if (m_dragItem && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); - if (m_selectionGroup) { // delete selection group scene()->destroyItemGroup(m_selectionGroup); m_selectionGroup = NULL; } + if (m_dragItem && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); + QList selection = m_scene->selectedItems(); if (selection.count() > 1) { m_selectionGroup = new AbstractGroupItem(m_document->fps()); -- 2.39.2