}
}
-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;
- }
-
- ClipItem *clip = static_cast <ClipItem *>(item);
- QList <CommentedTime> markers = clip->baseClip()->commentedSnapMarkers();
+void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) {
+ DocClipBase *base = m_document->clipManager()->getClipById(id);
+ QList <CommentedTime> 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");
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);
return NULL;
}
-ClipItem *CustomTrackView::getActiveClipUnderCursor() const {
+ClipItem *CustomTrackView::getActiveClipUnderCursor(bool allowOutsideCursor) const {
QList<QGraphicsItem *> clips = scene()->selectedItems();
if (clips.isEmpty()) {
return getClipUnderCursor();
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));
}
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;
}
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;
}
}
+void CustomTrackView::slotInsertTrack() {
+}
+
+void CustomTrackView::slotDeleteTrack() {
+}
+
#include "customtrackview.moc"
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);
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);
void pasteClipEffects();
void slotUpdateAllThumbs();
void slotCheckPositionScrolling();
+ void slotInsertTrack();
+ void slotDeleteTrack();
protected:
virtual void drawBackground(QPainter * painter, const QRectF & rect);
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();
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() {
<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" />
#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;
//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;
}
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();
}
}
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()));
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()));
}
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();
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);
QPoint m_DragStartPosition;
bool m_dragStarted;
Overlay *m_overlay;
- void checkOverlay();
GenTime getSnapForPos(bool previous);
private slots:
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();