]> git.sesse.net Git - kdenlive/blobdiff - src/graphicsscenerectmove.cpp
Improve profile selection in First run wizard
[kdenlive] / src / graphicsscenerectmove.cpp
index 6e47bb19e76d6d0b197fa6c7fc378a5b82885286..710d1d50e4ce13e829b574e479ebb5abb6e3955d 100644 (file)
@@ -5,16 +5,18 @@
 #include <QGraphicsSvgItem>
 #include <QGraphicsView>
 #include <QCursor>
+#include <QTextCursor>
 #include <QList>
 #include <QKeyEvent>
 #include <QApplication>
+#include <QTextBlock>
 
 #include "graphicsscenerectmove.h"
 
 GraphicsSceneRectMove::GraphicsSceneRectMove(QObject *parent): QGraphicsScene(parent), m_selectedItem(NULL), resizeMode(NoResize), m_tool(TITLE_RECTANGLE) {
     //grabMouse();
     zoom = 1.0;
-    setBackgroundBrush(QBrush(QColor(0, 0, 0, 0)));
+    setBackgroundBrush(QBrush(Qt::transparent));
 }
 
 void GraphicsSceneRectMove::setSelectedItem(QGraphicsItem *item) {
@@ -49,6 +51,13 @@ void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent) {
         return;
     }
     int diff = 1;
+    if (m_selectedItem->type() == 8) {
+        QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
+        if (t->textInteractionFlags() & Qt::TextEditorInteraction) {
+            QGraphicsScene::keyPressEvent(keyEvent);
+            return;
+        }
+    }
     if (keyEvent->modifiers() & Qt::ControlModifier) diff = 10;
     switch (keyEvent->key()) {
     case Qt::Key_Left:
@@ -76,6 +85,7 @@ void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent) {
     default:
         QGraphicsScene::keyPressEvent(keyEvent);
     }
+    emit actionFinished();
 }
 
 //virtual
@@ -88,6 +98,7 @@ void GraphicsSceneRectMove::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* e) {
     if (g) {
         if (g->type() == 8) {
             QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(g);
+            m_selectedItem = g;
             t->setTextInteractionFlags(Qt::TextEditorInteraction);
         }
     }
@@ -101,15 +112,16 @@ void GraphicsSceneRectMove::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
 }
 
 void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
+    m_clickPoint = e->screenPos();
     QPointF p = e->scenePos();
     p += QPoint(-2, -2);
     resizeMode = NoResize;
-    QList <QGraphicsItem *> list = items(QRectF(p , QSizeF(4, 4)).toRect());
+    const QList <QGraphicsItem *> list = items(QRectF(p , QSizeF(4, 4)).toRect());
     QGraphicsItem *item = NULL;
     bool hasSelected = false;
 
     if (m_tool == TITLE_SELECT) {
-        foreach(QGraphicsItemg, list) {
+        foreach(QGraphicsItem *g, list) {
             kDebug() << " - - CHECKING ITEM Z:" << g->zValue() << ", TYPE: " << g->type();
             // check is there is a selected item in list
             if (g->zValue() > -1000 && g->isSelected()) {
@@ -122,6 +134,9 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
             if (m_selectedItem && m_selectedItem->type() == 8) {
                 // disable text editing
                 QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
+                t->textCursor().setPosition(0);
+                QTextBlock cur = t->textCursor().block();
+                t->setTextCursor(QTextCursor(cur));
                 t->setTextInteractionFlags(Qt::NoTextInteraction);
             }
             m_selectedItem = NULL;
@@ -133,7 +148,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
             }
         }
         if (item != NULL) {
-            m_clickPoint = e->scenePos();
+            m_sceneClickPoint = e->scenePos();
             m_selectedItem = item;
             kDebug() << "/////////  ITEM TYPE: " << item->type();
             if (item->type() == 8) {
@@ -145,7 +160,11 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
                 t->setTextInteractionFlags(Qt::NoTextInteraction);
                 setCursor(Qt::ClosedHandCursor);
             } else if (item->type() == 3 || item->type() == 13 || item->type() == 7) {
-                QRectF r = item->boundingRect();
+                QRectF r;
+                if (m_selectedItem->type() == 3) {
+                    r = ((QGraphicsRectItem*)m_selectedItem)->rect();
+                } else r = m_selectedItem->boundingRect();
+
                 r.translate(item->scenePos());
                 if ((r.toRect().topLeft() - e->scenePos().toPoint()).manhattanLength() < 6 / zoom) {
                     resizeMode = TopLeft;
@@ -168,7 +187,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
         }
         QGraphicsScene::mousePressEvent(e);
     } else if (m_tool == TITLE_RECTANGLE) {
-        m_clickPoint = e->scenePos();
+        m_sceneClickPoint = e->scenePos();
         m_selectedItem = NULL;
     } else if (m_tool == TITLE_TEXT) {
         m_selectedItem = addText(QString());
@@ -183,13 +202,32 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) {
 
 }
 
+void GraphicsSceneRectMove::clearTextSelection() {
+    if (m_selectedItem && m_selectedItem->type() == 8) {
+        // disable text editing
+        QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
+        t->textCursor().setPosition(0);
+        QTextBlock cur = t->textCursor().block();
+        t->setTextCursor(QTextCursor(cur));
+        t->setTextInteractionFlags(Qt::NoTextInteraction);
+    }
+    m_selectedItem = NULL;
+    clearSelection();
+}
 
 //virtual
 void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent* e) {
-
+    if ((e->screenPos() - m_clickPoint).manhattanLength() < QApplication::startDragDistance()) {
+        e->accept();
+        return;
+    }
     if (m_selectedItem && e->buttons() & Qt::LeftButton) {
         if (m_selectedItem->type() == 3 || m_selectedItem->type() == 13 || m_selectedItem->type() == 7) {
-            QRectF newrect = m_selectedItem->boundingRect();
+            QRectF newrect;
+            if (m_selectedItem->type() == 3) {
+                newrect = ((QGraphicsRectItem*)m_selectedItem)->rect();
+            } else newrect = m_selectedItem->boundingRect();
+
             QPointF newpoint = e->scenePos();
             //newpoint -= m_selectedItem->scenePos();
             switch (resizeMode) {
@@ -223,12 +261,12 @@ void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent* e) {
                 newrect.setBottom(newpoint.y() - m_selectedItem->pos().y());
                 break;
             default:
-                QPointF diff = e->scenePos() - m_clickPoint;
-                m_clickPoint = e->scenePos();
+                QPointF diff = e->scenePos() - m_sceneClickPoint;
+                m_sceneClickPoint = e->scenePos();
                 m_selectedItem->moveBy(diff.x(), diff.y());
                 break;
             }
-            if (m_selectedItem->type() == 3) {
+            if (m_selectedItem->type() == 3 && resizeMode != NoResize) {
                 QGraphicsRectItem *gi = (QGraphicsRectItem*)m_selectedItem;
                 gi->setRect(newrect);
             }
@@ -250,24 +288,23 @@ void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent* e) {
                 QGraphicsScene::mouseMoveEvent(e);
                 return;
             }
-            QPointF diff = e->scenePos() - m_clickPoint;
-            m_clickPoint = e->scenePos();
+            QPointF diff = e->scenePos() - m_sceneClickPoint;
+            m_sceneClickPoint = e->scenePos();
             m_selectedItem->moveBy(diff.x(), diff.y());
         }
         emit itemMoved();
     } else if (m_tool == TITLE_SELECT) {
-
         QPointF p = e->scenePos();
         p += QPoint(-2, -2);
         resizeMode = NoResize;
         bool itemFound = false;
-        foreach(QGraphicsItem* g, items(QRectF(p , QSizeF(4, 4)).toRect())) {
+        foreach(const QGraphicsItem* g, items(QRectF(p , QSizeF(4, 4)).toRect())) {
             if ((g->type() == 13 || g->type() == 7) && g->zValue() > -1000) {
                 // image or svg item
                 setCursor(Qt::OpenHandCursor);
                 break;
             } else if (g->type() == 3 && g->zValue() > -1000) {
-                QRectF r = g->boundingRect();
+                QRectF r = ((QGraphicsRectItem*)g)->rect();
                 r.translate(g->scenePos());
                 itemFound = true;
                 if ((r.toRect().topLeft() - e->scenePos().toPoint()).manhattanLength() < 6 / zoom) {
@@ -293,12 +330,12 @@ void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent* e) {
         }
         QGraphicsScene::mouseMoveEvent(e);
     } else if (m_tool == TITLE_RECTANGLE && e->buttons() & Qt::LeftButton) {
-        if (m_selectedItem == NULL && (m_clickPoint.toPoint() - e->scenePos().toPoint()).manhattanLength() >= QApplication::startDragDistance()) {
+        if (m_selectedItem == NULL && (m_clickPoint - e->screenPos()).manhattanLength() >= QApplication::startDragDistance()) {
             // create new rect item
-            m_selectedItem = addRect(0, 0, e->scenePos().x() - m_clickPoint.x(), e->scenePos().y() - m_clickPoint.y());
+            m_selectedItem = addRect(0, 0, e->scenePos().x() - m_sceneClickPoint.x(), e->scenePos().y() - m_sceneClickPoint.y());
             emit newRect((QGraphicsRectItem *) m_selectedItem);
             m_selectedItem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
-            m_selectedItem->setPos(m_clickPoint);
+            m_selectedItem->setPos(m_sceneClickPoint);
             resizeMode = BottomRight;
             QGraphicsScene::mouseMoveEvent(e);
         }
@@ -338,7 +375,7 @@ void GraphicsSceneRectMove::setZoom(double s) {
 }
 
 void GraphicsSceneRectMove::setCursor(QCursor c) {
-    QList<QGraphicsView*> l = views();
+    const QList<QGraphicsView*> l = views();
     foreach(QGraphicsView* v, l) {
         v->setCursor(c);
     }