]> git.sesse.net Git - kdenlive/commitdiff
Markers can now be added / edited from clip monitor context menu
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 2 Dec 2008 00:16:08 +0000 (00:16 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 2 Dec 2008 00:16:08 +0000 (00:16 +0000)
svn path=/branches/KDE4/; revision=2743

src/customtrackview.cpp
src/customtrackview.h
src/headertrack.cpp
src/kdenliveui.rc
src/mainwindow.cpp
src/monitor.cpp
src/monitor.h
src/trackview.cpp

index c89092b9840887546bf09c68425979df85c2efa9..4d59c1efced379711d4fef13d77b840e94f78f44 100644 (file)
@@ -2097,83 +2097,25 @@ void CustomTrackView::clipEnd() {
     }
 }
 
-void CustomTrackView::slotAddClipMarker() {
-    QList<QGraphicsItem *> itemList = scene()->selectedItems();
-    if (itemList.count() != 1) {
-        emit displayMessage(i18n("Cannot add marker if more than one clip is selected"), ErrorMessage);
-        kDebug() << "// CANNOT ADD MARKER IF MORE TAN ONE CLIP IS SELECTED....";
-        return;
-    }
-    AbstractClipItem *item = (AbstractClipItem *)itemList.at(0);
-    if (item->type() != AVWIDGET) return;
-    GenTime pos = GenTime(m_cursorPos, m_document->fps());
-    if (item->startPos() > pos || item->endPos() < pos) return;
-    ClipItem *clip = (ClipItem *) item;
-    QString id = clip->baseClip()->getId();
-    GenTime position = pos - item->startPos() + item->cropStart();
-    CommentedTime marker(position, i18n("Marker"));
-    MarkerDialog d(clip->baseClip(), marker, m_document->timecode(), i18n("Add Marker"), this);
-    if (d.exec() == QDialog::Accepted) {
-        slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment());
-    }
-}
-
 void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c) {
     QString oldcomment = m_document->clipManager()->getClipById(id)->markerComment(t);
     AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t, true);
     m_commandStack->push(command);
 }
 
-void CustomTrackView::slotDeleteClipMarker() {
-    QList<QGraphicsItem *> itemList = scene()->selectedItems();
-    if (itemList.count() != 1) {
-        emit displayMessage(i18n("Cannot delete marker if more than one clip is selected"), ErrorMessage);
-        kDebug() << "// CANNOT DELETE MARKER IF MORE TAN ONE CLIP IS SELECTED....";
-        return;
-    }
-    AbstractClipItem *item = (AbstractClipItem *)itemList.at(0);
-    if (item->type() != AVWIDGET) {
-        emit displayMessage(i18n("No clip selected"), ErrorMessage);
-        return;
-    }
-    GenTime pos = GenTime(m_cursorPos, m_document->fps());
-    if (item->startPos() > pos || item->endPos() < pos) {
-        emit displayMessage(i18n("No selected clip at cursor time"), ErrorMessage);
-        return;
-    }
-    ClipItem *clip = (ClipItem *) item;
-    QString id = clip->baseClip()->getId();
-    GenTime position = pos - item->startPos() + item->cropStart();
-    QString comment = clip->baseClip()->markerComment(position);
-    if (comment.isEmpty()) {
-        emit displayMessage(i18n("No marker found at cursor time"), ErrorMessage);
-        return;
-    }
+void CustomTrackView::slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position) {
     AddMarkerCommand *command = new AddMarkerCommand(this, comment, QString(), id, position, true);
     m_commandStack->push(command);
 }
 
