void FruityPerfInput::update_mouse_pointer (perfroll & roll) { perform & p = roll.perf(); midipulse droptick; int dropseq; roll.convert_xy(m_current_x, m_current_y, droptick, dropseq); sequence * seq = p.get_sequence(dropseq); if (p.is_active(dropseq)) { midipulse start; midipulse end; if (seq->intersect_triggers(droptick, start, end)) { int wscalex = s_perfroll_size_box_click_w * c_perf_scale_x; int ymod = m_current_y % c_names_y; if ( start <= droptick && droptick <= (start + wscalex) && (ymod <= s_perfroll_size_box_click_w + 1) ) { roll.get_window()->set_cursor(Gdk::Cursor(Gdk::RIGHT_PTR)); } else if ( droptick <= end && (end - wscalex) <= droptick && ymod >= (c_names_y - s_perfroll_size_box_click_w - 1) ) { roll.get_window()->set_cursor(Gdk::Cursor(Gdk::LEFT_PTR)); } else roll.get_window()->set_cursor(Gdk::Cursor(Gdk::CENTER_PTR)); } else roll.get_window()->set_cursor(Gdk::Cursor(Gdk::PENCIL)); } else roll.get_window()->set_cursor(Gdk::Cursor(Gdk::CROSSHAIR)); }
void FruityPerfInput::updateMousePtr( perfroll& ths ) { // context sensitive mouse long drop_tick; int drop_sequence; ths.convert_xy( m_current_x, m_current_y, &drop_tick, &drop_sequence ); if (ths.m_mainperf->is_active( drop_sequence )) { long start, end; if (ths.m_mainperf->get_sequence(drop_sequence)->intersectTriggers( drop_tick, start, end )) { if (start <= drop_tick && drop_tick <= start + (c_perfroll_size_box_click_w * c_perf_scale_x) && (m_current_y % c_names_y) <= c_perfroll_size_box_click_w + 1) { ths.get_window()->set_cursor( Gdk::Cursor( Gdk::RIGHT_PTR )); } else if (end - (c_perfroll_size_box_click_w * c_perf_scale_x) <= drop_tick && drop_tick <= end && (m_current_y % c_names_y) >= c_names_y - c_perfroll_size_box_click_w - 1) { ths.get_window()->set_cursor( Gdk::Cursor( Gdk::LEFT_PTR )); } else { ths.get_window()->set_cursor( Gdk::Cursor( Gdk::CENTER_PTR )); } } else { ths.get_window()->set_cursor( Gdk::Cursor( Gdk::PENCIL )); } } else { ths.get_window()->set_cursor( Gdk::Cursor( Gdk::CROSSHAIR )); } }
bool Seq24PerfInput::on_button_press_event (GdkEventButton * ev, perfroll & roll) { bool result = false; perform & p = roll.perf(); int & dropseq = roll.m_drop_sequence; sequence * seq = p.get_sequence(dropseq); bool dropseq_active = p.is_active(dropseq); roll.grab_focus(); if (dropseq_active) { seq->unselect_triggers(); roll.draw_all(); } roll.m_drop_x = int(ev->x); roll.m_drop_y = int(ev->y); roll.convert_drop_xy(); /* affects dropseq */ seq = p.get_sequence(dropseq); dropseq_active = p.is_active(dropseq); if (! dropseq_active) return false; /* * EXPERIMENTAL. * Let's make better use of the Ctrl key here. First, let Ctrl-Left be * handled exactly like the Middle click, then bug out. * * Note that this middle-click code ought to be folded into a function. */ if (is_ctrl_key(ev)) { if (SEQ64_CLICK_LEFT(ev->button)) { bool state = seq->get_trigger_state(roll.m_drop_tick); if (state) { roll.split_trigger(dropseq, roll.m_drop_tick); } else { p.push_trigger_undo(dropseq); seq->paste_trigger(roll.m_drop_tick); } } return true; } if (SEQ64_CLICK_LEFT(ev->button)) { midipulse droptick = roll.m_drop_tick; if (is_adding()) /* add new note if nothing selected */ { set_adding_pressed(true); midipulse seqlength = seq->get_length(); bool state = seq->get_trigger_state(droptick); if (state) { p.push_trigger_undo(dropseq); /* stazed fix */ seq->del_trigger(droptick); } else { droptick -= (droptick % seqlength); /* snap */ p.push_trigger_undo(dropseq); /* stazed fix */ seq->add_trigger(droptick, seqlength); roll.draw_all(); } result = true; } else { /* * Set this flag to tell on_motion_notify() to call * p.push_trigger_undo(). */ roll.m_have_button_press = seq->select_trigger(droptick); midipulse tick0 = seq->selected_trigger_start(); midipulse tick1 = seq->selected_trigger_end(); int wscalex = s_perfroll_size_box_click_w * c_perf_scale_x; int ydrop = roll.m_drop_y % c_names_y; if ( droptick >= tick0 && droptick <= (tick0 + wscalex) && ydrop <= s_perfroll_size_box_click_w + 1 ) { roll.m_growing = true; roll.m_grow_direction = true; roll.m_drop_tick_trigger_offset = droptick - seq->selected_trigger_start(); } else if ( droptick >= (tick1 - wscalex) && droptick <= tick1 && ydrop >= c_names_y - s_perfroll_size_box_click_w - 1 ) { roll.m_growing = true; roll.m_grow_direction = false; roll.m_drop_tick_trigger_offset = droptick - seq->selected_trigger_end(); } else { roll.m_moving = true; roll.m_drop_tick_trigger_offset = droptick - seq->selected_trigger_start(); } roll.draw_all(); } } else if (SEQ64_CLICK_RIGHT(ev->button)) { activate_adding(true, roll); // Should we add this? // result = true; } else if (SEQ64_CLICK_MIDDLE(ev->button)) /* split */ { /* * The middle click in seq24 interaction mode is either for splitting * the triggers or for setting the paste location of copy/paste. */ bool state = seq->get_trigger_state(roll.m_drop_tick); if (state) { roll.split_trigger(dropseq, roll.m_drop_tick); result = true; } else { p.push_trigger_undo(dropseq); seq->paste_trigger(roll.m_drop_tick); // Should we add this? // result = true; } } return result; }
bool Seq24PerfInput::on_motion_notify_event (GdkEventMotion * ev, perfroll & roll) { bool result = false; int x = int(ev->x); perform & p = roll.perf(); int dropseq = roll.m_drop_sequence; sequence * seq = p.get_sequence(dropseq); if (! p.is_active(dropseq)) { return false; } if (is_adding() && is_adding_pressed()) { midipulse seqlength = seq->get_length(); midipulse tick; roll.convert_x(x, tick); tick -= (tick % seqlength); midipulse length = seqlength; seq->grow_trigger(roll.m_drop_tick, tick, length); roll.draw_all(); result = true; } else if (roll.m_moving || roll.m_growing) { /* * This code is necessary to insure that there is no push unless * we have a motion notification. */ if (roll.m_have_button_press) { p.push_trigger_undo(dropseq); roll.m_have_button_press = false; } midipulse tick; roll.convert_x(x, tick); tick -= roll.m_drop_tick_trigger_offset; tick -= tick % roll.m_snap; if (roll.m_moving) { seq->move_selected_triggers_to(tick, true); result = true; } if (roll.m_growing) { if (roll.m_grow_direction) { seq->move_selected_triggers_to ( tick, false, triggers::GROW_START ); } else { seq->move_selected_triggers_to ( tick - 1, false, triggers::GROW_END); } result = true; } roll.draw_all(); } return result; }
void FruityPerfInput::on_left_button_pressed(GdkEventButton* a_ev, perfroll& ths) { if ( a_ev->state & GDK_CONTROL_MASK ) { if ( ths.m_mainperf->is_active( ths.m_drop_sequence )) { bool state = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_trigger_state( ths.m_drop_tick ); if ( state ) { ths.split_trigger(ths.m_drop_sequence, ths.m_drop_tick); } } } else { long tick = ths.m_drop_tick; /* add a new note if we didnt select anything */ //if (m_adding) { m_adding_pressed = true; if ( ths.m_mainperf->is_active( ths.m_drop_sequence )){ long seq_length = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_length( ); bool state = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_trigger_state( tick ); // resize the event, or move it, depending on where clicked. if ( state ) { //m_adding = false; m_adding_pressed = false; ths.m_mainperf->push_trigger_undo(); ths.m_mainperf->get_sequence( ths.m_drop_sequence )->select_trigger( tick ); long start_tick = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_start_tick(); long end_tick = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_end_tick(); if ( tick >= start_tick && tick <= start_tick + (c_perfroll_size_box_click_w * c_perf_scale_x) && (ths.m_drop_y % c_names_y) <= c_perfroll_size_box_click_w + 1 ) { // clicked left side: begin a grow/shrink for the left side ths.m_growing = true; ths.m_grow_direction = true; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )-> get_selected_trigger_start_tick( ); } else if ( tick >= end_tick - (c_perfroll_size_box_click_w * c_perf_scale_x) && tick <= end_tick && (ths.m_drop_y % c_names_y) >= c_names_y - c_perfroll_size_box_click_w - 1 ) { // clicked right side: grow/shrink the right side ths.m_growing = true; ths.m_grow_direction = false; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_end_tick( ); } else { // clicked in the middle - move it ths.m_moving = true; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )-> get_selected_trigger_start_tick( ); } ths.draw_background_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_sequence_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_drawable_row( ths.m_window, ths.m_pixmap, ths.m_drop_y); } // add an event: else { // snap to length of sequence tick = tick - (tick % seq_length); ths.m_mainperf->push_trigger_undo(); ths.m_mainperf->get_sequence( ths.m_drop_sequence )->add_trigger( tick, seq_length ); ths.draw_background_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_sequence_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_drawable_row( ths.m_window, ths.m_pixmap, ths.m_drop_y); //m_drop_tick_last = (m_drop_tick + seq_length - 1); } } } } }
bool Seq24PerfInput::on_button_press_event(GdkEventButton* a_ev, perfroll& ths) { ths.grab_focus( ); if ( ths.m_mainperf->is_active( ths.m_drop_sequence )) { ths.m_mainperf->get_sequence( ths.m_drop_sequence )->unselect_triggers( ); ths.draw_background_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_sequence_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_drawable_row( ths.m_window, ths.m_pixmap, ths.m_drop_y); } ths.m_drop_x = (int) a_ev->x; ths.m_drop_y = (int) a_ev->y; ths.convert_xy( ths.m_drop_x, ths.m_drop_y, &ths.m_drop_tick, &ths.m_drop_sequence ); /* left mouse button */ if ( a_ev->button == 1 ){ long tick = ths.m_drop_tick; /* add a new note if we didnt select anything */ if ( m_adding ){ m_adding_pressed = true; if ( ths.m_mainperf->is_active( ths.m_drop_sequence )){ long seq_length = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_length( ); bool state = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_trigger_state( tick ); if ( state ) { ths.m_mainperf->push_trigger_undo(); ths.m_mainperf->get_sequence( ths.m_drop_sequence )->del_trigger( tick ); } else { // snap to length of sequence tick = tick - (tick % seq_length); //m_adding_pressed_state = true; ths.m_mainperf->push_trigger_undo(); ths.m_mainperf->get_sequence( ths.m_drop_sequence )->add_trigger( tick, seq_length ); ths.draw_background_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_sequence_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_drawable_row( ths.m_window, ths.m_pixmap, ths.m_drop_y); //m_drop_tick_last = (m_drop_tick + seq_length - 1); } } } else { if ( ths.m_mainperf->is_active( ths.m_drop_sequence )){ ths.m_mainperf->push_trigger_undo(); ths.m_mainperf->get_sequence( ths.m_drop_sequence )->select_trigger( tick ); long start_tick = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_start_tick(); long end_tick = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_end_tick(); if ( tick >= start_tick && tick <= start_tick + (c_perfroll_size_box_click_w * c_perf_scale_x) && (ths.m_drop_y % c_names_y) <= c_perfroll_size_box_click_w + 1 ) { ths.m_growing = true; ths.m_grow_direction = true; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )-> get_selected_trigger_start_tick( ); } else if ( tick >= end_tick - (c_perfroll_size_box_click_w * c_perf_scale_x) && tick <= end_tick && (ths.m_drop_y % c_names_y) >= c_names_y - c_perfroll_size_box_click_w - 1 ) { ths.m_growing = true; ths.m_grow_direction = false; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_selected_trigger_end_tick( ); } else { ths.m_moving = true; ths.m_drop_tick_trigger_offset = ths.m_drop_tick - ths.m_mainperf->get_sequence( ths.m_drop_sequence )-> get_selected_trigger_start_tick( ); } ths.draw_background_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_sequence_on( ths.m_pixmap, ths.m_drop_sequence ); ths.draw_drawable_row( ths.m_window, ths.m_pixmap, ths.m_drop_y); } } } /* right mouse button */ if ( a_ev->button == 3 ){ set_adding( true, ths ); } /* middle, split */ if ( a_ev->button == 2 ) { if ( ths.m_mainperf->is_active( ths.m_drop_sequence )){ bool state = ths.m_mainperf->get_sequence( ths.m_drop_sequence )->get_trigger_state( ths.m_drop_tick ); if ( state ) { ths.split_trigger(ths.m_drop_sequence, ths.m_drop_tick); } } } return true; }
bool FruityPerfInput::on_left_button_pressed (GdkEventButton * ev, perfroll & roll) { bool result = false; perform & p = roll.perf(); int dropseq = roll.m_drop_sequence; sequence * seq = p.get_sequence(dropseq); if (is_ctrl_key(ev)) { if (p.is_active(dropseq)) { midipulse droptick = roll.m_drop_tick; droptick -= droptick % roll.m_snap; /* stazed: grid snap */ bool state = seq->get_trigger_state(droptick); if (state) { roll.split_trigger(dropseq, droptick); result = true; } else /* track click, paste trig */ { p.push_trigger_undo(dropseq); seq->paste_trigger(droptick); } } } else /* add a new note if we didn't select anything */ { midipulse droptick = roll.m_drop_tick; set_adding_pressed(true); if (p.is_active(dropseq)) { midipulse seqlength = seq->get_length(); bool state = seq->get_trigger_state(droptick); if (state) /* resize or move event based on where clicked */ { set_adding_pressed(false); /* * Set the flag that tells the motion-notify callback to call * push_trigger_undo(). */ roll.m_have_button_press = seq->select_trigger(droptick); midipulse starttick = seq->selected_trigger_start(); midipulse endtick = seq->selected_trigger_end(); int wscalex = s_perfroll_size_box_click_w * c_perf_scale_x; int ydrop = roll.m_drop_y % c_names_y; if ( droptick >= starttick && droptick <= (starttick + wscalex) && ydrop <= (s_perfroll_size_box_click_w + 1) ) { /* clicked left side: grow/shrink left side */ roll.m_growing = true; roll.m_grow_direction = true; roll.m_drop_tick_trigger_offset = roll.m_drop_tick - seq->selected_trigger_start(); } else if ( droptick >= (endtick - wscalex) && droptick <= endtick && ydrop >= (c_names_y - s_perfroll_size_box_click_w - 1) ) { /* clicked right side: grow/shrink right side */ roll.m_growing = true; roll.m_grow_direction = false; roll.m_drop_tick_trigger_offset = roll.m_drop_tick - seq->selected_trigger_end(); } else /* clicked in the middle - move it */ { roll.m_moving = true; roll.m_drop_tick_trigger_offset = roll.m_drop_tick - seq->selected_trigger_start(); } roll.draw_all(); } else /* add a trigger */ { droptick -= (droptick % seqlength); /* snap to seqlength */ p.push_trigger_undo(); seq->add_trigger(droptick, seqlength); result = true; roll.draw_all(); } } } return result; }