X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomtrackview.cpp;h=e97c46ad1183331f5dfad70592709d921bc0f330;hb=12bd13b246f3cf974339c619c62104ca10af3170;hp=9ed99e8db4c04ee89a45a3fee2984346a6ed7e38;hpb=8b4c224d4929ace1515266709c0f24978b19d3b4;p=kdenlive diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 9ed99e8d..e97c46ad 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -980,27 +980,34 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) else if (dragGroup && dragGroup->isSelected()) itemSelected = true; - if (event->modifiers() == Qt::ControlModifier || itemSelected == false) { + if ((event->modifiers() == Qt::ControlModifier) || itemSelected == false) { if (event->modifiers() != Qt::ControlModifier) { resetSelectionGroup(false); m_scene->clearSelection(); // A refresh seems necessary otherwise in zoomed mode, some clips disappear viewport()->update(); - } else resetSelectionGroup(); + } else { + resetSelectionGroup(); + } dragGroup = NULL; if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET) { dragGroup = static_cast (m_dragItem->parentItem()); } bool selected = !m_dragItem->isSelected(); - if (dragGroup) + /*if (dragGroup) dragGroup->setSelected(selected); - else + else*/ m_dragItem->setSelected(selected); - + if (selected == false) { + m_dragItem = NULL; + } groupSelectedItems(); - ClipItem *clip = static_cast (m_dragItem); - updateClipTypeActions(dragGroup == NULL ? clip : NULL); - m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); + if (m_dragItem) { + ClipItem *clip = static_cast (m_dragItem); + updateClipTypeActions(dragGroup == NULL ? clip : NULL); + m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); + } + else updateClipTypeActions(NULL); } if (collisionClip != NULL || m_dragItem == NULL) { @@ -1013,9 +1020,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) } // If clicked item is selected, allow move - if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); + //if (!(event->modifiers() | Qt::ControlModifier) && 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())); + if (m_dragItem) { + m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y())); if (m_selectionGroup && m_dragItem->parentItem() == m_selectionGroup) { // all other modes break the selection, so the user probably wants to move it m_operationMode = MOVE; @@ -1026,6 +1035,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) } else m_operationMode = m_dragItem->operationMode(mapToScene(event->pos())); } + } else m_operationMode = NONE; m_controlModifier = (event->modifiers() == Qt::ControlModifier); // Update snap points @@ -1489,7 +1499,15 @@ void CustomTrackView::insertClipCut(DocClipBase *clip, int in, int out) pasteInfo.startPos = GenTime(m_cursorPos, m_document->fps()); pasteInfo.endPos = pasteInfo.startPos + info.endPos; pasteInfo.track = selectedTrack(); - if (!canBePastedTo(pasteInfo, AVWIDGET)) { + bool ok = canBePastedTo(pasteInfo, AVWIDGET); + if (!ok) { + // Cannot be inserted at cursor pos, insert at end of track + int duration = m_document->renderer()->mltTrackDuration(m_document->tracksCount() - pasteInfo.track) + 1; + pasteInfo.startPos = GenTime(duration, m_document->fps()); + pasteInfo.endPos = pasteInfo.startPos + info.endPos; + ok = canBePastedTo(pasteInfo, AVWIDGET); + } + if (!ok) { emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage); return; } @@ -1566,7 +1584,8 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos) // Check if clips can be inserted at that position for (int i = 0; i < ids.size(); ++i) { - DocClipBase *clip = m_document->getBaseClip(ids.at(i)); + QString clipData = ids.at(i); + DocClipBase *clip = m_document->getBaseClip(clipData.section('/', 0, 0)); if (clip == NULL) { kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i); return false; @@ -1577,11 +1596,20 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos) } ItemInfo info; info.startPos = start; - info.cropDuration = clip->duration(); - info.endPos = info.startPos + info.cropDuration; + if (clipData.contains('/')) { + // this is a clip zone, set in / out + int in = clipData.section('/', 1, 1).toInt(); + int out = clipData.section('/', 2, 2).toInt(); + info.cropStart = GenTime(in, m_document->fps()); + info.cropDuration = GenTime(out - in, m_document->fps()); + } + else { + info.cropDuration = clip->duration(); + } + info.endPos = info.startPos + info.cropDuration; info.track = track; infoList.append(info); - start += clip->duration(); + start += info.cropDuration; } if (!canBePastedTo(infoList, AVWIDGET)) { return true; @@ -1589,11 +1617,21 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos) m_selectionGroup = new AbstractGroupItem(m_document->fps()); start = GenTime(); for (int i = 0; i < ids.size(); ++i) { - DocClipBase *clip = m_document->getBaseClip(ids.at(i)); + QString clipData = ids.at(i); + DocClipBase *clip = m_document->getBaseClip(clipData.section('/', 0, 0)); ItemInfo info; info.startPos = start; - info.cropDuration = clip->duration(); - info.endPos = info.startPos + info.cropDuration; + if (clipData.contains('/')) { + // this is a clip zone, set in / out + int in = clipData.section('/', 1, 1).toInt(); + int out = clipData.section('/', 2, 2).toInt(); + info.cropStart = GenTime(in, m_document->fps()); + info.cropDuration = GenTime(out - in, m_document->fps()); + } + else { + info.cropDuration = clip->duration(); + } + info.endPos = info.startPos + info.cropDuration; info.track = 0; start += info.cropDuration; offsetList.append(start); @@ -1859,12 +1897,23 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) clearSelection(false); clip->setSelected(true); m_dragItem = clip; - emit clipItemSelected(clip); } + emit clipItemSelected(clip); break; } } } + else { + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == AVWIDGET) { + ClipItem *clip = static_cast(itemList.at(i)); + if (clip->isMainSelectedClip()) { + emit clipItemSelected(clip); + break; + } + } + } + } } else delete effectCommand; } @@ -3410,7 +3459,7 @@ void CustomTrackView::checkScrolling() void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { if (m_moveOpMode == SEEK) m_moveOpMode = NONE; - QGraphicsView::mouseReleaseEvent(event); + if (!m_controlModifier) QGraphicsView::mouseReleaseEvent(event); setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); #if QT_VERSION >= 0x040600 if (m_dragItem) m_dragItem->setGraphicsEffect(NULL); @@ -5527,7 +5576,9 @@ void CustomTrackView::drawBackground(QPainter * painter, const QRectF &rect) { painter->setClipRect(rect); QPen pen1 = painter->pen(); - pen1.setColor(palette().dark().color()); + QColor lineColor = palette().dark().color(); + lineColor.setAlpha(100); + pen1.setColor(lineColor); painter->setPen(pen1); double min = rect.left(); double max = rect.right(); @@ -5901,7 +5952,8 @@ ClipItem *CustomTrackView::getClipUnderCursor() const QList collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect); for (int i = 0; i < collisions.count(); i++) { if (collisions.at(i)->type() == AVWIDGET) { - return static_cast < ClipItem *>(collisions.at(i)); + ClipItem *clip = static_cast < ClipItem *>(collisions.at(i)); + if (!clip->isItemLocked()) return clip; } } return NULL;