1 /* This file is part of the KDE project
2 Copyright (c) 2010 Jean-Baptiste Mardelle <jb@kdenlive.org>
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
20 #include "timecodedisplay.h"
21 #include "kdenlivesettings.h"
25 #include <QMouseEvent>
30 #include <krestrictedline.h>
31 #include <KColorScheme>
32 #include <KRestrictedLine>
34 TimecodeDisplay::TimecodeDisplay(Timecode t, QWidget *parent)
35 : QAbstractSpinBox(parent),
40 lineEdit()->setFont(KGlobalSettings::toolBarFont());
41 lineEdit()->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
42 QFontMetrics fm = lineEdit()->fontMetrics();
43 setMinimumWidth(fm.width("88:88:88:88888888") + contentsMargins().right() + contentsMargins().right());
44 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
47 setTimeCodeFormat(KdenliveSettings::frametimecode(), true);
49 connect(lineEdit(), SIGNAL(returnPressed()), this, SLOT(slotEditingFinished()));
50 connect(lineEdit(), SIGNAL(cursorPositionChanged(int, int)), this, SLOT(slotCursorPositionChanged(int, int)));
54 QAbstractSpinBox::StepEnabled TimecodeDisplay::stepEnabled () const
56 QAbstractSpinBox::StepEnabled result = QAbstractSpinBox::StepNone;
57 if (getValue() > m_minimum) result |= QAbstractSpinBox::StepDownEnabled;
58 if (m_maximum == -1 || getValue() < m_maximum) result |= QAbstractSpinBox::StepUpEnabled;
63 void TimecodeDisplay::stepBy(int steps)
68 emit editingFinished();
71 void TimecodeDisplay::setTimeCodeFormat(bool frametimecode, bool init)
73 if (!init && m_frametimecode == frametimecode) return;
75 m_frametimecode = frametimecode;
76 if (m_frametimecode) {
77 QIntValidator *valid = new QIntValidator(lineEdit());
79 lineEdit()->setValidator(valid);
81 lineEdit()->setValidator(m_timecode.validator());
86 void TimecodeDisplay::slotUpdateTimeCodeFormat()
88 setTimeCodeFormat(KdenliveSettings::frametimecode());
91 void TimecodeDisplay::updateTimeCode(Timecode t)
94 setTimeCodeFormat(KdenliveSettings::frametimecode());
97 void TimecodeDisplay::keyPressEvent(QKeyEvent *e)
99 if (e->key() == Qt::Key_Return)
100 slotEditingFinished();
102 QAbstractSpinBox::keyPressEvent(e);
105 void TimecodeDisplay::mouseReleaseEvent(QMouseEvent *e)
107 QAbstractSpinBox::mouseReleaseEvent(e);
108 if (!lineEdit()->underMouse()) {
114 void TimecodeDisplay::wheelEvent(QWheelEvent *e)
123 int TimecodeDisplay::maximum() const
128 int TimecodeDisplay::minimum() const
133 int TimecodeDisplay::getValue() const
135 if (m_frametimecode) return lineEdit()->text().toInt();
136 else return m_timecode.getFrameCount(lineEdit()->text());
139 GenTime TimecodeDisplay::gentime() const
141 return GenTime(getValue(), m_timecode.fps());
144 Timecode TimecodeDisplay::timecode() const
149 void TimecodeDisplay::setRange(int min, int max)
155 void TimecodeDisplay::setValue(const QString &value)
157 setValue(m_timecode.getFrameCount(value));
160 void TimecodeDisplay::setValue(int value)
162 if (value < m_minimum)
164 if (m_maximum > m_minimum && value > m_maximum)
167 if (value == getValue() && !lineEdit()->text().isEmpty()) return;
168 //downarrow->setEnabled(value > m_minimum);
169 //uparrow->setEnabled(m_maximum < m_minimum || value < m_maximum);
172 lineEdit()->setText(QString::number(value));
174 QString v = m_timecode.getTimecodeFromFrames(value);
175 lineEdit()->setText(v);
179 void TimecodeDisplay::setValue(GenTime value)
181 setValue(m_timecode.getTimecode(value));
184 void TimecodeDisplay::slotCursorPositionChanged(int oldPos, int newPos)
186 if (!lineEdit()->hasFocus()) return;
187 lineEdit()->blockSignals(true);
188 QString text = lineEdit()->text();
190 if (newPos < text.size() && !text.at(newPos).isDigit()) {
191 // char at newPos is a separator (':' or ';')
193 // make it possible move the cursor backwards at separators
194 if (newPos == oldPos - 1)
195 lineEdit()->setSelection(newPos, -1);
197 lineEdit()->setSelection(newPos + 2, -1);
198 } else if (newPos < text.size()) {
199 lineEdit()->setSelection(newPos + 1, -1);
201 lineEdit()->setSelection(newPos, -1);
204 lineEdit()->blockSignals(false);
207 void TimecodeDisplay::slotEditingFinished()
210 lineEdit()->deselect();
211 emit editingFinished();
214 #include <timecodedisplay.moc>