From 7caecc149e65907e4a57c8115c7cac12042e9308 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 29 Dec 2008 12:47:39 +0000 Subject: [PATCH] * Fix several transition move problems * Add default shortcuts to play zone and loop zone * increment version number f0r 0.7.1 release svn path=/branches/KDE4/; revision=2854 --- src/customtrackview.cpp | 81 ++++++++++++++++++++++------------------- src/customtrackview.h | 1 + src/kdenlivedoc.cpp | 2 +- src/kdenliveui.rc | 4 +- src/main.cpp | 2 +- src/mainwindow.cpp | 17 +++++++-- src/mainwindow.h | 2 + src/monitor.cpp | 7 ++-- src/monitor.h | 2 +- src/monitormanager.cpp | 10 +++++ src/monitormanager.h | 2 + 11 files changed, 82 insertions(+), 48 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 85bf44d8..9f513bd5 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1673,19 +1673,19 @@ void CustomTrackView::moveCursorPos(int delta) { m_cursorPos += delta; m_cursorLine->setPos(m_cursorPos, 0); m_document->renderer()->seek(GenTime(m_cursorPos, m_document->fps())); - //if (m_autoScroll && m_scale < 50) checkScrolling(); +} + +void CustomTrackView::initCursorPos(int pos) { + emit cursorMoved((int)(m_cursorPos), (int)(pos)); + m_cursorPos = pos; + m_cursorLine->setPos(pos, 0); + checkScrolling(); } void CustomTrackView::checkScrolling() { int vert = verticalScrollBar()->value(); int hor = cursorPos(); ensureVisible(hor, vert + 10, 2, 2, 50, 0); - //centerOn(QPointF(cursorPos(), m_tracksHeight)); - /*QRect rectInView = viewport()->rect(); - int delta = rectInView.width() / 3; - int max = rectInView.right() + horizontalScrollBar()->value() - delta; - //kDebug() << "CURSOR POS: "<= max) horizontalScrollBar()->setValue((int)(horizontalScrollBar()->value() + 1 + m_scale));*/ } void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { @@ -1783,12 +1783,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { // Also move automatic transitions (on lower track) Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track); if (tr && tr->isAutomatic()) { - tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track)); ItemInfo trInfo = tr->info(); ItemInfo newTrInfo = trInfo; + newTrInfo.track = info.track; newTrInfo.startPos = m_dragItem->startPos(); - if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) { - // transition end should be adjusted to clip on lower track + if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) { + // transition end should stay the same + } else { + // transition end should be adjusted to clip newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos); } new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); @@ -1797,12 +1799,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { // Check if there is a transition at clip end tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track); if (tr && tr->isAutomatic()) { - tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track)); ItemInfo trInfo = tr->info(); ItemInfo newTrInfo = trInfo; + newTrInfo.track = info.track; newTrInfo.endPos = m_dragItem->endPos(); - if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) { - // transition end should be moved + if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) { + // transition start should stay the same + } else { + // transition start should be moved newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); } new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); @@ -1815,11 +1819,13 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { ItemInfo newTrInfo = trInfo; newTrInfo.startPos = m_dragItem->startPos(); ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtEnd(newTrInfo.endPos, tr->track())) { - // transition end should be adjusted to clip on upper track - newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos); + if (!upperClip || !upperClip->baseClip()->isTransparent()) { + if (!getClipItemAtEnd(newTrInfo.endPos, tr->track())) { + // transition end should be adjusted to clip on upper track + newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos); + } + new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); } - new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); } if (m_dragItemInfo.track == info.track && (tr == NULL || tr->endPos() < m_dragItemInfo.endPos)) { // Check if there is a transition at clip end @@ -1829,11 +1835,13 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { ItemInfo newTrInfo = trInfo; newTrInfo.endPos = m_dragItem->endPos(); ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtStart(trInfo.startPos, tr->track())) { - // transition start should be moved - newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); + if (!upperClip || !upperClip->baseClip()->isTransparent()) { + if (!getClipItemAtStart(trInfo.startPos, tr->track())) { + // transition start should be moved + newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); + } + new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); } - new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); } } m_commandStack->push(moveCommand); @@ -1940,7 +1948,10 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { ItemInfo trInfo = transition->info(); ItemInfo newTrInfo = trInfo; newTrInfo.startPos = m_dragItem->startPos(); - new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); + ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); + if (!upperClip || !upperClip->baseClip()->isTransparent()) { + new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); + } } updateClipFade(static_cast (m_dragItem)); new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand); @@ -1973,26 +1984,19 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { ItemInfo trInfo = tr->info(); ItemInfo newTrInfo = trInfo; newTrInfo.endPos = m_dragItem->endPos(); - if (!static_cast(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) { - // transition start should be moved - newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); - } new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); } // Check if there is an automatic transition on that clip (upper track) tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1); - if (tr) kDebug() << "TRANS TRK: " << tr->transitionEndTrack() << ", CLP TRK:" << m_dragItemInfo.track << ", CALC: " << m_document->tracksCount() - tr->transitionEndTrack(); if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) { - kDebug() << ".............. GOT TRANSITION"; ItemInfo trInfo = tr->info(); ItemInfo newTrInfo = trInfo; newTrInfo.endPos = m_dragItem->endPos(); - if (!static_cast(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, trInfo.track)) { - // transition start should be moved - newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); + ClipItem * upperClip = getClipItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1); + if (!upperClip || !upperClip->baseClip()->isTransparent()) { + new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); } - new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); } new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand); @@ -2213,9 +2217,10 @@ void CustomTrackView::slotUpdateClip(const QString &clipId) { } ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) { - QList list = scene()->items(QPointF(pos.frames(m_document->fps()) - 1, track * m_tracksHeight + m_tracksHeight / 2)); + int framepos = (int)(pos.frames(m_document->fps())); + QList list = scene()->items(QPointF(framepos - 1, track * m_tracksHeight + m_tracksHeight / 2)); ClipItem *clip = NULL; - for (int i = 0; i < list.size(); ++i) { + for (int i = 0; i < list.size(); i++) { if (list.at(i)->type() == AVWIDGET) { ClipItem *test = static_cast (list.at(i)); if (test->endPos() == pos) clip = test; @@ -2228,7 +2233,7 @@ ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) { ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track) { QList list = scene()->items(QPointF(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2)); ClipItem *clip = NULL; - for (int i = 0; i < list.size(); ++i) { + for (int i = 0; i < list.size(); i++) { if (list.at(i)->type() == AVWIDGET) { ClipItem *test = static_cast (list.at(i)); if (test->startPos() == pos) clip = test; @@ -2241,7 +2246,7 @@ ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track) { ClipItem *CustomTrackView::getClipItemAt(int pos, int track) { QList list = scene()->items(QPointF(pos , track * m_tracksHeight + m_tracksHeight / 2)); ClipItem *clip = NULL; - for (int i = 0; i < list.size(); ++i) { + for (int i = 0; i < list.size(); i++) { if (list.at(i)->type() == AVWIDGET) { clip = static_cast (list.at(i)); break; @@ -2258,7 +2263,7 @@ ClipItem *CustomTrackView::getClipItemAt(GenTime pos, int track) { Transition *CustomTrackView::getTransitionItemAt(int pos, int track) { QList list = scene()->items(QPointF(pos, (track + 1) * m_tracksHeight)); Transition *clip = NULL; - for (int i = 0; i < list.size(); ++i) { + for (int i = 0; i < list.size(); i++) { if (list.at(i)->type() == TRANSITIONWIDGET) { clip = static_cast (list.at(i)); break; @@ -2276,7 +2281,7 @@ Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track) { int framepos = (int)(pos.frames(m_document->fps())); QList list = scene()->items(QPointF(framepos - 1, (track + 1) * m_tracksHeight)); Transition *clip = NULL; - for (int i = 0; i < list.size(); ++i) { + for (int i = 0; i < list.size(); i++) { if (list.at(i)->type() == TRANSITIONWIDGET) { Transition *test = static_cast (list.at(i)); if (test->endPos() == pos) clip = test; diff --git a/src/customtrackview.h b/src/customtrackview.h index 5129b563..046ef36e 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -107,6 +107,7 @@ public: void saveThumbnails(); void autoTransition(); QStringList getLadspaParams(QDomElement effect) const; + void initCursorPos(int pos); public slots: void setCursorPos(int pos, bool seek = true); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index ec7322e7..9f671ecc 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -847,7 +847,7 @@ bool KdenliveDoc::saveSceneList(const QString &path, QDomDocument sceneList) { QDomElement addedXml = sceneList.createElement("kdenlivedoc"); QDomElement markers = sceneList.createElement("markers"); - addedXml.setAttribute("version", "0.8"); + addedXml.setAttribute("version", "0.81"); addedXml.setAttribute("profile", profilePath()); addedXml.setAttribute("position", m_render->seekPosition().frames(m_fps)); addedXml.setAttribute("projectfolder", m_projectFolder.path()); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 1a83d98b..070744a7 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -72,6 +72,8 @@ Monitor + + Go To diff --git a/src/main.cpp b/src/main.cpp index 0b93c072..20a73bc6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ int main(int argc, char *argv[]) { KAboutData aboutData(QByteArray("kdenlive"), QByteArray("kdenlive"), - ki18n("Kdenlive"), QByteArray("0.7"), + ki18n("Kdenlive"), QByteArray("0.7.1"), ki18n("An open source video editor."), KAboutData::License_GPL, ki18n("Copyright (c) 2008 Development team")); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 85dcd0ad..a2062545 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -213,8 +213,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent setupGUI(); //kDebug() << factory() << " " << factory()->container("video_effects_menu", this); - m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this))); - m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), static_cast(factory()->container("marker_menu", this))); + 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))); // build effects menus QAction *action; @@ -715,6 +715,16 @@ void MainWindow::setupActions() { collection->addAction("monitor_play", monitorPlay); connect(monitorPlay, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlay())); + m_playZone = new KAction(KIcon("media-playback-start"), i18n("Play Zone"), this); + m_playZone->setShortcut(Qt::CTRL + Qt::Key_Space); + collection->addAction("monitor_play_zone", m_playZone); + connect(m_playZone, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlayZone())); + + m_loopZone = new KAction(KIcon("media-playback-start"), i18n("Loop Zone"), this); + m_loopZone->setShortcut(Qt::ALT + Qt::Key_Space); + collection->addAction("monitor_loop_zone", m_loopZone); + connect(m_loopZone, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotLoopZone())); + KAction *markIn = collection->addAction("mark_in"); markIn->setText(i18n("Set In Point")); markIn->setShortcut(Qt::Key_I); @@ -1137,7 +1147,8 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) { m_timelineArea->setCurrentIndex(m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description())); m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path()); trackView->setDuration(trackView->duration()); - trackView->projectView()->setCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps())); + trackView->projectView()->initCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps())); + if (m_timelineArea->count() > 1) m_timelineArea->setTabBarHidden(false); slotGotProgressInfo(QString(), -1); m_clipMonitor->refreshMonitor(true); diff --git a/src/mainwindow.h b/src/mainwindow.h index 629b1519..7788f4b6 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -164,6 +164,8 @@ private: KAction *m_saveAction; KAction *m_closeAction; QSlider *m_zoomSlider; + QAction *m_loopZone; + QAction *m_playZone; StatusBarMessageLabel *m_messageLabel; bool m_findActivated; diff --git a/src/monitor.cpp b/src/monitor.cpp index a8ce6abb..c0436943 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -67,8 +67,6 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent) m_playAction = m_playMenu->addAction(m_playIcon, i18n("Play")); m_playAction->setCheckable(true); connect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay())); - m_playMenu->addAction(m_playIcon, i18n("Play Zone"), this, SLOT(slotPlayZone())); - m_playMenu->addAction(m_playIcon, i18n("Loop Zone"), this, SLOT(slotLoopZone())); playButton->setMenu(m_playMenu); playButton->setPopupMode(QToolButton::MenuButtonPopup); @@ -146,12 +144,15 @@ QString Monitor::name() const { return m_name; } -void Monitor::setupMenu(QMenu *goMenu, QMenu *markerMenu) { +void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu) { m_contextMenu = new QMenu(this); m_contextMenu->addMenu(m_playMenu); m_contextMenu->addMenu(goMenu); if (markerMenu) m_contextMenu->addMenu(markerMenu); + m_playMenu->addAction(playZone); + m_playMenu->addAction(loopZone); + //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())); diff --git a/src/monitor.h b/src/monitor.h index 3d3054ba..907ccf35 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -70,7 +70,7 @@ public: void resetSize(); bool isActive() const; void pause(); - void setupMenu(QMenu *goMenu, QMenu *markerMenu = NULL); + void setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu = NULL); QDomDocument sceneList(); DocClipBase *activeClip(); GenTime position(); diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp index a0ed893a..8788f385 100644 --- a/src/monitormanager.cpp +++ b/src/monitormanager.cpp @@ -77,6 +77,16 @@ void MonitorManager::slotPlay() { else m_projectMonitor->slotPlay(); } +void MonitorManager::slotPlayZone() { + if (m_clipMonitor->isActive()) m_clipMonitor->slotPlayZone(); + else m_projectMonitor->slotPlayZone(); +} + +void MonitorManager::slotLoopZone() { + if (m_clipMonitor->isActive()) m_clipMonitor->slotLoopZone(); + else m_projectMonitor->slotLoopZone(); +} + void MonitorManager::slotRewind(double speed) { if (m_clipMonitor->isActive()) m_clipMonitor->slotRewind(speed); else m_projectMonitor->slotRewind(speed); diff --git a/src/monitormanager.h b/src/monitormanager.h index 4dfcd4d8..9029407c 100644 --- a/src/monitormanager.h +++ b/src/monitormanager.h @@ -40,6 +40,8 @@ public: public slots: void activateMonitor(QString name = QString::null); void slotPlay(); + void slotPlayZone(); + void slotLoopZone(); void slotRewind(double speed = 0); void slotForward(double speed = 0); void slotRewindOneFrame(); -- 2.39.2