]> git.sesse.net Git - kdenlive/commitdiff
Rewrite UI for title animation
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 31 Aug 2009 12:14:41 +0000 (12:14 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 31 Aug 2009 12:14:41 +0000 (12:14 +0000)
svn path=/trunk/kdenlive/; revision=3865

src/graphicsscenerectmove.cpp
src/projectlist.cpp
src/titledocument.cpp
src/titledocument.h
src/titlewidget.cpp
src/titlewidget.h
src/widgets/titlewidget_ui.ui

index 275c2a4da4fa0e8271d1a44ce541f5a8be78c8be..7cd2e9a32d90dee110c4fd48391451ed1b70420a 100644 (file)
@@ -74,7 +74,7 @@ void GraphicsSceneRectMove::setTool(TITLETOOL tool)
 
 void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent)
 {
-    if (m_selectedItem == NULL) {
+    if (m_selectedItem == NULL || !(m_selectedItem->flags() & QGraphicsItem::ItemIsMovable)) {
         QGraphicsScene::keyPressEvent(keyEvent);
         return;
     }
@@ -165,7 +165,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e)
                 break;
             }
         }
-        if (item == NULL) {
+        if (item == NULL  || !(item->flags() & QGraphicsItem::ItemIsSelectable)) {
             if (m_selectedItem && m_selectedItem->type() == 8) {
                 // disable text editing
                 QGraphicsTextItem *t = static_cast<QGraphicsTextItem *>(m_selectedItem);
@@ -182,7 +182,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e)
                 }
             }
         }
-        if (item != NULL) {
+        if (item != NULL && item->flags() & QGraphicsItem::ItemIsMovable) {
             m_sceneClickPoint = e->scenePos();
             m_selectedItem = item;
             kDebug() << "/////////  ITEM TYPE: " << item->type();
index 50f2ad794daec19fadeea33e5898d603605309bb..52e4287113b88ce571d6eeb87d17693543c68600 100644 (file)
@@ -878,7 +878,7 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update)
         int height = 50;
         int width = (int)(height  * m_render->dar());
         if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
-        else if (clip->clipType() == TEXT || clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height);
+        else if (clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height);
         else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
         if (!pix.isNull()) {
             m_listView->blockSignals(true);
index a402a195d2fd3d6a8a69f2c6b73e605b18e1c1e5..514f3239286bbb51760d1492a07ceac64baab6a9 100644 (file)
@@ -47,7 +47,7 @@ void TitleDocument::setScene(QGraphicsScene* _scene, int width, int height)
     m_height = height;
 }
 
-QDomDocument TitleDocument::xml(QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv)
+QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv)
 {
     QDomDocument doc;
 
@@ -128,18 +128,11 @@ QDomDocument TitleDocument::xml(QGraphicsPolygonItem* startv, QGraphicsPolygonIt
     if (startv && endv) {
         QDomElement endp = doc.createElement("endviewport");
         QDomElement startp = doc.createElement("startviewport");
-        endp.setAttribute("x", endv->data(0).toString());
-        endp.setAttribute("y", endv->data(1).toString());
-        endp.setAttribute("size", endv->data(2).toString());
-        endp.setAttribute("rect", rectFToString(endv->boundingRect()));
-
-        startp.setAttribute("x", startv->data(0).toString());
-        startp.setAttribute("y", startv->data(1).toString());
-        startp.setAttribute("size", startv->data(2).toString());
-        startp.setAttribute("rect", rectFToString(startv->boundingRect()));
-
-        startp.setAttribute("z-index", startv->zValue());
-        endp.setAttribute("z-index", endv->zValue());
+        QRectF r(endv->pos().x(), endv->pos().y(), endv->rect().width(), endv->rect().height());
+        endp.setAttribute("rect", rectFToString(r));
+        QRectF r2(startv->pos().x(), startv->pos().y(), startv->rect().width(), startv->rect().height());
+        startp.setAttribute("rect", rectFToString(r2));
+
         main.appendChild(startp);
         main.appendChild(endp);
     }
@@ -169,7 +162,7 @@ QColor TitleDocument::getBackgroundColor()
 }
 
 
-bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int out)
+bool TitleDocument::saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out)
 {
     if (!m_scene)
         return false;
@@ -192,7 +185,7 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv,
     return KIO::NetAccess::upload(tmpfile.fileName(), url, 0);
 }
 
