X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipdurationdialog.cpp;h=24d5cb7b74da4d4d325a5a1923f2f1bec76af411;hb=56aee6aedeeed3efd10ada8fe3c229eddc01ef05;hp=3948df27910074a207f0836116cf9dd99bdb9fb5;hpb=86329423d0ea65f95da4d745fd2ac94a416aa27c;p=kdenlive diff --git a/src/clipdurationdialog.cpp b/src/clipdurationdialog.cpp index 3948df27..24d5cb7b 100644 --- a/src/clipdurationdialog.cpp +++ b/src/clipdurationdialog.cpp @@ -18,165 +18,158 @@ ***************************************************************************/ +#include "clipdurationdialog.h" +#include "clipitem.h" + #include +#include +#include -#include "clipitem.h" -#include "clipdurationdialog.h" -#include "kdenlivesettings.h" #include -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); + 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) { + if (clip->type() == AVWidget) { ClipItem *item = static_cast (clip); - int t = item->clipType(); - if (t == COLOR || t == IMAGE || t == TEXT) allowCrop = false; + const int t = item->clipType(); + if (t == Color || t == Image || t == Text) + allowCrop = false; } - if (!allowCrop || clip->type() == TRANSITIONWIDGET) { - m_view.crop_up->hide(); - m_view.crop_down->hide(); - m_view.crop_position->hide(); - m_view.crop_label->hide(); + if (!allowCrop || clip->type() == TransitionWidget) { + m_cropStart->setHidden(true); + crop_label->hide(); + m_cropEnd->setHidden(true), + end_label->hide(); } - 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())); - connect(m_view.crop_position, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckCrop())); - adjustSize(); -} + m_crop = m_clip->cropStart(); -ClipDurationDialog::~ClipDurationDialog() { -} - -void ClipDurationDialog::setMargins(GenTime min, GenTime max) { - m_min = min; - m_max = max; - connect(m_view.clip_position, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckStart())); - connect(m_view.clip_duration, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckDuration())); -} + 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()); -void ClipDurationDialog::slotCheckStart() { - int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); - int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); - GenTime start(pos, m_fps); - GenTime duration(dur, m_fps); - if (start < m_min) { - m_view.clip_position->setText(m_tc.getTimecode(m_min, m_fps)); - } else if (start + duration > m_max) { - m_view.clip_position->setText(m_tc.getTimecode(m_max - duration, m_fps)); - } -} + 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())); -void ClipDurationDialog::slotCheckDuration() { - int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); - int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); - GenTime start(pos, m_fps); - GenTime duration(dur, m_fps); - GenTime maxDuration = m_max == GenTime() ? start + m_clip->maxDuration() : qMin(m_max, start + m_clip->maxDuration()); - if (start + duration > maxDuration) { - m_view.clip_duration->setText(m_tc.getTimecode(maxDuration - start, m_fps)); - } + adjustSize(); } -void ClipDurationDialog::slotCheckCrop() { - int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); - int crop = m_tc.getFrameCount(m_view.crop_position->text(), m_fps); - GenTime duration(dur, m_fps); - GenTime cropStart(crop, m_fps); - GenTime maxDuration = m_clip->maxDuration(); - if (cropStart + duration > maxDuration) { - m_view.crop_position->setText(m_tc.getTimecode(maxDuration - duration, m_fps)); +ClipDurationDialog::~ClipDurationDialog() +{ + delete m_pos; + delete m_dur; + delete m_cropStart; + delete m_cropEnd; +} + +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::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::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)); + m_cropEnd->blockSignals(true); + m_cropEnd->setValue(m_clip->maxDuration() - m_dur->gentime() - cropStart); + m_cropEnd->blockSignals(false); } -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::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)); -} +void ClipDurationDialog::slotCheckCrop() +{ + GenTime duration = m_dur->gentime(); + GenTime cropStart = m_cropStart->gentime(); + GenTime maxDuration = m_clip->maxDuration(); -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)); -} + 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; -GenTime ClipDurationDialog::startPos() const { - int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); - return GenTime(pos, m_fps); + 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::cropStart() const { - int pos = m_tc.getFrameCount(m_view.crop_position->text(), m_fps); - return GenTime(pos, m_fps); +GenTime ClipDurationDialog::startPos() const +{ + return m_pos->gentime(); } -GenTime ClipDurationDialog::duration() const { - int pos = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); - return GenTime(pos, m_fps); +GenTime ClipDurationDialog::cropStart() const +{ + return m_cropStart->gentime(); } -void ClipDurationDialog::wheelEvent(QWheelEvent * event) { - if (m_view.clip_position->underMouse()) { - if (event->delta() > 0) - slotPosUp(); - else - slotPosDown(); - } else if (m_view.clip_duration->underMouse()) { - if (event->delta() > 0) - slotDurUp(); - else - slotDurDown(); - } else if (m_view.crop_position->underMouse()) { - if (event->delta() > 0) - slotCropUp(); - else - slotCropDown(); - } +GenTime ClipDurationDialog::duration() const +{ + return m_dur->gentime(); } #include "clipdurationdialog.moc"