]> git.sesse.net Git - kdenlive/commitdiff
* New: audio fade in / out by dragging a clip's top corner
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 8 Jun 2008 10:47:12 +0000 (10:47 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 8 Jun 2008 10:47:12 +0000 (10:47 +0000)
* Nice animation on effect add/remove

svn path=/branches/KDE4/; revision=2232

14 files changed:
src/abstractclipitem.cpp
src/abstractclipitem.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/effectslist.cpp
src/effectslist.h
src/effectslistview.cpp
src/effectstackedit.cpp
src/graphicsscenerectmove.cpp
src/projectlistview.cpp
src/transitionsettings.cpp
src/widgets/transitionsettings_ui.ui

index 9e0e203bc70a66b9e60d7692b1e773f1b17b28f8..b7a38a0059b927d119ad0f5af45699d7d1e9b754 100644 (file)
@@ -4,7 +4,7 @@
 #include <QGraphicsView>
 #include <QScrollBar>
 
-AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0), m_track(0), m_fps(fps) {
+AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps) {
     setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
     setTrack(info.track);
     m_startPos = info.startPos;
@@ -119,14 +119,6 @@ void AbstractClipItem::resizeEnd(int posx, double scale) {
     }
 }
 
-void AbstractClipItem::setFadeOut(int pos, double scale) {
-
-}
-
-void AbstractClipItem::setFadeIn(int pos, double scale) {
-
-}
-
 GenTime AbstractClipItem::duration() const {
     return m_cropDuration;
 }
@@ -143,14 +135,6 @@ double AbstractClipItem::fps() const {
     return m_fps;
 }
 
-int AbstractClipItem::fadeIn() const {
-    return m_startFade;
-}
-
-int AbstractClipItem::fadeOut() const {
-    return m_endFade;
-}
-
 GenTime AbstractClipItem::maxDuration() const {
     return m_maxDuration;
 }
index 6e1cc1df966989643d1f5a8f40f9eabe9d095cc7..5f5cb887930ae1bef1be78e5f0711611138fb67e 100644 (file)
@@ -18,12 +18,8 @@ public:
     virtual GenTime cropStart() const ;
     virtual  void resizeStart(int posx, double scale);
     virtual void resizeEnd(int posx, double scale);
-    virtual void setFadeOut(int pos, double scale);
-    virtual void setFadeIn(int pos, double scale);
     virtual GenTime duration() const;
     virtual double fps() const;
-    virtual int fadeIn() const;
-    virtual int fadeOut() const;
     virtual GenTime maxDuration() const;
     virtual void setCropStart(GenTime pos);
 
@@ -34,8 +30,6 @@ protected:
     GenTime m_startPos;
     GenTime m_maxDuration;
     double m_fps;
-    uint m_startFade;
-    uint m_endFade;
     QPainterPath upperRectPart(QRectF);
     QPainterPath lowerRectPart(QRectF);
     QRect visibleRect();
index b910f6ab19d2563b9bfc1e05e1ace87775f9da74..279986024d7a26c30459d7bf243c87c45cb52684 100644 (file)
@@ -40,7 +40,7 @@
 #include "kthumb.h"
 
 ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, GenTime cropStart, double scale, double fps)
