From 23f110ad06d4524f47de721a8f35e46228d8682b Mon Sep 17 00:00:00 2001 From: Till Theato Date: Fri, 24 Sep 2010 21:27:31 +0000 Subject: [PATCH] Allow to loop selected timeline item svn path=/trunk/kdenlive/; revision=4929 --- src/colorpickerwidget.h | 1 - src/kdenliveui.rc | 3 ++- src/mainwindow.cpp | 11 ++++++++- src/mainwindow.h | 1 + src/monitor.cpp | 54 ++++++++++++++++++++++++++++++++++++++--- src/monitor.h | 22 +++++++++++++++-- 6 files changed, 83 insertions(+), 9 deletions(-) diff --git a/src/colorpickerwidget.h b/src/colorpickerwidget.h index ed2a73c0..7a6e8743 100644 --- a/src/colorpickerwidget.h +++ b/src/colorpickerwidget.h @@ -58,7 +58,6 @@ private: void closeEventFilter(); /** @brief Calculates the average color for a rect around @param pos with m_size->value() as width. */ - QColor averagePickedColor(const QPoint pos); /** @brief Color of the screen at point @param p. diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index d6413633..16b70f08 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -123,6 +123,7 @@ + Go To diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 605eb01e..61aa9419 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -352,7 +352,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & loadTranscoders(); //kDebug() << factory() << " " << factory()->container("video_effects_menu", this); - m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone); + m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, NULL, m_loopClip); m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); QMenu *clipInTimeline = static_cast(factory()->container("clip_in_timeline", this)); @@ -1125,6 +1125,11 @@ void MainWindow::setupActions() collection->addAction("monitor_loop_zone", m_loopZone); connect(m_loopZone, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotLoopZone())); + m_loopClip = new KAction(KIcon("media-playback-start"), i18n("Loop selected clip"), this); + m_loopClip->setEnabled(false); + collection->addAction("monitor_loop_clip", m_loopClip); + connect(m_loopClip, SIGNAL(triggered(bool)), m_projectMonitor, SLOT(slotLoopClip())); + KAction *dvdWizard = new KAction(KIcon("media-optical"), i18n("DVD Wizard"), this); collection->addAction("dvd_wizard", dvdWizard); connect(dvdWizard, SIGNAL(triggered(bool)), this, SLOT(slotDvdWizard())); @@ -2240,8 +2245,10 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); + disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*))); disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool))); disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); + disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*))); disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int))); @@ -2332,6 +2339,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int))); connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); + connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*))); + connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*))); connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int))); connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString))); diff --git a/src/mainwindow.h b/src/mainwindow.h index c27f7dee..c0c12d74 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -230,6 +230,7 @@ private: KAction *m_zoomOut; KAction *m_loopZone; KAction *m_playZone; + KAction *m_loopClip; StatusBarMessageLabel *m_messageLabel; QActionGroup *m_clipTypeGroup; KActionCollection *m_effectsActionCollection; diff --git a/src/monitor.cpp b/src/monitor.cpp index 292623f6..f7ae4644 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -24,6 +24,7 @@ #include "smallruler.h" #include "docclipbase.h" #include "monitorscene.h" +#include "abstractclipitem.h" #include "kdenlivesettings.h" #include @@ -57,7 +58,9 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget m_length(0), m_dragStarted(false), m_effectScene(NULL), - m_effectView(NULL) + m_effectView(NULL), + m_selectedClip(NULL), + m_loopClipTransition(true) { m_ui.setupUi(this); QVBoxLayout *layout = new QVBoxLayout; @@ -199,15 +202,21 @@ QString Monitor::name() const return m_name; } -void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu) +void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu, QAction *loopClip) { m_contextMenu = new QMenu(this); m_contextMenu->addMenu(m_playMenu); - if (goMenu) m_contextMenu->addMenu(goMenu); - if (markerMenu) m_contextMenu->addMenu(markerMenu); + if (goMenu) + m_contextMenu->addMenu(goMenu); + if (markerMenu) + m_contextMenu->addMenu(markerMenu); m_playMenu->addAction(playZone); m_playMenu->addAction(loopZone); + if (loopClip) { + m_loopClipAction = loopClip; + m_playMenu->addAction(loopClip); + } //TODO: add save zone to timeline monitor when fixed if (m_name == "clip") { @@ -730,6 +739,16 @@ void Monitor::slotLoopZone() m_playAction->setIcon(m_pauseIcon); } +void Monitor::slotLoopClip() +{ + if (render == NULL || m_selectedClip == NULL) + return; + activateMonitor(); + render->loopZone(m_selectedClip->startPos(), m_selectedClip->endPos()); + m_playAction->setChecked(true); + m_playAction->setIcon(m_pauseIcon); +} + void Monitor::slotSetXml(DocClipBase *clip, QPoint zone, const int position) { if (render == NULL) return; @@ -843,6 +862,33 @@ QStringList Monitor::getZoneInfo() const return result; } +void Monitor::slotSetSelectedClip(AbstractClipItem* item) +{ + if (item) { + m_loopClipAction->setEnabled(true); + m_selectedClip = item; + } else { + m_loopClipAction->setEnabled(false); + } +} + +void Monitor::slotSetSelectedClip(ClipItem* item) +{ + if (item || (!item && !m_loopClipTransition)) { + m_loopClipTransition = false; + slotSetSelectedClip((AbstractClipItem*)item); + } +} + +void Monitor::slotSetSelectedClip(Transition* item) +{ + if (item || (!item && m_loopClipTransition)) { + m_loopClipTransition = true; + slotSetSelectedClip((AbstractClipItem*)item); + } +} + + void Monitor::slotEffectScene(bool show) { if (m_name == "project") { diff --git a/src/monitor.h b/src/monitor.h index ff6b88fb..8a2bd274 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -40,6 +40,9 @@ class Render; class SmallRuler; class DocClipBase; class MonitorScene; +class AbstractClipItem; +class Transition; +class ClipItem; class QGraphicsView; class QGraphicsPixmapItem; @@ -79,7 +82,7 @@ public: void resetSize(); bool isActive() const; void pause(); - void setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu = NULL); + void setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu = NULL, QAction *loopClip = NULL); const QString sceneList(); DocClipBase *activeClip(); GenTime position(); @@ -122,6 +125,8 @@ private: KIcon m_pauseIcon; TimecodeDisplay *m_timePos; QAction *m_playAction; + /** Has to be available so we can enable and disable it. */ + QAction *m_loopClipAction; QMenu *m_contextMenu; QMenu *m_configMenu; QMenu *m_playMenu; @@ -129,9 +134,15 @@ private: QPoint m_DragStartPosition; MonitorScene *m_effectScene; QGraphicsView *m_effectView; + /** Selected clip/transition in timeline. Used for looping it. */ + AbstractClipItem *m_selectedClip; + /** true if selected clip is transition, false = selected clip is clip. + * Necessary because sometimes we get two signals, e.g. we get a clip and we get selected transition = NULL. */ + bool m_loopClipTransition; #ifdef Q_WS_MAC VideoGLWidget *m_glWidget; #endif + GenTime getSnapForPos(bool previous); private slots: @@ -160,6 +171,8 @@ public slots: void slotPlay(); void slotPlayZone(); void slotLoopZone(); + /** @brief Loops the selected item (clip or transition). */ + void slotLoopClip(); void slotForward(double speed = 0); void slotRewind(double speed = 0); void slotRewindOneFrame(int diff = 1); @@ -180,6 +193,11 @@ public slots: void slotEffectScene(bool show = true); bool effectSceneDisplayed(); + /** @brief Sets m_selectedClip to @param item. Used for looping it. */ + void slotSetSelectedClip(AbstractClipItem *item); + void slotSetSelectedClip(ClipItem *item); + void slotSetSelectedClip(Transition *item); + signals: void renderPosition(int); void durationChanged(int); @@ -187,7 +205,7 @@ signals: void adjustMonitorSize(); void zoneUpdated(QPoint); void saveZone(Render *, QPoint); - /** @brief Editing transitions / effects over the monitor requires thr renderer to send frames as QImage. + /** @brief Editing transitions / effects over the monitor requires the renderer to send frames as QImage. * This causes a major slowdown, so we only enable it if required */ void requestFrameForAnalysis(bool); }; -- 2.39.2