]> git.sesse.net Git - kdenlive/commitdiff
Fix compile, make composite transition usable
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Sep 2008 23:11:58 +0000 (23:11 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Sep 2008 23:11:58 +0000 (23:11 +0000)
svn path=/branches/KDE4/; revision=2398

src/effectstackedit.cpp
src/geometryval.cpp
src/geometryval.h
src/initeffects.cpp
src/keyframehelper.cpp
src/keyframehelper.h
src/renderer.cpp
src/widgets/geometryval_ui.ui

index 1dbc3b3527a0797c8327d7cc32f0918c07a3a4d4..b235c58207910ce1c519f78e0a906d8e8e637a7b 100644 (file)
@@ -103,10 +103,10 @@ void EffectStackEdit::transferParamDesc(const QDomElement& d, int , int) {
         QString value = pa.attribute("value").isNull() ?
                         pa.attribute("default") : pa.attribute("value");
         if (type == "geometry") {
-            pa.setAttribute("namedesc", "X;Y;Width;Height;Transparency");
+            /*pa.setAttribute("namedesc", "X;Y;Width;Height;Transparency");
             pa.setAttribute("format", "%d%,%d%:%d%x%d%:%d");
             pa.setAttribute("min", "-500;-500;0;0;0");
-            pa.setAttribute("max", "500;500;200;200;100");
+            pa.setAttribute("max", "500;500;200;200;100");*/
         } else if (type == "complex") {
             //pa.setAttribute("namedesc",pa.attribute("name"));
 
index 36befc500a93301809a2bcc3bdef11fd58280eb7..24bbb5e914aa9a21e87b8c9bc4dd58dd2174cc97 100644 (file)
 #include <QGraphicsView>
 #include <QVBoxLayout>
 #include <QGraphicsScene>
-#include "graphicsscenerectmove.h"
 #include <QGraphicsRectItem>
 #include <QMouseEvent>
+#include <QMenu>
+
 #include <KDebug>
 
+#include "graphicsscenerectmove.h"
 #include "geometryval.h"
 
 Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent): QWidget(parent), m_profile(profile) {
@@ -40,6 +42,8 @@ Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent): QWidge
     vbox2->addWidget(m_helper);
     vbox2->setContentsMargins(0, 0, 0, 0);
 
+    connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
+
     scene = new GraphicsSceneRectMove(this);
     scene->setTool(TITLE_SELECT);
     view->setScene(scene);
@@ -50,54 +54,110 @@ Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent): QWidge
     m_frameBorder->setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 1.0, Qt::DashLine));
     scene->addItem(m_frameBorder);
 
-    //scene->setSceneRect(-100.0*aspect, -100, 300.0*aspect, 300);
+    ui.buttonNext->setIcon(KIcon("media-skip-forward"));
+    ui.buttonPrevious->setIcon(KIcon("media-skip-backward"));
+    ui.buttonAdd->setIcon(KIcon("document-new"));
+    ui.buttonDelete->setIcon(KIcon("edit-delete"));
+
+    QMenu *configMenu = new QMenu(i18n("Misc..."), this);
+    ui.buttonMenu->setIcon(KIcon("system-run"));
+    ui.buttonMenu->setMenu(configMenu);
+    ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup);
+
+    //scene->setSceneRect(0, 0, profile.width * 2, profile.height * 2);
     //view->fitInView(m_frameBorder, Qt::KeepAspectRatio);
-    const double sc = 100.0 / profile.height;
+    const double sc = 100.0 / profile.height * 0.8;
+    QRectF srect = view->sceneRect();
+    view->setSceneRect(srect.x(), -srect.height() / 2, srect.width(), srect.height() * 2);
     view->scale(sc, sc);
     view->centerOn(m_frameBorder);
-    connect(scene , SIGNAL(itemMoved()) , this , SLOT(moveEvent()));
     connect(ui.buttonNext , SIGNAL(clicked()) , this , SLOT(slotNextFrame()));
     connect(ui.buttonPrevious , SIGNAL(clicked()) , this , SLOT(slotPreviousFrame()));