-int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int *out)
+int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out)
 {
     QDomNodeList titles = doc.elementsByTagName("kdenlivetitle");
     //TODO: Check if the opened title size is equal to project size, otherwise warn user and rescale
@@ -313,23 +306,14 @@ int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, Q
                 }
             } else if (items.item(i).nodeName() == "startviewport" && startv) {
                 QString rect = items.item(i).attributes().namedItem("rect").nodeValue();
-                startv->setPolygon(stringToRect(rect));
-                int x = items.item(i).attributes().namedItem("x").nodeValue().toInt();
-                int y = items.item(i).attributes().namedItem("y").nodeValue().toInt();
-                int size = items.item(i).attributes().namedItem("size").nodeValue().toInt();
-                startv->setData(0, x);
-                startv->setData(1, y);
-                startv->setData(2, size);
-                //startv->setPos(p);
+                QRectF r = stringToRect(rect);
+                startv->setRect(0, 0, r.width(), r.height());
+                startv->setPos(r.topLeft());
             } else if (items.item(i).nodeName() == "endviewport" && endv) {
                 QString rect = items.item(i).attributes().namedItem("rect").nodeValue();
-                endv->setPolygon(stringToRect(rect));
-                int x = items.item(i).attributes().namedItem("x").nodeValue().toInt();
-                int y = items.item(i).attributes().namedItem("y").nodeValue().toInt();
-                int size = items.item(i).attributes().namedItem("size").nodeValue().toInt();
-                endv->setData(0, x);
-                endv->setData(1, y);
-                endv->setData(2, size);
+                QRectF r = stringToRect(rect);
+                endv->setRect(0, 0, r.width(), r.height());
+                endv->setPos(r.topLeft());
             }
         }
     }
index 2d006475a620a71e46688bfd21ae7fe3c309460f..8b15bb5ffeb830dc2f4638d2d1ccb7cfc801c01f 100644 (file)
@@ -22,7 +22,7 @@
 #include <KUrl>
 
 class QGraphicsScene;
-class QGraphicsPolygonItem;
+class QGraphicsRectItem;
 
 class TitleDocument
 {
@@ -30,9 +30,9 @@ class TitleDocument
 public:
     TitleDocument();
     void setScene(QGraphicsScene* scene, int width, int height);
-    bool saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int out);
-    QDomDocument xml(QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv);
-    int loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int *out);
+    bool saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out);
+    QDomDocument xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv);
+    int loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out);
     /** \brief Get the background color (incl. alpha) from the document, if possibly
      * \returns The background color of the document, inclusive alpha. If none found, returns (0,0,0,0) */
     QColor getBackgroundColor();
index 1dc30385ea629a6a3d1b283bf7c157fd95893cf4..d6de9291e821c492076104564090ffbde5f0f654 100644 (file)
@@ -86,12 +86,12 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render
     connect(rectBColor, SIGNAL(clicked()), this, SLOT(rectChanged()));
     connect(rectLineWidth, SIGNAL(valueChanged(int)), this, SLOT(rectChanged()));
 
-    connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
+    /*connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
     connect(startViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
     connect(startViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
     connect(endViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
     connect(endViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
-    connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
+    connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));*/
 
     connect(zValue, SIGNAL(valueChanged(int)), this, SLOT(zIndexChanged(int)));
     connect(itemzoom, SIGNAL(valueChanged(int)), this, SLOT(itemScaled(int)));
@@ -261,18 +261,22 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render
     // mbd: load saved settings
     readChoices();
 
-    initViewports();
     graphicsView->show();
     //graphicsView->setRenderHint(QPainter::Antialiasing);
     graphicsView->setInteractive(true);
     //graphicsView->resize(400, 300);
     kDebug() << "// TITLE WIDGWT: " << graphicsView->viewport()->width() << "x" << graphicsView->viewport()->height();
     //toolBox->setItemEnabled(2, false);
