m_baseColor = QColor(141, 215, 166);
connect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
}
+ m_paintColor = m_baseColor;
}
if (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") {
if (e.attribute("keyframes").isEmpty()) {
// Effect has a keyframe type parameter, we need to set the values
- e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + e.attribute("default"));
+ e.setAttribute("keyframes", QString::number((int) cropStart().frames(m_fps)) + ':' + e.attribute("default"));
}
else if (offset != 0) {
// adjust keyframes to this clip
if (e.attribute("type") == "geometry" && !e.hasAttribute("fixed")) {
// Effects with a geometry parameter need to sync in / out with parent clip
- effect.setAttribute("in", QString::number(cropStart().frames(m_fps)));
- effect.setAttribute("out", QString::number((cropStart() + cropDuration()).frames(m_fps) - 1));
+ effect.setAttribute("in", QString::number((int) cropStart().frames(m_fps)));
+ effect.setAttribute("out", QString::number((int) (cropStart() + cropDuration()).frames(m_fps) - 1));
effect.setAttribute("_sync_in_out", "1");
}
}
return result.join(";");
}
-bool ClipItem::checkKeyFrames()
+bool ClipItem::checkKeyFrames(int width, int height, int previousDuration, int cutPos)
{
bool clipEffectsModified = false;
QLocale locale;
// go through all effects this clip has
for (int ix = 0; ix < m_effectList.count(); ++ix) {
+ // Check geometry params
+ resizeGeometries(ix, width, height, previousDuration, cutPos == -1 ? 0 : cutPos, cropDuration().frames(m_fps) - 1);
+
+ // Check keyframe params
QStringList keyframeParams = keyframes(ix);
QStringList newKeyFrameParams;
bool effModified = false;
int lastPos = -1;
double lastValue = -1;
int start = cropStart().frames(m_fps);
- int end = (cropStart() + cropDuration()).frames(m_fps);
+ int end = (cropStart() + cropDuration()).frames(m_fps) - 1;
// go through all keyframes for one param
foreach(const QString &str, keyframes) {
if (pos > start) {
int diff = pos - lastPos;
double ratio = (double)(start - lastPos) / diff;
- double newValue = lastValue + (val - lastValue) * ratio;
- newKeyFrames.append(QString::number(start) + ':' + locale.toString(newValue));
+ int newValue = lastValue + (val - lastValue) * ratio;
+ newKeyFrames.append(QString::number(start) + ':' + QString::number(newValue));
modified = true;
}
cutKeyFrame = false;
int diff = pos - lastPos;
if (diff != 0) {
double ratio = (double)(end - lastPos) / diff;
- double newValue = lastValue + (val - lastValue) * ratio;
- newKeyFrames.append(QString::number(end) + ':' + locale.toString(newValue));
+ int newValue = lastValue + (val - lastValue) * ratio;
+ newKeyFrames.append(QString::number(end) + ':' + QString::number(newValue));
modified = true;
}
break;
} else {
- newKeyFrames.append(QString::number(pos) + ':' + locale.toString(val));
+ newKeyFrames.append(QString::number(pos) + ':' + QString::number(val));
}
}
lastPos = pos;
int keyframeParams = 0;
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
- if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") && e.attribute("intimeline") == "1") {
+ if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") && (!e.hasAttribute("intimeline") || e.attribute("intimeline") == "1")) {
e.setAttribute("keyframes", keyframes.at(keyframeParams));
- if (ix == m_selectedEffect && keyframeParams == 0) {
+ if (ix + 1 == m_selectedEffect && keyframeParams == 0) {
m_keyframes.clear();
m_visibleParam = i;
double max = locale.toDouble(e.attribute("max"));
}
}
+void ClipItem::resizeGeometries(const int index, int width, int height, int previousDuration, int start, int duration)
+{
+ QString geom;
+ QDomElement effect = m_effectList.at(index);
+ QDomNodeList params = effect.elementsByTagName("parameter");
+
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.isNull() && e.attribute("type") == "geometry") {
+ geom = e.attribute("value");
+ Mlt::Geometry geometry(geom.toUtf8().data(), previousDuration, width, height);
+ e.setAttribute("value", geometry.serialise(start, start + duration));
+ }
+ }
+}
+
QStringList ClipItem::keyframes(const int index)
{
QStringList result;
QWidget *)
{
QPalette palette = scene()->palette();
- QColor paintColor;
+ QColor paintColor = m_paintColor;
QColor textColor;
QColor textBgColor;
QPen framePen;
- if (parentItem()) paintColor = QColor(255, 248, 149);
- else paintColor = m_baseColor;
if (isSelected() || (parentItem() && parentItem()->isSelected())) {
textColor = palette.highlightedText().color();
textBgColor = palette.highlight().color();
- paintColor = paintColor.darker();
framePen.setColor(textBgColor);
+ paintColor.setRed(qMin(paintColor.red() * 2, 255));
}
else {
textColor = palette.text().color();
textBgColor = palette.window().color();
textBgColor.setAlpha(200);
- framePen.setColor(paintColor.darker());
+ framePen.setColor(m_paintColor.darker());
}
const QRectF exposed = option->exposedRect;
const QTransform transformation = painter->worldTransform();
painter->setClipPath(p.intersected(q));
painter->setPen(Qt::NoPen);
painter->fillRect(mappedExposed, paintColor);
- painter->setPen(paintColor.darker());
+ painter->setPen(m_paintColor.darker());
// draw thumbnails
if (KdenliveSettings::videothumbnails() && !isAudioOnly()) {
QRectF thumbRect;
QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == QGraphicsItem::ItemSelectedChange) {
- if (value.toBool()) setZValue(10);
- else setZValue(2);
+ if (value.toBool())
+ setZValue(10);
+ else
+ setZValue(2);
}
if (change == ItemPositionChange && scene()) {
// calculate new position.
//kDebug()<<"// ITEM NEW POS: "<<newPos.x()<<", mapped: "<<mapToScene(newPos.x(), 0).x();
return newPos;
}
+ if (change == ItemParentChange) {
+ QGraphicsItem* parent = value.value<QGraphicsItem*>();
+ if (parent) m_paintColor = m_baseColor.lighter(135);
+ else m_paintColor = m_baseColor;
+ }
return QGraphicsItem::itemChange(change, value);
}
}
}
if (needInOutSync) {
- parameters.addParam("in", QString::number(cropStart().frames(m_fps)));
- parameters.addParam("out", QString::number((cropStart() + cropDuration()).frames(m_fps) - 1));
+ parameters.addParam("in", QString::number((int) cropStart().frames(m_fps)));
+ parameters.addParam("out", QString::number((int) (cropStart() + cropDuration()).frames(m_fps) - 1));
parameters.addParam("_sync_in_out", "1");
}
m_effectNames = m_effectList.effectNames().join(" / ");
e.removeAttribute("kdenlive_ix");
}
CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
- if (view) view->slotAddEffect(e, m_info.startPos, track());
+ if (view) view->slotDropEffect(this, e, m_info.startPos, track());
}
else return;
}
} else if (m_clipType == AUDIO) m_baseColor = QColor(141, 215, 166);
else m_baseColor = QColor(141, 166, 215);
}
+ if (parentItem())
+ m_paintColor = m_baseColor.lighter(135);
+ else
+ m_paintColor = m_baseColor;
m_audioThumbCachePic.clear();
}
if (in < cropStart().frames(m_fps)) {
if (!effects.contains(i))
effects[i] = effect.cloneNode().toElement();
- EffectsList::setParameter(effect, "in", QString::number(cropStart().frames(m_fps)));
+ EffectsList::setParameter(effect, "in", QString::number((int) cropStart().frames(m_fps)));
}
if (effects.contains(i))
setFadeOut(out - in);