diff --git a/include/SongEditor.h b/include/SongEditor.h index 8a02d56919a..b9355cc25ca 100644 --- a/include/SongEditor.h +++ b/include/SongEditor.h @@ -63,6 +63,7 @@ class SongEditor : public TrackContainerView enum EditMode { DrawMode, + KnifeMode, SelectMode }; @@ -82,6 +83,7 @@ public slots: void setEditMode( EditMode mode ); void setEditModeDraw(); + void setEditModeKnife(); void setEditModeSelect(); void toggleProportionalSnap(); @@ -114,6 +116,7 @@ private slots: virtual void wheelEvent( QWheelEvent * we ); virtual bool allowRubberband() const; + virtual bool knifeMode() const; Song * m_song; @@ -192,6 +195,7 @@ protected slots: ActionGroup * m_editModeGroup; QAction* m_drawModeAction; + QAction* m_knifeModeAction; QAction* m_selectModeAction; QAction* m_crtlAction; diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 67575583b51..f1d68719fed 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -77,6 +77,7 @@ class TrackContainerView : public QWidget, public ModelView, const TrackView * trackViewAt( const int _y ) const; virtual bool allowRubberband() const; + virtual bool knifeMode() const; inline bool rubberBandActive() const { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index fe66ab4a5e5..a9d229062b6 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -716,7 +716,29 @@ void TrackContentObjectView::mousePressEvent( QMouseEvent * me ) { setInitialPos( me->pos() ); setInitialOffsets(); - if( !fixedTCOs() && me->button() == Qt::LeftButton ) + if ( m_trackView->trackContainerView()->knifeMode() + && me->button() == Qt::LeftButton ) + { + SampleTCO * leftTCO = dynamic_cast( m_tco ); + if ( leftTCO ) + { + const float ppt = m_trackView->trackContainerView()->pixelsPerTact(); + const int x = mapToParent( me->pos() ).x(); + MidiTime t = qMax( 0, m_trackView->trackContainerView()->currentPosition() + x * MidiTime::ticksPerTact()/ppt); + if ( me->modifiers() & Qt::ControlModifier + || me->modifiers() & Qt::AltModifier ) {} + else { t = t.quantize( gui->songEditor()->m_editor->getSnapSize() ); } + leftTCO->copy(); + SampleTCO * rightTCO = new SampleTCO ( leftTCO->getTrack() ); + rightTCO->paste(); + + leftTCO->changeLength( t - leftTCO->startPosition() ); + rightTCO->movePosition(t); + rightTCO->changeLength( rightTCO->length() - leftTCO->length() ); + rightTCO->setStartTimeOffset( leftTCO->startTimeOffset() - leftTCO->length() ); + } + } + else if( !fixedTCOs() && me->button() == Qt::LeftButton ) { if( me->modifiers() & Qt::ControlModifier ) { diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 7c69d5eb824..f37c4dc3880 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -307,6 +307,14 @@ bool TrackContainerView::allowRubberband() const +bool TrackContainerView::knifeMode() const +{ + return false; +} + + + + void TrackContainerView::setPixelsPerTact( int _ppt ) { m_ppt = _ppt; @@ -377,7 +385,7 @@ void TrackContainerView::dropEvent( QDropEvent * _de ) //it->toggledInstrumentTrackButton( true ); _de->accept(); } - else if( type == "samplefile" || type == "pluginpresetfile" + else if( type == "samplefile" || type == "pluginpresetfile" || type == "soundfontfile" || type == "vstpluginfile" || type == "patchfile" ) { diff --git a/src/gui/editors/SongEditor.cpp b/src/gui/editors/SongEditor.cpp index 6e23fcdbef7..dea0b7f712c 100644 --- a/src/gui/editors/SongEditor.cpp +++ b/src/gui/editors/SongEditor.cpp @@ -356,6 +356,11 @@ void SongEditor::setEditModeDraw() setEditMode(DrawMode); } +void SongEditor::setEditModeKnife() +{ + setEditMode(KnifeMode); +} + void SongEditor::setEditModeSelect() { setEditMode(SelectMode); @@ -713,6 +718,14 @@ bool SongEditor::allowRubberband() const +bool SongEditor::knifeMode() const +{ + return m_mode == KnifeMode; +} + + + + ComboBoxModel *SongEditor::zoomingModel() const { return m_zoomingModel; @@ -777,13 +790,16 @@ SongEditorWindow::SongEditorWindow(Song* song) : m_editModeGroup = new ActionGroup(this); m_drawModeAction = m_editModeGroup->addAction(embed::getIconPixmap("edit_draw"), tr("Draw mode")); + m_knifeModeAction = m_editModeGroup->addAction(embed::getIconPixmap("edit_knife"), tr("Knife mode (split sample clips)")); m_selectModeAction = m_editModeGroup->addAction(embed::getIconPixmap("edit_select"), tr("Edit mode (select and move)")); m_drawModeAction->setChecked(true); connect(m_drawModeAction, SIGNAL(triggered()), m_editor, SLOT(setEditModeDraw())); + connect(m_knifeModeAction, SIGNAL(triggered()), m_editor, SLOT(setEditModeKnife())); connect(m_selectModeAction, SIGNAL(triggered()), m_editor, SLOT(setEditModeSelect())); editActionsToolBar->addAction( m_drawModeAction ); + editActionsToolBar->addAction( m_knifeModeAction ); editActionsToolBar->addAction( m_selectModeAction ); DropToolBar *timeLineToolBar = addDropToolBarToTop(tr("Timeline controls"));