widgets/boolval_ui.ui
widgets/colorval_ui.ui
widgets/titlewidget_ui.ui
+ widgets/timelinebuttons_ui.ui
)
set(kdenlive_SRCS
graphicsscenerectmove.cpp
effectslistwidget.cpp
titledocument.cpp
+ transition.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
}
// 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 + " ");
}
}
- 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
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"));
#include "effectslist.h"
#include "docclipbase.h"
#include "kthumb.h"
+#include "transition.h"
class ClipItem : public QObject, public QGraphicsRectItem {
/** 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);
bool m_hover;
EffectsList m_effectList;
+ QList <Transition *> m_transitionsList;
QMap<int, QPixmap> audioThumbCachePic;
bool audioThumbWasDrawn, audioThumbReady;
double framePixelWidth;
#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()) {
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;
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;
#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),
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");
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) {
#include "effectslist.h"
#include "effectslistview.h"
#include "effectstackview.h"
-
+#include "ui_timelinebuttons_ui.h"
class MainWindow : public KXmlGuiWindow {
Q_OBJECT
EffectsList m_audioEffects;
EffectsList m_customEffects;
+ Ui::TimelineButtons_UI timeline_buttons_ui;
+
KRecentFilesAction *m_fileOpenRecent;
void readOptions();
void saveOptions();
void slotEditProjectSettings();
void slotDisplayActionMessage(QAction *a);
void slotGotProgressInfo(KUrl url, int progress);
+ void slotSwitchVideoThumbs();
+ void slotSwitchAudioThumbs();
};
#endif
--- /dev/null
+/***************************************************************************
+ 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;
+}
+
--- /dev/null
+/***************************************************************************
+ 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
--- /dev/null
+<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>