+    m_startViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight));
+    m_endViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight));
     if (!url.isEmpty()) loadTitle(url);
     else {
         slotTextTool();
         QTimer::singleShot(200, this, SLOT(slotAdjustZoom()));
     }
+    initAnimation();
+    connect(anim_start, SIGNAL(toggled(bool)), this, SLOT(slotAnimStart(bool)));
+    connect(anim_end, SIGNAL(toggled(bool)), this, SLOT(slotAnimEnd(bool)));
 }
 
 TitleWidget::~TitleWidget()
@@ -360,7 +364,12 @@ void TitleWidget::slotSelectTool()
             break;
         }
     }
+
     enableToolbars(t);
+    if (t == TITLE_RECTANGLE && (l.at(0) == m_endViewport || l.at(0) == m_startViewport)) {
+        //graphicsView->centerOn(l.at(0));
+        t = TITLE_NONE;
+    }
     showToolbars(t);
 
     if (l.size() > 0) {
@@ -520,11 +529,10 @@ void TitleWidget::displayBackgroundFrame()
     }
 }
 
-void TitleWidget::initViewports()
+void TitleWidget::initAnimation()
 {
-    m_startViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
-    m_endViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
-
+    align_box->setEnabled(false);
+    align_box->setVisible(false);
     QPen startpen(Qt::DotLine);
     QPen endpen(Qt::DashDotLine);
     startpen.setColor(QColor(100, 200, 100, 140));
@@ -533,9 +541,6 @@ void TitleWidget::initViewports()
     m_startViewport->setPen(startpen);
     m_endViewport->setPen(endpen);
 
-    startViewportSize->setValue(100);
-    endViewportSize->setValue(100);
-
     m_startViewport->setZValue(-1000);
     m_endViewport->setZValue(-1000);
 
@@ -718,24 +723,34 @@ void TitleWidget::selectionChanged()
             showToolbars(TITLE_RECTANGLE);
             settingUp = true;
             QGraphicsRectItem *rec = static_cast <QGraphicsRectItem *>(l.at(0));
-            toolBox->setCurrentIndex(0);
-            //toolBox->setItemEnabled(3, true);
-            rectFAlpha->setValue(rec->pen().color().alpha());
-            rectBAlpha->setValue(rec->brush().color().alpha());
-            //kDebug() << rec->brush().color().alpha();
-            QColor fcol = rec->pen().color();
-            QColor bcol = rec->brush().color();
-            //fcol.setAlpha(255);
-            //bcol.setAlpha(255);
-            rectFColor->setColor(fcol);
-            rectBColor->setColor(bcol);
-            settingUp = false;
-            rectLineWidth->setValue(rec->pen().width());
+            if (rec == m_startViewport || rec == m_endViewport) {
+                toolBox->setCurrentIndex(3);
+                toolBox->widget(0)->setEnabled(false);
+                toolBox->widget(1)->setEnabled(false);
+                enableToolbars(TITLE_NONE);
+            }
+            else {
+                toolBox->widget(0)->setEnabled(true);
+                toolBox->widget(1)->setEnabled(true);
+                toolBox->setCurrentIndex(0);
+                //toolBox->setItemEnabled(3, true);
+                rectFAlpha->setValue(rec->pen().color().alpha());
+                rectBAlpha->setValue(rec->brush().color().alpha());
+                //kDebug() << rec->brush().color().alpha();
+                QColor fcol = rec->pen().color();
+                QColor bcol = rec->brush().color();
+                //fcol.setAlpha(255);
+                //bcol.setAlpha(255);
+                rectFColor->setColor(fcol);
+                rectBColor->setColor(bcol);
+                settingUp = false;
+                rectLineWidth->setValue(rec->pen().width());
+                enableToolbars(TITLE_RECTANGLE);
+            }
 
             updateAxisButtons(l.at(0));
             updateCoordinates(rec);
             updateDimension(rec);
-            enableToolbars(TITLE_RECTANGLE);
 
         } else if (l.at(0)->type() == IMAGEITEM) {
             showToolbars(TITLE_IMAGE);
@@ -1281,7 +1296,7 @@ void TitleWidget::setupViewports()
 {
     //double aspect_ratio = 4.0 / 3.0;//read from project
     //better zoom centered, but render uses only the created rect, so no problem to change the zoom function
-    QRectF sp(0, 0, startViewportSize->value() * m_frameWidth / 100.0 , startViewportSize->value()* m_frameHeight / 100.0);
+    /*QRectF sp(0, 0, startViewportSize->value() * m_frameWidth / 100.0 , startViewportSize->value()* m_frameHeight / 100.0);
     QRectF ep(0, 0, endViewportSize->value() * m_frameWidth / 100.0, endViewportSize->value() * m_frameHeight / 100.0);
     // use a polygon thiat uses 16:9 and 4:3 rects forpreview the size in all aspect ratios ?
     QPolygonF spoly(sp);
@@ -1298,7 +1313,7 @@ void TitleWidget::setupViewports()
         m_endViewport->setData(0, endViewportX->value());
         m_endViewport->setData(1, endViewportY->value());
         m_endViewport->setData(2, endViewportSize->value());
-    }
+    }*/
 }
 
 void TitleWidget::loadTitle(KUrl url)
@@ -1322,6 +1337,7 @@ void TitleWidget::loadTitle(KUrl url)
             KIO::NetAccess::removeTempFile(tmpfile);
         }
         setXml(doc);
