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.
<?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" />
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));
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()));
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)));
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)));
KAction *m_zoomOut;
KAction *m_loopZone;
KAction *m_playZone;
+ KAction *m_loopClip;
StatusBarMessageLabel *m_messageLabel;
QActionGroup *m_clipTypeGroup;
KActionCollection *m_effectsActionCollection;
#include "smallruler.h"
#include "docclipbase.h"
#include "monitorscene.h"
+#include "abstractclipitem.h"
#include "kdenlivesettings.h"
#include <KDebug>
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;
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") {
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;
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") {
class SmallRuler;
class DocClipBase;
class MonitorScene;
+class AbstractClipItem;
+class Transition;
+class ClipItem;
class QGraphicsView;
class QGraphicsPixmapItem;
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();
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;
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:
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);
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);
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);
};