-        : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) {
+        : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_startFade(0), m_endFade(0), m_hover(false) {
     QRectF rect((double) info.startPos.frames(fps) * scale, (double)(info.track * KdenliveSettings::trackheight() + 1), (double)(info.endPos - info.startPos).frames(fps) * scale, (double)(KdenliveSettings::trackheight() - 1));
     setRect(rect);
 
@@ -171,13 +171,14 @@ int ClipItem::clipProducer() {
 void ClipItem::flashClip() {
     if (m_timeLine == 0) {
         m_timeLine = new QTimeLine(750, this);
+        m_timeLine->setCurveShape(QTimeLine::EaseInOutCurve);
         connect(m_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(animate(qreal)));
     }
     m_timeLine->start();
 }
 
 void ClipItem::animate(qreal value) {
-    m_opacity = value;
+    //m_opacity = value;
     update();
 }
 
@@ -286,54 +287,54 @@ void ClipItem::paint(QPainter *painter,
     pen.setStyle(Qt::SolidLine);
 
 
-    /*
-      // draw start / end fades
-      QBrush fades;
-      if (isSelected()) {
-          fades = QBrush(QColor(200, 50, 50, 150));
-      } else fades = QBrush(QColor(200, 200, 200, 200));
-
-      if (m_startFade != 0) {
-          QPainterPath fadeInPath;
-          fadeInPath.moveTo(br.x() , br.y());
-          fadeInPath.lineTo(br.x() , br.y() + br.height());
-          fadeInPath.lineTo(br.x() + m_startFade * scale, br.y());
-          fadeInPath.closeSubpath();
-          painter->fillPath(fadeInPath, fades);
-          if (isSelected()) {
-              QLineF l(br.x() + m_startFade * scale, br.y(), br.x(), br.y() + br.height());
-              painter->drawLine(l);
-          }
-      }
-      if (m_endFade != 0) {
-          QPainterPath fadeOutPath;
-          fadeOutPath.moveTo(br.x() + br.width(), br.y());
-          fadeOutPath.lineTo(br.x() + br.width(), br.y() + br.height());
-          fadeOutPath.lineTo(br.x() + br.width() - m_endFade * scale, br.y());
-          fadeOutPath.closeSubpath();
-          painter->fillPath(fadeOutPath, fades);
-          if (isSelected()) {
-              QLineF l(br.x() + br.width() - m_endFade * scale, br.y(), br.x() + br.width(), br.y() + br.height());
-              painter->drawLine(l);
-          }
-      }
-      */
 
-    //pen.setStyle(Qt::DashDotDotLine); //Qt::DotLine);
+    // draw start / end fades
+    QBrush fades;
+    if (isSelected()) {
+        fades = QBrush(QColor(200, 50, 50, 150));
+    } else fades = QBrush(QColor(200, 200, 200, 200));
+
+    if (m_startFade != 0) {
+        QPainterPath fadeInPath;
+        fadeInPath.moveTo(br.x() , br.y());
+        fadeInPath.lineTo(br.x() , br.y() + br.height());
+        fadeInPath.lineTo(br.x() + m_startFade * scale, br.y());
+        fadeInPath.closeSubpath();
+        painter->fillPath(fadeInPath, fades);
+        if (isSelected()) {
+            QLineF l(br.x() + m_startFade * scale, br.y(), br.x(), br.y() + br.height());
+            painter->drawLine(l);
+        }
+    }
+    if (m_endFade != 0) {
+        QPainterPath fadeOutPath;
+        fadeOutPath.moveTo(br.x() + br.width(), br.y());
+        fadeOutPath.lineTo(br.x() + br.width(), br.y() + br.height());
+        fadeOutPath.lineTo(br.x() + br.width() - m_endFade * scale, br.y());
+        fadeOutPath.closeSubpath();
+        painter->fillPath(fadeOutPath, fades);
+        if (isSelected()) {
+            QLineF l(br.x() + br.width() - m_endFade * scale, br.y(), br.x() + br.width(), br.y() + br.height());
+            painter->drawLine(l);
+        }
+    }
 
     // Draw effects names
-    QString effects = effectNames().join(" / ");
-    if (!effects.isEmpty()) {
-        QFont font = painter->font();
-        QFont smallFont = font;
-        smallFont.setPointSize(8);
-        painter->setFont(smallFont);
-        QRectF txtBounding = painter->boundingRect(br, Qt::AlignLeft | Qt::AlignTop, " " + effects + " ");
+    if (!m_effectNames.isEmpty()) {
+        QRectF txtBounding = painter->boundingRect(br, Qt::AlignLeft | Qt::AlignTop, m_effectNames);
+        txtBounding.setRight(txtBounding.right() + 15);
         painter->setPen(Qt::white);
-        painter->fillRect(txtBounding, QBrush(QColor(0, 0, 0, 150)));
-        painter->drawText(txtBounding, Qt::AlignCenter, effects);
+        QBrush markerBrush(Qt::SolidPattern);
+        if (m_timeLine && m_timeLine->state() == QTimeLine::Running) {
+            qreal value = m_timeLine->currentValue();
+            txtBounding.setWidth(txtBounding.width() * value);
+            markerBrush.setColor(QColor(50 + 200 * (1.0 - value), 50, 50, 100 + 50 * value));
+        } else markerBrush.setColor(QColor(50, 50, 50, 150));
+        QPainterPath path;
+        path.addRoundedRect(txtBounding, 4, 4);
+        painter->fillPath(path, markerBrush);
+        painter->drawText(txtBounding, Qt::AlignCenter, m_effectNames);
         painter->setPen(Qt::black);
-        painter->setFont(font);
     }
 
     /*
@@ -527,6 +528,13 @@ void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path,
     //}
 }
 
+uint ClipItem::fadeIn() const {
+    return m_startFade;
+}
+
+uint ClipItem::fadeOut() const {
+    return m_endFade;
+}
 
 
 void ClipItem::setFadeIn(int pos, double scale) {
@@ -610,6 +618,7 @@ void ClipItem::setEffectAt(int ix, QDomElement effect) {
     kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag");
     m_effectList.insert(ix, effect);
     m_effectList.removeAt(ix + 1);
+    m_effectNames = m_effectList.effectNames().join(" / ");
     update(boundingRect());
 }
 
@@ -620,20 +629,36 @@ QMap <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
     kDebug() << "///////  CLIP ADD EFFECT: "<< doc.toString();*/
     m_effectList.append(effect);
     effectParams["tag"] = effect.attribute("tag");
+    QString effectId = effect.attribute("id");
     effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
     QString state = effect.attribute("disabled");
     if (!state.isEmpty()) effectParams["disabled"] = state;
     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()) {
-            effectParams[e.attribute("name")] = e.attribute("value");
-        }
-        if (!e.attribute("factor").isEmpty()) {
-            effectParams[e.attribute("name")] =  QString::number(effectParams[e.attribute("name")].toDouble() / e.attribute("factor").toDouble());
+            if (e.attribute("factor").isEmpty()) {
+                effectParams[e.attribute("name")] = e.attribute("value");
+                // check if it is a fade effect
+                if (effectId == "fadein") {
+                    if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
+                    else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
+                } else if (effectId == "fadeout") {
+                    if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
+                    else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                }
+            } else {
+                effectParams[e.attribute("name")] =  QString::number(effectParams[e.attribute("name")].toDouble() / e.attribute("factor").toDouble());
+            }
         }
     }
-    if (animate) flashClip();
+    m_effectNames = m_effectList.effectNames().join(" / ");
+    if (fade > 0) m_startFade = fade;
+    else if (fade < 0) m_endFade = -fade;
+    if (animate) {
+        flashClip();
+    }
     update(boundingRect());
     return effectParams;
 }
@@ -674,10 +699,13 @@ QMap <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
 void ClipItem::deleteEffect(QString index) {
     for (int i = 0; i < m_effectList.size(); ++i) {
         if (m_effectList.at(i).attribute("kdenlive_ix") == index) {
+            if (m_effectList.at(i).attribute("id") == "fadein") m_startFade = 0;
+            else if (m_effectList.at(i).attribute("id") == "fadeout") m_endFade = 0;
             m_effectList.removeAt(i);
             break;
         }
     }
+    m_effectNames = m_effectList.effectNames().join(" / ");
     flashClip();
     update(boundingRect());
 }
index 9bfc054802cc33b0b6de6845ec1fa09fb23ca68b..4bcac9cabda422dd7878082927308025fc2f6f98 100644 (file)
@@ -79,6 +79,8 @@ public:
     void refreshClip();
     /** Returns a list of times for this clip's markers */
     QList <GenTime> snapMarkers();
+    uint fadeIn() const;
+    uint fadeOut() const;
 
 protected:
     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
@@ -97,7 +99,9 @@ private:
     int m_producer;
     CLIPTYPE m_clipType;
     QString m_clipName;
-
+    QString m_effectNames;
+    uint m_startFade;
+    uint m_endFade;
 
     int m_maxTrack;
 
index 92a186f02bcf0f9e9e7ad2af507127fb837ee4f2..58a43a4ad6f2ea1525cc9ccb7b186277f6b8d8ec 100644 (file)
@@ -53,6 +53,8 @@
 #include "clipmanager.h"
 #include "renderer.h"
 #include "markerdialog.h"
+#include "mainwindow.h"
+
 
 //TODO:
 // disable animation if user asked it in KDE's global settings
@@ -182,10 +184,10 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_dragItem->resizeEnd((int)(snappedPos / m_scale), m_scale);
             } else if (m_operationMode == FADEIN) {
                 int pos = (int)(mapToScene(event->pos()).x() / m_scale);
-                m_dragItem->setFadeIn((int)(pos - m_dragItem->startPos().frames(m_document->fps())), m_scale);
+                ((ClipItem*) m_dragItem)->setFadeIn((int)(pos - m_dragItem->startPos().frames(m_document->fps())), m_scale);
             } else if (m_operationMode == FADEOUT) {
                 int pos = (int)(mapToScene(event->pos()).x() / m_scale);
-                m_dragItem->setFadeOut((int)(m_dragItem->endPos().frames(m_document->fps()) - pos), m_scale);
+                ((ClipItem*) m_dragItem)->setFadeOut((int)(m_dragItem->endPos().frames(m_document->fps()) - pos), m_scale);
             }
 
             if (m_animation) delete m_animation;
@@ -286,7 +288,8 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 }
             } else if (opMode == FADEIN) {
                 if (m_visualTip == NULL) {
-                    m_visualTip = new QGraphicsEllipseItem(clip->rect().x() + clip->fadeIn() * m_scale - size, clip->rect().y() - 8, size * 2, 16);
+                    ClipItem *item = (ClipItem *) clip;
+                    m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->fadeIn() * m_scale - size, item->rect().y() - 8, size * 2, 16);
                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
                     m_visualTip->setZValue(100);
@@ -296,17 +299,18 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                     m_visualTip->setPos(0, 0);
                     double scale = 2.0;
                     m_animation->setScaleAt(.5, scale, scale);
-                    m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale -  clip->fadeIn() * m_scale, clip->rect().y() - clip->rect().y() * scale));
+                    m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale -  item->fadeIn() * m_scale, item->rect().y() - item->rect().y() * scale));
                     scale = 1.0;
                     m_animation->setScaleAt(1, scale, scale);
