From a23790875ee20326ba0fb9d30b7719979659c2cd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 29 Oct 2009 23:22:25 +0000 Subject: [PATCH] First steps to implement 3 points editing (Using v to insert-overwrite) svn path=/trunk/kdenlive/; revision=4077 --- src/addtimelineclipcommand.cpp | 10 ++++++---- src/addtimelineclipcommand.h | 4 +++- src/customtrackview.cpp | 26 ++++++++++++++++++-------- src/customtrackview.h | 3 ++- src/kdenliveui.rc | 19 ++++++++++++------- src/mainwindow.cpp | 13 +++++++++++++ src/mainwindow.h | 1 + src/monitor.cpp | 10 ++++++++++ src/monitor.h | 1 + 9 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/addtimelineclipcommand.cpp b/src/addtimelineclipcommand.cpp index 7498fa18..3a13ad54 100644 --- a/src/addtimelineclipcommand.cpp +++ b/src/addtimelineclipcommand.cpp @@ -23,7 +23,7 @@ #include -AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent) : +AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool overwrite, bool push, bool doIt, bool doRemove, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_clipInfo(info), @@ -31,7 +31,9 @@ AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElemen m_clipId(clipId), m_xml(xml), m_doIt(doIt), - m_remove(doRemove) + m_remove(doRemove), + m_overwrite(overwrite), + m_push(push) { if (!m_remove) setText(i18n("Add timeline clip")); else setText(i18n("Delete timeline clip")); @@ -46,13 +48,13 @@ AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElemen void AddTimelineClipCommand::undo() { if (!m_remove) m_view->deleteClip(m_clipInfo, m_refresh); - else m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects, m_refresh); + else m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects, m_overwrite, m_push, m_refresh); } // virtual void AddTimelineClipCommand::redo() { if (m_doIt) { - if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects, m_refresh); + if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects, m_overwrite, m_push, m_refresh); else m_view->deleteClip(m_clipInfo, m_refresh); } m_doIt = true; diff --git a/src/addtimelineclipcommand.h b/src/addtimelineclipcommand.h index 2752c3a5..015e7a3c 100644 --- a/src/addtimelineclipcommand.h +++ b/src/addtimelineclipcommand.h @@ -34,7 +34,7 @@ class CustomTrackView; class AddTimelineClipCommand : public QUndoCommand { public: - AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent = 0); + AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool overwrite, bool push, bool doIt, bool doRemove, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); @@ -47,6 +47,8 @@ private: bool m_doIt; bool m_remove; bool m_refresh; + bool m_overwrite; + bool m_push; }; #endif diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 54b6f66a..8e824b34 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -2020,7 +2020,7 @@ void CustomTrackView::dropEvent(QDropEvent * event) } adjustTimelineClips(m_scene->editMode(), item, addCommand); - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, addCommand); + new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand); if (item->baseClip()->isTransparent() && getTransitionItemAtStart(info.startPos, info.track) == NULL) { // add transparency transition @@ -2077,7 +2077,7 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCo clip->resizeEnd(info.startPos.frames(m_document->fps())); } } else if (clip->endPos() < info.endPos) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, true, command); + new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, false, false, true, command); scene()->removeItem(clip); delete clip; clip = NULL; @@ -2575,7 +2575,7 @@ void CustomTrackView::deleteClip(const QString &clipId) // Clip is in a group, destroy the group new GroupClipsCommand(this, QList() << item->info(), QList(), false, deleteCommand); } - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteCommand); + new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, true, true, deleteCommand); } } } @@ -3350,7 +3350,7 @@ void CustomTrackView::deleteSelectedClips() ClipItem *item = static_cast (itemList.at(i)); if (item->parentItem()) resetGroup = true; //kDebug()<<"// DELETE CLP AT: "<info().startPos.frames(25); - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteSelected); + new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, true, true, deleteSelected); emit clipItemSelected(NULL); } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { transitionCount++; @@ -3516,7 +3516,7 @@ void CustomTrackView::doGroupClips(QList clipInfos, QList setDocumentModified(); } -void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool refresh) +void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool overwrite, bool push, bool refresh) { DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId); if (baseclip == NULL) { @@ -4569,7 +4569,7 @@ void CustomTrackView::pasteClip() info.endPos += offset; info.track += trackOffset; if (canBePastedTo(info, AVWIDGET)) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), true, false, pasteClips); + new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, true, false, pasteClips); } else emit displayMessage(i18n("Cannot paste clip to selected place"), ErrorMessage); } else if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == TRANSITIONWIDGET) { Transition *tr = static_cast (m_copiedItems.at(i)); @@ -4916,7 +4916,7 @@ void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo) for (int i = 0; i < selection.count(); i++) { if (selection.at(i)->type() == AVWIDGET) { ClipItem *item = static_cast (selection.at(i)); - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, true, deleteTrack); + new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, false, true, deleteTrack); m_scene->removeItem(item); delete item; item = NULL; @@ -5477,4 +5477,14 @@ void CustomTrackView::checkTrackSequence(int track) if (times != timelineList) KMessageBox::sorry(this, i18n("error"), i18n("TRACTOR")); } - +void CustomTrackView::insertZoneOverwrite(QStringList data, int in) +{ + DocClipBase *clip = m_document->getBaseClip(data.at(0)); + ItemInfo info; + info.startPos = GenTime(in, m_document->fps()); + info.cropDuration = GenTime(data.at(1).toInt(), m_document->fps()); + info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps());; + info.track = m_selectedTrack; + AddTimelineClipCommand *add = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false); + m_commandStack->push(add); +} diff --git a/src/customtrackview.h b/src/customtrackview.h index cdc5a3e8..e878e595 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -59,7 +59,7 @@ public: /** move transition, startPos = (old start, old end), endPos = (new start, new end) */ void moveTransition(const ItemInfo start, const ItemInfo end, bool m_refresh); void resizeClip(const ItemInfo start, const ItemInfo end, bool dontWorry = false); - void addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList list = EffectsList(), bool refresh = true); + void addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList list = EffectsList(), bool overwrite = false, bool push = false, bool refresh = true); void deleteClip(ItemInfo info, bool refresh = true); void slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position); void slotDeleteAllClipMarkers(const QString &id); @@ -168,6 +168,7 @@ public slots: void slotTrackUp(); void slotTrackDown(); void slotSelectTrack(int ix); + void insertZoneOverwrite(QStringList data, int in); protected: virtual void drawBackground(QPainter * painter, const QRectF & rect); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 91e60ccd..e1fa359c 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -71,12 +71,17 @@ Timeline - - - - - - + Selection + + + + + + + + Insertion + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 62243db0..ebcf106c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1101,6 +1101,11 @@ void MainWindow::setupActions() ungroupClip->setData("ungroup_clip"); connect(ungroupClip, SIGNAL(triggered(bool)), this, SLOT(slotUnGroupClips())); + KAction* insertOvertwrite = new KAction(KIcon(), i18n("Insert Clip Zone in Timeline (Overwrite)"), this); + insertOvertwrite->setShortcut(Qt::Key_V); + collection->addAction("overwrite_to_in_point", insertOvertwrite); + connect(insertOvertwrite, SIGNAL(triggered(bool)), this, SLOT(slotInsertClipOverwrite())); + KAction* selectTimelineClip = new KAction(KIcon("edit-select"), i18n("Select Clip"), this); selectTimelineClip->setShortcut(Qt::Key_Plus); collection->addAction("select_timeline_clip", selectTimelineClip); @@ -2333,6 +2338,14 @@ void MainWindow::slotCutTimelineClip() } } +void MainWindow::slotInsertClipOverwrite() +{ + if (m_activeTimeline) { + QStringList data = m_clipMonitor->getZoneInfo(); + m_activeTimeline->projectView()->insertZoneOverwrite(data, m_activeTimeline->inPoint()); + } +} + void MainWindow::slotSelectTimelineClip() { if (m_activeTimeline) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 7cd9bc7c..8fe335f2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -249,6 +249,7 @@ private slots: void slotDeleteAllClipMarkers(); void slotEditClipMarker(); void slotCutTimelineClip(); + void slotInsertClipOverwrite(); void slotSelectTimelineClip(); void slotSelectTimelineTransition(); void slotDeselectTimelineClip(); diff --git a/src/monitor.cpp b/src/monitor.cpp index 1a17c5f1..c5490a7f 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -851,6 +851,16 @@ void Monitor::updateTimecodeFormat() } } +QStringList Monitor::getZoneInfo() const +{ + QStringList result; + if (m_currentClip == NULL) return result; + result << m_currentClip->getId(); + QPoint zone = m_ruler->zone(); + result << QString::number(zone.x()) << QString::number(zone.y()); + return result; +} + MonitorRefresh::MonitorRefresh(QWidget* parent) : \ QWidget(parent), diff --git a/src/monitor.h b/src/monitor.h index 1fb41d9e..aacf233d 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -165,6 +165,7 @@ public slots: void slotSeekToPreviousSnap(); void adjustRulerSize(int length); void setTimePos(const QString &pos); + QStringList getZoneInfo() const; signals: void renderPosition(int); -- 2.39.2