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;
}
}
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;
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);
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();
</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 />
<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" />
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
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()));
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) {
void slotFind();
void findTimeout();
void slotFindNext();
+ void slotSelectClipInTimeline();
+ void slotClipInTimeline(const QString &clipId);
void slotInsertSpace();
void slotRemoveSpace();
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();
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);
} else m_openAction->setEnabled(false);
// Display relevant transcoding actions only
adjustTranscodeActions(clip);
+ // Display uses in timeline
+ emit findInTimeline(clip->clipId());
}
} else {
emit clipSelected(NULL);
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()));
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();
void refreshClip();
void updateRenderStatus();
void deleteProjectClips(QStringList ids, QMap <QString, QString> folderids);
+ void findInTimeline(const QString &clipId);
};
#endif