From 7bdee3646c2dfbd8366093c8c9c6b8d675fa5bf1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 2 Dec 2008 00:16:08 +0000 Subject: [PATCH] Markers can now be added / edited from clip monitor context menu svn path=/branches/KDE4/; revision=2743 --- src/customtrackview.cpp | 123 +++++----------------------------------- src/customtrackview.h | 10 ++-- src/headertrack.cpp | 4 +- src/kdenliveui.rc | 15 +++-- src/mainwindow.cpp | 114 ++++++++++++++++++++++++++++++++++--- src/monitor.cpp | 11 +++- src/monitor.h | 6 +- src/trackview.cpp | 4 +- 8 files changed, 151 insertions(+), 136 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index c89092b9..4d59c1ef 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -2097,83 +2097,25 @@ void CustomTrackView::clipEnd() { } } -void CustomTrackView::slotAddClipMarker() { - QList 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 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 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 (item); - QList markers = clip->baseClip()->commentedSnapMarkers(); +void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) { + DocClipBase *base = m_document->clipManager()->getClipById(id); + QList 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 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 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" diff --git a/src/customtrackview.h b/src/customtrackview.h index ffe62e8a..67f0dc3f 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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 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(); diff --git a/src/headertrack.cpp b/src/headertrack.cpp index 0ad35548..014f4b02 100644 --- a/src/headertrack.cpp +++ b/src/headertrack.cpp @@ -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() { diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 56f8ed1b..2e1044c4 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -23,17 +23,20 @@ + + Clip + Markers + + + + + + Timeline - Markers - - - - - Guides diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index eb3a8c37..f2fa6c32 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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(factory()->container("monitor_go", this))); - m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this))); + m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), static_cast(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(); } } diff --git a/src/monitor.cpp b/src/monitor.cpp index 067efe3f..f21c6f7b 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -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 snaps; QList < GenTime > markers = m_currentClip->snapMarkers(); diff --git a/src/monitor.h b/src/monitor.h index 462d21a9..516c7679 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -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: diff --git a/src/trackview.cpp b/src/trackview.cpp index d4ccbde8..02da1554 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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(); -- 2.39.2