]> git.sesse.net Git - kdenlive/commitdiff
Remember & save monitor zone for each clip:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Jan 2009 16:45:28 +0000 (16:45 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Jan 2009 16:45:28 +0000 (16:45 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=517

svn path=/branches/KDE4/; revision=2988

src/docclipbase.cpp
src/docclipbase.h
src/monitor.cpp
src/monitor.h
src/renderer.cpp
src/renderer.h

index b2b26de81dc6c4e785cd650d7769b525ba1357eb..3bddb769a2202825b02215f8ebdfe018e57d23bb 100644 (file)
@@ -76,6 +76,18 @@ DocClipBase::~DocClipBase() {
     m_baseTrackProducers.clear();
 }
 
+void DocClipBase::setZone(QPoint zone) {
+    m_properties.insert("zone_in", QString::number(zone.x()));
+    m_properties.insert("zone_out", QString::number(zone.y()));
+}
+
+QPoint DocClipBase::zone() const {
+    QPoint zone;
+    zone.setX(m_properties.value("zone_in").toInt());
+    zone.setY(m_properties.value("zone_out", "50").toInt());
+    return zone;
+}
+
 void DocClipBase::slotCreateAudioTimer() {
     connect(m_thumbProd, SIGNAL(audioThumbReady(QMap <int, QMap <int, QByteArray> >)), this , SLOT(updateAudioThumbnail(QMap <int, QMap <int, QByteArray> >)));
     connect(this, SIGNAL(getAudioThumbs()), this , SLOT(slotGetAudioThumbs()));
@@ -404,8 +416,10 @@ Mlt::Producer *DocClipBase::producer(int track) {
     if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) {
         if (m_baseTrackProducers.count() == 0) return NULL;
         int i;
-        for (int i = 0; i < m_baseTrackProducers.count(); i++)
-            if (m_baseTrackProducers.at(i) != NULL) return m_baseTrackProducers.at(i);
+        for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+            if (m_baseTrackProducers.at(i) != NULL)
+                return m_baseTrackProducers.at(i);
+        }
         return NULL;
     }
     if (track >= m_baseTrackProducers.count()) {
index 5171bc5a3c5aa66187ca0cfcc844f7b996a018c6..a956bf7398d59478a4bd5384d1291d4b19f26f90 100644 (file)
@@ -168,6 +168,11 @@ Q_OBJECT public:
     void setProducerProperty(const char *name, const char *data);
     void deleteProducers();
 
+    /** Set default play zone for clip monitor */
+    void setZone(QPoint zone);
+    /** Get default play zone for clip monitor */
+    QPoint zone() const;
+
 private:   // Private attributes
 
     /** A description of this clip */
index 4aad50d9bf7c9c1f8e9e6a71e88b8ae1055d861b..0d055d75e0fda93a9604901c1907f937c409db09 100644 (file)
@@ -114,7 +114,6 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
 
 
     connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
-    connect(m_ruler, SIGNAL(zoneChanged(QPoint)), this, SIGNAL(zoneUpdated(QPoint)));
     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
     connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
     connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
@@ -128,6 +127,9 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
     if (name != "clip") {
         connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
         connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int)));
+        connect(m_ruler, SIGNAL(zoneChanged(QPoint)), this, SIGNAL(zoneUpdated(QPoint)));
+    } else {
+        connect(m_ruler, SIGNAL(zoneChanged(QPoint)), this, SLOT(setClipZone(QPoint)));
     }
     m_monitorRefresh->show();
     kDebug() << "/////// BUILDING MONITOR, ID: " << ui.video_frame->winId();
