From 0c847584b04b4ff41b610aa9280848f6e30e33df Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 10 Nov 2008 21:54:30 +0000 Subject: [PATCH] piano roll, hold right click to delete multiple notes, hold ctrl to use the select tool git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1833 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 7 ++++ include/piano_roll.h | 1 + src/gui/piano_roll.cpp | 78 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index f8e65ff41..23d47e647 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-11-10 Andrew Kelley + * src/gui/piano_roll.h: + * src/gui/piano_roll.cpp: + -made it so you can hold right click and drag around to delete notes + -changed ctrl+click from opening automation window to shift+click + -hold ctrl to temporarily select the select tool + 2008-11-10 Tobias Doerffel * include/audio_portaudio.h: diff --git a/include/piano_roll.h b/include/piano_roll.h index 5742fa49f..9533aa46d 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -238,6 +238,7 @@ private: editModes m_editMode; + editModes m_ctrlMode; // mode they were in before they hit ctrl timeLine * m_timeLine; diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 54010efd8..1e8f0ef62 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -28,7 +28,6 @@ #include "piano_roll.h" - #include #include #include @@ -854,6 +853,13 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) } case Qt::Key_Control: + m_ctrlMode = m_editMode; + m_editMode = ModeSelect; + QApplication::changeOverrideCursor( + QCursor( Qt::ArrowCursor ) ); + update(); + break; + case Qt::Key_Shift: if( mouseOverNote() ) { m_editMode = ModeOpen; @@ -861,7 +867,7 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) QCursor( Qt::ArrowCursor ) ); update(); } - + break; default: _ke->ignore(); break; @@ -888,11 +894,16 @@ void pianoRoll::keyReleaseEvent( QKeyEvent * _ke ) switch( _ke->key() ) { case Qt::Key_Control: + m_editMode = m_ctrlMode; + update(); + break; + case Qt::Key_Shift: if( m_editMode == ModeOpen ) { m_editMode = ModeDraw; update(); } + break; } _ke->ignore(); } @@ -1630,10 +1641,71 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) m_moveStartKey = key_num; } else if( m_editMode == ModeOpen && !( mouseOverNote() - && _me->modifiers() & Qt::ControlModifier ) ) + && _me->modifiers() & Qt::ShiftModifier ) ) { m_editMode = ModeDraw; } + else if( m_editMode == ModeDraw && _me->buttons() & Qt::RightButton ) + { + // holding down right-click to delete notes + + // get tick in which the user clicked + int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + m_currentPosition; + + + // get note-vector of current pattern + const noteVector & notes = m_pattern->notes(); + + // will be our iterator in the following loop + noteVector::const_iterator it = notes.begin(); + + // loop through whole note-vector... + while( it != notes.end() ) + { + midiTime len = ( *it )->length(); + if( len < 0 ) + { + len = 4; + } + // and check whether the user clicked on an + // existing note or an edit-line + if( pos_ticks >= ( *it )->pos() && + len > 0 && + ( + ( edit_note == false && + pos_ticks <= ( *it )->pos() + len && + ( *it )->key() == key_num ) + || + ( edit_note == true && + pos_ticks <= ( *it )->pos() + + NE_LINE_WIDTH * + midiTime::ticksPerTact() / + m_ppt ) + ) + ) + { + // delete this note + if( it != notes.end() ) + { + if( ( *it )->length() > 0 ) + { + m_pattern->removeNote( *it ); + } + else + { + ( *it )->setLength( 0 ); + m_pattern->dataChanged(); + } + engine::getSong()->setModified(); + } + } + else + { + ++it; + } + } + } } else {