]> git.sesse.net Git - kdenlive/commitdiff
Allow to loop selected timeline item
authorTill Theato <root@ttill.de>
Fri, 24 Sep 2010 21:27:31 +0000 (21:27 +0000)
committerTill Theato <root@ttill.de>
Fri, 24 Sep 2010 21:27:31 +0000 (21:27 +0000)
svn path=/trunk/kdenlive/; revision=4929

src/colorpickerwidget.h
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/monitor.cpp
src/monitor.h

index ed2a73c06f9c80b6a763482cdb9bd89937526f23..7a6e874300927e302f5b70fdabe123c99756c110 100644 (file)
@@ -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.
index d64136332bdb514d3e9a798d5fdabbd1689a976d..16b70f08fbe163425f0e0346c36d7fa84f5caaf5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="54">
+<gui name="kdenlive" version="55">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
       <Action name="monitor_play" />
       <Action name="monitor_play_zone" />
       <Action name="monitor_loop_zone" />
+      <Action name="monitor_loop_clip" />
       <Separator />      
       <Menu name="monitor_go" ><text>Go To</text>
            <Action name="seek_start" />
index 605eb01e7088ce73df4ceee77b24a30239018363..61aa9419442d55e470a13b1408b1b13184e6a49c 100644 (file)
@@ -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<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone);
+    m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, NULL, m_loopClip);
     m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast<QMenu*>(factory()->container("marker_menu", this)));
 
     QMenu *clipInTimeline = static_cast<QMenu*>(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)));
index c27f7deeda080619b2f77d02ea0b6969fc903962..c0c12d74910ef327d06ea09c8f6552f95aaf2eda 100644 (file)
@@ -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;
index 292623f6aeddee66e31069025affad07d0cf2198..f7ae4644c2bcb401c3c496b06cce147372267f2b 100644 (file)
@@ -24,6 +24,7 @@
 #include "smallruler.h"
 #include "docclipbase.h"
 #include "monitorscene.h"
+#include "abstractclipitem.h"
 #include "kdenlivesettings.h"
 
 #include <KDebug>
@@ -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") {
index ff6b88fbe907bc0d538d054753c2ae0644ec9a56..8a2bd274226556e95c089809a3045ac5f5abb0eb 100644 (file)
@@ -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);
 };