int selectedTrack() const;
QStringList selectedClips() const;
QList<ClipItem *> selectedClipItems() const;
+ /** @brief Checks wheter an item can be inserted (make sure it does not overlap another item) */
+ bool canBePastedTo(ItemInfo info, int type) const;
/** @brief Selects a clip.
* @param add Whether to select or deselect
int getPreviousVideoTrack(int track);
void updatePositionEffects(ClipItem * item, ItemInfo info, bool standalone = true);
bool insertDropClips(const QMimeData *data, const QPoint pos);
- bool canBePastedTo(ItemInfo info, int type) const;
bool canBePastedTo(QList <ItemInfo> infoList, int type) const;
bool canBePasted(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
tracksinfoElm.appendChild(trackinfo);
}
}
- }
-
- // Make sure transitions do not overlap
- QDomNodeList transitions = m_doc.elementsByTagName("transition");
- QPolygon scenelist;
- QStringList overlappingTransitions;
- for (int i = 0; i < transitions.count(); i++) {
- QDomElement t = transitions.at(i).toElement();
- QDomNodeList props = t.elementsByTagName("property");
- bool testTransition = true;
- int track = -1;
- for (int k = 0; k < props.count(); k++) {
- QDomElement p = props.at(k).toElement();
- QString name = p.attribute("name");
- if (name == "mlt_service" && p.firstChild().nodeValue() == "mix") testTransition = false;
- else if (name == "b_track") track = p.firstChild().nodeValue().toInt();
- }
- if (testTransition) {
- QRect r(t.attribute("in").toInt(), 3 * track, t.attribute("out").toInt() - t.attribute("in").toInt(), 1);
- QPolygon p(r);
- if (scenelist.intersected(p).isEmpty()) {
- scenelist = scenelist.united(p);
- }
- else {
- // Transition is overlapping, should be removed
- overlappingTransitions << t.attribute("id");
- tractor.removeChild(t);
- i--;
- }
- }
- }
- if (!overlappingTransitions.isEmpty()) {
- KMessageBox::informationList(kapp->activeWindow(), i18n("The following transitions were corrupted (overlapping)\n and removed from project."), overlappingTransitions, i18n("Invalid Transitions"));
- m_modified = true;
- }
+ }
// TODO: check the tracks references
// TODO: check internal mix transitions
kDebug() << "///// REMOVED INVALID TRANSITION: " << e.attribute("id");
tractor.removeChild(transitions.item(i));
i--;
- } else {
+ } else if (m_trackview->canBePastedTo(transitionInfo, TRANSITIONWIDGET)) {
Transition *tr = new Transition(transitionInfo, a_track, m_doc->fps(), base, isAutomatic);
if (forceTrack) tr->setForcedTrack(true, a_track);
m_scene->addItem(tr);
tr->setItemLocked(true);
}
}
+ else {
+ m_documentErrors.append(i18n("Removed overlapping transition: (%1, %2, %3)", e.attribute("id"), mlt_service, transitionId) + '\n');
+ tractor.removeChild(transitions.item(i));
+ i--;
+ }
}
}