]> git.sesse.net Git - kdenlive/commitdiff
start implementing transitions. buttons in statusbar to show / hide thumbnails
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 8 Mar 2008 14:39:57 +0000 (14:39 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 8 Mar 2008 14:39:57 +0000 (14:39 +0000)
svn path=/branches/KDE4/; revision=2012

src/CMakeLists.txt
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/definitions.h
src/mainwindow.cpp
src/mainwindow.h
src/transition.cpp [new file with mode: 0644]
src/transition.h [new file with mode: 0644]
src/widgets/timelinebuttons_ui.ui [new file with mode: 0644]

index d9796e9ebd46e76c1be9ce6bb55ec76945f92f50..9755cff6e6dbd8b05c40dd70490f812ed3d4fb88 100644 (file)
@@ -36,6 +36,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/boolval_ui.ui
   widgets/colorval_ui.ui
   widgets/titlewidget_ui.ui
+  widgets/timelinebuttons_ui.ui
 )
  
 set(kdenlive_SRCS 
@@ -80,6 +81,7 @@ set(kdenlive_SRCS
   graphicsscenerectmove.cpp
   effectslistwidget.cpp
   titledocument.cpp
+  transition.cpp
 )
 
 kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
index 11a05721cd3cc7aaa2583c56d5b8fe04a5372dce..ebec5e33a5f1bf783597c3482817155e4d0a6f45 100644 (file)
@@ -347,20 +347,20 @@ void ClipItem::paint(QPainter *painter,
     }
 
     // For testing puspose only: draw transitions count
-/*    {
+    {
         painter->setPen(pen);
         QFont font = painter->font();
         QFont smallFont = font;
         smallFont.setPointSize(8);
         painter->setFont(smallFont);
-       QString txt = " Transitions: " + QString::number(m_transitionsList.count()) + " ";
-        QRectF txtBoundin = painter->boundingRect(br, Qt::AlignHCenter | Qt::AlignTop, txt);
+        QString txt = " Transitions: " + QString::number(m_transitionsList.count()) + " ";
+        QRectF txtBoundin = painter->boundingRect(br, Qt::AlignRight | Qt::AlignTop, txt);
         painter->fillRect(txtBoundin, QBrush(QColor(0, 0, 0, 150)));
         painter->drawText(txtBoundin, Qt::AlignCenter, txt);
         pen.setColor(Qt::black);
         painter->setPen(pen);
         painter->setFont(font);
-    }*/
+    }
 
     // Draw clip name
     QRectF txtBounding = painter->boundingRect(br, Qt::AlignHCenter | Qt::AlignTop, " " + m_clipName + " ");
@@ -474,11 +474,11 @@ void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path,
                 }
 
         }
