#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()
setTimeCodeFormat(KdenliveSettings::frametimecode());
}
-void TimecodeDisplay::updateTimeCode(Timecode t)
+void TimecodeDisplay::updateTimeCode(const Timecode &t)
{
m_timecode = t;
setTimeCodeFormat(KdenliveSettings::frametimecode());
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);
}
}
}
-/*
+
void TimecodeDisplay::wheelEvent(QWheelEvent *e)
{
- if (e->delta() > 0)
- slotValueUp();
- else
- slotValueDown();
-}*/
+ QAbstractSpinBox::wheelEvent(e);
+ clearFocus();
+}
int TimecodeDisplay::maximum() 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
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>