From 3915be02797dcbcefa0c30cfb8ab4595d8ab779b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 25 Nov 2008 13:19:18 +0000 Subject: [PATCH] * Clip Markers are now displayed over the clip monitor * Make snap points work for clip monitor: http://www.kdenlive.org/mantis/view.php?id=404 svn path=/branches/KDE4/; revision=2733 --- src/mainwindow.cpp | 4 +-- src/monitor.cpp | 76 +++++++++++++++++++++++++++++++++++++--------- src/monitor.h | 12 ++++++-- 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3ffe22e7..fb254432 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1645,14 +1645,14 @@ void MainWindow::slotSnapRewind() { if (m_projectMonitor->isActive()) { if (m_activeTimeline) m_activeTimeline->projectView()->slotSeekToPreviousSnap(); - } + } else m_clipMonitor->slotSeekToPreviousSnap(); } void MainWindow::slotSnapForward() { if (m_projectMonitor->isActive()) { if (m_activeTimeline) m_activeTimeline->projectView()->slotSeekToNextSnap(); - } + } else m_clipMonitor->slotSeekToNextSnap(); } void MainWindow::slotClipStart() { diff --git a/src/monitor.cpp b/src/monitor.cpp index d28b905f..067efe3f 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -32,7 +32,6 @@ #include #include -#include "gentime.h" #include "monitor.h" #include "renderer.h" #include "monitormanager.h" @@ -211,6 +210,42 @@ void Monitor::resetSize() { ui.video_frame->setMinimumSize(0, 0); } +void Monitor::slotSeekToPreviousSnap() { + if (m_currentClip) slotSeek(getSnapForPos(true).frames(m_monitorManager->timecode().fps())); +} + +void Monitor::slotSeekToNextSnap() { + if (m_currentClip) slotSeek(getSnapForPos(false).frames(m_monitorManager->timecode().fps())); +} + +GenTime Monitor::getSnapForPos(bool previous) { + QList snaps; + QList < GenTime > markers = m_currentClip->snapMarkers(); + for (int i = 0; i < markers.size(); ++i) { + GenTime t = markers.at(i); + snaps.append(t); + } + QPoint zone = m_ruler->zone(); + snaps.append(GenTime(zone.x(), m_monitorManager->timecode().fps())); + snaps.append(GenTime(zone.y(), m_monitorManager->timecode().fps())); + snaps.append(GenTime()); + snaps.append(m_currentClip->duration()); + qSort(snaps); + + const GenTime pos(m_position, m_monitorManager->timecode().fps()); + for (int i = 0; i < snaps.size(); ++i) { + if (previous && snaps.at(i) >= pos) { + if (i == 0) i = 1; + return snaps.at(i - 1); + } else if (!previous && snaps.at(i) > pos) { + return snaps.at(i); + } + } + return GenTime(); +} + + + void Monitor::slotZoneMoved(int start, int end) { m_ruler->setZone(start, end); checkOverlay(); @@ -360,19 +395,24 @@ void Monitor::slotSeek() { void Monitor::slotSeek(int pos) { if (!m_isActive) m_monitorManager->activateMonitor(m_name); if (render == NULL) return; - render->seekToFrame(pos); m_position = pos; + checkOverlay(); + render->seekToFrame(pos); emit renderPosition(m_position); m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); - checkOverlay(); } void Monitor::checkOverlay() { QPoint zone = m_ruler->zone(); - //kDebug()<<"RUL: "<setOverlayText(i18n("In Point")); else if (m_position == zone.y()) m_overlay->setOverlayText(i18n("Out Point")); - else m_overlay->setHidden(true); + else { + if (m_currentClip) { + QString markerComment = m_currentClip->markerComment(GenTime(m_position, m_monitorManager->timecode().fps())); + if (markerComment.isEmpty()) m_overlay->setHidden(true); + else m_overlay->setOverlayText(markerComment, false); + } else m_overlay->setHidden(true); + } } void Monitor::slotStart() { @@ -438,10 +478,10 @@ void Monitor::slotRewindOneFrame() { render->play(0); if (m_position < 1) return; m_position--; + checkOverlay(); render->seekToFrame(m_position); emit renderPosition(m_position); m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); - checkOverlay(); } void Monitor::slotForwardOneFrame() { @@ -449,18 +489,18 @@ void Monitor::slotForwardOneFrame() { render->play(0); if (m_position >= m_length) return; m_position++; + checkOverlay(); render->seekToFrame(m_position); emit renderPosition(m_position); m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); - checkOverlay(); } void Monitor::seekCursor(int pos) { if (!m_isActive) m_monitorManager->activateMonitor(m_name); m_position = pos; + checkOverlay(); m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos)); m_ruler->slotNewValue(pos); - checkOverlay(); } void Monitor::rendererStopped(int pos) { @@ -608,7 +648,7 @@ void MonitorRefresh::paintEvent(QPaintEvent * event) { } -Overlay::Overlay(QWidget* parent): QWidget(parent) { +Overlay::Overlay(QWidget* parent): QLabel(parent) { setAttribute(Qt::WA_TransparentForMouseEvents); //setAttribute(Qt::WA_OpaquePaintEvent); // //setAttribute(Qt::WA_NoSystemBackground); @@ -617,14 +657,20 @@ Overlay::Overlay(QWidget* parent): QWidget(parent) { void Overlay::paintEvent(QPaintEvent * event) { QPainter painter(this); - painter.fillRect(event->rect(), QColor(200, 0, 0)); - painter.drawText(event->rect(), Qt::AlignCenter, m_text); - //if (m_renderer) m_renderer->doRefresh(); + QColor col; + painter.setPen(Qt::white); + if (m_isZone) col = QColor(200, 0, 0); + else col = QColor(0, 0, 200); + painter.fillRect(rect(), col); + painter.drawText(rect(), Qt::AlignCenter, text()); } -void Overlay::setOverlayText(const QString &text) { - kDebug() << "/////// SET OVERLAY: " << text; - m_text = text; + + +void Overlay::setOverlayText(const QString &text, bool isZone) { + setHidden(true); + m_isZone = isZone; + setText(' ' + text + ' '); setHidden(false); update(); } diff --git a/src/monitor.h b/src/monitor.h index 106d4bd9..462d21a9 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -21,11 +21,14 @@ #ifndef MONITOR_H #define MONITOR_H +#include + #include #include #include #include +#include "gentime.h" #include "ui_monitor_ui.h" class MonitorManager; @@ -44,15 +47,15 @@ private: Render *m_renderer; }; -class Overlay : public QWidget { +class Overlay : public QLabel { Q_OBJECT public: Overlay(QWidget* parent); virtual void paintEvent(QPaintEvent * event); - void setOverlayText(const QString &); + void setOverlayText(const QString &, bool isZone = true); private: - QString m_text; + bool m_isZone; }; class Monitor : public QWidget { @@ -104,6 +107,7 @@ private: bool m_dragStarted; Overlay *m_overlay; void checkOverlay(); + GenTime getSnapForPos(bool previous); private slots: void adjustRulerSize(int length); @@ -140,6 +144,8 @@ public slots: void slotZoneStart(); void slotZoneEnd(); void slotZoneMoved(int start, int end); + void slotSeekToNextSnap(); + void slotSeekToPreviousSnap(); signals: void renderPosition(int); -- 2.39.2