PianoRoll: respect stacking order of notes

Notes are always drawn on-top of each other starting from the left
to the right. However the behaviour when clicking notes was reverse,
which made it quite hard to edit notes sometimes. Now the top most
note is edited/selected/moved/resized if notes overlay.

Closes #2808603.
(cherry picked from comit 28eb7e00bf)
This commit is contained in:
Tobias Doerffel
2010-08-24 18:42:49 +02:00
parent 9288998686
commit 8ebdee61f6

View File

@@ -1343,10 +1343,10 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
const NoteVector & notes = m_pattern->notes();
// will be our iterator in the following loop
NoteVector::ConstIterator it = notes.begin();
NoteVector::ConstIterator it = notes.begin()+notes.size()-1;
// loop through whole note-vector...
while( it != notes.end() )
for( int i = 0; i < notes.size(); ++i )
{
midiTime len = ( *it )->length();
if( len < 0 )
@@ -1372,7 +1372,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
{
break;
}
++it;
--it;
}
// first check whether the user clicked in note-edit-
@@ -1390,10 +1390,9 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
note * created_new_note = NULL;
// did it reach end of vector because
// there's no note??
if( it == notes.end() )
if( it == notes.begin()-1 )
{
m_pattern->setType(
pattern::MelodyPattern );
m_pattern->setType( pattern::MelodyPattern );
// then set new note
@@ -1549,10 +1548,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
// play the note
testPlayNote( m_currentNote );
}
engine::getSong()->setModified();
}
else if( ( _me->buttons() == Qt::RightButton &&
@@ -1561,7 +1557,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
{
// erase single note
m_mouseDownRight = true;
if( it != notes.end() )
if( it != notes.begin()-1 )
{
if( ( *it )->length() > 0 )
{
@@ -2009,36 +2005,37 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
// loop through vector
bool use_selection = isSelection();
NoteVector::ConstIterator it = notes.begin();
while( it != notes.end() )
NoteVector::ConstIterator it = notes.begin()+notes.size()-1;
for( int i = 0; i < notes.size(); ++i )
{
if( ( *it )->pos().getTicks() >= ticks_start
&& ( *it )->pos().getTicks() <= ticks_end
&& ( *it )->length().getTicks() != 0
&& ( ( *it )->selected() || ! use_selection ) )
note * n = *it;
if( n->pos().getTicks() >= ticks_start
&& n->pos().getTicks() <= ticks_end
&& n->length().getTicks() != 0
&& ( n->selected() || ! use_selection ) )
{
m_pattern->dataChanged();
// play the note so that the user can tell how loud it is
// and where it is panned
testPlayNote( *it );
testPlayNote( n );
if( m_noteEditMode == NoteEditVolume )
{
( *it )->setVolume( vol );
n->setVolume( vol );
m_pattern->instrumentTrack()->processInEvent(
midiEvent(
MidiKeyPressure,
0,
( *it )->key(),
n->key(),
vol * 127 / 100),
midiTime() );
}
else if( m_noteEditMode == NoteEditPanning )
{
( *it )->setPanning( pan );
n->setPanning( pan );
midiEvent evt( MidiMetaEvent, 0,
( *it )->key(), panningToMidi( pan ) );
n->key(), panningToMidi( pan ) );
evt.m_metaEvent = MidiNotePanning;
m_pattern->instrumentTrack()->processInEvent(
evt, midiTime() );
@@ -2046,18 +2043,18 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
}
else
{
if( ( *it )->isPlaying() )
if( n->isPlaying() )
{
// mouse not over this note, stop playing it.
m_pattern->instrumentTrack()->processInEvent(
midiEvent( MidiNoteOff, 0,
( *it )->key(), 0 ), midiTime() );
n->key(), 0 ), midiTime() );
( *it )->setIsPlaying( false );
n->setIsPlaying( false );
}
}
++it;
--it;
}
}
@@ -2073,10 +2070,10 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
const NoteVector & notes = m_pattern->notes();
// will be our iterator in the following loop
NoteVector::ConstIterator it = notes.begin();
NoteVector::ConstIterator it = notes.begin()+notes.size()-1;
// loop through whole note-vector...
while( it != notes.end() )
for( int i = 0; i < notes.size(); ++i )
{
// and check whether the cursor is over an
// existing note
@@ -2088,12 +2085,12 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
{
break;
}
++it;
--it;
}
// did it reach end of vector because there's
// no note??
if( it != notes.end() )
if( it != notes.begin()-1 )
{
// cursor at the "tail" of the note?
if( ( *it )->length() > 0 &&
@@ -3587,10 +3584,11 @@ note * pianoRoll::noteUnderMouse()
midiTime::ticksPerTact() / m_ppt + m_currentPosition;
// will be our iterator in the following loop
NoteVector::ConstIterator it = notes.begin();
NoteVector::ConstIterator it = notes.begin()+notes.size()-1;
// loop through whole note-vector...
while( it != notes.end() )
int i;
for( i = 0; i < notes.size(); ++i )
{
// and check whether the cursor is over an
// existing note
@@ -3600,7 +3598,12 @@ note * pianoRoll::noteUnderMouse()
{
break;
}
++it;
--it;
}
if( i == notes.size() )
{
return NULL;
}
return *it;