]> git.sesse.net Git - kdenlive/commitdiff
- Find clip, selected in project tree, in timeline
authorTill Theato <root@ttill.de>
Sat, 17 Apr 2010 15:16:50 +0000 (15:16 +0000)
committerTill Theato <root@ttill.de>
Sat, 17 Apr 2010 15:16:50 +0000 (15:16 +0000)
- Add "Edit duration" to timeline menu

svn path=/trunk/kdenlive/; revision=4386

src/customtrackview.cpp
src/customtrackview.h
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/projectlist.h

index b5ea9f328589d54cfeda6dd19e11f792d133b3f3..f4cb35fca5c1d7fafd6c2a2799bf31f537f5c6f0 100644 (file)
@@ -1304,7 +1304,11 @@ void CustomTrackView::editItemDuration()
         if (m_scene->selectedItems().count() == 1) {
             item = static_cast <AbstractClipItem *> (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<ItemInfo> CustomTrackView::findId(const QString &clipId)
+{
+    QList<ItemInfo> matchingInfo;
+    QList<QGraphicsItem *> 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);
index a023f93a434aad41fa8ef09afb5a7fb29bd32112..2cc1052b1849c40dd6bbaff48dd6d8e86bcb0a74 100644 (file)
@@ -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<ItemInfo> findId(const QString &clipId);
     void clipStart();
     void clipEnd();
     void changeClipSpeed();
index 5cd903724c5c52674f10510ce6a139e9d314f5d2..2b593562dc64677118c7363f5bfe872f095b5713 100644 (file)
@@ -36,7 +36,9 @@
       </Menu>
       <Separator />
       <Action name="reload_clip" />
-      <Action name="clip_properties" />       
+      <Menu name="clip_in_timeline"><text>Clip in Timeline</text>
+      </Menu>
+      <Action name="clip_properties" />
       <Action name="edit_clip" />
       <Action name="delete_clip" />
       <Separator />
@@ -86,6 +88,7 @@
       <Action name="resize_timeline_clip_end" />
       <Action name="cut_timeline_clip" />
       <Action name="delete_timeline_clip" />
+      <Action name="edit_item_duration" />
       <Menu name="guide_menu" ><text>Guides</text>
                <Action name="add_guide" />
                <Action name="edit_guide" />
index edc9e999196965384123ffc808a5d8e4c8a62024..cfcf397ad74f572d1bf48f246b074efbc773fd65 100644 (file)
@@ -262,7 +262,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
 
     m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone);
     m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast<QMenu*>(factory()->container("marker_menu", this)));
-    m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)), static_cast<QMenu*>(factory()->container("transcoders", this)));
+    m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)),
+                                      static_cast<QMenu*>(factory()->container("transcoders", this)),
+                                      static_cast<QMenu*>(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<ItemInfo> matching = m_activeTimeline->projectView()->findId(clipId);
+        
+        QMenu *inTimelineMenu = static_cast<QMenu*>(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<QAction *>(sender());
+        QStringList data = action->data().toStringList();
+        m_activeTimeline->projectView()->selectFound(data.at(0), data.at(1));
+    }
+}
+
 void MainWindow::keyPressEvent(QKeyEvent *ke)
 {
     if (m_findActivated) {
index 4307bd9aca0fb891511d35e4bcacf79ba43291c4..1d41e2802301e838471c401ed677613cd6ff15e2 100644 (file)
@@ -282,6 +282,8 @@ private slots:
     void slotFind();
     void findTimeout();
     void slotFindNext();
+    void slotSelectClipInTimeline();
+    void slotClipInTimeline(const QString &clipId);
 
     void slotInsertSpace();
     void slotRemoveSpace();
index 6f698385dc1841b1b334e4817a080ac028801811..6b9e129bb49eece7f4ad4174b0f3927fa0581580 100644 (file)
@@ -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 <ProjectItem*>(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()));
index a0172cefe44ae7c4bc39e64378d998e90f312204..ced79c768c84871df102b1e81193c7c3d95257b7 100644 (file)
@@ -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 <QString, QString> folderids);
+    void findInTimeline(const QString &clipId);
 };
 
 #endif