From: <j-...@us...> - 2008-12-02 00:16:16
|
Revision: 2743 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=2743&view=rev Author: j-b-m Date: 2008-12-02 00:16:08 +0000 (Tue, 02 Dec 2008) Log Message: ----------- Markers can now be added / edited from clip monitor context menu Modified Paths: -------------- branches/KDE4/src/customtrackview.cpp branches/KDE4/src/customtrackview.h branches/KDE4/src/headertrack.cpp branches/KDE4/src/kdenliveui.rc branches/KDE4/src/mainwindow.cpp branches/KDE4/src/monitor.cpp branches/KDE4/src/monitor.h branches/KDE4/src/trackview.cpp Modified: branches/KDE4/src/customtrackview.cpp =================================================================== --- branches/KDE4/src/customtrackview.cpp 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/customtrackview.cpp 2008-12-02 00:16:08 UTC (rev 2743) @@ -2097,83 +2097,25 @@ } } -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; - } +void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) { + DocClipBase *base = m_document->clipManager()->getClipById(id); + QList <CommentedTime> markers = base->commentedSnapMarkers(); - ClipItem *clip = static_cast <ClipItem *>(item); - QList <CommentedTime> markers = clip->baseClip()->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 @@ 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 @@ 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 @@ 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 @@ } 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::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::slotInsertTrack() { +} + +void CustomTrackView::slotDeleteTrack() { +} + #include "customtrackview.moc" Modified: branches/KDE4/src/customtrackview.h =================================================================== --- branches/KDE4/src/customtrackview.h 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/customtrackview.h 2008-12-02 00:16:08 UTC (rev 2743) @@ -58,10 +58,8 @@ 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 @@ 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 @@ void pasteClipEffects(); void slotUpdateAllThumbs(); void slotCheckPositionScrolling(); + void slotInsertTrack(); + void slotDeleteTrack(); protected: virtual void drawBackground(QPainter * painter, const QRectF & rect); @@ -205,7 +206,6 @@ 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(); Modified: branches/KDE4/src/headertrack.cpp =================================================================== --- branches/KDE4/src/headertrack.cpp 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/headertrack.cpp 2008-12-02 00:16:08 UTC (rev 2743) @@ -54,13 +54,13 @@ 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() { Modified: branches/KDE4/src/kdenliveui.rc =================================================================== --- branches/KDE4/src/kdenliveui.rc 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/kdenliveui.rc 2008-12-02 00:16:08 UTC (rev 2743) @@ -23,17 +23,20 @@ <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" /> Modified: branches/KDE4/src/mainwindow.cpp =================================================================== --- branches/KDE4/src/mainwindow.cpp 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/mainwindow.cpp 2008-12-02 00:16:08 UTC (rev 2743) @@ -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 @@ //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,27 +1477,121 @@ } 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(); + } } void MainWindow::slotAddGuide() { Modified: branches/KDE4/src/monitor.cpp =================================================================== --- branches/KDE4/src/monitor.cpp 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/monitor.cpp 2008-12-02 00:16:08 UTC (rev 2743) @@ -146,10 +146,11 @@ 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 @@ 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 @@ 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(); Modified: branches/KDE4/src/monitor.h =================================================================== --- branches/KDE4/src/monitor.h 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/monitor.h 2008-12-02 00:16:08 UTC (rev 2743) @@ -70,8 +70,11 @@ 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 @@ QPoint m_DragStartPosition; bool m_dragStarted; Overlay *m_overlay; - void checkOverlay(); GenTime getSnapForPos(bool previous); private slots: Modified: branches/KDE4/src/trackview.cpp =================================================================== --- branches/KDE4/src/trackview.cpp 2008-12-01 22:58:46 UTC (rev 2742) +++ branches/KDE4/src/trackview.cpp 2008-12-02 00:16:08 UTC (rev 2743) @@ -338,10 +338,10 @@ 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(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |