]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Updated Dvd wizard
[kdenlive] / src / customtrackview.cpp
index 4d77a3d87d7ca35d9d31e83083233f16bad13dc4..c42f5866566087a5954a104b45a37c2e430cd455 100644 (file)
@@ -574,6 +574,8 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     kDebug() << "mousePressEvent STARTED";
     m_menuPosition = QPoint();
     m_blockRefresh = true;
+    m_dragItem = NULL;
+    m_dragGuide = NULL;
     bool collision = false;
 
     if (m_tool != RAZORTOOL) activateMonitor();
@@ -614,26 +616,30 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         return;
     }
 
-    if (event->button() == Qt::LeftButton && collisionList.count() == 1 && collisionList.at(0)->type() == GUIDEITEM) {
-        // a guide item was pressed
-        collisionList.at(0)->setFlag(QGraphicsItem::ItemIsMovable, true);
-        m_dragItem = NULL;
-        m_dragGuide = (Guide *) collisionList.at(0);
-        collision = true;
-        m_operationMode = MOVEGUIDE;
-        // deselect all clips so that only the guide will move
-        m_scene->clearSelection();
-        resetSelectionGroup();
-        updateSnapPoints(NULL);
-        QGraphicsView::mousePressEvent(event);
-        return;
+    // if a guide and a clip were pressed, just select the guide
+    for (int i = 0; i < collisionList.count(); ++i) {
+        if (collisionList.at(i)->type() == GUIDEITEM) {
+            // a guide item was pressed
+            m_dragGuide = (Guide *) collisionList.at(i);
+            if (event->button() == Qt::LeftButton) { // move it
+                m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, true);
+                collision = true;
+                m_operationMode = MOVEGUIDE;
+                // deselect all clips so that only the guide will move
+                m_scene->clearSelection();
+                resetSelectionGroup(false);
+                updateSnapPoints(NULL);
+                QGraphicsView::mousePressEvent(event);
+                return;
+            } else // show context menu
+                break;
+        }
     }
 
-    // Find first clip, transition or group under mouse
+    // Find first clip, transition or group under mouse (when no guides selected)
     int ct = 0;
-    m_dragItem = NULL;
     AbstractGroupItem *dragGroup = NULL;
-    while (ct < collisionList.count()) {
+    while (!m_dragGuide && ct < collisionList.count()) {
         if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
             m_dragItem = static_cast <AbstractClipItem *>(collisionList.at(ct));
             m_dragItemInfo = m_dragItem->info();
@@ -654,7 +660,6 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
 
     // context menu requested
     if (event->button() == Qt::RightButton) {
-        m_dragGuide = NULL;
         if (m_dragItem) {
             if (dragGroup) dragGroup->setSelected(true);
             else if (!m_dragItem->isSelected()) {
@@ -662,16 +667,23 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                 m_scene->clearSelection();
                 m_dragItem->setSelected(true);
             }
-        }
-
-        // check if there is a guide close to mouse click
-        QList<QGraphicsItem *> guidesCollisionList = items(event->pos().x() - 5, event->pos().y(), 10, 1);
-        for (int i = 0; i < guidesCollisionList.count(); i++) {
-            if (guidesCollisionList.at(0)->type() != GUIDEITEM)
+        } else if (!m_dragGuide) {
+            // check if there is a guide close to mouse click
+            QList<QGraphicsItem *> guidesCollisionList = items(event->pos().x() - 5, event->pos().y(), 10, 2); // a rect of height < 2 does not always collide with the guide
+            for (int i = 0; i < guidesCollisionList.count(); i++) {
+                if (guidesCollisionList.at(i)->type() == GUIDEITEM) {
+                    m_dragGuide = static_cast <Guide *>(guidesCollisionList.at(i));
+                    break;
+                }
+            }
+            // keep this to support multiple guides context menu in the future (?)
+            /*if (guidesCollisionList.at(0)->type() != GUIDEITEM)
                 guidesCollisionList.removeAt(0);
+            }
+            if (!guidesCollisionList.isEmpty())
+            m_dragGuide = static_cast <Guide *>(guidesCollisionList.at(0));*/
         }
-        if (!guidesCollisionList.isEmpty())
-            m_dragGuide = static_cast <Guide *>(guidesCollisionList.at(0));
+
         m_operationMode = NONE;
         displayContextMenu(event->globalPos(), m_dragItem, dragGroup);
         m_menuPosition = m_clickEvent;
@@ -768,12 +780,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     if (m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) emit clipItemSelected((ClipItem*) m_dragItem);
     else emit clipItemSelected(NULL);
 
-    if (event->modifiers() != Qt::ControlModifier && (m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected()))) {
-        // If clicked item is selected, allow move
-        if (dragGroup) dragGroup->setSelected(true);
-        //event->accept();
-        if (m_operationMode == NONE) QGraphicsView::mousePressEvent(event);
-    } else {
+    if (event->modifiers() == Qt::ControlModifier || !(m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected()))) {
         resetSelectionGroup();
         if (event->modifiers() != Qt::ControlModifier) m_scene->clearSelection();
         dragGroup = NULL;
@@ -792,6 +799,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
     }
 
+    // If clicked item is selected, allow move
+    //event->accept();
+    if (event->modifiers() != Qt::ControlModifier && (m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected())) && m_operationMode == NONE) QGraphicsView::mousePressEvent(event);
+
     m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
     m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
 
@@ -3498,7 +3509,7 @@ int CustomTrackView::hasGuide(int pos, int offset)
 {
     for (int i = 0; i < m_guides.count(); i++) {
         int guidePos = m_guides.at(i)->position().frames(m_document->fps());
-        if (qAbs(guidePos - pos) < offset) return guidePos;
+        if (qAbs(guidePos - pos) <= offset) return guidePos;
         else if (guidePos > pos) return -1;
     }
     return -1;