ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs)
: AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
+ setZValue(1);
setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
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::slotSetStartThumb(QPixmap pix) {
+void ClipItem::slotSetStartThumb(const QPixmap pix) {
m_startPix = pix;
}
-void ClipItem::slotSetEndThumb(QPixmap pix) {
+void ClipItem::slotSetEndThumb(const QPixmap pix) {
m_endPix = pix;
}
+QPixmap ClipItem::startThumb() const {
+ return m_startPix;
+}
+
+QPixmap ClipItem::endThumb() const {
+ return m_endPix;
+}
+
void ClipItem::slotGotAudioData() {
audioThumbReady = true;
if (m_clipType == AV) {
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();
//build path around clip
//QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower);
//painter->fillPath(resultClipPath, paintColor);
- painter->fillRect(br, paintColor);
+ painter->fillRect(exposed, paintColor);
//painter->setClipPath(resultClipPath, Qt::IntersectClip);
const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps) + 1;
if (posx > max) posx = max;
if (posx == endPos().frames(m_fps)) return;
- kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
+ //kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
const int previous = (cropStart() + duration()).frames(m_fps);
AbstractClipItem::resizeEnd(posx, m_speed);
if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
if (m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect);
}
-
//virtual
QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// calculate new position.
- if (group() != 0) return pos();
+ if (parentItem()) return pos();
QPointF newPos = value.toPointF();
- //kDebug() << "/// MOVING CLIP ITEM.------------";
+ //kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++";
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
newPos.setX(xpos);
- int newTrack = (newPos.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
+ int newTrack = newPos.y() / KdenliveSettings::trackheight();
newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
newTrack = qMax(newTrack, 0);
newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + 1));
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) {