#include <kglobal.h>
#include <klocale.h>
#include <kdebug.h>
+#include <krestrictedline.h>
+#include <KColorScheme>
+#include <KRestrictedLine>
-
-TimecodeDisplay::TimecodeDisplay(Timecode t, QWidget *parent)
- : QWidget(parent),
+TimecodeDisplay::TimecodeDisplay(const Timecode& t, QWidget *parent)
+ : QAbstractSpinBox(parent),
m_timecode(t),
+ m_frametimecode(false),
m_minimum(0),
m_maximum(-1)
{
- setupUi(this);
- lineedit->setFont(KGlobalSettings::toolBarFont());
- QFontMetrics fm = lineedit->fontMetrics();
- lineedit->setMaximumWidth(fm.width("88:88:88:888"));
- setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
+ 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(uparrow, SIGNAL(clicked()), this, SLOT(slotValueUp()));
- connect(downarrow, SIGNAL(clicked()), this, SLOT(slotValueDown()));
- connect(lineedit, SIGNAL(editingFinished()), this, SIGNAL(editingFinished()));
+ connect(lineEdit(), SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
}
-void TimecodeDisplay::slotValueUp()
+// virtual protected
+QAbstractSpinBox::StepEnabled TimecodeDisplay::stepEnabled () const
{
- int val = getValue();
- val++;
- setValue(val);
- lineedit->clearFocus();
- emit editingFinished();
+ QAbstractSpinBox::StepEnabled result = QAbstractSpinBox::StepNone;
+ if (m_value > m_minimum) result |= QAbstractSpinBox::StepDownEnabled;
+ if (m_maximum == -1 || m_value < m_maximum) result |= QAbstractSpinBox::StepUpEnabled;
+ return result;
}
-void TimecodeDisplay::slotValueDown()
+// virtual
+void TimecodeDisplay::stepBy(int steps)
{
- int val = getValue();
- val--;
+ int val = m_value + steps;
setValue(val);
- lineedit->clearFocus();
- 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);
+ QIntValidator *valid = new QIntValidator(lineEdit());
valid->setBottom(0);
- lineedit->setValidator(valid);
+ 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_Up)
- slotValueUp();
- else if (e->key() == Qt::Key_Down)
- slotValueDown();
+ if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
+ e->setAccepted(true);
+ clearFocus();
+ }
else
- QWidget::keyPressEvent(e);
+ QAbstractSpinBox::keyPressEvent(e);
}
+void TimecodeDisplay::mouseReleaseEvent(QMouseEvent *e)
+{
+ QAbstractSpinBox::mouseReleaseEvent(e);
+ if (!lineEdit()->underMouse()) {
+ clearFocus();
+ }
+}
+
+
void TimecodeDisplay::wheelEvent(QWheelEvent *e)
{
- if (e->delta() > 0)
- slotValueUp();
- else
- slotValueDown();
+ QAbstractSpinBox::wheelEvent(e);
+ clearFocus();
}
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)
- lineedit->setText(QString::number(value));
+ 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);
+ lineEdit()->setText(v);
}
}
-void TimecodeDisplay::setValue(GenTime value)
+void TimecodeDisplay::setValue(const GenTime &value)
+{
+ setValue((int) value.frames(m_timecode.fps()));
+}
+
+
+void TimecodeDisplay::slotEditingFinished()
{
- setValue(m_timecode.getTimecode(value));
+ lineEdit()->deselect();
+ if (m_frametimecode) setValue(lineEdit()->text().toInt());
+ else setValue(lineEdit()->text());
+ emit timeCodeEditingFinished();
}
#include <timecodedisplay.moc>