-                    m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, clip->rect().y() - clip->rect().y() * scale));
+                    m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
                     scene()->addItem(m_visualTip);
                     m_animationTimer->start();
                 }
                 setCursor(Qt::PointingHandCursor);
             } else if (opMode == FADEOUT) {
                 if (m_visualTip == NULL) {
-                    m_visualTip = new QGraphicsEllipseItem(clip->rect().x() + clip->rect().width() - clip->fadeOut() * m_scale - size, clip->rect().y() - 8, size*2, 16);
+                    ClipItem *item = (ClipItem *) clip;
+                    m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->rect().width() - item->fadeOut() * m_scale - size, item->rect().y() - 8, size*2, 16);
                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
                     m_visualTip->setZValue(100);
@@ -316,10 +320,10 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                     m_visualTip->setPos(0, 0);
                     double scale = 2.0;
                     m_animation->setScaleAt(.5, scale, scale);
-                    m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale - clip->rect().width() + clip->fadeOut() * m_scale, clip->rect().y() - clip->rect().y() * scale));
+                    m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale - item->rect().width() + item->fadeOut() * m_scale, item->rect().y() - item->rect().y() * scale));
                     scale = 1.0;
                     m_animation->setScaleAt(1, scale, scale);
-                    m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, clip->rect().y() - clip->rect().y() * scale));
+                    m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
                     scene()->addItem(m_visualTip);
                     m_animationTimer->start();
                 }
