alex mitchell's piano roll header: add correct motion event handler
This commit is contained in:
parent
baa32aa5bd
commit
a3838f0c66
@ -497,35 +497,93 @@ PianoRollHeader::get_note_name (int note)
|
|||||||
bool
|
bool
|
||||||
PianoRollHeader::on_motion_notify_event (GdkEventMotion* ev)
|
PianoRollHeader::on_motion_notify_event (GdkEventMotion* ev)
|
||||||
{
|
{
|
||||||
int note = _view.y_to_note (ev->y);
|
if (!_scroomer_drag && ev->x < _scroomer_size){
|
||||||
set_note_highlight (note);
|
Gdk::Cursor m_Cursor;
|
||||||
|
double scroomer_top = max(1.0, (1.0 - ((_adj.get_value()+_adj.get_page_size()) / 127.0)) * get_height () );
|
||||||
|
double scroomer_bottom = (1.0 - (_adj.get_value () / 127.0)) * get_height ();
|
||||||
|
if (ev->y > scroomer_top - 5 && ev->y < scroomer_top + 5){
|
||||||
|
m_Cursor = Gdk::Cursor (Gdk::TOP_SIDE);
|
||||||
|
get_window()->set_cursor(m_Cursor);
|
||||||
|
_scroomer_state = TOP;
|
||||||
|
}else if (ev->y > scroomer_bottom - 5 && ev->y < scroomer_bottom + 5){
|
||||||
|
m_Cursor = Gdk::Cursor (Gdk::BOTTOM_SIDE);
|
||||||
|
get_window()->set_cursor(m_Cursor);
|
||||||
|
_scroomer_state = BOTTOM;
|
||||||
|
}else {
|
||||||
|
_scroomer_state = MOVE;
|
||||||
|
get_window()->set_cursor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_dragging) {
|
if (_scroomer_drag){
|
||||||
if (false /*editor().current_mouse_mode() == Editing::MouseRange*/) { //ToDo: fix this. this mode is buggy, and of questionable utility anyway
|
double pixel2val = 127.0 / get_height();
|
||||||
|
double delta = _old_y - ev->y;
|
||||||
|
double val_at_pointer = (delta * pixel2val);
|
||||||
|
double real_val_at_pointer = 127.0 - (ev->y * pixel2val);
|
||||||
|
double note_range = _adj.get_page_size ();
|
||||||
|
|
||||||
/* select note range */
|
switch (_scroomer_button_state){
|
||||||
|
case MOVE:
|
||||||
|
_fract += val_at_pointer;
|
||||||
|
_fract = (_fract + note_range > 127.0)? 127.0 - note_range : _fract;
|
||||||
|
_fract = max(0.0, _fract);
|
||||||
|
_adj.set_value (min(_fract, 127.0 - note_range));
|
||||||
|
break;
|
||||||
|
case TOP:
|
||||||
|
real_val_at_pointer = real_val_at_pointer <= _saved_top_val? _adj.get_value() + _adj.get_page_size() : real_val_at_pointer;
|
||||||
|
real_val_at_pointer = min(127.0, real_val_at_pointer);
|
||||||
|
if (_note_height >= 18.5){
|
||||||
|
_saved_top_val = min(_adj.get_value() + _adj.get_page_size (), 127.0);
|
||||||
|
}else _saved_top_val = 0.0;
|
||||||
|
//if we are at largest note size & the user is moving down don't do anything
|
||||||
|
//FIXME we are using a heuristic of 18.5 for max note size, but this changes when track size is small to 19.5?
|
||||||
|
_view.apply_note_range (_adj.get_value (), real_val_at_pointer, true);
|
||||||
|
break;
|
||||||
|
case BOTTOM:
|
||||||
|
real_val_at_pointer = max(0.0, real_val_at_pointer);
|
||||||
|
real_val_at_pointer = real_val_at_pointer >= _saved_bottom_val? _adj.get_value() : real_val_at_pointer;
|
||||||
|
if (_note_height >= 18.5){
|
||||||
|
_saved_bottom_val = _adj.get_value();
|
||||||
|
}else _saved_bottom_val = 127.0;
|
||||||
|
_view.apply_note_range (real_val_at_pointer, _adj.get_value () + _adj.get_page_size (), true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
int note = _view.y_to_note(ev->y);
|
||||||
|
set_note_highlight (note);
|
||||||
|
|
||||||
if (Keyboard::no_modifiers_active (ev->state)) {
|
if (_dragging) {
|
||||||
AddNoteSelection (note); // EMIT SIGNAL
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
if ( false /*editor().current_mouse_mode() == Editing::MouseRange*/ ) { //ToDo: fix this. this mode is buggy, and of questionable utility anyway
|
||||||
/* play notes */
|
|
||||||
/* redraw already taken care of above in set_note_highlight */
|
|
||||||
if (_clicked_note != NO_MIDI_NOTE && _clicked_note != note) {
|
|
||||||
_active_notes[_clicked_note] = false;
|
|
||||||
send_note_off (_clicked_note);
|
|
||||||
|
|
||||||
_clicked_note = note;
|
/* select note range */
|
||||||
|
|
||||||
if (!_active_notes[note]) {
|
if (Keyboard::no_modifiers_active (ev->state)) {
|
||||||
_active_notes[note] = true;
|
AddNoteSelection (note); // EMIT SIGNAL
|
||||||
send_note_on (note);
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* play notes */
|
||||||
|
/* redraw already taken care of above in set_note_highlight */
|
||||||
|
if (_clicked_note != NO_MIDI_NOTE && _clicked_note != note) {
|
||||||
|
_active_notes[_clicked_note] = false;
|
||||||
|
send_note_off(_clicked_note);
|
||||||
|
|
||||||
|
_clicked_note = note;
|
||||||
|
|
||||||
|
if (!_active_notes[note]) {
|
||||||
|
_active_notes[note] = true;
|
||||||
|
send_note_on(note);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_adj.value_changed ();
|
||||||
|
queue_draw ();
|
||||||
|
_old_y = ev->y;
|
||||||
//win->process_updates(false);
|
//win->process_updates(false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -540,6 +598,7 @@ PianoRollHeader::on_button_press_event (GdkEventButton* ev)
|
|||||||
_old_y = ev->y;
|
_old_y = ev->y;
|
||||||
_fract = _adj.get_value();
|
_fract = _adj.get_value();
|
||||||
_fract_top = _adj.get_value() + _adj.get_page_size();
|
_fract_top = _adj.get_value() + _adj.get_page_size();
|
||||||
|
std::cerr << "scroomer drag ON\n";
|
||||||
return true;
|
return true;
|
||||||
}else {
|
}else {
|
||||||
int note = _view.y_to_note(ev->y);
|
int note = _view.y_to_note(ev->y);
|
||||||
@ -583,6 +642,7 @@ PianoRollHeader::on_button_release_event (GdkEventButton* ev)
|
|||||||
{
|
{
|
||||||
if (_scroomer_drag){
|
if (_scroomer_drag){
|
||||||
_scroomer_drag = false;
|
_scroomer_drag = false;
|
||||||
|
std::cerr << "scroomer drag OFF\n";
|
||||||
}
|
}
|
||||||
int note = _view.y_to_note(ev->y);
|
int note = _view.y_to_note(ev->y);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user