-void CustomTrackView::slotDeleteAllClipMarkers() {
-    QList<QGraphicsItem *> itemList = scene()->selectedItems();
-    if (itemList.count() != 1) {
-        emit displayMessage(i18n("Cannot delete marker if more than one clip is selected"), ErrorMessage);
-        kDebug() << "// CANNOT DELETE MARKER IF MORE TAN ONE CLIP IS SELECTED....";
-        return;
-    }
-    AbstractClipItem *item = (AbstractClipItem *)itemList.at(0);
-    if (item->type() != AVWIDGET) {
-        emit displayMessage(i18n("No clip selected"), ErrorMessage);
-        return;
-    }
-
-    ClipItem *clip = static_cast <ClipItem *>(item);
-    QList <CommentedTime> markers = clip->baseClip()->commentedSnapMarkers();
+void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) {
+    DocClipBase *base = m_document->clipManager()->getClipById(id);
+    QList <CommentedTime> markers = base->commentedSnapMarkers();
 
     if (markers.isEmpty()) {
         emit displayMessage(i18n("Clip has no markers"), ErrorMessage);
         return;
     }
-    QString id = clip->baseClip()->getId();
     QUndoCommand *deleteMarkers = new QUndoCommand();
     deleteMarkers->setText("Delete clip markers");
 
@@ -2183,49 +2125,6 @@ void CustomTrackView::slotDeleteAllClipMarkers() {
     m_commandStack->push(deleteMarkers);
 }
 
-void CustomTrackView::slotEditClipMarker() {
-    QList<QGraphicsItem *> itemList = scene()->selectedItems();
-    if (itemList.count() != 1) {
-        emit displayMessage(i18n("Cannot edit marker if more than one clip is selected"), ErrorMessage);
-        kDebug() << "// CANNOT DELETE MARKER IF MORE TAN ONE CLIP IS SELECTED....";
-        return;
-    }
-    AbstractClipItem *item = (AbstractClipItem *)itemList.at(0);
-    if (item->type() != AVWIDGET) {
-        emit displayMessage(i18n("No clip at cursor time"), ErrorMessage);
-        return;
-    }
-    GenTime pos = GenTime(m_cursorPos, m_document->fps());
-    if (item->startPos() > pos || item->endPos() < pos) {
-        emit displayMessage(i18n("No selected clip at cursor time"), ErrorMessage);
-        return;
-    }
-    ClipItem *clip = (ClipItem *) item;
-    QString id = clip->baseClip()->getId();
-    GenTime position = pos - item->startPos() + item->cropStart();
-    QString oldcomment = clip->baseClip()->markerComment(position);
-    if (oldcomment.isEmpty()) {
-        emit displayMessage(i18n("No marker found at cursor time"), ErrorMessage);
-        return;
-    }
-
-    CommentedTime marker(position, oldcomment);
-    MarkerDialog d(clip->baseClip(), marker, m_document->timecode(), i18n("Edit Marker"), this);
-    if (d.exec() == QDialog::Accepted) {
-        if (d.newMarker().time() == position) {
-            // marker position was not changed, only text
-            AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, d.newMarker().comment(), id, position, true);
-            m_commandStack->push(command);
-        } else {
-            // marker text and position were changed, remove previous marker and add new one
-            AddMarkerCommand *command1 = new AddMarkerCommand(this, oldcomment, QString(), id, position, true);
-            AddMarkerCommand *command2 = new AddMarkerCommand(this, QString(), d.newMarker().comment(), id, d.newMarker().time(), true);
-            m_commandStack->push(command1);
-            m_commandStack->push(command2);
-        }
-    }
-}
-
 void CustomTrackView::addMarker(const QString &id, const GenTime &pos, const QString comment) {
     DocClipBase *base = m_document->clipManager()->getClipById(id);
     if (!comment.isEmpty()) base->addSnapMarker(pos, comment);
@@ -2633,7 +2532,7 @@ ClipItem *CustomTrackView::getMainActiveClip() const {
     return NULL;
 }
 
-ClipItem *CustomTrackView::getActiveClipUnderCursor() const {
+ClipItem *CustomTrackView::getActiveClipUnderCursor(bool allowOutsideCursor) const {
     QList<QGraphicsItem *> clips = scene()->selectedItems();
     if (clips.isEmpty()) {
         return getClipUnderCursor();
@@ -2644,7 +2543,7 @@ ClipItem *CustomTrackView::getActiveClipUnderCursor() const {
             if (clips.at(i)->type() != AVWIDGET) clips.removeAt(i);
             else i++;
         }
-        if (clips.count() == 1) return static_cast < ClipItem *>(clips.at(0));
+        if (clips.count() == 1 && allowOutsideCursor) return static_cast < ClipItem *>(clips.at(0));
         for (int i = 0; i < clips.count(); ++i) {
             if (clips.at(i)->type() == AVWIDGET)
                 item = static_cast < ClipItem *>(clips.at(i));
@@ -2655,7 +2554,7 @@ ClipItem *CustomTrackView::getActiveClipUnderCursor() const {
 }
 
 void CustomTrackView::setInPoint() {
-    ClipItem *clip = getActiveClipUnderCursor();
+    ClipItem *clip = getActiveClipUnderCursor(true);
     if (clip == NULL) {
         emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
         return;
@@ -2668,7 +2567,7 @@ void CustomTrackView::setInPoint() {
 }
 
 void CustomTrackView::setOutPoint() {
-    ClipItem *clip = getActiveClipUnderCursor();
+    ClipItem *clip = getActiveClipUnderCursor(true);
     if (clip == NULL) {
         emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
         return;
@@ -2693,4 +2592,10 @@ void CustomTrackView::slotUpdateAllThumbs() {
     }
 }
 
+void CustomTrackView::slotInsertTrack() {
+}
+
+void CustomTrackView::slotDeleteTrack() {
+}
+
 #include "customtrackview.moc"
index ffe62e8aa813439fae15d3aec9f8aa933c647caa..67f0dc3f6b3e1bfb038c0a4515983c341f801587 100644 (file)
@@ -58,10 +58,8 @@ public:
     void resizeClip(const ItemInfo start, const ItemInfo end);
     void addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList list = EffectsList());
     void deleteClip(ItemInfo info);
-    void slotAddClipMarker();
-    void slotEditClipMarker();
-    void slotDeleteClipMarker();
-    void slotDeleteAllClipMarkers();
+    void slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position);
+    void slotDeleteAllClipMarkers(const QString &id);
     void addMarker(const QString &id, const GenTime &pos, const QString comment);
     void setScale(double scaleFactor);
     void deleteClip(const QString &clipId);
@@ -101,6 +99,7 @@ public:
     void slotInsertSpace();
     void slotRemoveSpace();
     void insertSpace(const GenTime &pos, int track, const GenTime duration, bool add);
+    ClipItem *getActiveClipUnderCursor(bool allowOutsideCursor = false) const;
 
 public slots:
     void setCursorPos(int pos, bool seek = true);
@@ -132,6 +131,8 @@ public slots:
     void pasteClipEffects();
     void slotUpdateAllThumbs();
     void slotCheckPositionScrolling();
+    void slotInsertTrack();
+    void slotDeleteTrack();
 
 protected:
     virtual void drawBackground(QPainter * painter, const QRectF & rect);
@@ -205,7 +206,6 @@ private:
     bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
     ClipItem *getClipUnderCursor() const;
     ClipItem *getMainActiveClip() const;
-    ClipItem *getActiveClipUnderCursor() const;
     bool insertPossible(AbstractGroupItem *group, const QPoint &pos) const;
     void resetSelectionGroup();
 
index 0ad355487438d30ab74cb4a57628857176effa15..014f4b026f06fc482d3b5513ee0edbf309a31836 100644 (file)
@@ -54,13 +54,13 @@ HeaderTrack::HeaderTrack(int index, TrackInfo info, QWidget *parent)
     m_contextMenu = new QMenu(this);
 
     //TODO: implement add/remove track
-    /*QAction *insertAction = new QAction(i18n("Insert track"), this);
+    QAction *insertAction = new QAction(i18n("Insert track"), this);
     m_contextMenu->addAction(insertAction);
     connect(insertAction, SIGNAL(triggered()), this, SLOT(slotAddTrack()));
 
     QAction *removeAction = new QAction(KIcon("edit-delete"), i18n("Delete track"), this);
     m_contextMenu->addAction(removeAction);
-    connect(removeAction, SIGNAL(triggered()), this, SLOT(slotDeleteTrack()));*/
+    connect(removeAction, SIGNAL(triggered()), this, SLOT(slotDeleteTrack()));
 }
 
 void HeaderTrack::switchVideo() {
index 56f8ed1b15ac267e68a0f24c75e9524677b74265..2e1044c4e550a6c9d01dec6a7eea37d9da4a30c3 100644 (file)
       <Action name="razor_tool" />
       <Action name="spacer_tool" />
     </Menu>
+    
+    <Menu name="clip" ><text>Clip</text>
+          <Menu name="marker_menu" ><text>Markers</text>
+               <Action name="add_clip_marker" />
+               <Action name="edit_clip_marker" />
+               <Action name="delete_clip_marker" />
+               <Action name="delete_all_clip_markers" />
+         </Menu>
+    </Menu>
 
     <Menu name="timeline" ><text>Timeline</text>
       <Action name="cut_timeline_clip" />
       <Action name="delete_timeline_clip" />
       <Action name="change_clip_speed" />
-      <Menu name="marker_menu" ><text>Markers</text>
-               <Action name="add_clip_marker" />
-               <Action name="edit_clip_marker" />
-               <Action name="delete_clip_marker" />
-               <Action name="delete_all_clip_markers" />
-      </Menu>
       <Menu name="guide_menu" ><text>Guides</text>
                <Action name="add_guide" />
                <Action name="edit_guide" />
index eb3a8c37a3cf3f2c1fd52438728a29faa337c212..f2fa6c322f2d26823d83c031a9ac94e3a4e44627 100644 (file)
@@ -81,6 +81,8 @@
 #include "wizard.h"
 #include "editclipcommand.h"
 #include "titlewidget.h"
+#include "markerdialog.h"
+#include "clipitem.h"
 
 static const int ID_STATUS_MSG = 1;
 static const int ID_EDITMODE_MSG = 2;
@@ -212,7 +214,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     //kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
 
     m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)));
-    m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)));
+    m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), static_cast<QMenu*>(factory()->container("marker_menu", this)));
 
     // build effects menus
     QAction *action;
@@ -1475,26 +1477,120 @@ void MainWindow::slotChangeClipSpeed() {
 }
 
 void MainWindow::slotAddClipMarker() {
-    if (m_activeTimeline) {
-        m_activeTimeline->projectView()->slotAddClipMarker();
+    DocClipBase *clip = NULL;
+    GenTime pos;
+    if (m_projectMonitor->isActive()) {
+        if (m_activeTimeline) {
+            ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
+            if (item) {
+                pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+                clip = item->baseClip();
+            }
+        }
+    } else {
+        clip = m_clipMonitor->activeClip();
+        pos = m_clipMonitor->position();
     }
+    if (!clip) {
+        m_messageLabel->setMessage(i18n("Cannot find clip to add marker"), ErrorMessage);
+        return;
+    }
+    QString id = clip->getId();
+    CommentedTime marker(pos, i18n("Marker"));
+    MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Add Marker"), this);
+    if (d.exec() == QDialog::Accepted) {
+        m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment());
+    }
+    if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay();
 }
 
 void MainWindow::slotDeleteClipMarker() {
-    if (m_activeTimeline) {
-        m_activeTimeline->projectView()->slotDeleteClipMarker();
+    DocClipBase *clip = NULL;
+    GenTime pos;
+    if (m_projectMonitor->isActive()) {
+        if (m_activeTimeline) {
+            ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
+            if (item) {
+                pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+                clip = item->baseClip();
+            }
+        }
+    } else {
+        clip = m_clipMonitor->activeClip();
+        pos = m_clipMonitor->position();
+    }
+    if (!clip) {
+        m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage);
+        return;
     }
+
+    QString id = clip->getId();
+    QString comment = clip->markerComment(pos);
+    if (comment.isEmpty()) {
+        m_messageLabel->setMessage(i18n("No marker found at cursor time"), ErrorMessage);
+        return;
+    }
+    m_activeTimeline->projectView()->slotDeleteClipMarker(comment, id, pos);
+    if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay();
+
 }
 
 void MainWindow::slotDeleteAllClipMarkers() {
-    if (m_activeTimeline) {
-        m_activeTimeline->projectView()->slotDeleteAllClipMarkers();
+    DocClipBase *clip = NULL;
+    if (m_projectMonitor->isActive()) {
+        if (m_activeTimeline) {
+            ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
+            if (item) {
+                clip = item->baseClip();
+            }
+        }
+    } else {
+        clip = m_clipMonitor->activeClip();
     }
+    if (!clip) {
+        m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage);
+        return;
+    }
+    m_activeTimeline->projectView()->slotDeleteAllClipMarkers(clip->getId());
+    if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay();
 }
 
 void MainWindow::slotEditClipMarker() {
-    if (m_activeTimeline) {
-        m_activeTimeline->projectView()->slotEditClipMarker();
+    DocClipBase *clip = NULL;
+    GenTime pos;
+    if (m_projectMonitor->isActive()) {
+        if (m_activeTimeline) {
+            ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
+            if (item) {
+                pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+                clip = item->baseClip();
+            }
+        }
+    } else {
+        clip = m_clipMonitor->activeClip();
+        pos = m_clipMonitor->position();
+    }
+    if (!clip) {
+        m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage);
+        return;
+    }
+
+    QString id = clip->getId();
+    QString oldcomment = clip->markerComment(pos);
+    if (oldcomment.isEmpty()) {
+        m_messageLabel->setMessage(i18n("No marker found at cursor time"), ErrorMessage);
+        return;
+    }
+
+    CommentedTime marker(pos, oldcomment);
+    MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Edit Marker"), this);
+    if (d.exec() == QDialog::Accepted) {
+        m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment());
+        if (d.newMarker().time() != pos) {
+            // remove old marker
+            m_activeTimeline->projectView()->slotAddClipMarker(id, pos, QString());
+        }
+        if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay();
     }
 }
 
index 067efe3f39743f355fc87c0af9ce317e9b6fa897..f21c6f7b2da82a59e3996b82b58d1a05df62e9be 100644 (file)
@@ -146,10 +146,11 @@ QString Monitor::name() const {
     return m_name;
 }
 
-void Monitor::setupMenu(QMenu *goMenu) {
+void Monitor::setupMenu(QMenu *goMenu, QMenu *markerMenu) {
     m_contextMenu = new QMenu(this);
     m_contextMenu->addMenu(m_playMenu);
     m_contextMenu->addMenu(goMenu);
+    if (markerMenu) m_contextMenu->addMenu(markerMenu);
 
     //TODO: add save zone to timeline monitor when fixed
     if (m_name == "clip") m_contextMenu->addAction(KIcon("document-save"), i18n("Save zone"), this, SLOT(slotSaveZone()));
@@ -210,6 +211,10 @@ void Monitor::resetSize() {
     ui.video_frame->setMinimumSize(0, 0);
 }
 
+DocClipBase *Monitor::activeClip() {
+    return m_currentClip;
+}
+
 void Monitor::slotSeekToPreviousSnap() {
     if (m_currentClip) slotSeek(getSnapForPos(true).frames(m_monitorManager->timecode().fps()));
 }
@@ -218,6 +223,10 @@ void Monitor::slotSeekToNextSnap() {
     if (m_currentClip) slotSeek(getSnapForPos(false).frames(m_monitorManager->timecode().fps()));
 }
 
+GenTime Monitor::position() {
+    return GenTime(m_position, m_monitorManager->timecode().fps());
+}
+
 GenTime Monitor::getSnapForPos(bool previous) {
     QList <GenTime> snaps;
     QList < GenTime > markers = m_currentClip->snapMarkers();
index 462d21a9c3423eaefe25b9290b7fe1f6e6947276..516c7679f3f76cc1ca3466e49123754aef32ba84 100644 (file)
@@ -70,8 +70,11 @@ public:
     void resetSize();
     bool isActive() const;
     void pause();
-    void setupMenu(QMenu *goMenu);
+    void setupMenu(QMenu *goMenu, QMenu *markerMenu = NULL);
     QDomDocument sceneList();
+    DocClipBase *activeClip();
+    GenTime position();
+    void checkOverlay();
 
 protected:
     virtual void mousePressEvent(QMouseEvent * event);
@@ -106,7 +109,6 @@ private:
     QPoint m_DragStartPosition;
     bool m_dragStarted;
     Overlay *m_overlay;
-    void checkOverlay();
     GenTime getSnapForPos(bool previous);
 
 private slots:
index d4ccbde877d0346d63bf0d9df1b2702f68aca7aa..02da1554de75a11c0e50c8999fd24dda09dfa441 100644 (file)
@@ -338,10 +338,10 @@ void TrackView::slotRebuildTrackHeaders() {
         HeaderTrack *header = new HeaderTrack(i, list.at(max - i - 1), this);
         connect(header, SIGNAL(switchTrackVideo(int)), m_trackview, SLOT(slotSwitchTrackVideo(int)));
         connect(header, SIGNAL(switchTrackAudio(int)), m_trackview, SLOT(slotSwitchTrackAudio(int)));
-        /*
+
         //TODO: re-enable when add / remove track is implemented
         connect(header, SIGNAL(deleteTrack(int)), m_trackview, SLOT(slotDeleteTrack(int)));
-        connect(header, SIGNAL(insertTrack(int)), m_trackview, SLOT(slotInsertTrack(int)));*/
+        connect(header, SIGNAL(insertTrack(int)), m_trackview, SLOT(slotInsertTrack(int)));
         m_headersLayout->addWidget(header);
     }
     view->headers_container->adjustSize();