-       if (m_clipType != AV) pixpainter.setBrush(QBrush(QColor(200, 200, 100)));
-       else {
-           pixpainter.setPen(QPen(QColor(0, 0, 0)));
-           pixpainter.setBrush(QBrush(QColor(60, 60, 60)));
-       }
+        if (m_clipType != AV) pixpainter.setBrush(QBrush(QColor(200, 200, 100)));
+        else {
+            pixpainter.setPen(QPen(QColor(0, 0, 0)));
+            pixpainter.setBrush(QBrush(QColor(60, 60, 60)));
+        }
         for (int i = 0;i < channels;i++) {
             if (fullAreaDraw) {
                 //pixpainter.fillPath(positiveChannelPaths[i].united(negativeChannelPaths[i]),QBrush(Qt::SolidPattern));//or singleif looks better
@@ -742,6 +742,11 @@ void ClipItem::deleteEffect(QString index) {
     update(boundingRect());
 }
 
+void ClipItem::addTransition(Transition tr) {
+    m_transitionsList.append(&tr);
+    update();
+}
+
 //virtual
 void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) {
     QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
index 692022036dcc560ef93607253566cb678931a904..e8b80e931a4d922ff016131289316d20bc1b5af3 100644 (file)
@@ -31,6 +31,7 @@
 #include "effectslist.h"
 #include "docclipbase.h"
 #include "kthumb.h"
+#include "transition.h"
 
 
 class ClipItem : public QObject, public QGraphicsRectItem {
@@ -81,6 +82,7 @@ public:
     /** Replace effect at pos ix with given value */
     void setEffectAt(int ix, QDomElement effect);
     void flashClip();
+    void addTransition(Transition tr);
 
 protected:
     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
@@ -122,6 +124,7 @@ private:
     bool m_hover;
 
     EffectsList m_effectList;
+    QList <Transition *> m_transitionsList;
     QMap<int, QPixmap> audioThumbCachePic;
     bool audioThumbWasDrawn, audioThumbReady;
     double framePixelWidth;
index 60b642763f41b194f1e1c2b1a53b62e21e64ce76..9838c1dbb30d261a64edb07039b94250dbd0cbae 100644 (file)
@@ -36,6 +36,7 @@
 #include "addeffectcommand.h"
 #include "editeffectcommand.h"
 #include "kdenlivesettings.h"
+#include "transition.h"
 
 CustomTrackView::CustomTrackView(KdenliveDoc *doc, QGraphicsScene * projectscene, QWidget *parent)
         : QGraphicsView(projectscene, parent), m_tracksCount(0), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_startPos(QPointF()), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(0), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()) {
@@ -340,6 +341,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
                     m_startPos = QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track());
                 else if (m_operationMode == RESIZEEND)
                     m_startPos = QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track());
+                else if (m_operationMode == TRANSITIONSTART) {
+                    Transition tra(m_dragItem, LUMA_TRANSITION, m_dragItem->startPos(), GenTime(2.5));
+                    m_dragItem->addTransition(tra);
+                }
                 kDebug() << "//////// ITEM CLICKED: " << m_startPos;
                 collision = true;
                 break;
index 6236e3a1d721cd83bd5e731e5f03308b1c1a5fc2..5c85b14fe15e4b97ef4b878a0e5e992fc2fb4d43 100644 (file)
 enum OPERATIONTYPE { NONE = 0, MOVE = 1, RESIZESTART = 2, RESIZEEND = 3, FADEIN = 4, FADEOUT = 5, TRANSITIONSTART = 6, TRANSITIONEND = 7};
 enum CLIPTYPE { UNKNOWN = 0, AUDIO = 1, VIDEO = 2, AV = 3, COLOR = 4, IMAGE = 5, TEXT = 6, SLIDESHOW = 7, VIRTUAL = 8, PLAYLIST = 9};
 
+enum TRANSITIONTYPE {
+    /** TRANSITIONTYPE: between 0-99: video trans, 100-199: video+audio trans, 200-299: audio trans */
+    LUMA_TRANSITION = 0,
+    COMPOSITE_TRANSITION = 1,
+    PIP_TRANSITION = 2,
+    LUMAFILE_TRANSITION = 3,
+    MIX_TRANSITION = 200
+};
+
 struct MltVideoProfile {
     QString path;
     QString description;
index ef4e12afdb21b7f15d51e7e987e1a38b7dfa7c56..c097243143019122d138b8664680b41a2530e0ff 100644 (file)
@@ -55,8 +55,9 @@
 #define ID_STATUS_MSG 1
 #define ID_EDITMODE_MSG 2
 #define ID_TIMELINE_MSG 3
-#define ID_TIMELINE_POS 4
-#define ID_TIMELINE_FORMAT 5
+#define ID_TIMELINE_BUTTONS 4
+#define ID_TIMELINE_POS 5
+#define ID_TIMELINE_FORMAT 6
 
 MainWindow::MainWindow(QWidget *parent)
         : KXmlGuiWindow(parent),
@@ -151,10 +152,24 @@ MainWindow::MainWindow(QWidget *parent)
     statusProgressBar->setVisible(false);
     statusLabel = new QLabel(this);
 
+    QWidget *w = new QWidget;
+    timeline_buttons_ui.setupUi(w);
+    timeline_buttons_ui.buttonVideo->setDown(KdenliveSettings::videothumbnails());
+    timeline_buttons_ui.buttonAudio->setDown(KdenliveSettings::audiothumbnails());
+    connect(timeline_buttons_ui.buttonVideo, SIGNAL(clicked()), this, SLOT(slotSwitchVideoThumbs()));
+    connect(timeline_buttons_ui.buttonAudio, SIGNAL(clicked()), this, SLOT(slotSwitchAudioThumbs()));
+
     statusBar()->insertPermanentWidget(0, statusProgressBar, 1);
     statusBar()->insertPermanentWidget(1, statusLabel, 1);
+    statusBar()->insertPermanentWidget(ID_TIMELINE_BUTTONS, w);
     statusBar()->insertPermanentFixedItem("00:00:00:00", ID_TIMELINE_POS);
     statusBar()->insertPermanentWidget(ID_TIMELINE_FORMAT, m_timecodeFormat);
+    statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 4);
+
+    timeline_buttons_ui.buttonVideo->setIcon(KIcon("display-video"));
+    timeline_buttons_ui.buttonVideo->setToolTip(i18n("Show video thumbnails"));
+    timeline_buttons_ui.buttonAudio->setIcon(KIcon("display-audio"));
+    timeline_buttons_ui.buttonAudio->setToolTip(i18n("Show audio thumbnails"));
 
     setupGUI(Default, "kdenliveui.rc");
 
@@ -530,6 +545,28 @@ void MainWindow::updateConfiguration() {
         currentTab->projectView()->checkAutoScroll();
         if (m_activeDocument) m_activeDocument->clipManager()->checkAudioThumbs();
     }
+    timeline_buttons_ui.buttonAudio->setDown(KdenliveSettings::audiothumbnails());
+    timeline_buttons_ui.buttonVideo->setDown(KdenliveSettings::videothumbnails());
+}
+
+void MainWindow::slotSwitchVideoThumbs() {
+    KdenliveSettings::setVideothumbnails(!KdenliveSettings::videothumbnails());
+    TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
+    if (currentTab) {
+        currentTab->refresh();
+    }
+    timeline_buttons_ui.buttonVideo->setDown(KdenliveSettings::videothumbnails());
+}
+
+void MainWindow::slotSwitchAudioThumbs() {
+    KdenliveSettings::setAudiothumbnails(!KdenliveSettings::audiothumbnails());
+    TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
+    if (currentTab) {
+        currentTab->refresh();
+        currentTab->projectView()->checkAutoScroll();
+        if (m_activeDocument) m_activeDocument->clipManager()->checkAudioThumbs();
+    }
+    timeline_buttons_ui.buttonAudio->setDown(KdenliveSettings::audiothumbnails());
 }
 
 void MainWindow::slotGotProgressInfo(KUrl url, int progress) {
index 455bdc1c5027011685a32df00dd8c42b5210cde3..de8f569c51cbc69041201f4c23caf6a6cbecbe87 100644 (file)
@@ -43,7 +43,7 @@
 #include "effectslist.h"
 #include "effectslistview.h"
 #include "effectstackview.h"
-
+#include "ui_timelinebuttons_ui.h"
 
 class MainWindow : public KXmlGuiWindow {
     Q_OBJECT
@@ -98,6 +98,8 @@ private:
     EffectsList m_audioEffects;
     EffectsList m_customEffects;
 
+    Ui::TimelineButtons_UI timeline_buttons_ui;
+
     KRecentFilesAction *m_fileOpenRecent;
     void readOptions();
     void saveOptions();
@@ -127,6 +129,8 @@ private slots:
     void slotEditProjectSettings();
     void slotDisplayActionMessage(QAction *a);
     void slotGotProgressInfo(KUrl url, int progress);
+    void slotSwitchVideoThumbs();
+    void slotSwitchAudioThumbs();
 };
 
 #endif
diff --git a/src/transition.cpp b/src/transition.cpp
new file mode 100644 (file)
index 0000000..2bcc5b8
--- /dev/null
@@ -0,0 +1,299 @@
+/***************************************************************************
+                          transition.cpp  -  description
+                             -------------------
+    begin                : Tue Jan 24 2006
+    copyright            : (C) 2006 by Jean-Baptiste Mardelle
+    email                : jb@ader.ch
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#include <QBrush>
+#include <qdom.h>
+
+#include <kdebug.h>
+#include <KIcon>
+#include <klocale.h>
+
+#include "transition.h"
+#include "clipitem.h"
+#include "kdenlivesettings.h"
+
+
+Transition::Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted) {
+    m_invertTransition = inverted;
+    m_singleClip = true;
+    m_transitionTrack = 0;
+    m_secondClip = NULL;
+    m_transitionType = type;
+    m_transitionName = getTransitionName(m_transitionType);
+
+    GenTime duration = endTime - startTime;
+
+    // Default duration = 2.5 seconds
+    GenTime defaultTransitionDuration = GenTime(2.5);
+
+    m_referenceClip = clipa;
+    if (startTime < m_referenceClip->startPos()) m_transitionStart = GenTime(0.0);
+    else if (startTime > m_referenceClip->endPos()) m_transitionStart = m_referenceClip->duration() - defaultTransitionDuration;
+    else m_transitionStart = startTime - m_referenceClip->startPos();
+
+    if (m_transitionStart + duration > m_referenceClip->duration())
+        m_transitionDuration = m_referenceClip->duration() - m_transitionStart;
+    else m_transitionDuration = duration;
+    m_secondClip = 0;
+}
+
+// create a transition from XML
+Transition::Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset) {
+    if (offset == GenTime()) offset = clip->startPos();
+    m_referenceClip = clip;
+    m_singleClip = true;
+    m_secondClip = NULL;
+    m_transitionStart = GenTime(transitionElement.attribute("start", QString::null).toInt(), m_referenceClip->fps());
+    m_transitionDuration = GenTime(transitionElement.attribute("end", QString::null).toInt(), m_referenceClip->fps()) - m_transitionStart;
+    m_transitionTrack = transitionElement.attribute("transition_track", "0").toInt();
+    m_transitionStart = m_transitionStart - offset;
+
+    m_invertTransition = transitionElement.attribute("inverted", "0").toInt();
+    uint transType = transitionElement.attribute("type", "0").toInt();
+    if (transType == LUMA_TRANSITION) m_transitionType = LUMA_TRANSITION;
+    else if (transType == COMPOSITE_TRANSITION) m_transitionType = COMPOSITE_TRANSITION;
+    else if (transType == PIP_TRANSITION) m_transitionType = PIP_TRANSITION;
+    else if (transType == LUMAFILE_TRANSITION) m_transitionType = LUMAFILE_TRANSITION;
+    else if (transType == MIX_TRANSITION) m_transitionType = MIX_TRANSITION;
+
+    // load transition parameters
+    typedef QMap<QString, QString> ParamMap;
+    ParamMap params;
+    for (QDomNode n = transitionElement.firstChild(); !n.isNull(); n = n.nextSibling()) {
+        QDomElement paramElement = n.toElement();
+        params[paramElement.tagName()] = paramElement.attribute("value", QString::null);
+    }
+    if (m_invertTransition) params["reverse"] = "1";
+    if (!params.isEmpty()) setTransitionParameters(params);
+
+    // Check if transition is valid (not outside of clip)
+    if (m_transitionStart > clip->duration())
+        m_transitionDuration = GenTime();
+}
+
+Transition::~Transition() {
+}
+
+void Transition::setTransitionType(TRANSITIONTYPE newType) {
+    m_transitionType = newType;
+    m_transitionName = getTransitionName(m_transitionType);
+}
+
+TRANSITIONTYPE Transition::transitionType() const {
+    return m_transitionType;
+}
+
+QString Transition::transitionTag()const {
+    switch (m_transitionType) {
+    case COMPOSITE_TRANSITION:
+        return "composite";
+    case PIP_TRANSITION:
+        return "composite";
+    case MIX_TRANSITION:
+        return "mix";
+    default:
+        return "luma";
+
+    }
+}
+
+QString Transition::getTransitionName(const TRANSITIONTYPE & type) {
+    if (type == COMPOSITE_TRANSITION) return i18n("Push");
+    else if (type == PIP_TRANSITION) return i18n("Pip");
+    else if (type == LUMAFILE_TRANSITION) return i18n("Wipe");
+    else if (type == MIX_TRANSITION) return i18n("Audio Fade");
+    return i18n("Crossfade");
+}
+
+TRANSITIONTYPE Transition::getTransitionForName(const QString & type) {
+    if (type == i18n("Push")) return COMPOSITE_TRANSITION;
+    else if (type == i18n("Pip")) return PIP_TRANSITION;
+    else if (type == i18n("Wipe")) return LUMAFILE_TRANSITION;
+    return LUMA_TRANSITION;
+}
+
+
+QString Transition::transitionName() const {
+    return m_transitionName;
+}
+
+void Transition::setTransitionParameters(const QMap < QString, QString > parameters) {
+    m_transitionParameters = parameters;
+}
+
+const QMap < QString, QString > Transition::transitionParameters() const {
+    return m_transitionParameters;
+}
+
+bool Transition::invertTransition() const {
+    if (!m_singleClip) {
+        if (m_referenceClip->startPos() < m_secondClip->startPos()) return true;
+        else return false;
+    }
+    return m_invertTransition;
+}
+
+QPixmap Transition::transitionPixmap() const {
+    KIcon icon;
+    if (m_transitionType == LUMA_TRANSITION) {
+        if (invertTransition()) icon = KIcon("kdenlive_trans_down");
+        else icon = KIcon("kdenlive_trans_up");
+    } else if (m_transitionType == COMPOSITE_TRANSITION) {
+        icon = KIcon("kdenlive_trans_wiper");
+    } else if (m_transitionType == LUMAFILE_TRANSITION) {
+        icon = KIcon("kdenlive_trans_luma");
+    } else icon = KIcon("kdenlive_trans_pip");
+    return icon.pixmap(QSize(15, 15));
+}
+
+int Transition::transitionTrack() const {
+    return m_transitionTrack;
+}
+
+void Transition::setTransitionTrack(int track) {
+    m_transitionTrack = track;
+}
+
+void Transition::setTransitionDirection(bool inv) {
+    m_invertTransition = inv;
+}
+
+int Transition::transitionStartTrack() const {
+    return m_referenceClip->track();
+}
+
+int Transition::transitionEndTrack() const {
+    if (!m_singleClip) return m_secondClip->track();
+    return m_referenceClip->track() + 1;
+    //TODO: calculate next video track
+}
+
+GenTime Transition::transitionDuration() const {
+    return transitionEndTime() - transitionStartTime();
+}
+
+GenTime Transition::transitionStartTime() const {
+    if (!m_singleClip) {
+        GenTime startb = m_secondClip->startPos();
+        GenTime starta = m_referenceClip->startPos();
+        if (startb > m_referenceClip->endPos()) return m_referenceClip->endPos() - GenTime(0.12);
+        if (startb > starta)
+            return startb;
+        return starta;
+    } else return m_referenceClip->startPos() + m_transitionStart;
+}
+
+
+GenTime Transition::transitionEndTime() const {
+    if (!m_singleClip) {
+        GenTime endb = m_secondClip->endPos();
+        GenTime enda = m_referenceClip->endPos();
+        if (m_secondClip->startPos() > enda) return enda;
+        if (endb < m_referenceClip->startPos()) return m_referenceClip->startPos() + GenTime(0.12);
+        else if (endb > enda) return enda;
+        else return endb;
+    } else {
+        if (m_transitionStart + m_transitionDuration > m_referenceClip->duration())
+            return m_referenceClip->endPos();
+        return m_referenceClip->startPos() + m_transitionStart + m_transitionDuration;
+    }
+}
+
+
+void Transition::resizeTransitionStart(GenTime time) {
+    if (!m_singleClip) return; //cannot resize automatic transitions
+    if (time < m_referenceClip->startPos()) time = m_referenceClip->startPos();
+    // Transitions shouldn't be shorter than 3 frames, about 0.12 seconds
+    if (transitionEndTime().ms() - time.ms() < 120.0) time = transitionEndTime() - GenTime(0.12);
+    m_transitionDuration = m_transitionDuration - (time - m_referenceClip->startPos() - m_transitionStart);
+    m_transitionStart = time - m_referenceClip->startPos();
+}
+
+void Transition::resizeTransitionEnd(GenTime time) {
+    if (!m_singleClip) return; //cannot resize automatic transitions
+    if (time > m_referenceClip->endPos()) time = m_referenceClip->endPos();
+    // Transitions shouldn't be shorter than 3 frames, about 0.12 seconds
+    if (time.ms() - transitionStartTime().ms() < 120.0) time = transitionStartTime() + GenTime(0.12);
+    m_transitionDuration = time - (m_referenceClip->startPos() + m_transitionStart);
+}
+
+void Transition::moveTransition(GenTime time) {
+    if (!m_singleClip) return; //cannot move automatic transitions
+    if (m_transitionStart + time < GenTime(0.0)) m_transitionStart = GenTime(0.0);
+    else if (m_transitionStart + time > m_referenceClip->duration() - m_transitionDuration)
+        m_transitionStart = m_referenceClip->duration() - m_transitionDuration;
+    else m_transitionStart = m_transitionStart + time;
+    if (m_transitionStart < GenTime(0.0)) m_transitionStart = GenTime(0.0);
+}
+
+bool Transition::hasClip(const ClipItem * clip) const {
+    if (clip == m_secondClip) return true;
+    return false;
+}
+
+bool Transition::belongsToClip(const ClipItem * clip) const {
+    if (clip == m_referenceClip) return true;
+    return false;
+}
+
+Transition *Transition::clone() {
+    return new Transition::Transition(m_referenceClip, this->toXML());
+    /*if (m_singleClip || m_secondClip == 0)
+        return new Transition::Transition(m_referenceClip);
+    else
+        //return new Transition::Transition(m_referenceClip, m_secondClip);
+    return new Transition::Transition(m_referenceClip, this->toXML());
+    */
+}
+
+Transition *Transition::reparent(ClipItem * clip) {
+    return new Transition::Transition(clip, this->toXML(), m_referenceClip->startPos());
+}
+
+bool Transition::isValid() const {
+    return (m_transitionDuration != GenTime());
+}
+
+const ClipItem *Transition::referencedClip() const {
+    return m_referenceClip;
+}
+
+QDomElement Transition::toXML() {
+    QDomDocument doc;
+    QDomElement effect = doc.createElement("ktransition");
+    effect.setAttribute("type", transitionType());
+    effect.setAttribute("inverted", invertTransition());
+    effect.setAttribute("transition_track", m_transitionTrack);
+    effect.setAttribute("start", transitionStartTime().frames(m_referenceClip->fps()));
+    effect.setAttribute("end", transitionEndTime().frames(m_referenceClip->fps()));
+
+    if (m_secondClip) {
+        effect.setAttribute("clipb_starttime", m_secondClip->startPos().frames(m_referenceClip->fps()));
+        effect.setAttribute("clipb_track", transitionEndTrack());
+    }
+
+
+    QMap<QString, QString>::Iterator it;
+    for (it = m_transitionParameters.begin(); it != m_transitionParameters.end(); ++it) {
+        QDomElement param = doc.createElement(it.key());
+        param.setAttribute("value", it.value());
+        effect.appendChild(param);
+    }
+
+    return effect;
+}
+
diff --git a/src/transition.h b/src/transition.h
new file mode 100644 (file)
index 0000000..3678fd3
--- /dev/null
@@ -0,0 +1,108 @@
+/***************************************************************************
+                          transition.h  -  description
+                             -------------------
+    begin                : Tue Jan 24 2006
+    copyright            : (C) 2006 by Jean-Baptiste Mardelle
+    email                : jb@ader.ch
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TRANSITION_H
+#define TRANSITION_H
+
+#include <QString>
+#include <QGraphicsRectItem>
+#include <qpixmap.h>
+#include <qdom.h>
+#include <qmap.h>
+
+#include "gentime.h"
+#include "definitions.h"
+
+
+/**Describes a Transition, with a name, parameters keyframes, etc.
+  *@author Jean-Baptiste Mardelle
+  */
+
+class ClipItem;
+
+class Transition {
+public:
+
+    Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted = false);
+    Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset = GenTime());
+    ~Transition();
+
+    /** Returns an XML representation of this transition. */
+    QDomElement toXML();
+
+    GenTime transitionStartTime() const;
+    GenTime transitionEndTime() const;
+    /** Return the track number of transition in the playlist*/
+    int transitionStartTrack() const;
+    int transitionEndTrack() const;
+    Transition *clone();
+    bool hasClip(const ClipItem * clip) const;
+    bool belongsToClip(const ClipItem * clip) const;
+    void resizeTransitionEnd(GenTime time);
+    void resizeTransitionStart(GenTime time);
+    void moveTransition(GenTime time);
+    bool invertTransition() const;
+    TRANSITIONTYPE transitionType() const;
+    QString transitionTag() const;
+    QString transitionName() const;
+    void setTransitionType(TRANSITIONTYPE newType);
+    const QMap < QString, QString > transitionParameters() const;
+    void setTransitionParameters(const QMap < QString, QString > parameters);
+    void setTransitionDirection(bool inv);
+    int transitionTrack() const;
+    void setTransitionTrack(int track);
+    QPixmap transitionPixmap() const;
+    Transition *reparent(ClipItem * clip);
+    bool isValid() const;
+    GenTime transitionDuration() const;
+    const ClipItem *referencedClip() const;
+
+private:
+
+    GenTime m_transitionStart;
+    GenTime m_transitionDuration;
+    QMap < QString, QString > m_transitionParameters;
+
+    /** The name of the transition used by mlt (composite, luma,...)*/
+    TRANSITIONTYPE m_transitionType;
+
+    /** The name of the transition to be displayed to user */
+    QString m_transitionName;
+
+    /** Should the transition be reversed */
+    bool m_invertTransition;
+
+    bool m_singleClip;
+
+    /** The track to which the transition is attached*/
+    int m_track;
+
+    /** The clip to which the transition is attached */
+    ClipItem *m_referenceClip;
+
+    /** The 2nd clip to which the transition is attached */
+    ClipItem *m_secondClip;
+    int m_transitionTrack;
+
+    /** Return the display name for a transition type */
+    QString getTransitionName(const TRANSITIONTYPE & type);
+
+    /** Return the transition type for a given name */
+    TRANSITIONTYPE getTransitionForName(const QString & type);
+};
+
+#endif
diff --git a/src/widgets/timelinebuttons_ui.ui b/src/widgets/timelinebuttons_ui.ui
new file mode 100644 (file)
index 0000000..f732d8b
--- /dev/null
@@ -0,0 +1,37 @@
+<ui version="4.0" >
+ <class>TimelineButtons_UI</class>
+ <widget class="QWidget" name="TimelineButtons_UI" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>58</width>
+    <height>30</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" >
+   <property name="margin" >
+    <number>0</number>
+   </property>
+   <item row="0" column="0" >
+    <widget class="QToolButton" name="buttonVideo" >
+     <property name="text" >
+      <string>V</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1" >
+    <widget class="QToolButton" name="buttonAudio" >
+     <property name="text" >
+      <string>A</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>