break;
}
}
+}
+
+void EffectStackEdit::updateTimecodeFormat()
+{
+ QDomNodeList namenode = m_params.elementsByTagName("parameter");
+ for (int i = 0; i < namenode.count() ; i++) {
+ QDomNode pa = namenode.item(i);
+ QDomNode na = pa.firstChildElement("name");
+ QString type = pa.attributes().namedItem("type").nodeValue();
+ QString paramName = i18n(na.toElement().text().toUtf8().data());
+ if (type == "geometry") {
+ Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]);
+ geom->updateTimecodeFormat();
+ break;
+ }
+ }
}
void EffectStackEdit::updateProjectFormat(MltVideoProfile profile, Timecode t)
m_valueItems[paramName+"complex"] = pl;
connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
} else if (type == "geometry") {
- Geometryval *geo = new Geometryval(m_profile, m_frameSize, m_in);
+ Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, m_in);
geo->setupParam(pa, minFrame, maxFrame);
m_vbox->addWidget(geo);
m_valueItems[paramName+"geometry"] = geo;
static QMap<QString, QImage> iconCache;
void updateParameter(const QString &name, const QString &value);
void setFrameSize(QPoint p);
+ void updateTimecodeFormat();
private:
void clearAllItems();
#include <QInputDialog>
-Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint, QWidget* parent) :
+Geometryval::Geometryval(const MltVideoProfile profile, Timecode t, QPoint frame_size, int startPoint, QWidget* parent) :
QWidget(parent),
m_profile(profile),
+ m_timecode(t),
m_paramRect(NULL),
m_geom(NULL),
m_path(NULL),
connect(buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame()));
connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties()));
connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry()));
+ connect(pos_up, SIGNAL(clicked()), this, SLOT(slotPosUp()));
+ connect(pos_down, SIGNAL(clicked()), this, SLOT(slotPosDown()));
buttonhcenter->setIcon(KIcon("kdenlive-align-hor"));
buttonhcenter->setToolTip(i18n("Align item horizontally"));
void Geometryval::slotTransparencyChanged(int transp)
{
- int pos = spinPos->value();
+ int pos;
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
Mlt::GeometryItem item;
int error = m_geom->fetch(&item, pos);
if (error || item.key() == false) {
KdenliveSettings::setTransitionfollowcursor(m_syncAction->isChecked());
}
+void Geometryval::updateTimecodeFormat()
+{
+ timePos->setInputMask("");
+ if (KdenliveSettings::frametimecode()) {
+ int frames = m_timecode.getFrameCount(timePos->text());
+ QIntValidator *valid = new QIntValidator(this);
+ valid->setBottom(0);
+ timePos->setValidator(valid);
+ timePos->setText(QString::number(frames));
+ } else {
+ int pos = timePos->text().toInt();
+ timePos->setValidator(m_timecode.validator());
+ timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+ }
+}
+
+void Geometryval::slotPosUp()
+{
+ int pos;
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
+ pos ++;
+ if (pos > m_helper->frameLength) pos = m_helper->frameLength;
+ if (KdenliveSettings::frametimecode()) {
+ timePos->setText(QString::number(pos));
+ } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+ slotPositionChanged();
+}
+
+void Geometryval::slotPosDown()
+{
+ int pos;
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
+ pos --;
+ if (pos < 0) pos = 0;
+ if (KdenliveSettings::frametimecode()) {
+ timePos->setText(QString::number(pos));
+ } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+ slotPositionChanged();
+}
+
void Geometryval::slotPositionChanged(int pos, bool seek)
{
+ if (pos == -1) {
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
+ }
if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos + m_startPoint);
- spinPos->setValue(pos);
+ if (KdenliveSettings::frametimecode()) {
+ timePos->setText(QString::number(pos));
+ } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+
+ //spinPos->setValue(pos);
m_helper->setValue(pos);
Mlt::GeometryItem item;
int error = m_geom->fetch(&item, pos);
{
// check there is more than one keyframe
Mlt::GeometryItem item;
- if (pos == -1) pos = spinPos->value();
+ int frame;
+ if (KdenliveSettings::frametimecode()) frame = timePos->text().toInt();
+ else frame = m_timecode.getFrameCount(timePos->text());
+
+ if (pos == -1) pos = frame;
int error = m_geom->next_key(&item, pos + 1);
if (error) {
error = m_geom->prev_key(&item, pos - 1);
if (error || item.frame() == pos) return;
}
- m_geom->remove(spinPos->value());
+ m_geom->remove(frame);
buttonAdd->setEnabled(true);
buttonDelete->setEnabled(false);
widget->setEnabled(false);
void Geometryval::slotAddFrame(int pos)
{
- if (pos == -1) pos = spinPos->value();
+ int frame;
+ if (KdenliveSettings::frametimecode()) frame = timePos->text().toInt();
+ else frame = m_timecode.getFrameCount(timePos->text());
+ if (pos == -1) pos = frame;
Mlt::GeometryItem item;
item.frame(pos);
QRectF r = m_paramRect->rect().normalized();
{
Mlt::GeometryItem item;
int error = m_geom->next_key(&item, m_helper->value() + 1);
+ int pos;
kDebug() << "// SEEK TO NEXT KFR: " << error;
if (error) {
// Go to end
- spinPos->setValue(spinPos->maximum());
- return;
- }
- int pos = item.frame();
- spinPos->setValue(pos);
+ pos = m_helper->frameLength;
+ } else pos = item.frame();
+
+ if (KdenliveSettings::frametimecode()) {
+ timePos->setText(QString::number(pos));
+ } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+ slotPositionChanged();
}
void Geometryval::slotPreviousFrame()
kDebug() << "// SEEK TO NEXT KFR: " << error;
if (error) return;
int pos = item.frame();
- spinPos->setValue(pos);
+ if (KdenliveSettings::frametimecode()) {
+ timePos->setText(QString::number(pos));
+ } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+ slotPositionChanged();
}
spinTransp->setMaximum(500);
label_pos->setHidden(true);
m_helper->setHidden(true);
- spinPos->setHidden(true);
+ timePos->setHidden(true);
}
if (par.attribute("opacity") == "false") {
label_opacity->setHidden(true);
/*QDomDocument doc;
doc.appendChild(doc.importNode(par, true));
kDebug() << "IMPORTED TRANS: " << doc.toString();*/
- spinPos->setMaximum(maxFrame - minFrame - 1);
if (m_path == NULL) {
m_path = new QGraphicsPathItem();
m_path->setPen(QPen(Qt::red));
slotPositionChanged(0, false);
slotUpdateGeometry();
if (!m_fixedMode) {
- connect(spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int)));
+ connect(timePos, SIGNAL(editingFinished()), this , SLOT(slotPositionChanged()));
}
connect(spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int)));
}
void Geometryval::slotUpdateTransitionProperties()
{
- int pos = spinPos->value();
+ int pos;
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
Mlt::GeometryItem item;
int error = m_geom->next_key(&item, pos);
if (error || item.frame() != pos) {
frameOptions->setHidden(true);
m_editOptions->setChecked(false);
}
- adjustSize();
+ //adjustSize();
}
void Geometryval::slotGeometryX(int value)
bool Geometryval::keyframeSelected()
{
Mlt::GeometryItem item;
- if (m_geom->fetch(&item, spinPos->value()) || item.key() == false) return false;
+ int pos;
+ if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+ else pos = m_timecode.getFrameCount(timePos->text());
+ if (m_geom->fetch(&item, pos) || item.key() == false) return false;
return true;
}
{
Q_OBJECT
public:
- explicit Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint = 0, QWidget* parent = 0);
+ explicit Geometryval(const MltVideoProfile profile, Timecode t, QPoint frame_size, int startPoint = 0, QWidget* parent = 0);
virtual ~Geometryval();
QDomElement getParamDesc();
QString getValue() const;
void setFrameSize(QPoint p);
+ /* update the timecode display depending on what the user wants (frame number or hh:mm:ss:ff) */
+ void updateTimecodeFormat();
private:
MltVideoProfile m_profile;
+ Timecode m_timecode;
int m_realWidth;
GraphicsSceneRectMove *m_scene;
QGraphicsRectItem *m_paramRect;
private slots:
void slotNextFrame();
void slotPreviousFrame();
- void slotPositionChanged(int pos, bool seek = true);
+ void slotPositionChanged(int pos = -1, bool seek = true);
void slotDeleteFrame(int pos = -1);
void slotAddFrame(int pos = -1);
void slotUpdateTransitionProperties();
void slotGeometryY(int value);
void slotGeometryWidth(int value);
void slotGeometryHeight(int value);
+ void slotPosUp();
+ void slotPosDown();
signals:
void parameterChanged();
m_geom->remove(m_movingItem.frame());
}
int pos = qMax(0, (int)(event->x() / m_scale));
- pos = qMin(m_length, pos);
+ pos = qMin(frameLength, pos);
m_movingItem.frame(pos);
update();
return;
}
m_position = event->x() / m_scale;
m_position = qMax(0, m_position);
- m_position = qMin(m_length, m_position);
+ m_position = qMin(frameLength, m_position);
emit positionChanged(m_position);
update();
}
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);
+ m_position = qMin(frameLength, m_position);
emit positionChanged(m_position);
update();
/* int delta = 1;
QStylePainter p(this);
const QRectF clipRect = e->rect();
p.setClipRect(clipRect);
- m_scale = (double) width() / m_length;
+ m_scale = (double) width() / frameLength;
if (m_geom != NULL) {
int pos = 0;
p.setPen(QColor(255, 20, 20));
void KeyframeHelper::setKeyGeometry(Mlt::Geometry *geom, const int length)
{
m_geom = geom;
- m_length = length;
+ frameLength = length;
update();
}
public:
KeyframeHelper(QWidget *parent = 0);
int value() const;
+ int frameLength;
protected:
virtual void paintEvent(QPaintEvent * /*e*/);
private:
Mlt::Geometry *m_geom;
- int m_length;
int m_position;
double m_scale;
bool m_movingKeyframe;
KdenliveSettings::setFrametimecode(ix == 1);
m_clipMonitor->updateTimecodeFormat();
m_projectMonitor->updateTimecodeFormat();
+ m_transitionConfig->updateTimecodeFormat();
m_activeTimeline->projectView()->clearSelection();
m_activeTimeline->updateRuler();
}
updateTrackList();
}
+void TransitionSettings::updateTimecodeFormat()
+{
+ m_effectEdit->updateTimecodeFormat();
+}
+
void TransitionSettings::updateTrackList()
{
transitionTrack->blockSignals(true);
TransitionSettings(QWidget* parent = 0);
void raiseWindow(QWidget*);
void updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info);
+ void updateTimecodeFormat();
private:
EffectStackEdit *m_effectEdit;
<rect>
<x>0</x>
<y>0</y>
- <width>405</width>
- <height>240</height>
+ <width>401</width>
+ <height>251</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>0</number>
</property>
- <item row="0" column="0" colspan="10">
+ <item row="0" column="0">
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <zorder>frameOptions</zorder>
</widget>
</item>
- <item row="1" column="0" colspan="10">
+ <item row="1" column="0">
<widget class="QFrame" name="keyframeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
</widget>
</item>
<item row="2" column="0">
- <widget class="QToolButton" name="buttonMenu">
- <property name="text">
- <string>M</string>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="spacing">
+ <number>-1</number>
</property>
- <property name="arrowType">
- <enum>Qt::NoArrow</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <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="4">
- <widget class="QToolButton" name="buttonDelete">
- <property name="text">
- <string>D</string>
- </property>
- </widget>
- </item>
- <item row="2" column="5">
- <widget class="QLabel" name="label_opacity">
- <property name="text">
- <string>Opacity</string>
- </property>
- </widget>
+ <item>
+ <widget class="QToolButton" name="buttonMenu">
+ <property name="text">
+ <string>M</string>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonPrevious">
+ <property name="text">
+ <string>P</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonNext">
+ <property name="text">
+ <string>N</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonAdd">
+ <property name="text">
+ <string>A</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonDelete">
+ <property name="text">
+ <string>D</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_opacity">
+ <property name="text">
+ <string>Opacity</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinTransp">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_pos">
+ <property name="text">
+ <string>Pos</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="KRestrictedLine" name="timePos">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QToolButton" name="pos_up">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>3</width>
+ <height>2</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::UpArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="pos_down">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>3</width>
+ <height>2</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::DownArrow</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <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>
</item>
- <item row="2" column="6">
- <widget class="QSpinBox" name="spinTransp">
- <property name="maximum">
- <number>100</number>
- </property>
- </widget>
- </item>
- <item row="2" column="7">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="8">
- <widget class="QLabel" name="label_pos">
- <property name="text">
- <string>Pos</string>
- </property>
- </widget>
- </item>
- <item row="2" column="9">
- <widget class="QSpinBox" name="spinPos"/>
- </item>
- <item row="3" column="0" colspan="10">
+ <item row="3" column="0">
<widget class="QGroupBox" name="frameOptions">
<property name="title">
<string/>
</item>
</layout>
</item>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer">
+ <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>
</item>
<extends>QSpinBox</extends>
<header>knuminput.h</header>
</customwidget>
+ <customwidget>
+ <class>KLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>klineedit.h</header>
+ </customwidget>
+ <customwidget>
+ <class>KRestrictedLine</class>
+ <extends>KLineEdit</extends>
+ <header>krestrictedline.h</header>
+ </customwidget>
</customwidgets>
<resources/>
<connections/>