]> git.sesse.net Git - kdenlive/blobdiff - src/timecodedisplay.cpp
Integrate with the required MLT hooks for getting Movit to work.
[kdenlive] / src / timecodedisplay.cpp
index 72cb9a5b36f4b9ab0c2b8897799ff6c2472b606e..a98659ed9b832de832a8cd74608cd9db9e42ea22 100644 (file)
 #include <KColorScheme>
 #include <KRestrictedLine>
 
-TimecodeDisplay::TimecodeDisplay(Timecode t, QWidget *parent)
+TimecodeDisplay::TimecodeDisplay(const Timecode& t, QWidget *parent)
         : QAbstractSpinBox(parent),
         m_timecode(t),
+        m_frametimecode(false),
         m_minimum(0),
         m_maximum(-1)
 {
     lineEdit()->setFont(KGlobalSettings::toolBarFont());
     lineEdit()->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
     QFontMetrics fm = lineEdit()->fontMetrics();
+#if QT_VERSION >= 0x040600
     setMinimumWidth(fm.width("88:88:88:88888888") + contentsMargins().right() + contentsMargins().right());
+#else
+    int left, top, right, bottom;
+    getContentsMargins(&left, &top, &right, &bottom);
+    setMinimumWidth(fm.width("88:88:88:88888888") + left + right);
+#endif
     setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
     setAccelerated(true);
 
+    setValue(m_minimum);
+
     setTimeCodeFormat(KdenliveSettings::frametimecode(), true);
 
-    connect(lineEdit(), SIGNAL(returnPressed()), this, SLOT(slotEditingFinished()));
-    connect(lineEdit(), SIGNAL(cursorPositionChanged(int, int)), this, SLOT(slotCursorPositionChanged(int, int)));
+    connect(lineEdit(), SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
 }
 
 // virtual protected
 QAbstractSpinBox::StepEnabled TimecodeDisplay::stepEnabled () const
 {
     QAbstractSpinBox::StepEnabled result = QAbstractSpinBox::StepNone;
-    if (getValue() > m_minimum) result |= QAbstractSpinBox::StepDownEnabled;
-    if (m_maximum == -1 || getValue() < m_maximum) result |= QAbstractSpinBox::StepUpEnabled;
+    if (m_value > m_minimum) result |= QAbstractSpinBox::StepDownEnabled;
+    if (m_maximum == -1 || m_value < m_maximum) result |= QAbstractSpinBox::StepUpEnabled;
     return result;
 }
 
 // virtual
 void TimecodeDisplay::stepBy(int steps)
 {
-    int val = getValue();
-    val += steps;
+    int val = m_value + steps;
     setValue(val);
-    emit editingFinished();
 }
 
 void TimecodeDisplay::setTimeCodeFormat(bool frametimecode, bool init)
 {
     if (!init && m_frametimecode == frametimecode) return;
-    int val = getValue();
     m_frametimecode = frametimecode;
+    lineEdit()->clear();
     if (m_frametimecode) {
         QIntValidator *valid = new QIntValidator(lineEdit());
         valid->setBottom(0);
         lineEdit()->setValidator(valid);
+        lineEdit()->setInputMask(QString());
     } else {
-        lineEdit()->setValidator(m_timecode.validator());
+        lineEdit()->setValidator(0);
+        lineEdit()->setInputMask(m_timecode.mask());
     }
-    setValue(val);
+    setValue(m_value);
 }
 
 void TimecodeDisplay::slotUpdateTimeCodeFormat()
@@ -88,7 +96,7 @@ void TimecodeDisplay::slotUpdateTimeCodeFormat()
     setTimeCodeFormat(KdenliveSettings::frametimecode());
 }
 
-void TimecodeDisplay::updateTimeCode(Timecode t)
+void TimecodeDisplay::updateTimeCode(const Timecode &t)
 {
     m_timecode = t;
     setTimeCodeFormat(KdenliveSettings::frametimecode());
@@ -96,8 +104,10 @@ void TimecodeDisplay::updateTimeCode(Timecode t)
 
 void TimecodeDisplay::keyPressEvent(QKeyEvent *e)
 {
-    if (e->key() == Qt::Key_Return)
-        slotEditingFinished();
+    if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
+        e->setAccepted(true);
+        clearFocus();
+    }
     else
         QAbstractSpinBox::keyPressEvent(e);
 }
@@ -110,14 +120,12 @@ void TimecodeDisplay::mouseReleaseEvent(QMouseEvent *e)
     }
 }
 
-/*
+
 void TimecodeDisplay::wheelEvent(QWheelEvent *e)
 {
-    if (e->delta() > 0)
-        slotValueUp();
-    else
-        slotValueDown();
-}*/
+    QAbstractSpinBox::wheelEvent(e);
+    clearFocus();
+}
 
 
 int TimecodeDisplay::maximum() const
@@ -132,13 +140,12 @@ int TimecodeDisplay::minimum() const
 
 int TimecodeDisplay::getValue() const
 {
-    if (m_frametimecode) return lineEdit()->text().toInt();
-    else return m_timecode.getFrameCount(lineEdit()->text());
+    return m_value;
 }
 
 GenTime TimecodeDisplay::gentime() const
 {
-    return GenTime(getValue(), m_timecode.fps());
+    return GenTime(m_value, m_timecode.fps());
 }
 
 Timecode TimecodeDisplay::timecode() const
@@ -164,51 +171,31 @@ void TimecodeDisplay::setValue(int value)
     if (m_maximum > m_minimum && value > m_maximum)
         value = m_maximum;
 
-    if (value == getValue() && !lineEdit()->text().isEmpty()) return;
-    //downarrow->setEnabled(value > m_minimum);
-    //uparrow->setEnabled(m_maximum < m_minimum || value < m_maximum);
-
-    if (m_frametimecode)
+    if (m_frametimecode) {
+       if (value == m_value && !lineEdit()->text().isEmpty()) return;
+       m_value = value;
         lineEdit()->setText(QString::number(value));
+    }
     else {
+       if (value == m_value && lineEdit()->text() != ":::") return;
+       m_value = value;
         QString v = m_timecode.getTimecodeFromFrames(value);
         lineEdit()->setText(v);
     }
 }
 
-void TimecodeDisplay::setValue(GenTime value)
+void TimecodeDisplay::setValue(const GenTime &value)
 {
-    setValue(m_timecode.getTimecode(value));
+    setValue((int) value.frames(m_timecode.fps()));
 }
 
-void TimecodeDisplay::slotCursorPositionChanged(int oldPos, int newPos)
-{
-    if (!lineEdit()->hasFocus()) return;
-    lineEdit()->blockSignals(true);
-    QString text = lineEdit()->text();
-
-    if (newPos < text.size() && !text.at(newPos).isDigit()) {
-        // char at newPos is a separator (':' or ';')
-
-        // make it possible move the cursor backwards at separators
-        if (newPos == oldPos - 1)
-            lineEdit()->setSelection(newPos, -1);
-        else
-            lineEdit()->setSelection(newPos + 2, -1);
-    } else if (newPos < text.size()) {
-        lineEdit()->setSelection(newPos + 1, -1);
-    } else {
-        lineEdit()->setSelection(newPos, -1);
-    }
-
-    lineEdit()->blockSignals(false);
-}
 
 void TimecodeDisplay::slotEditingFinished()
 {
-    clearFocus();
     lineEdit()->deselect();
-    emit editingFinished();
+    if (m_frametimecode) setValue(lineEdit()->text().toInt());
+    else setValue(lineEdit()->text());
+    emit timeCodeEditingFinished();
 }
 
 #include <timecodedisplay.moc>