+        
         /*int out;
         m_count = m_titledocument.loadDocument(url, m_startViewport, m_endViewport, &out) + 1;
         adjustFrameSize();
@@ -1342,6 +1358,8 @@ void TitleWidget::loadTitle(KUrl url)
 
 void TitleWidget::saveTitle(KUrl url)
 {
+    if (anim_start->isChecked()) slotAnimStart(false);
+    if (anim_end->isChecked()) slotAnimEnd(false);
     if (url.isEmpty()) url = KFileDialog::getSaveUrl(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this, i18n("Save Title"));
     if (!url.isEmpty()) {
         if (m_titledocument.saveDocument(url, m_startViewport, m_endViewport, m_tc.getFrameCount(title_duration->text())) == false)
@@ -1399,12 +1417,12 @@ void TitleWidget::setXml(QDomDocument doc)
     horizontalSlider->blockSignals(false);
     kcolorbutton->blockSignals(false);
 
-    startViewportX->setValue(m_startViewport->data(0).toInt());
+    /*startViewportX->setValue(m_startViewport->data(0).toInt());
     startViewportY->setValue(m_startViewport->data(1).toInt());
     startViewportSize->setValue(m_startViewport->data(2).toInt());
     endViewportX->setValue(m_endViewport->data(0).toInt());
     endViewportY->setValue(m_endViewport->data(1).toInt());
-    endViewportSize->setValue(m_endViewport->data(2).toInt());
+    endViewportSize->setValue(m_endViewport->data(2).toInt());*/
 
     QTimer::singleShot(200, this, SLOT(slotAdjustZoom()));
     slotSelectTool();
@@ -1461,6 +1479,8 @@ QImage TitleWidget::renderedPixmap()
 /** \brief Connected to the accepted signal - calls writeChoices */
 void TitleWidget::slotAccepted()
 {
+    if (anim_start->isChecked()) slotAnimStart(false);
+    if (anim_end->isChecked()) slotAnimEnd(false);
     writeChoices();
 }
 
@@ -1534,6 +1554,65 @@ void TitleWidget::adjustFrameSize()
     displayBackgroundFrame();
 }
 
+void TitleWidget::slotAnimStart(bool anim)
+{
+    if (anim && anim_end->isChecked()) {
+        anim_end->setChecked(false);
+        m_endViewport->setZValue(-1000);
+        m_endViewport->setBrush(QBrush());
+    }
+    slotSelectTool();
+    QList<QGraphicsItem *> list = m_scene->items();
+    for (int i = 0; i < list.count(); i++) {
+        list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim);
+        list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim);
+    }
+    align_box->setEnabled(anim);
+    frame_toolbar->setEnabled(!anim);
+    rect_properties->setEnabled(!anim);
+    if (anim) {
+        m_startViewport->setZValue(1100);
+        QColor col = m_startViewport->pen().color();
+        col.setAlpha(100);
+        m_startViewport->setBrush(col);
+        m_startViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+    }
+    else {
+        m_startViewport->setZValue(-1000);
+        m_startViewport->setBrush(QBrush());
+        m_startViewport->setFlags(0);
+    }
+    
+}
 
