From c60118aadf194393e71f34229ea38800352d6e66 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 24 Jun 2008 21:52:46 +0000 Subject: [PATCH] new icons, snapping can now be en/disabled svn path=/branches/KDE4/; revision=2272 --- icons/hi16-action-kdenlive-show-audio.png | Bin 213 -> 267 bytes .../hi16-action-kdenlive-show-audiothumb.png | Bin 0 -> 207 bytes icons/hi16-action-kdenlive-show-markers.png | Bin 0 -> 210 bytes icons/hi16-action-kdenlive-show-video.png | Bin 176 -> 205 bytes .../hi16-action-kdenlive-show-videothumb.png | Bin 0 -> 176 bytes icons/hi16-action-kdenlive-snap.png | Bin 0 -> 201 bytes src/customtrackview.cpp | 30 +++++++++-- src/kdenlivesettings.kcfg | 5 ++ src/mainwindow.cpp | 46 +++++++++++++++-- src/mainwindow.h | 2 + src/renderer.cpp | 48 +++++++++++------- src/renderer.h | 4 +- 12 files changed, 104 insertions(+), 31 deletions(-) create mode 100644 icons/hi16-action-kdenlive-show-audiothumb.png create mode 100644 icons/hi16-action-kdenlive-show-markers.png create mode 100644 icons/hi16-action-kdenlive-show-videothumb.png create mode 100644 icons/hi16-action-kdenlive-snap.png diff --git a/icons/hi16-action-kdenlive-show-audio.png b/icons/hi16-action-kdenlive-show-audio.png index 6247a1579e966a802bfb901cd40da146c24439a0..268ecfff65a805a637de51838a092a342b896285 100644 GIT binary patch delta 190 zcmV;v073uN0gD2VHwgv+8vrxepkr8(Kq7xNBQq@qS^xk5i%CR5R5;6HU>In?h%WH| z|Np6YH83(}<1~PfW^9Hq;nHm48tG%=8tDV$$7WZXV^hn7%?4zRFtB)P>q%rouo{4F zD+~n0<=f#hgozkGZ&)<(5X=y~E+7XGWk5h&zTJjJ6A$4{2go6d91dr8FW-V36N@UR sww^?eN~|tG)`U$nRTC1$NqOJ_09_$Mh5P9{5C8xG07*qoM6N<$f?wiGM*si- delta 135 zcmV;20C@k40@VSKHwpg${{a7>y{D6rKq7N7GfMW;IsgCwRY^oaR5;6HU>F5>0h_e( z4mN4y9Z39EbTv%)G^30CdV01R-4G^1wjzm7#byW-vEKRh^lUcF5Td+5EMOubK&SqC pdN!Nn7(fpXY%xJmG>!rW1^_vG9rug;4>SM(002ovPDHLkV1ny{HFp32 diff --git a/icons/hi16-action-kdenlive-show-audiothumb.png b/icons/hi16-action-kdenlive-show-audiothumb.png new file mode 100644 index 0000000000000000000000000000000000000000..816c54b5a1341c61bf7bec1b17c40608bd6b8d9d GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yMs&<1gqt%^ImXMAdnxofRwu3i*4wIEGl9PEL@p zbm(nNWH&2R3o?CR+92WkB5MYRW^ImXM0Ht2|2f73g@Qa?978NlzwO`1 zdq9DQ<-Eq`112-gF3(7{6YYJfp}3{yasI!OHd*PVhfIy%6fjK*Z5DYTr1zJ3hl}yz wnYB$a{%qd*Jk1In?h%WH| z|Nkj?H83*f;52}cW^9JQ4bZgEN36q_C;)0&>70Ghjdh hk$MS<+@w74005^=GlCwL1vLNw002ovPDHLkV1ngeG!y^; delta 98 zcmX@hxPftkIp=={AY8C_`Q(WXN`9Iw1p)7J7#J7~JY5_^EKVmUNU-)8u+84`(J{#6 zUsct$d5u88Ia^_4&a2%GG6pAjBqlh>u=4OQJY1=q_GVp-Jy0)$r>mdKI;Vst0EWUP ARR910 diff --git a/icons/hi16-action-kdenlive-show-videothumb.png b/icons/hi16-action-kdenlive-show-videothumb.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e9cbf03142d2e2a96997003242383552e16d93 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^QIH zq#2BFE=Z05if|TqL>2>8?FL~+t2d7y0R`DhJbhi+Z?H*-s_+NDQ=SJDGVpY946!(! zoFKv4W6&nWeAqF_ literal 0 HcmV?d00001 diff --git a/icons/hi16-action-kdenlive-snap.png b/icons/hi16-action-kdenlive-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d13dc3005a9f65f66cf26ef831a80c04a0e70732 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yMs&<1gqt%^ImXL=Dx{UdBEH3VC|EIEGl9PEJ^0 z8jzfDqsM<WNx{cmR?WZobfyQVMb0CiBez;k2i!V(NSBQ*zNTgm+k>DU n-#MKTXOEoXKe)ulkb&XqUH;lTb-iXlLm50>{an^LB{Ts57}7xd literal 0 HcmV?d00001 diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 93a0a2b4..60af8b52 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -405,6 +405,10 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) { setCursor(Qt::PointingHandCursor); } } // no clip under mouse + else if (m_tool == RAZORTOOL) { + QGraphicsView::mouseMoveEvent(event); + return; + } else if (opMode == MOVEGUIDE) { m_moveOpMode = opMode; setCursor(Qt::SplitHCursor); @@ -959,9 +963,17 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { setCursor(Qt::OpenHandCursor); // move clip if (m_dragItem->type() == AVWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { - MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false); - m_commandStack->push(command); - m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps()))); + bool success = m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps()))); + if (success) { + MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false); + m_commandStack->push(command); + } + else { + // undo last move and emit error message + MoveClipCommand *command = new MoveClipCommand(this, info, m_dragItemInfo, true); + m_commandStack->push(command); + emit displayMessage(i18n("Cannot move clip to requested position"), ErrorMessage); + } } if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); @@ -1183,8 +1195,15 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) { return; } //kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y(); - item->moveTo((int) end.startPos.frames(m_document->fps()), m_scale, (int)((end.track - start.track) * m_tracksHeight), end.track); - m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - start.track), (int)(m_tracksList.count() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps())); + + bool success = m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - start.track), (int)(m_tracksList.count() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps())); + if (success) { + item->moveTo((int) end.startPos.frames(m_document->fps()), m_scale, (int)((end.track - start.track) * m_tracksHeight), end.track); + } + else { + // undo last move and emit error message + emit displayMessage(i18n("Cannot move clip to requested position"), ErrorMessage); + } } void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) { @@ -1279,6 +1298,7 @@ double CustomTrackView::getSnapPointForPos(double pos) { void CustomTrackView::updateSnapPoints(AbstractClipItem *selected) { m_snapPoints.clear(); + if (!KdenliveSettings::snaptopoints()) return; GenTime offset; if (selected) offset = selected->duration(); QList itemList = items(); diff --git a/src/kdenlivesettings.kcfg b/src/kdenlivesettings.kcfg index 8395eb87..dac1dba7 100644 --- a/src/kdenlivesettings.kcfg +++ b/src/kdenlivesettings.kcfg @@ -201,5 +201,10 @@ false + + + true + + \ No newline at end of file diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 22b09371..49885c3e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -376,7 +376,7 @@ void MainWindow::setupActions() { m_toolGroup = new QActionGroup(this); - QString style1 = "QToolButton { background-color: rgba(230, 230, 230, 20); border-style: inset; border:1px solid #666666;border-radius: 3px;margin: 0px 3px} QToolButton:checked { background-color: rgba(224, 0, 0, 100); border-style: inset; border:1px solid #666666;border-radius: 3px;}"; + QString style1 = "QToolButton {background-color: rgba(230, 230, 230, 220); border-style: inset; border:1px solid #999999;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:checked { background-color: rgba(224, 224, 0, 100); border-style: inset; border:1px solid #cc6666;border-radius: 3px;}"; m_buttonSelectTool = toolbar->addAction(KIcon("kdenlive-select-tool"), i18n("Selection tool")); m_buttonSelectTool->setCheckable(true); @@ -389,6 +389,17 @@ void MainWindow::setupActions() { m_toolGroup->addAction(m_buttonSelectTool); m_toolGroup->addAction(m_buttonRazorTool); m_toolGroup->setExclusive(true); + toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly); + + QWidget * actionWidget; + actionWidget = toolbar->widgetForAction( m_buttonSelectTool ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + + actionWidget = toolbar->widgetForAction( m_buttonRazorTool ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + toolbar->setStyleSheet(style1); connect(m_toolGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeTool(QAction *))); @@ -415,22 +426,44 @@ void MainWindow::setupActions() { toolbar->addWidget(m_zoomSlider); - m_buttonVideoThumbs = toolbar->addAction(KIcon("video-mpeg"), i18n("Show video thumbnails")); + m_buttonVideoThumbs = toolbar->addAction(KIcon("kdenlive-show-videothumb"), i18n("Show video thumbnails")); m_buttonVideoThumbs->setCheckable(true); m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); connect(m_buttonVideoThumbs, SIGNAL(triggered()), this, SLOT(slotSwitchVideoThumbs())); - m_buttonAudioThumbs = toolbar->addAction(KIcon("audio-mpeg"), i18n("Show audio thumbnails")); + m_buttonAudioThumbs = toolbar->addAction(KIcon("kdenlive-show-audiothumb"), i18n("Show audio thumbnails")); m_buttonAudioThumbs->setCheckable(true); m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); connect(m_buttonAudioThumbs, SIGNAL(triggered()), this, SLOT(slotSwitchAudioThumbs())); - m_buttonShowMarkers = toolbar->addAction(KIcon("audio-mpeg"), i18n("Show markers comments")); + m_buttonShowMarkers = toolbar->addAction(KIcon("kdenlive-show-markers"), i18n("Show markers comments")); m_buttonShowMarkers->setCheckable(true); m_buttonShowMarkers->setChecked(KdenliveSettings::showmarkers()); connect(m_buttonShowMarkers, SIGNAL(triggered()), this, SLOT(slotSwitchMarkersComments())); + + m_buttonSnap = toolbar->addAction(KIcon("kdenlive-snap"), i18n("Snap")); + m_buttonSnap->setCheckable(true); + m_buttonSnap->setChecked(KdenliveSettings::snaptopoints()); + connect(m_buttonSnap, SIGNAL(triggered()), this, SLOT(slotSwitchSnap())); layout->addWidget(toolbar); + + actionWidget = toolbar->widgetForAction( m_buttonVideoThumbs ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + + actionWidget = toolbar->widgetForAction( m_buttonAudioThumbs ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + + actionWidget = toolbar->widgetForAction( m_buttonShowMarkers ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + + actionWidget = toolbar->widgetForAction( m_buttonSnap ); + actionWidget->setMaximumWidth(24); + actionWidget->setMinimumHeight(18); + m_messageLabel = new StatusBarMessageLabel(this); m_messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); @@ -958,7 +991,10 @@ void MainWindow::slotSwitchMarkersComments() { m_buttonShowMarkers->setChecked(KdenliveSettings::showmarkers()); } - +void MainWindow::slotSwitchSnap() { + KdenliveSettings::setSnaptopoints(!KdenliveSettings::snaptopoints()); + m_buttonShowMarkers->setChecked(KdenliveSettings::snaptopoints()); +} void MainWindow::slotDeleteTimelineClip() { diff --git a/src/mainwindow.h b/src/mainwindow.h index 1347b9f0..2a0deea1 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -124,6 +124,7 @@ private: QAction *m_buttonFitZoom; QAction *m_buttonSelectTool; QAction *m_buttonRazorTool; + QAction *m_buttonSnap; QActionGroup *m_toolGroup; QSlider *m_zoomSlider; StatusBarMessageLabel *m_messageLabel; @@ -162,6 +163,7 @@ private slots: void slotSwitchVideoThumbs(); void slotSwitchAudioThumbs(); void slotSwitchMarkersComments(); + void slotSwitchSnap(); void slotRenderProject(); void slotDoRender(const QString &dest, const QString &render, const QStringList &avformat_args, bool zoneOnly, bool playAfter); void slotFullScreen(); diff --git a/src/renderer.cpp b/src/renderer.cpp index 2fd774b6..58749d37 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -808,12 +808,11 @@ void Render::switchPlay() { if (m_mltProducer->get_speed() == 0.0) m_mltProducer->set_speed(1.0); else { m_isBlocked = true; - m_mltProducer->set_speed(0.0); - m_mltConsumer->set("refresh", 0); + m_mltProducer->set_speed(0.0); + //m_mltConsumer->set("refresh", 0); m_mltProducer->seek((int) m_framePosition); m_isBlocked = false; } - /*if (speed == 0.0) { m_mltProducer->seek((int) m_framePosition + 1); m_mltConsumer->purge(); @@ -1444,12 +1443,12 @@ void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime m_isBlocked = false; } -void Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) { - mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps)); +bool Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) { + return mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps)); } -void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) { +bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) { m_isBlocked = true; m_mltConsumer->set("refresh", 0); @@ -1467,27 +1466,39 @@ void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex)); trackPlaylist.consolidate_blanks(0); if (!trackPlaylist.is_blank_at(moveEnd)) { - kWarning() << "// ERROR, CLIP COLLISION----------"; - int ix = trackPlaylist.get_clip_index_at(moveEnd); - kDebug() << "BAD CLIP STARTS AT: " << trackPlaylist.clip_start(ix) << ", LENGT: " << trackPlaylist.clip_length(ix); + // error, destination is not empty + //int ix = trackPlaylist.get_clip_index_at(moveEnd); + mlt_service_unlock(m_mltConsumer->get_service()); + m_isBlocked = false; + return false; } - trackPlaylist.insert_at(moveEnd, clipProducer, 1); - trackPlaylist.consolidate_blanks(0); + else { + trackPlaylist.insert_at(moveEnd, clipProducer, 1); + trackPlaylist.consolidate_blanks(0); + } //mlt_service_unlock(service.get_service()); } else { - Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex)); - trackPlaylist.consolidate_blanks(0); - Mlt::Producer destTrackProducer(tractor.track(endTrack)); Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service()); - destTrackPlaylist.consolidate_blanks(1); - destTrackPlaylist.insert_at(moveEnd, clipProducer, 1); - destTrackPlaylist.consolidate_blanks(0); + if (!destTrackPlaylist.is_blank_at(moveEnd)) { + // error, destination is not empty + mlt_service_unlock(m_mltConsumer->get_service()); + m_isBlocked = false; + return false; + } + else { + Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex)); + trackPlaylist.consolidate_blanks(0); + destTrackPlaylist.consolidate_blanks(1); + destTrackPlaylist.insert_at(moveEnd, clipProducer, 1); + destTrackPlaylist.consolidate_blanks(0); + } } mltCheckLength(); mlt_service_unlock(m_mltConsumer->get_service()); m_isBlocked = false; m_mltConsumer->set("refresh", 1); + return true; } void Render::mltMoveTransition(QString type, int startTrack, int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut) { @@ -1603,7 +1614,6 @@ void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, G } void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) { - Mlt::Service service(m_mltProducer->parent().get_service()); Mlt::Tractor tractor(service); Mlt::Field *field = tractor.field(); @@ -1627,6 +1637,7 @@ void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime if (resource == tag && b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) { //kDebug() << " / / / / /DELETE TRANS DOOOMNE"; mlt_field_disconnect_service(field->get_field(), nextservice); + mlt_service_close(nextservice); break; } nextservice = mlt_service_producer(nextservice); @@ -1677,7 +1688,6 @@ QMap Render::mltGetTransitionParamsFromXml(QDomElement xml) { } void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) { - //kDebug() << "-- ADDING TRANSITION: " << tag << ", ON TRACKS: " << a_track << ", " << b_track; QMap args = mltGetTransitionParamsFromXml(xml); diff --git a/src/renderer.h b/src/renderer.h index 77fbdfaf..54510f12 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -154,8 +154,8 @@ Q_OBJECT public: void mltCutClip(int track, GenTime position); void mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out); void mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out); - void mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart); - void mltMoveClip(int startTrack, int endTrack, int pos, int moveStart); + bool mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart); + bool mltMoveClip(int startTrack, int endTrack, int pos, int moveStart); void mltRemoveClip(int track, GenTime position); void mltRemoveEffect(int track, GenTime position, QString index, bool doRefresh = true); void mltAddEffect(int track, GenTime position, QMap args, bool doRefresh = true); -- 2.39.5