QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
+ kDebug() << "// inint eff: " << e.attribute("name");
if (!e.isNull() && e.attribute("type") == "keyframe") {
QString def = e.attribute("default");
// Effect has a keyframe type parameter, we need to set the values
void ClipItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *) {
- painter->setOpacity(m_opacity);
+ /*if (parentItem()) m_opacity = 0.5;
+ else m_opacity = 1.0;
+ painter->setOpacity(m_opacity);*/
QBrush paintColor = brush();
if (isSelected()) paintColor = QBrush(QColor(79, 93, 121));
QRectF br = rect();
QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// calculate new position.
- if (group()) return pos();
+ if (parentItem()) return pos();
QPointF newPos = value.toPointF();
- kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++";
+ //kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++";
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
newPos.setX(xpos);
sceneShape.translate(newPos);
QList<QGraphicsItem*> items = scene()->items(sceneShape, Qt::IntersectsItemShape);
items.removeAll(this);
-
+ bool forwardMove = newPos.x() > pos().x();
+ int offset = 0;
if (!items.isEmpty()) {
for (int i = 0; i < items.count(); i++) {
if (items.at(i)->type() == type()) {
// Collision!
QPointF otherPos = items.at(i)->pos();
- if ((int) otherPos.y() != (int) pos().y()) return pos();
- if (pos().x() < otherPos.x()) {
- // move clip just before colliding clip
- int npos = (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_cropDuration).frames(m_fps);
- // check we don't run into another clip
- newPos.setX(npos);
- sceneShape = rect();
- sceneShape.translate(newPos);
- QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
- items.removeAll(this);
- for (int j = 0; j < subitems.count(); j++) {
- if (subitems.at(j)->type() == type()) return pos();
- }
+ if ((int) otherPos.y() != (int) pos().y()) {
+ return pos();
+ }
+ if (forwardMove) {
+ offset = qMax(offset, (int)(newPos.x() - (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_cropDuration).frames(m_fps)));
} else {
- // get pos just after colliding clip
- int npos = static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps);
- // check we don't run into another clip
- newPos.setX(npos);
- sceneShape = rect();
- sceneShape.translate(newPos);
+ offset = qMax(offset, (int)((static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps)) - newPos.x()));
+ }
+
+ if (offset > 0) {
+ if (forwardMove) {
+ sceneShape.translate(QPointF(-offset, 0));
+ newPos.setX(newPos.x() - offset);
+ } else {
+ sceneShape.translate(QPointF(offset, 0));
+ newPos.setX(newPos.x() + offset);
+ }
QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
- items.removeAll(this);
+ subitems.removeAll(this);
for (int j = 0; j < subitems.count(); j++) {
if (subitems.at(j)->type() == type()) return pos();
}
}
+
m_track = newTrack;
m_startPos = GenTime((int) newPos.x(), m_fps);
return newPos;
}
}
-QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
- QHash <QString, QString> effectParams;
+EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate) {
+
bool needRepaint = false;
/*QDomDocument doc;
doc.appendChild(doc.importNode(effect, true));
kDebug() << "/////// CLIPÂ ADD EFFECT: " << doc.toString();*/
m_effectList.append(effect);
- effectParams["tag"] = effect.attribute("tag");
+
+ EffectsParameterList parameters;
+ parameters.addParam("tag", effect.attribute("tag"));
+ parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+ if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
+
+ QString state = effect.attribute("disabled");
+ if (!state.isEmpty()) {
+ parameters.addParam("disabled", state);
+ }
+
QString effectId = effect.attribute("id");
if (effectId.isEmpty()) effectId = effect.attribute("tag");
- effectParams["id"] = effectId;
- effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
- QString state = effect.attribute("disabled");
- if (!state.isEmpty()) effectParams["disabled"] = state;
+ parameters.addParam("id", effectId);
+
QDomNodeList params = effect.elementsByTagName("parameter");
int fade = 0;
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
if (!e.isNull()) {
if (e.attribute("type") == "keyframe") {
- effectParams["keyframes"] = e.attribute("keyframes");
- effectParams["min"] = e.attribute("min");
- effectParams["max"] = e.attribute("max");
- effectParams["factor"] = e.attribute("factor", "1");
- effectParams["starttag"] = e.attribute("starttag", "start");
- effectParams["endtag"] = e.attribute("endtag", "end");
+ parameters.addParam("keyframes", e.attribute("keyframes"));
+ parameters.addParam("max", e.attribute("max"));
+ parameters.addParam("min", e.attribute("min"));
+ parameters.addParam("factor", e.attribute("factor", "1"));
+ parameters.addParam("starttag", e.attribute("starttag", "start"));
+ parameters.addParam("endtag", e.attribute("endtag", "end"));
}
double f = e.attribute("factor", "1").toDouble();
if (f == 1) {
- effectParams[e.attribute("name")] = e.attribute("value");
+ parameters.addParam(e.attribute("name"), e.attribute("value"));
+
// check if it is a fade effect
if (effectId == "fadein") {
needRepaint = true;
else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
}
} else {
- effectParams[e.attribute("name")] = QString::number(e.attribute("value").toDouble() / f);
+ parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
}
}
}
m_selectedEffect = 0;
setSelectedEffect(m_selectedEffect);
}
- return effectParams;
+ return parameters;
}
-QHash <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
- QHash <QString, QString> effectParams;
- effectParams["tag"] = effect.attribute("tag");
- effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
- effectParams["id"] = effect.attribute("id");
+EffectsParameterList ClipItem::getEffectArgs(QDomElement effect) {
+ EffectsParameterList parameters;
+ parameters.addParam("tag", effect.attribute("tag"));
+ parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+ parameters.addParam("id", effect.attribute("id"));
+ if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
QString state = effect.attribute("disabled");
- if (!state.isEmpty()) effectParams["disabled"] = state;
+ if (!state.isEmpty()) {
+ parameters.addParam("disabled", state);
+ }
+
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
//kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
if (e.attribute("type") == "keyframe") {
kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
- effectParams["keyframes"] = e.attribute("keyframes");
- effectParams["max"] = e.attribute("max");
- effectParams["min"] = e.attribute("min");
- effectParams["factor"] = e.attribute("factor", "1");
- effectParams["starttag"] = e.attribute("starttag", "start");
- effectParams["endtag"] = e.attribute("endtag", "end");
+ parameters.addParam("keyframes", e.attribute("keyframes"));
+ parameters.addParam("max", e.attribute("max"));
+ parameters.addParam("min", e.attribute("min"));
+ parameters.addParam("factor", e.attribute("factor", "1"));
+ parameters.addParam("starttag", e.attribute("starttag", "start"));
+ parameters.addParam("endtag", e.attribute("endtag", "end"));
} else if (e.attribute("namedesc").contains(";")) {
QString format = e.attribute("format");
QStringList separators = format.split("%d", QString::SkipEmptyParts);
txtNeu << separators[i];
txtNeu << (int)(values[i+1].toDouble());
}
- effectParams["start"] = neu;
+ parameters.addParam("start", neu);
} else {
- if (e.attribute("factor", "1") != "1")
- effectParams[e.attribute("name")] = QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble());
- else effectParams[e.attribute("name")] = e.attribute("value");
+ if (e.attribute("factor", "1") != "1") {
+ parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble()));
+ } else {
+ parameters.addParam(e.attribute("name"), e.attribute("value"));
+ }
}
}
- return effectParams;
+ return parameters;
}
void ClipItem::deleteEffect(QString index) {