+void TitleWidget::slotAnimEnd(bool anim)
+{
+    if (anim && anim_start->isChecked()) {
+        anim_start->setChecked(false);
+        m_startViewport->setZValue(-1000);
+        m_startViewport->setBrush(QBrush());
+    }
+    slotSelectTool();
+    QList<QGraphicsItem *> list = m_scene->items();
+    for (int i = 0; i < list.count(); i++) {
+        list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim);
+        list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim);
+    }
+    align_box->setEnabled(anim);
+    frame_toolbar->setEnabled(!anim);
+    rect_properties->setEnabled(!anim);
+    if (anim) {
+        m_endViewport->setZValue(1100);
+        QColor col = m_endViewport->pen().color();
+        col.setAlpha(100);
+        m_endViewport->setBrush(col);
+        m_endViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+    }
+    else {
+        m_endViewport->setZValue(-1000);
+        m_endViewport->setBrush(QBrush());
+        m_endViewport->setFlags(0);
+    }
+}
 
 
index 288daa840b6cb3dcc574ab54d97af1e28fd0528f..af5b289a9f1ea62da05ac5fd625e3bfc487aa803 100644 (file)
@@ -83,9 +83,9 @@ protected:
     virtual void resizeEvent(QResizeEvent * event);
 
 private:
-    QGraphicsPolygonItem *m_startViewport, *m_endViewport;
+    QGraphicsRectItem *m_startViewport, *m_endViewport;
     GraphicsSceneRectMove *m_scene;
-    void initViewports();
+    void initAnimation();
     QMap<QGraphicsItem*, Transform > m_transformations;
     TitleDocument m_titledocument;
     QGraphicsRectItem *m_frameBorder;
@@ -229,6 +229,8 @@ private slots:
     void slotSelectTool();
     void slotImageTool();
 
+    void slotAnimStart(bool);
+    void slotAnimEnd(bool);
 
     /** \brief Called when accepted, stores the user selections for next time use */
     void slotAccepted();
index 7bf81640adf1a0d37af00db5e413f0ef0073abd6..6f6aafa91eb8638e94cb6c5cd0c7ace06ac4837d 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>736</width>
-    <height>515</height>
+    <height>638</height>
    </rect>
   </property>
   <property name="sizePolicy">
          </property>
         </widget>
        </item>
+       <item row="1" column="0" colspan="2">
+        <widget class="Line" name="line_3">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
        <item row="2" column="0" colspan="2">
         <widget class="QToolBox" name="toolBox">
          <property name="sizePolicy">
           </sizepolicy>
          </property>
          <property name="currentIndex">
-          <number>0</number>
+          <number>2</number>
          </property>
          <widget class="QWidget" name="BasicOperations">
           <property name="geometry">
             <x>0</x>
             <y>0</y>
             <width>347</width>
-            <height>140</height>
+            <height>238</height>
            </rect>
           </property>
           <attribute name="label">
            <rect>
             <x>0</x>
             <y>0</y>
-            <width>94</width>
-            <height>65</height>
+            <width>347</width>
+            <height>238</height>
            </rect>
           </property>
           <attribute name="label">
           <property name="geometry">
            <rect>
             <x>0</x>
-            <y>-58</y>
-            <width>330</width>
-            <height>198</height>
+            <y>0</y>
+            <width>347</width>
+            <height>238</height>
            </rect>
           </property>
           <attribute name="label">
-           <string>Viewport</string>
+           <string>Animation</string>
           </attribute>
-          <layout class="QGridLayout">
+          <layout class="QGridLayout" name="gridLayout_9">
            <item row="0" column="0">