+    connect(ui.buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame()));
+    connect(ui.buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame()));
+}
+
+void Geometryval::slotTransparencyChanged(int transp) {
+    int pos = ui.spinPos->value();
+    Mlt::GeometryItem item;
+    int error = m_geom->next_key(&item, pos);
+    if (error || item.frame() != pos) {
+        // no keyframe under cursor
+        return;
+    }
+    item.mix(transp);
+    paramRect->setBrush(QColor(255, 0, 0, transp));
+    m_geom->insert(item);
+    emit parameterChanged();
+}
+
+void Geometryval::slotPositionChanged(int pos) {
+    ui.spinPos->setValue(pos);
+    m_helper->setValue(pos);
+    Mlt::GeometryItem item;
+    int error = m_geom->fetch(&item, pos);
+    if (error || item.key() == false) {
+        // no keyframe under cursor, adjust buttons
+        ui.buttonAdd->setEnabled(true);
+        ui.buttonDelete->setEnabled(false);
+        ui.widget->setEnabled(false);
+        ui.spinTransp->setEnabled(false);
+    } else {
+        ui.buttonAdd->setEnabled(false);
+        ui.buttonDelete->setEnabled(true);
+        ui.widget->setEnabled(true);
+        ui.spinTransp->setEnabled(true);
+    }
+    paramRect->setPos(item.x(), item.y());
+    paramRect->setRect(0, 0, item.w(), item.h());
+    ui.spinTransp->setValue(item.mix());
+    paramRect->setBrush(QColor(255, 0, 0, item.mix()));
+}
+
+void Geometryval::slotDeleteFrame() {
+    m_geom->remove(ui.spinPos->value());
+    m_helper->update();
+}
+
+void Geometryval::slotAddFrame() {
+    int pos = ui.spinPos->value();
+    Mlt::GeometryItem item;
+    item.frame(pos);
+    item.x(paramRect->pos().x());
+    item.y(paramRect->pos().y());
+    item.w(paramRect->rect().width());
+    item.h(paramRect->rect().height());
+    item.mix(ui.spinTransp->value());
+    m_geom->insert(item);
+    ui.buttonAdd->setEnabled(false);
+    ui.buttonDelete->setEnabled(true);
+    ui.widget->setEnabled(true);
+    ui.spinTransp->setEnabled(true);
+    m_helper->update();
 }
 
 void Geometryval::slotNextFrame() {
     Mlt::GeometryItem item;
-    m_geom->next_key(&item, ui.keyframeSlider->value() + 1);
+    int error = m_geom->next_key(&item, m_helper->value() + 1);
+    kDebug() << "// SEEK TO NEXT KFR: " << error;
+    if (error) return;
     int pos = item.frame();
-    ui.keyframeSlider->setValue(pos);
+    ui.spinPos->setValue(pos);
 }
 
 void Geometryval::slotPreviousFrame() {
     Mlt::GeometryItem item;
-    m_geom->prev_key(&item, ui.keyframeSlider->value() - 1);
+    int error = m_geom->prev_key(&item, m_helper->value() - 1);
+    kDebug() << "// SEEK TO NEXT KFR: " << error;
+    if (error) return;
     int pos = item.frame();
-    ui.keyframeSlider->setValue(pos);
+    ui.spinPos->setValue(pos);
 }
 
-void Geometryval::moveEvent() {
-    //if (event->button())
-
-    QDomNodeList namenode = param.elementsByTagName("parameter");
-    QDomNode pa = namenode.item(0);
-    QRectF rec = paramRect->rect().translated(paramRect->pos());
-    pa.attributes().namedItem("value").setNodeValue(
-        QString("%1;%2;%3;%4;%5").arg(
-            (int)rec.x()).arg(
-            (int)rec.y()).arg(
-            (int)(rec.x() + rec.width())).arg(
-            (int)(rec.y() + rec.height())).arg(
-            "100"
-        )
-    );
-    //pa.attributes().namedItem("start").setNodeValue("50");
-    QString dat;
-    QTextStream stre(&dat);
-    param.save(stre, 2);
-    kDebug() << dat;
-    emit parameterChanged();
-}
 
 QDomElement Geometryval::getParamDesc() {
+    param.setAttribute("value", m_geom->serialise());
+    kDebug() << " / / UPDATING TRANSITION VALUE: " << param.attribute("value");
     return param;
 }
 
@@ -105,22 +165,67 @@ void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame)
     param = par;
     QString val = par.attribute("value");
     char *tmp = (char *) qstrdup(val.toUtf8().data());