@@ -259,18 +261,21 @@ GenTime Monitor::getSnapForPos(bool previous) {
 void Monitor::slotZoneMoved(int start, int end) {
     m_ruler->setZone(start, end);
     checkOverlay();
+    setClipZone(m_ruler->zone());
 }
 
 void Monitor::slotSetZoneStart() {
     m_ruler->setZone(m_position, -1);
     emit zoneUpdated(m_ruler->zone());
     checkOverlay();
+    setClipZone(m_ruler->zone());
 }
 
 void Monitor::slotSetZoneEnd() {
     m_ruler->setZone(-1, m_position);
     emit zoneUpdated(m_ruler->zone());
     checkOverlay();
+    setClipZone(m_ruler->zone());
 }
 
 // virtual
@@ -539,6 +544,10 @@ void Monitor::initMonitor() {
 void Monitor::adjustRulerSize(int length) {
     if (length > 0) m_length = length;
     m_ruler->adjustScale(m_length);
+    if (m_currentClip != NULL) {
+        QPoint zone = m_currentClip->zone();
+        m_ruler->setZone(zone.x(), zone.y());
+    }
 }
 
 void Monitor::stop() {
@@ -608,14 +617,9 @@ void Monitor::slotSetXml(DocClipBase *clip, const int position) {
         return;
     }
     if (clip != m_currentClip) {
-        if (clip->producer() != NULL) {
-            m_currentClip = clip;
-            render->setProducer(clip->producer(), position);
-            //m_ruler->slotNewValue(0);
-            //adjustRulerSize(clip->producer()->get_playtime());
-            //m_timePos->setText("00:00:00:00");
-            m_position = position;
-        }
+        m_currentClip = clip;
+        render->setProducer(clip->producer(), position);
+        m_position = position;
     } else if (position != -1) render->seek(GenTime(position, render->fps()));
 }
 
@@ -657,6 +661,12 @@ QDomDocument Monitor::sceneList() {
     return doc;
 }
 
+
+void Monitor::setClipZone(QPoint pos) {
+    if (m_currentClip == NULL) return;
+    m_currentClip->setZone(pos);
+}
+
 MonitorRefresh::MonitorRefresh(QWidget* parent): QWidget(parent), m_renderer(NULL) {
     setAttribute(Qt::WA_PaintOnScreen);
     setAttribute(Qt::WA_OpaquePaintEvent); //setAttribute(Qt::WA_NoSystemBackground);
index 73a9ff7caca20972ea19c2334b8f48846758879b..87f876c8e1e40eb70abbc91079b7874a79c74c22 100644 (file)
@@ -120,6 +120,7 @@ private slots:
     void slotSetSizeOneToTwo();
     void slotSaveZone();
     void slotSeek();
+    void setClipZone(QPoint pos);
 
 public slots:
     void slotOpenFile(const QString &);
index 92880e67edc109e08d969007b3aaec27216f7988..d237cf71d4f84806756e709bc1e6e1d6ac1f3ca7 100644 (file)
@@ -1128,6 +1128,7 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime) {
     if (!m_mltProducer || !m_mltConsumer)
         return;
     m_isBlocked = false;
+    if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1;
     m_mltProducer->set("out", stopTime.frames(m_fps));
     m_mltProducer->seek((int)(startTime.frames(m_fps)));
     m_mltProducer->set_speed(1.0);
@@ -1136,7 +1137,8 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime) {
 }
 
 void Render::resetZoneMode() {
-    m_mltProducer->set("out", m_mltProducer->get_length() - 1);
+    if (!m_isZoneMode && !m_isLoopMode) return;
+    m_mltProducer->set("out", m_originalOut);
     //m_mltProducer->set("eof", "pause");
     m_isZoneMode = false;
     m_isLoopMode = false;
index 3c69d96898e2b3910619eb09fff4958d482317df..2e28eb643601079aa2c44107576da9dacbf48ded 100644 (file)
@@ -200,6 +200,7 @@ private:   // Private attributes & methods
     bool m_isZoneMode;
     bool m_isLoopMode;
     GenTime m_loopStart;
+    int m_originalOut;
 
     /** true when monitor is in split view (several tracks at the same time) */
     bool m_isSplitView;