@@ -860,6 +864,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
         // resize start
         if (m_dragItem->type() == AVWIDGET) {
             m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), m_dragItemInfo.startPos, m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
+            updateClipFade((ClipItem *) m_dragItem);
             ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
             m_commandStack->push(command);
         } else if (m_dragItem->type() == TRANSITIONWIDGET) {
@@ -877,14 +882,64 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
             m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - m_dragItem->track(), m_dragItem->startPos(), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
             m_commandStack->push(command);
         } else if (m_dragItem->type() == TRANSITIONWIDGET) {
-
             MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
             m_commandStack->push(command);
             Transition *transition = (Transition *) m_dragItem;
             m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
         }
         //m_document->renderer()->doRefresh();
+    } else if (m_operationMode == FADEIN) {
+        // resize fade in effect
+        ClipItem * item = (ClipItem *) m_dragItem;
+        QStringList clipeffects = item->effectNames();
+        if (clipeffects.contains(i18n("Fade in"))) {
+            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade in"));
+            int start = item->cropStart().frames(m_document->fps());
+            int end = item->fadeIn();
+            if (end == 0) {
+                slotDeleteEffect(item, oldeffect);
+            } else {
+                end += start;
+                QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade in");
+                EffectsList::setParameter(effect, "in", QString::number(start));
+                EffectsList::setParameter(effect, "out", QString::number(end));
+                slotUpdateClipEffect(item, oldeffect, effect);
+            }
+        } else {
+            QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade in");
+            int start = item->cropStart().frames(m_document->fps());
+            int end = item->fadeIn() + start;
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+            slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
+        }
+    } else if (m_operationMode == FADEOUT) {
+        // resize fade in effect
+        ClipItem * item = (ClipItem *) m_dragItem;
+        QStringList clipeffects = item->effectNames();
+        if (clipeffects.contains(i18n("Fade out"))) {
+            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade out"));
+            int end = (item->duration() + item->cropStart()).frames(m_document->fps());
+            int start = item->fadeOut();
+            if (start == 0) {
+                slotDeleteEffect(item, oldeffect);
+            } else {
+                start = end - start;
+                QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade out");
+                EffectsList::setParameter(effect, "in", QString::number(start));
+                EffectsList::setParameter(effect, "out", QString::number(end));
+                slotUpdateClipEffect(item, oldeffect, effect);
+            }
+        } else {
+            QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade out");
+            int end = (item->duration() + item->cropStart()).frames(m_document->fps());
+            int start = end - item->fadeOut();
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+            slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
+        }
     }