-            <layout class="QVBoxLayout">
-             <item>
-              <widget class="QGroupBox" name="groupBox_3">
-               <property name="title">
-                <string>StartViewport</string>
-               </property>
-               <layout class="QGridLayout">
-                <item row="0" column="0">
-                 <layout class="QGridLayout">
-                  <item row="0" column="0">
-                   <widget class="QLabel" name="label_8">
-                    <property name="text">
-                     <string>X:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="0" column="1">
-                   <widget class="QLabel" name="label_9">
-                    <property name="text">
-                     <string>Y:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="0" column="2">
-                   <widget class="QLabel" name="label_10">
-                    <property name="text">
-                     <string>Size:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="0">
-                   <widget class="QSpinBox" name="startViewportX">
-                    <property name="minimum">
-                     <number>-32000</number>
-                    </property>
-                    <property name="maximum">
-                     <number>3200</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>10</number>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="1">
-                   <widget class="QSpinBox" name="startViewportY">
-                    <property name="minimum">
-                     <number>-32000</number>
-                    </property>
-                    <property name="maximum">
-                     <number>32000</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>10</number>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="2">
-                   <widget class="QSpinBox" name="startViewportSize">
-                    <property name="minimum">
-                     <number>1</number>
-                    </property>
-                    <property name="maximum">
-                     <number>1000</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>5</number>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </item>
-               </layout>
-              </widget>
-             </item>
-             <item>
-              <widget class="QGroupBox" name="groupBox_4">
-               <property name="title">
-                <string>EndViewport</string>
-               </property>
-               <layout class="QGridLayout">
-                <item row="0" column="0">
-                 <layout class="QGridLayout">
-                  <item row="0" column="0">
-                   <widget class="QLabel" name="label_5">
-                    <property name="text">
-                     <string>X:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="0" column="1">
-                   <widget class="QLabel" name="label_6">
-                    <property name="text">
-                     <string>Y:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="0" column="2">
-                   <widget class="QLabel" name="label_7">
-                    <property name="text">
-                     <string>Size:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="0">
-                   <widget class="QSpinBox" name="endViewportX">
-                    <property name="minimum">
-                     <number>-32000</number>
-                    </property>
-                    <property name="maximum">
-                     <number>32000</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>10</number>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="1">
-                   <widget class="QSpinBox" name="endViewportY">
-                    <property name="minimum">
-                     <number>-32000</number>
-                    </property>
-                    <property name="maximum">
-                     <number>32000</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>10</number>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="2">
-                   <widget class="QSpinBox" name="endViewportSize">
-                    <property name="minimum">
-                     <number>1</number>
-                    </property>
-                    <property name="maximum">
-                     <number>1000</number>
-                    </property>
-                    <property name="singleStep">
-                     <number>5</number>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </item>
-               </layout>
-              </widget>
-             </item>
-             <item>
-              <spacer>
-               <property name="orientation">
-                <enum>Qt::Vertical</enum>
-               </property>
-               <property name="sizeHint" stdset="0">
-                <size>
-                 <width>20</width>
-                 <height>40</height>
-                </size>
-               </property>
-              </spacer>
-             </item>
-            </layout>
+            <widget class="QToolButton" name="anim_start">
+             <property name="text">
+              <string>Edit start</string>
+             </property>
+             <property name="checkable">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QToolButton" name="anim_end">
+             <property name="text">
+              <string>Edit end</string>
+             </property>
+             <property name="checkable">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+           <item row="2" column="0">
+            <widget class="QGroupBox" name="align_box">
+             <property name="title">
+              <string/>
+             </property>
+             <layout class="QGridLayout" name="gridLayout_8">
+              <item row="0" column="0" colspan="2">
+               <widget class="QLabel" name="label_5">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Hor. align</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QToolButton" name="left_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>&lt;</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QToolButton" name="hcenter_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>|</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="2">
+               <widget class="QToolButton" name="right_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>&gt;</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0" colspan="3">
+               <widget class="QLabel" name="label_6">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Vert. align</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0">
+               <widget class="QToolButton" name="top_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>&lt;</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <widget class="QToolButton" name="vcenter_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>|</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="2">
+               <widget class="QToolButton" name="bottom_align">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>&gt;</string>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item row="3" column="0">
+            <spacer>
+             <property name="orientation">
+              <enum>Qt::Vertical</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>81</width>
+               <height>120</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item row="2" column="1">
+            <spacer name="horizontalSpacer_7">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
            </item>
           </layout>
          </widget>
         </widget>
        </item>
-       <item row="1" column="0" colspan="2">
-        <widget class="Line" name="line_3">
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-        </widget>
-       </item>
       </layout>
      </widget>
     </widget>