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"));
#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) {
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);
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;
}
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();
}
#include <QWidget>
#include <QDomElement>
+#include <QGraphicsPathItem>
#include <mlt++/Mlt.h>
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;
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();
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);
}
- paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
+
ktrans.appendChild(tname);
foreach(const QDomElement &e, paramList) {
#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;
// 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();
}
public:
KeyframeHelper(QWidget *parent = 0);
+ const int value() const;
protected:
virtual void paintEvent(QPaintEvent * /*e*/);
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
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");
<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>