+
     emit transitionItemSelected((m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) ? (Transition*) m_dragItem : NULL);
     m_document->setModified(true);
     m_operationMode = NONE;
@@ -897,6 +952,7 @@ void CustomTrackView::deleteClip(ItemInfo info) {
         kDebug() << "----------------  ERROR, CANNOT find clip to move at...";// << rect.x();
         return;
     }
+    if (item->isSelected()) emit clipItemSelected(NULL);
     item->baseClip()->removeReference();
     m_document->updateClip(item->baseClip()->getId());
     delete item;
@@ -1053,13 +1109,45 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) {
     if (resizeClipStart) {
         m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), end.startPos, item->startPos(), item->cropStart() + end.startPos - start.startPos, item->cropStart() + end.startPos - start.startPos + item->endPos() - end.startPos);
         item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale);
+        updateClipFade(item);
     } else {
         m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + end.startPos - item->startPos());
         item->resizeEnd((int) end.startPos.frames(m_document->fps()), m_scale);
+        updateClipFade(item, true);
     }
     m_document->renderer()->doRefresh();
 }
 
+void CustomTrackView::updateClipFade(ClipItem * item, bool updateFadeOut) {
+    if (!updateFadeOut) {
+        int end = item->fadeIn();
+        if (end != 0) {
+            // there is a fade in effect
+            QStringList clipeffects = item->effectNames();
+            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade in"));
+            int start = item->cropStart().frames(m_document->fps());
+            end += start;
+            EffectsList::setParameter(oldeffect, "in", QString::number(start));
+            EffectsList::setParameter(oldeffect, "out", QString::number(end));
+            QMap <QString, QString> effectParams = item->getEffectArgs(oldeffect);
+            m_document->renderer()->mltEditEffect(m_tracksList.count() - item->track(), item->startPos(), effectParams);
+        }
+    } else {
+        int start = item->fadeOut();
+        if (start != 0) {
+            // there is a fade in effect
+            QStringList clipeffects = item->effectNames();
+            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade out"));
+            int end = (item->duration() - item->cropStart()).frames(m_document->fps());
+            start = end - start;
+            EffectsList::setParameter(oldeffect, "in", QString::number(start));
+            EffectsList::setParameter(oldeffect, "out", QString::number(end));
+            QMap <QString, QString> effectParams = item->getEffectArgs(oldeffect);
+            m_document->renderer()->mltEditEffect(m_tracksList.count() - item->track(), item->startPos(), effectParams);
+        }
+    }
+}
+
 double CustomTrackView::getSnapPointForPos(double pos) {
     for (int i = 0; i < m_snapPoints.size(); ++i) {
         if (abs((int)(pos - m_snapPoints.at(i).frames(m_document->fps()) * m_scale)) < 10) {
index 9e58725117e39fe51d14e02cf9a6f8de1866d196..cae676a995f5c7306cd48fd3f9c712b229e23800 100644 (file)
@@ -150,7 +150,7 @@ private:
     QCursor m_razorCursor;
     /** Get the index of the video track that is just below current track */
     int getPreviousVideoTrack(int track);
-
+    void updateClipFade(ClipItem * item, bool updateFadeOut = false);
 
 signals:
     void cursorMoved(int, int);
index 9e0bad5cb489675fd4cb93a5b44e2d5de3d77f8e..58152ad63fb012b9e313257342fa6e0b79d3d336 100644 (file)
@@ -101,3 +101,15 @@ QString EffectsList::getInfo(QString effectName) {
     return info;
 }
 
+// static
+void EffectsList::setParameter(QDomElement effect, QString name, QString value) {
+    QDomNodeList params = effect.elementsByTagName("parameter");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (e.attribute("name") == name) {
+            e.setAttribute("value", value);
+            break;
+        }
+    }
+}
+
index a51bf521732e9fbd26cce5f8d6440e4d3c781ea0..b5b87e7b993e16cbe07ecc04f47ecbe39fff21ce 100644 (file)
@@ -38,6 +38,8 @@ public:
     QStringList effectNames();
     QString getInfo(QString effectName);
     QMap <QString, QString> effect(const QString & name);
+
+    static void setParameter(QDomElement effect, QString name, QString value);
 };
 
 #endif
index 716b387a064e414d9379d6dfd0d4c6689b83e966..1f6e9247b384f0052a3203a1075f180439802993 100644 (file)
@@ -65,10 +65,10 @@ void EffectsListView::filterList(int pos) {
 
 void EffectsListView::showInfoPanel() {
     if (ui.infopanel->isVisible()) {
-        ui.infopanel->hide();
+        ui.infopanel->setVisible(false);
         ui.buttonInfo->setDown(false);
     } else {
-        ui.infopanel->show();
+        ui.infopanel->setVisible(true);
         ui.buttonInfo->setDown(true);
     }
 }
index 29c38dde247eea886efb54b6b8b55dfa074a4e82..d7e50b81515ddaf47c57dc6001ae94c0f9fd8a3d 100644 (file)
@@ -98,7 +98,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement& d, int , int) {
 
 
         //TODO constant, list, bool, complex , color, geometry, position
-        if (type == "double" || type == "constant") {
+        if (type == "double") {
             createSliderItem(paramName, value.toInt(), pa.attribute("min").toInt(), pa.attribute("max").toInt());
             delete toFillin;
             toFillin = NULL;
@@ -311,7 +311,7 @@ void EffectStackEdit::collectAllParameters() {
         QDomNode na = pa.firstChildElement("name");
         QString type = pa.attributes().namedItem("type").nodeValue();
         QString setValue;
-        if (type == "double" || type == "constant") {
+        if (type == "double") {
             QSlider* slider = ((Ui::Constval_UI*)valueItems[na.toElement().text()])->horizontalSlider;
             setValue = QString::number(slider->value());
         } else if (type == "list") {
index 2994ac9f1ceba038735fde2d1ff03875ae89f647..26af61c73015d64cd1ff8cfc58d4a7c0f1321627 100644 (file)
@@ -50,11 +50,11 @@ void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent) {
     }
     int diff = 1;
     if (m_selectedItem->type() == 8) {
-               QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
-               if (t->textInteractionFlags() & Qt::TextEditorInteraction) {
-                       QGraphicsScene::keyPressEvent(keyEvent);
-                       return;
-               }
+        QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
+        if (t->textInteractionFlags() & Qt::TextEditorInteraction) {
+            QGraphicsScene::keyPressEvent(keyEvent);
+            return;
+        }
     }
     if (keyEvent->modifiers() & Qt::ControlModifier) diff = 10;
     switch (keyEvent->key()) {
@@ -76,9 +76,9 @@ void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent) {
         break;
     case Qt::Key_Delete:
     case Qt::Key_Backspace:
-               delete m_selectedItem;
-               m_selectedItem = NULL;
-               emit selectionChanged();
+        delete m_selectedItem;
+        m_selectedItem = NULL;
+        emit selectionChanged();
         break;
     default:
         QGraphicsScene::keyPressEvent(keyEvent);
index 022ea16238e80883877b829876f44fd531f6c286..2cfa436d8bfe4b2c546f85d40cbfe29e47b4673f 100644 (file)
@@ -50,7 +50,7 @@ ProjectListView::ProjectListView(QWidget *parent)
     connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)),
             this, SLOT(configureColumns(const QPoint&)));
 
-    connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(slotFocusOut(QTreeWidgetItem *, QTreeWidgetItem *)));
+    //connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(slotFocusOut(QTreeWidgetItem *, QTreeWidgetItem *)));
 
     if (!KdenliveSettings::showdescriptioncolumn()) hideColumn(2);
     if (!KdenliveSettings::showratingcolumn()) hideColumn(3);
index 70c8ed511133a36a5d0068dac645c2f1600280db..77994737e068ac317eb146d4d36f6d4829610f34 100644 (file)
@@ -34,6 +34,8 @@ TransitionSettings::TransitionSettings(QWidget* parent): QWidget(parent) {
     connect(ui.listWidget, SIGNAL(currentRowChanged(int)), this, SLOT(slotTransitionChanged()));
     connect(this, SIGNAL(transferParamDesc(const QDomElement&, int , int)), effectEdit , SLOT(transferParamDesc(const QDomElement&, int , int)));
     connect(effectEdit, SIGNAL(parameterChanged(const QDomElement&, const QDomElement&)), this , SLOT(slotUpdateEffectParams(const QDomElement&, const QDomElement&)));
+    ui.splitter->setStretchFactor(0, 1);
+    ui.splitter->setStretchFactor(1, 10);
 }
 
 
index 5d25c3ac09814b95be0b73ac810e42fa8828f1ce..9b36f04e5a44d4301ed2561b84baab4699bbd2ab 100644 (file)
@@ -5,8 +5,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>323</width>
-    <height>217</height>
+    <width>291</width>
+    <height>189</height>
    </rect>
   </property>
   <property name="windowTitle" >
@@ -21,7 +21,7 @@
      <widget class="QListWidget" name="listWidget" />
      <widget class="QFrame" name="frame" >
       <property name="sizePolicy" >
-       <sizepolicy vsizetype="Preferred" hsizetype="MinimumExpanding" >
+       <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>