X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftimecodedisplay.cpp;h=c4b77a4a3a15a9475583dfcd016965ff86accded;hb=e8d7fcdcf399fe74a40a14db5d989d774e6f1d09;hp=7916ebdd784bdad15986e460a8bcb47e7d6bca05;hpb=405ebfa31dec2209eca7031b7ee781f5ca7be10d;p=kdenlive diff --git a/src/timecodedisplay.cpp b/src/timecodedisplay.cpp index 7916ebdd..c4b77a4a 100644 --- a/src/timecodedisplay.cpp +++ b/src/timecodedisplay.cpp @@ -27,42 +27,51 @@ #include #include #include - +#include +#include +#include TimecodeDisplay::TimecodeDisplay(Timecode t, QWidget *parent) - : 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::MinimumExpanding); + 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); 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())); + connect(lineEdit(), SIGNAL(cursorPositionChanged(int, int)), this, SLOT(slotCursorPositionChanged(int, int))); } -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 (getValue() > m_minimum) result |= QAbstractSpinBox::StepDownEnabled; + if (m_maximum == -1 || getValue() < m_maximum) result |= QAbstractSpinBox::StepUpEnabled; + return result; } -void TimecodeDisplay::slotValueDown() +// virtual +void TimecodeDisplay::stepBy(int steps) { int val = getValue(); - val--; + val += steps; setValue(val); - lineedit->clearFocus(); emit editingFinished(); } @@ -72,11 +81,11 @@ void TimecodeDisplay::setTimeCodeFormat(bool frametimecode, bool init) int val = getValue(); m_frametimecode = frametimecode; if (m_frametimecode) { - QIntValidator *valid = new QIntValidator(lineedit); + QIntValidator *valid = new QIntValidator(lineEdit()); valid->setBottom(0); - lineedit->setValidator(valid); + lineEdit()->setValidator(valid); } else { - lineedit->setValidator(m_timecode.validator()); + lineEdit()->setValidator(m_timecode.validator()); } setValue(val); } @@ -94,21 +103,28 @@ void TimecodeDisplay::updateTimeCode(Timecode t) 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) + slotEditingFinished(); 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(); -} +}*/ int TimecodeDisplay::maximum() const @@ -123,8 +139,8 @@ int TimecodeDisplay::minimum() const int TimecodeDisplay::getValue() const { - if (m_frametimecode) return lineedit->text().toInt(); - else return m_timecode.getFrameCount(lineedit->text()); + if (m_frametimecode) return lineEdit()->text().toInt(); + else return m_timecode.getFrameCount(lineEdit()->text()); } GenTime TimecodeDisplay::gentime() const @@ -155,16 +171,15 @@ void TimecodeDisplay::setValue(int value) if (m_maximum > m_minimum && value > m_maximum) value = m_maximum; - if (value == getValue()) return; - downarrow->setEnabled(value > m_minimum); - uparrow->setEnabled(m_maximum < m_minimum || 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)); + lineEdit()->setText(QString::number(value)); else { QString v = m_timecode.getTimecodeFromFrames(value); - kDebug() << "// SETTING TO: " << value << " = " << v << "( " << m_timecode.fps(); - lineedit->setText(v); + lineEdit()->setText(v); } } @@ -173,4 +188,34 @@ void TimecodeDisplay::setValue(GenTime value) setValue(m_timecode.getTimecode(value)); } +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(); +} + #include