***************************************************************************/
+#include "clipdurationdialog.h"
+#include "clipitem.h"
+
#include <KDebug>
+#include <KMessageBox>
+#include <KGlobalSettings>
-#include "clipdurationdialog.h"
-#include "kdenlivesettings.h"
+#include <QWheelEvent>
-ClipDurationDialog::ClipDurationDialog(AbstractClipItem *clip, Timecode tc, QWidget * parent): QDialog(parent), m_tc(tc), m_clip(clip) {
+ClipDurationDialog::ClipDurationDialog(AbstractClipItem *clip, const Timecode &tc, const GenTime &min, const GenTime &max, QWidget * parent):
+ QDialog(parent),
+ m_clip(clip),
+ m_min(min),
+ m_max(max)
+{
setFont(KGlobalSettings::toolBarFont());
- m_fps = m_tc.fps();
- m_view.setupUi(this);
-
- if (clip->type() == TRANSITIONWIDGET) {
- m_view.crop_up->hide();
- m_view.crop_down->hide();
- m_view.crop_position->hide();
- m_view.crop_label->hide();
+ setupUi(this);
+
+ m_pos = new TimecodeDisplay(tc);
+ m_cropStart = new TimecodeDisplay(tc);
+ m_dur = new TimecodeDisplay(tc);
+ m_cropEnd = new TimecodeDisplay(tc);
+
+ clip_position_box->addWidget(m_pos);
+ crop_start_box->addWidget(m_cropStart);
+ clip_duration_box->addWidget(m_dur);
+ crop_end_box->addWidget(m_cropEnd);
+
+ bool allowCrop = true;
+ if (clip->type() == AVWidget) {
+ ClipItem *item = static_cast <ClipItem *>(clip);
+ const int t = item->clipType();
+ if (t == Color || t == Image || t == Text)
+ allowCrop = false;
}
- m_view.clip_position->setText(tc.getTimecode(m_clip->startPos(), m_fps));
- m_view.crop_position->setText(tc.getTimecode(m_clip->cropStart(), m_fps));
- m_view.clip_duration->setText(tc.getTimecode(m_clip->duration(), m_fps));
- connect(m_view.position_up, SIGNAL(clicked()), this, SLOT(slotPosUp()));
- connect(m_view.position_down, SIGNAL(clicked()), this, SLOT(slotPosDown()));
- connect(m_view.crop_up, SIGNAL(clicked()), this, SLOT(slotCropUp()));
- connect(m_view.crop_down, SIGNAL(clicked()), this, SLOT(slotCropDown()));
- connect(m_view.duration_up, SIGNAL(clicked()), this, SLOT(slotDurUp()));
- connect(m_view.duration_down, SIGNAL(clicked()), this, SLOT(slotDurDown()));
+ if (!allowCrop || clip->type() == TransitionWidget) {
+ m_cropStart->setHidden(true);
+ crop_label->hide();
+ m_cropEnd->setHidden(true),
+ end_label->hide();
+ }
+
+ m_crop = m_clip->cropStart();
+
+ m_pos->setValue(m_clip->startPos());
+ m_dur->setValue(m_clip->cropDuration());
+ m_cropStart->setValue(m_clip->cropStart());
+ m_cropEnd->setValue(m_clip->maxDuration() - m_clip->cropDuration() - m_clip->cropStart());
+
+ connect(m_pos, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotCheckStart()));
+ connect(m_dur, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotCheckDuration()));
+ connect(m_cropStart, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotCheckCrop()));
+ connect(m_cropEnd, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotCheckEnd()));
adjustSize();
}
-ClipDurationDialog::~ClipDurationDialog() {
+ClipDurationDialog::~ClipDurationDialog()
+{
+ delete m_pos;
+ delete m_dur;
+ delete m_cropStart;
+ delete m_cropEnd;
}
-void ClipDurationDialog::slotPosUp() {
- int position = m_tc.getFrameCount(m_view.clip_position->text(), m_fps);
- //if (duration >= m_clip->duration().frames(m_fps)) return;
- position ++;
- m_view.clip_position->setText(m_tc.getTimecode(GenTime(position, m_fps), m_fps));
+void ClipDurationDialog::slotCheckStart()
+{
+ GenTime start = m_pos->gentime();
+ GenTime duration = m_dur->gentime();
+ if (m_min != GenTime() && start < m_min)
+ m_pos->setValue(m_min);
+ else if (m_max != GenTime() && start + duration > m_max)
+ m_pos->setValue(m_max - duration);
}
-void ClipDurationDialog::slotPosDown() {
- int position = m_tc.getFrameCount(m_view.clip_position->text(), m_fps);
- //if (duration >= m_clip->duration().frames(m_fps)) return;
- position --;
- m_view.clip_position->setText(m_tc.getTimecode(GenTime(position, m_fps), m_fps));
-}
+void ClipDurationDialog::slotCheckDuration()
+{
+ GenTime start = m_pos->gentime();
+ GenTime duration = m_dur->gentime();
+ GenTime cropStart = m_cropStart->gentime();
+ GenTime maxDuration;
+
+ if (m_clip->maxDuration() == GenTime())
+ maxDuration = m_max;
+ else
+ maxDuration = m_max == GenTime() ? start + m_clip->maxDuration() - cropStart : qMin(m_max, start + m_clip->maxDuration() - cropStart);
+
+ if (maxDuration != GenTime() && start + duration > maxDuration) {
+ m_dur->blockSignals(true);
+ m_dur->setValue(maxDuration - start);
+ m_dur->blockSignals(false);
+ }
-void ClipDurationDialog::slotDurUp() {
- int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
- int crop = m_tc.getFrameCount(m_view.crop_position->text(), m_fps);
- if (duration + crop > m_clip->maxDuration().frames(m_fps)) return;
- duration ++;
- m_view.clip_duration->setText(m_tc.getTimecode(GenTime(duration, m_fps), m_fps));
+ m_cropEnd->blockSignals(true);
+ m_cropEnd->setValue(m_clip->maxDuration() - m_dur->gentime() - cropStart);
+ m_cropEnd->blockSignals(false);
}
-void ClipDurationDialog::slotDurDown() {
- int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
- if (duration <= 0) return;
- duration --;
- m_view.clip_duration->setText(m_tc.getTimecode(GenTime(duration, m_fps), m_fps));
-}
+void ClipDurationDialog::slotCheckCrop()
+{
+ GenTime duration = m_dur->gentime();
+ GenTime cropStart = m_cropStart->gentime();
+ GenTime maxDuration = m_clip->maxDuration();
+
+ GenTime diff = cropStart - m_crop;
+ if ((diff > GenTime() && diff < duration) || diff < GenTime()) {
+ duration -= diff;
+ } else {
+ m_cropStart->setValue(m_crop);
+ return;
+ }
-void ClipDurationDialog::slotCropUp() {
- int crop = m_tc.getFrameCount(m_view.crop_position->text(), m_fps);
- int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
- if (duration + crop > m_clip->maxDuration().frames(m_fps)) return;
- crop ++;
- m_view.crop_position->setText(m_tc.getTimecode(GenTime(crop, m_fps), m_fps));
+ if (maxDuration != GenTime() && cropStart + duration > maxDuration) {
+ m_cropStart->setValue(m_crop);
+ } else {
+ m_crop = cropStart;
+ m_dur->blockSignals(true);
+ m_dur->setValue(duration);
+ m_dur->blockSignals(false);
+ }
}
-void ClipDurationDialog::slotCropDown() {
- int crop = m_tc.getFrameCount(m_view.crop_position->text(), m_fps);
- if (crop <= 0) return;
- crop --;
- m_view.crop_position->setText(m_tc.getTimecode(GenTime(crop, m_fps), m_fps));
+void ClipDurationDialog::slotCheckEnd()
+{
+ GenTime cropStart = m_cropStart->gentime();
+ GenTime cropEnd = m_cropEnd->gentime();
+ GenTime duration = m_clip->maxDuration() - cropEnd - cropStart;
+
+ if (duration >= GenTime()) {
+ m_dur->setValue(duration);
+ slotCheckDuration();
+ } else {
+ m_cropEnd->blockSignals(true);
+ m_cropEnd->setValue(m_clip->maxDuration() - m_dur->gentime() - cropStart);
+ m_cropEnd->blockSignals(false);
+ }
}
-GenTime ClipDurationDialog::startPos() const {
- int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps);
- return GenTime(pos, m_fps);
+GenTime ClipDurationDialog::startPos() const
+{
+ return m_pos->gentime();
}
-GenTime ClipDurationDialog::cropStart() const {
- int pos = m_tc.getFrameCount(m_view.crop_position->text(), m_fps);
- return GenTime(pos, m_fps);
+GenTime ClipDurationDialog::cropStart() const
+{
+ return m_cropStart->gentime();
}
-GenTime ClipDurationDialog::duration() const {
- int pos = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
- return GenTime(pos, m_fps);
+GenTime ClipDurationDialog::duration() const
+{
+ return m_dur->gentime();
}
#include "clipdurationdialog.moc"