From: <tt...@us...> - 2010-09-24 21:27:37
|
Revision: 4929 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=4929&view=rev Author: ttill Date: 2010-09-24 21:27:31 +0000 (Fri, 24 Sep 2010) Log Message: ----------- Allow to loop selected timeline item Modified Paths: -------------- trunk/kdenlive/src/colorpickerwidget.h trunk/kdenlive/src/kdenliveui.rc trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/mainwindow.h trunk/kdenlive/src/monitor.cpp trunk/kdenlive/src/monitor.h Modified: trunk/kdenlive/src/colorpickerwidget.h =================================================================== --- trunk/kdenlive/src/colorpickerwidget.h 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/colorpickerwidget.h 2010-09-24 21:27:31 UTC (rev 4929) @@ -58,7 +58,6 @@ 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. Modified: trunk/kdenlive/src/kdenliveui.rc =================================================================== --- trunk/kdenlive/src/kdenliveui.rc 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/kdenliveui.rc 2010-09-24 21:27:31 UTC (rev 4929) @@ -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" /> @@ -123,6 +123,7 @@ <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" /> Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/mainwindow.cpp 2010-09-24 21:27:31 UTC (rev 4929) @@ -352,7 +352,7 @@ 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 @@ 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 @@ 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 @@ 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))); Modified: trunk/kdenlive/src/mainwindow.h =================================================================== --- trunk/kdenlive/src/mainwindow.h 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/mainwindow.h 2010-09-24 21:27:31 UTC (rev 4929) @@ -230,6 +230,7 @@ KAction *m_zoomOut; KAction *m_loopZone; KAction *m_playZone; + KAction *m_loopClip; StatusBarMessageLabel *m_messageLabel; QActionGroup *m_clipTypeGroup; KActionCollection *m_effectsActionCollection; Modified: trunk/kdenlive/src/monitor.cpp =================================================================== --- trunk/kdenlive/src/monitor.cpp 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/monitor.cpp 2010-09-24 21:27:31 UTC (rev 4929) @@ -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 @@ 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 @@ 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 @@ 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 @@ 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") { Modified: trunk/kdenlive/src/monitor.h =================================================================== --- trunk/kdenlive/src/monitor.h 2010-09-24 07:18:59 UTC (rev 4928) +++ trunk/kdenlive/src/monitor.h 2010-09-24 21:27:31 UTC (rev 4929) @@ -40,6 +40,9 @@ class SmallRuler; class DocClipBase; class MonitorScene; +class AbstractClipItem; +class Transition; +class ClipItem; class QGraphicsView; class QGraphicsPixmapItem; @@ -79,7 +82,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |