From 685a1ac409a1ab03e846b264d03a9b2113f5eafc Mon Sep 17 00:00:00 2001 From: Till Theato Date: Sat, 17 Apr 2010 15:16:50 +0000 Subject: [PATCH] - Find clip, selected in project tree, in timeline - Add "Edit duration" to timeline menu svn path=/trunk/kdenlive/; revision=4386 --- src/customtrackview.cpp | 31 ++++++++++++++++++++++++++++++- src/customtrackview.h | 2 ++ src/kdenliveui.rc | 5 ++++- src/mainwindow.cpp | 38 +++++++++++++++++++++++++++++++++++++- src/mainwindow.h | 2 ++ src/projectlist.cpp | 8 +++++++- src/projectlist.h | 3 ++- 7 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index b5ea9f32..f4cb35fc 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1304,7 +1304,11 @@ void CustomTrackView::editItemDuration() if (m_scene->selectedItems().count() == 1) { item = static_cast (m_scene->selectedItems().at(0)); } else { - emit displayMessage(i18n("Cannot edit the duration of multiple items"), ErrorMessage); + if (m_scene->selectedItems().empty()) { + emit displayMessage(i18n("Cannot find clip to edit"), ErrorMessage); + } else { + emit displayMessage(i18n("Cannot edit the duration of multiple items"), ErrorMessage); + } return; } } @@ -4708,6 +4712,16 @@ bool CustomTrackView::findString(const QString &text) return false; } +void CustomTrackView::selectFound(QString track, QString pos) +{ + setCursorPos(m_document->timecode().getFrameCount(pos), true); + slotSelectTrack(track.toInt()); + selectClip(true); + int vert = verticalScrollBar()->value(); + int hor = cursorPos(); + ensureVisible(hor, vert + 10, 2, 2, 50, 0); +} + bool CustomTrackView::findNextString(const QString &text) { QString marker; @@ -4757,6 +4771,21 @@ void CustomTrackView::clearSearchStrings() m_findIndex = 0; } +QList CustomTrackView::findId(const QString &clipId) +{ + QList matchingInfo; + QList itemList = items(); + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == AVWIDGET) { + ClipItem *item = (ClipItem *)itemList.at(i); + if (item->clipProducer() == clipId) { + matchingInfo << item->info(); + } + } + } + return matchingInfo; +} + void CustomTrackView::copyClip() { qDeleteAll(m_copiedItems); diff --git a/src/customtrackview.h b/src/customtrackview.h index a023f93a..2cc1052b 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -90,9 +90,11 @@ public: double getSnapPointForPos(double pos); void editKeyFrame(const GenTime pos, const int track, const int index, const QString keyframes); bool findString(const QString &text); + void selectFound(QString track, QString pos); bool findNextString(const QString &text); void initSearchStrings(); void clearSearchStrings(); + QList findId(const QString &clipId); void clipStart(); void clipEnd(); void changeClipSpeed(); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 5cd90372..2b593562 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -36,7 +36,9 @@ - + Clip in Timeline + + @@ -86,6 +88,7 @@ + Guides diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index edc9e999..cfcf397a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -262,7 +262,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone); m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); - m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), static_cast(factory()->container("transcoders", this))); + m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), + static_cast(factory()->container("transcoders", this)), + static_cast(factory()->container("clip_in_timeline", this))); QAction *action; // build themes menus @@ -2029,6 +2031,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString))); + + connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&))); connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); @@ -2840,6 +2844,38 @@ void MainWindow::findTimeout() removeEventFilter(this); } +void MainWindow::slotClipInTimeline(const QString &clipId) +{ + if (m_activeTimeline && m_activeDocument) { + QList matching = m_activeTimeline->projectView()->findId(clipId); + + QMenu *inTimelineMenu = static_cast(factory()->container("clip_in_timeline", this)); + inTimelineMenu->clear(); + + for(int i = 0; i < matching.size(); ++i) { + QString track = QString::number(matching.at(i).track); + QString start = m_activeDocument->timecode().getTimecode(matching.at(i).startPos); + QAction *a = inTimelineMenu->addAction(track + ": " + start); + a->setData(QStringList() << track << start); + connect(a, SIGNAL(triggered()), this, SLOT(slotSelectClipInTimeline())); + } + + if (matching.empty()) + inTimelineMenu->setEnabled(false); + else + inTimelineMenu->setEnabled(true); + } +} + +void MainWindow::slotSelectClipInTimeline() +{ + if (m_activeTimeline) { + QAction *action = qobject_cast(sender()); + QStringList data = action->data().toStringList(); + m_activeTimeline->projectView()->selectFound(data.at(0), data.at(1)); + } +} + void MainWindow::keyPressEvent(QKeyEvent *ke) { if (m_findActivated) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 4307bd9a..1d41e280 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -282,6 +282,8 @@ private slots: void slotFind(); void findTimeout(); void slotFindNext(); + void slotSelectClipInTimeline(); + void slotClipInTimeline(const QString &clipId); void slotInsertSpace(); void slotRemoveSpace(); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 6f698385..6b9e129b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -173,7 +173,7 @@ void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction) m_menu->addActions(addMenu->actions()); } -void ProjectList::setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu) +void ProjectList::setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu, QMenu *inTimelineMenu) { if (!addMenu) return; QMenu *menu = m_addButton->menu(); @@ -186,6 +186,8 @@ void ProjectList::setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu) if (transcodeMenu->isEmpty()) transcodeMenu->setEnabled(false); m_transcodeAction = transcodeMenu; m_menu->addAction(m_reloadAction); + m_menu->addMenu(inTimelineMenu); + inTimelineMenu->setEnabled(false); m_menu->addAction(m_editAction); m_menu->addAction(m_openAction); m_menu->addAction(m_deleteAction); @@ -480,6 +482,8 @@ void ProjectList::slotClipSelected() } else m_openAction->setEnabled(false); // Display relevant transcoding actions only adjustTranscodeActions(clip); + // Display uses in timeline + emit findInTimeline(clip->clipId()); } } else { emit clipSelected(NULL); @@ -637,6 +641,8 @@ void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) clip = static_cast (item); // Display relevant transcoding actions only adjustTranscodeActions(clip); + // Display uses in timeline + emit findInTimeline(clip->clipId()); } else m_transcodeAction->setEnabled(false); if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) { m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp())); diff --git a/src/projectlist.h b/src/projectlist.h index a0172cef..ced79c76 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -142,7 +142,7 @@ public: void setHeaderInfo(const QByteArray &state); void updateProjectFormat(Timecode t); void setupMenu(QMenu *addMenu, QAction *defaultAction); - void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu); + void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu, QMenu *inTimelineMenu); QString currentClipUrl() const; KUrl::List getConditionalUrls(const QString &condition) const; void reloadClipThumbnails(); @@ -248,6 +248,7 @@ signals: void refreshClip(); void updateRenderStatus(); void deleteProjectClips(QStringList ids, QMap folderids); + void findInTimeline(const QString &clipId); }; #endif -- 2.39.2