-    m_geom = new Mlt::Geometry(tmp, val.count(';') + 1, m_profile.width, m_profile.height);
+    m_geom = new Mlt::Geometry(tmp, maxFrame - minFrame, m_profile.width, m_profile.height);
     delete[] tmp;
+    kDebug() << " / / UPDATING TRANSITION VALUE: " << m_geom->serialise();
     //read param her and set rect
-    ui.keyframeSlider->setRange(0, maxFrame - minFrame);
-    m_helper->setKeyGeometry(m_geom, maxFrame - minFrame);
+    m_helper->setKeyGeometry(m_geom, maxFrame - minFrame - 1);
     QDomDocument doc;
     doc.appendChild(doc.importNode(par, true));
     kDebug() << "IMPORTED TRANS: " << doc.toString();
-
+    ui.spinPos->setMaximum(maxFrame - minFrame - 1);
     Mlt::GeometryItem item;
+    m_path = new QGraphicsPathItem();
+    m_path->setPen(QPen(Qt::red));
+    updateTransitionPath();
+
+    connect(scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties()));
+
     m_geom->fetch(&item, 0);
     paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w(), item.h()));
     paramRect->setPos(item.x(), item.y());
     paramRect->setZValue(0);
 
-    paramRect->setBrush(QColor(255, 0, 0, 40));
     paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0));
     scene->addItem(paramRect);
+    scene->addItem(m_path);
+    slotPositionChanged(0);
+    connect(ui.spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int)));
+    connect(ui.spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int)));
+}
+
+void Geometryval::updateTransitionPath() {
+    Mlt::GeometryItem item;
+    int pos = 0;
+    int counter = 0;
+    QPainterPath path;
+    while (true) {
+        if (m_geom->next_key(&item, pos) == 1) break;
+        pos = item.frame();
+        if (counter == 0) {
+            path.moveTo(item.x() + item.w() / 2, item.y() + item.h() / 2);
+        } else {
+            path.lineTo(item.x() + item.w() / 2, item.y() + item.h() / 2);
+        }
+        counter++;
+        pos++;
+    }
+    m_path->setPath(path);
+}
+
+void Geometryval::slotUpdateTransitionProperties() {
+    int pos = ui.spinPos->value();
+    Mlt::GeometryItem item;
+    int error = m_geom->next_key(&item, pos);
+    if (error || item.frame() != pos) {
+        // no keyframe under cursor
+        return;
+    }
+    item.x(paramRect->pos().x());
+    item.y(paramRect->pos().y());
+    item.w(paramRect->rect().width());
+    item.h(paramRect->rect().height());
+    m_geom->insert(item);
+    updateTransitionPath();
+    emit parameterChanged();
 }
index 3142aaaad807bc9fd30c3a362a8e89ea4f290733..cd4757029d460a4836223a771e4df82d3020dff3 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <QWidget>
 #include <QDomElement>
+#include <QGraphicsPathItem>
 
 #include <mlt++/Mlt.h>
 
@@ -33,11 +34,13 @@ class GraphicsSceneRectMove;
 class QGraphicsRectItem;
 class QMouseEvent;
 
+
 class Geometryval : public QWidget {
     Q_OBJECT
 public:
     Geometryval(const MltVideoProfile profile, QWidget* parent = 0);
     QDomElement getParamDesc();
+
 private:
     Ui::Geometryval ui;
     MltVideoProfile m_profile;
@@ -47,14 +50,20 @@ private:
     QGraphicsRectItem *paramRect;
     Mlt::Geometry *m_geom;
     KeyframeHelper *m_helper;
+    QGraphicsPathItem *m_path;
+    void updateTransitionPath();
 
 public slots:
     void setupParam(const QDomElement&, int, int);
-    void moveEvent();
 
 private slots:
     void slotNextFrame();
     void slotPreviousFrame();
+    void slotPositionChanged(int pos);
+    void slotDeleteFrame();
+    void slotAddFrame();
+    void slotUpdateTransitionProperties();
+    void slotTransparencyChanged(int transp);
 
 signals:
     void parameterChanged();
index f31a548c9a2f7d07e569d37cbcd3194b96e6abee..5bb491fa6adb41475603e3801e47820046db46b7 100644 (file)
@@ -542,12 +542,13 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList*
                 paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "", "100"));
                 paramList.append(quickParameterFill(ret, "Invert", "invert", "bool", "0", "0", "1"));
                 paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles, imagenamelist));
+                paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
                 //thumbnailer.prepareThumbnailsCall(imagelist);
 
             } else if (name == "composite") {
-                paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "20%,0%:50%x100%;30=50%,0%:50%x50%", "-500;-500;-500;-500;0", "500;500;500;500;100"));
+                paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%:100;-1=0%,0%:100%x100%:100", "-500;-500;-500;-500;0", "500;500;500;500;100"));
+                paramList.append(quickParameterFill(ret, "Distort", "distort", "bool", "1", "1", "1"));
                 tname.appendChild(ret.createTextNode("Composite"));
-
                 QDomDocument ret1;
                 QDomElement ktrans1 = ret1.createElement("ktransition");
                 ret1.appendChild(ktrans1);
@@ -581,7 +582,7 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList*
 
 
         }
-        paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
+
         ktrans.appendChild(tname);
 
         foreach(const QDomElement &e, paramList) {
index b880f0e39651ca19d39173cd0bb5c45582270418..c46928a7facf46ac6c351344f56c6b0fb4ac7926 100644 (file)
 #include <QStylePainter>
 
 #include <KDebug>
-#include <KIcon>
-#include <KCursor>
 #include <KGlobalSettings>
 
 #include "keyframehelper.h"
-
 #include "definitions.h"
 
 
 KeyframeHelper::KeyframeHelper(QWidget *parent)
-        : QWidget(parent), m_geom(NULL) {
+        : QWidget(parent), m_geom(NULL), m_position(0), m_scale(0) {
     setFont(KGlobalSettings::toolBarFont());
-
 }
 
 // virtual
 void KeyframeHelper::mousePressEvent(QMouseEvent * event) {
-    /*    if (event->button() == Qt::RightButton) {
-            m_contextMenu->exec(event->globalPos());
-            return;
-        }
-        m_view->activateMonitor();
-        int pos = (int)((event->x() + offset()));
-        m_moveCursor = RULER_CURSOR;
-        if (event->y() > 10) {
-            if (qAbs(pos - m_zoneStart * m_factor) < 4) m_moveCursor = RULER_START;
-            else if (qAbs(pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2) * m_factor) < 4) m_moveCursor = RULER_MIDDLE;
-            else if (qAbs(pos - m_zoneEnd * m_factor) < 4) m_moveCursor = RULER_END;
-        }
-        if (m_moveCursor == RULER_CURSOR)
-            m_view->setCursorPos((int) pos / m_factor);
-    */
+    m_position = event->x() / m_scale;
+    emit positionChanged(m_position);
+    update();
 }
 
 // virtual
 void KeyframeHelper::mouseMoveEvent(QMouseEvent * event) {
-    /*    if (event->buttons() == Qt::LeftButton) {
-            int pos = (int)((event->x() + offset()) / m_factor);
-            if (pos < 0) pos = 0;
-            if (m_moveCursor == RULER_CURSOR) {
-                m_view->setCursorPos(pos);
-                return;
-            } else if (m_moveCursor == RULER_START) m_zoneStart = pos;
-            else if (m_moveCursor == RULER_END) m_zoneEnd = pos;
-            else if (m_moveCursor == RULER_MIDDLE) {
-                int move = pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2);
-                m_zoneStart += move;
-                m_zoneEnd += move;
-            }
-            m_view->setDocumentModified();
-            update();
-        } else {
-            int pos = (int)((event->x() + offset()));
-            if (event->y() <= 10) setCursor(Qt::ArrowCursor);
-            else if (qAbs(pos - m_zoneStart * m_factor) < 4) setCursor(KCursor("left_side", Qt::SizeHorCursor));
-            else if (qAbs(pos - m_zoneEnd * m_factor) < 4) setCursor(KCursor("right_side", Qt::SizeHorCursor));
-            else if (qAbs(pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2) * m_factor) < 4) setCursor(Qt::SizeHorCursor);
-            else setCursor(Qt::ArrowCursor);
-        }
-    */
+    m_position = event->x() / m_scale;
+    m_position = qMax(0, m_position);
+    m_position = qMin(m_length, m_position);
+    emit positionChanged(m_position);
+    update();
 }
 
 
 // virtual
 void KeyframeHelper::wheelEvent(QWheelEvent * e) {
+    if (e->delta() < 0) m_position = m_position - 1;
+    else m_position = m_position + 1;
+    m_position = qMax(0, m_position);
+    m_position = qMin(m_length, m_position);
+    emit positionChanged(m_position);
+    update();
     /*    int delta = 1;
         if (e->modifiers() == Qt::ControlModifier) delta = m_timecode.fps();
         if (e->delta() < 0) delta = 0 - delta;
@@ -96,26 +67,45 @@ void KeyframeHelper::wheelEvent(QWheelEvent * e) {
 // virtual
 void KeyframeHelper::paintEvent(QPaintEvent *e) {
     QStylePainter p(this);
-    p.setClipRect(e->rect());
-
+    const QRectF clipRect = e->rect();
+    p.setClipRect(clipRect);
+    m_scale = (double) width() / m_length;
     if (m_geom != NULL) {
         int pos = 0;
+        p.setBrush(QColor(255, 20, 20));
         Mlt::GeometryItem item;
-        for (int i = 0; i < m_geom->length(); i++) {
-            m_geom->next_key(&item, pos);
+        while (true) {
+            if (m_geom->next_key(&item, pos) == 1) break;
             pos = item.frame();
-            kDebug() << "++ PAINTING POS: " << pos;
-            int scaledPos = pos * width() / m_length;
-            p.fillRect(QRect(scaledPos - 1, 0, 2, 15), QBrush(QColor(255, 20, 20)));
+            int scaledPos = pos * m_scale;
+            p.drawLine(scaledPos, clipRect.y() , scaledPos, clipRect.bottom());
+            //p.fillRect(QRect(scaledPos - 1, 0, 2, 15), QBrush(QColor(255, 20, 20)));
             pos++;
         }
     }
+    // draw pointer
+    QPolygon pa(3);
+    const int cursor = m_position * m_scale;
+    pa.setPoints(3, cursor - 5, 14, cursor + 5, 14, cursor/*+0*/, 9);
+    p.setBrush(palette().dark().color());
+    p.drawPolygon(pa);
+
+
+}
+
+const int KeyframeHelper::value() const {
+    return m_position;
+}
+
+void KeyframeHelper::setValue(const int pos) {
+    if (pos == m_position) return;
+    m_position = pos;
+    update();
 }
 
 void KeyframeHelper::setKeyGeometry(Mlt::Geometry *geom, const int length) {
     m_geom = geom;
     m_length = length;
-    kDebug() << "KEYFRAMES: " << m_geom->length() << ", TRANS SOZE: " << m_length;
     update();
 }
 
index c7d4de1db91837351bf5506425366f12b7362360..0b295650f4e429b9cfd4a298d225077b8f7f12a0 100644 (file)
@@ -32,6 +32,7 @@ class KeyframeHelper : public QWidget {
 
 public:
     KeyframeHelper(QWidget *parent = 0);
+    const int value() const;
 
 protected:
     virtual void paintEvent(QPaintEvent * /*e*/);
@@ -42,9 +43,15 @@ protected:
 private:
     Mlt::Geometry *m_geom;
     int m_length;
+    int m_position;
+    double m_scale;
 
 public slots:
     void setKeyGeometry(Mlt::Geometry *geom, const int length);
+    void setValue(const int pos);
+
+signals:
+    void positionChanged(int);
 };
 
 #endif
index 629a4d5ed75d2274018a9da640c41699385b3158..d510b56fe266c0f254f326356d7049b929194709 100644 (file)
@@ -579,6 +579,11 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId) {
 
     AVFormatContext *context = (AVFormatContext *) mlt_properties_get_data(properties, "video_context", NULL);
     if (context != NULL) {
+        /*if (context->duration == AV_NOPTS_VALUE) {
+        kDebug() << " / / / / / / / /ERRROR / / / CLIP HAS UNKNOWN DURATION";
+            emit removeInvalidClip(clipId);
+            return;
+        }*/
         // Get the video_index
         int index = mlt_properties_get_int(properties, "video_index");
 
index 677c56a3ce4308ac26b32c4cc4115ae315943284..a12e8c13d92658d3a278dd396de1503c78fe04a2 100644 (file)
@@ -5,15 +5,18 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>273</width>
-    <height>256</height>
+    <width>370</width>
+    <height>226</height>
    </rect>
   </property>
   <property name="windowTitle" >
    <string>Form</string>
   </property>
   <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" colspan="7" >
+   <property name="verticalSpacing" >
+    <number>0</number>
+   </property>
+   <item row="0" column="0" colspan="10" >
     <widget class="QWidget" native="1" name="widget" >
      <property name="sizePolicy" >
       <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" >
      </property>
     </widget>
    </item>
-   <item row="1" column="0" colspan="7" >
-    <layout class="QVBoxLayout" name="verticalLayout" >
-     <item>
-      <widget class="QFrame" name="keyframeWidget" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Preferred" hsizetype="MinimumExpanding" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="minimumSize" >
-        <size>
-         <width>0</width>
-         <height>15</height>
-        </size>
-       </property>
-       <property name="maximumSize" >
-        <size>
-         <width>16777215</width>
-         <height>15</height>
-        </size>
-       </property>
-       <property name="frameShape" >
-        <enum>QFrame::NoFrame</enum>
-       </property>
-       <property name="frameShadow" >
-        <enum>QFrame::Plain</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QSlider" name="keyframeSlider" >
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-      </widget>
-     </item>
-    </layout>
+   <item row="1" column="0" colspan="10" >
+    <widget class="QFrame" name="keyframeWidget" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Preferred" hsizetype="MinimumExpanding" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize" >
+      <size>
+       <width>0</width>
+       <height>15</height>
+      </size>
+     </property>
+     <property name="maximumSize" >
+      <size>
+       <width>16777215</width>
+       <height>15</height>
+      </size>
+     </property>
+     <property name="frameShape" >
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow" >
+      <enum>QFrame::Plain</enum>
+     </property>
+    </widget>
    </item>
    <item row="2" column="0" >
-    <widget class="KArrowButton" name="buttonPrevious" >
-     <property name="arrowType" stdset="0" >
-      <number>3</number>
+    <widget class="QToolButton" name="buttonMenu" >
+     <property name="text" >
+      <string>M</string>
+     </property>
+     <property name="arrowType" >
+      <enum>Qt::NoArrow</enum>
      </property>
     </widget>
    </item>
    <item row="2" column="1" >
-    <widget class="KArrowButton" name="buttonNext" >
-     <property name="arrowType" stdset="0" >
-      <number>4</number>
+    <widget class="QToolButton" name="buttonPrevious" >
+     <property name="text" >
+      <string>P</string>
      </property>
     </widget>
    </item>
    <item row="2" column="2" >
+    <widget class="QToolButton" name="buttonNext" >
+     <property name="text" >
+      <string>N</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3" >
     <widget class="QToolButton" name="buttonAdd" >
      <property name="text" >
       <string>A</string>
      </property>
     </widget>
    </item>
-   <item row="2" column="3" >
+   <item row="2" column="4" >
     <widget class="QToolButton" name="buttonDelete" >
      <property name="text" >
       <string>D</string>
      </property>
     </widget>
    </item>
-   <item row="2" column="4" >
+   <item row="2" column="5" >
+    <widget class="QLabel" name="label_2" >
+     <property name="text" >
+      <string>Opacity</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="6" >
+    <widget class="QSpinBox" name="spinTransp" >
+     <property name="maximum" >
+      <number>100</number>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="8" >
+    <widget class="QLabel" name="label_3" >
+     <property name="text" >
+      <string>Pos</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="9" >
+    <widget class="QSpinBox" name="spinPos" />
+   </item>
+   <item row="2" column="7" >
     <spacer name="horizontalSpacer" >
      <property name="orientation" >
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0" >
       <size>
-       <width>17</width>
-       <height>29</height>
+       <width>40</width>
+       <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
-   <item row="2" column="5" >
-    <widget class="QLabel" name="label_2" >
-     <property name="text" >
-      <string>Transparency</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="6" >
-    <widget class="QSpinBox" name="spinBox" />
-   </item>
   </layout>
  </widget>
- <customwidgets>
-  <customwidget>
-   <class>KArrowButton</class>
-   <extends>QPushButton</extends>
-   <header>karrowbutton.h</header>
-  </customwidget>
- </customwidgets>
  <resources/>
  <connections/>
 </ui>