From 9931171b6957be8989aa34e94dc15d7a4e598fd3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 18 Nov 2009 13:24:43 +0000 Subject: [PATCH] start to make mouse modes better when in note edit mode by allowing mouse ops on non-MIDI objects to proceed normally. not finished git-svn-id: svn://localhost/ardour2/branches/3.0@6115 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_mouse.cc | 439 ++++++++++++++++++------------------ 1 file changed, 220 insertions(+), 219 deletions(-) diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 5210515541..1b0f5bb229 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -601,278 +601,279 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; } - if (internal_editing()) { + switch (mouse_mode) { + case MouseRange: switch (item_type) { - case StreamItem: + case StartSelectionTrimItem: assert (_drag == 0); - _drag = new RegionCreateDrag (this, item, clicked_axisview); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionStartTrim); _drag->start_grab (event); - return true; - case NoteItem: - /* Note: we don't get here if not in internal_editing() mode */ - if (mouse_mode == MouseTimeFX) { - assert (_drag == 0); - _drag = new NoteResizeDrag (this, item); - _drag->start_grab (event); - return true; - } else if (mouse_mode == MouseObject) { - assert (_drag == 0); - _drag = new NoteDrag (this, item); - _drag->start_grab (event); - return true; - } else { - return false; - } break; - default: - return true; - } - } else { - switch (mouse_mode) { - case MouseRange: - switch (item_type) { - case StartSelectionTrimItem: + + case EndSelectionTrimItem: + assert (_drag == 0); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionEndTrim); + _drag->start_grab (event); + break; + + case SelectionItem: + if (Keyboard::modifier_state_contains + (event->button.state, Keyboard::ModifierMask(Keyboard::SecondaryModifier))) { + // contains and not equals because I can't use alt as a modifier alone. + start_selection_grab (item, event); + } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { + /* grab selection for moving */ assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionStartTrim); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionMove); _drag->start_grab (event); - break; - - case EndSelectionTrimItem: - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionEndTrim); - _drag->start_grab (event); - break; - - case SelectionItem: - if (Keyboard::modifier_state_contains - (event->button.state, Keyboard::ModifierMask(Keyboard::SecondaryModifier))) { - // contains and not equals because I can't use alt as a modifier alone. - start_selection_grab (item, event); - } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { - /* grab selection for moving */ - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionMove); - _drag->start_grab (event); - } else { - /* this was debated, but decided the more common action was to - make a new selection */ - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); - _drag->start_grab (event); - } - break; - - default: + } else { + /* this was debated, but decided the more common action was to + make a new selection */ assert (_drag == 0); _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); _drag->start_grab (event); } - return true; break; - case MouseObject: - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && - event->type == GDK_BUTTON_PRESS) { + default: + assert (_drag == 0); + _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); + _drag->start_grab (event); + } + return true; + break; + case MouseObject: + switch (item_type) { + case NoteItem: + if (internal_editing()) { + /* Note: we don't get here if not in internal_editing() mode */ assert (_drag == 0); - _drag = new RubberbandSelectDrag (this, item); + _drag = new NoteDrag (this, item); _drag->start_grab (event); - - } else if (event->type == GDK_BUTTON_PRESS) { - - switch (item_type) { - case FadeInHandleItem: - { - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new FadeInDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); - _drag->start_grab (event); - return true; - } - - case FadeOutHandleItem: - { - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new FadeOutDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); - _drag->start_grab (event); - return true; - } - - case RegionItem: - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { - start_region_copy_grab (item, event, clicked_regionview); - } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) { - start_region_brush_grab (item, event, clicked_regionview); - } else { - start_region_grab (item, event, clicked_regionview); - } - break; - - case RegionViewNameHighlight: - { - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new TrimDrag (this, item, clicked_regionview, s.by_layer()); - _drag->start_grab (event); - return true; - break; - } - - case RegionViewName: - { - /* rename happens on edit clicks */ - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer()); - _drag->start_grab (event); - return true; - break; - } - - case ControlPointItem: - assert (_drag == 0); - _drag = new ControlPointDrag (this, item); - _drag->start_grab (event); - return true; - break; - - case AutomationLineItem: - assert (_drag == 0); - _drag = new LineDrag (this, item); - _drag->start_grab (event); - return true; - break; - - case StreamItem: - case AutomationTrackItem: - assert (_drag == 0); - _drag = new RubberbandSelectDrag (this, item); - _drag->start_grab (event); - break; - -#ifdef WITH_CMT - case ImageFrameHandleStartItem: - imageframe_start_handle_op(item, event) ; - return(true) ; - break ; - case ImageFrameHandleEndItem: - imageframe_end_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewHandleStartItem: - markerview_item_start_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewHandleEndItem: - markerview_item_end_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewItem: - start_markerview_grab(item, event) ; - break ; - case ImageFrameItem: - start_imageframe_grab(item, event) ; - break ; -#endif - - case MarkerBarItem: - - break; - - default: - break; - } + return true; } - return true; break; + + default: + break; + } + + if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && + event->type == GDK_BUTTON_PRESS) { + + assert (_drag == 0); + _drag = new RubberbandSelectDrag (this, item); + _drag->start_grab (event); + + } else if (event->type == GDK_BUTTON_PRESS) { - case MouseGain: switch (item_type) { + case FadeInHandleItem: + { + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new FadeInDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); + _drag->start_grab (event); + return true; + } + + case FadeOutHandleItem: + { + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new FadeOutDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); + _drag->start_grab (event); + return true; + } + case RegionItem: - /* start a grab so that if we finish after moving - we can tell what happened. - */ - assert (_drag == 0); - _drag = new RegionGainDrag (this, item); - _drag->start_grab (event, current_canvas_cursor); + if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { + start_region_copy_grab (item, event, clicked_regionview); + } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) { + start_region_brush_grab (item, event, clicked_regionview); + } else { + start_region_grab (item, event, clicked_regionview); + } break; - case GainLineItem: + case RegionViewNameHighlight: + { assert (_drag == 0); - _drag = new LineDrag (this, item); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new TrimDrag (this, item, clicked_regionview, s.by_layer()); + _drag->start_grab (event); + return true; + break; + } + + case RegionViewName: + { + /* rename happens on edit clicks */ + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer()); _drag->start_grab (event); return true; - - case ControlPointItem: - assert (_drag == 0); - _drag = new ControlPointDrag (this, item); - _drag->start_grab (event); - return true; - break; - - default: break; } - return true; - break; - switch (item_type) { case ControlPointItem: assert (_drag == 0); _drag = new ControlPointDrag (this, item); _drag->start_grab (event); + return true; break; case AutomationLineItem: assert (_drag == 0); _drag = new LineDrag (this, item); _drag->start_grab (event); + return true; break; - case RegionItem: - // XXX need automation mode to identify which - // line to use - // start_line_grab_from_regionview (item, event); + case StreamItem: + if (internal_editing()) { + assert (_drag == 0); + _drag = new RegionCreateDrag (this, item, clicked_axisview); + _drag->start_grab (event); + return true; + } + /* fallthru */ + case AutomationTrackItem: + assert (_drag == 0); + _drag = new RubberbandSelectDrag (this, item); + _drag->start_grab (event); + break; + +#ifdef WITH_CMT + case ImageFrameHandleStartItem: + imageframe_start_handle_op(item, event) ; + return(true) ; + break ; + case ImageFrameHandleEndItem: + imageframe_end_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewHandleStartItem: + markerview_item_start_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewHandleEndItem: + markerview_item_end_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewItem: + start_markerview_grab(item, event) ; + break ; + case ImageFrameItem: + start_imageframe_grab(item, event) ; + break ; +#endif + + case MarkerBarItem: + break; default: break; } - return true; + } + return true; + break; + + case MouseGain: + switch (item_type) { + case RegionItem: + /* start a grab so that if we finish after moving + we can tell what happened. + */ + assert (_drag == 0); + _drag = new RegionGainDrag (this, item); + _drag->start_grab (event, current_canvas_cursor); break; - case MouseZoom: - if (event->type == GDK_BUTTON_PRESS) { - assert (_drag == 0); - _drag = new MouseZoomDrag (this, item); - _drag->start_grab (event); - } - - return true; - break; - - case MouseTimeFX: - if (item_type == RegionItem) { - assert (_drag == 0); - _drag = new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()); - _drag->start_grab (event); - } - break; - - case MouseAudition: - _drag = new ScrubDrag (this, item); + case GainLineItem: + assert (_drag == 0); + _drag = new LineDrag (this, item); _drag->start_grab (event); - scrub_reversals = 0; - scrub_reverse_distance = 0; - last_scrub_x = event->button.x; - scrubbing_direction = 0; - track_canvas->get_window()->set_cursor (*transparent_cursor); + return true; + + case ControlPointItem: + assert (_drag == 0); + _drag = new ControlPointDrag (this, item); + _drag->start_grab (event); + return true; break; default: break; } + return true; + break; + + switch (item_type) { + case ControlPointItem: + assert (_drag == 0); + _drag = new ControlPointDrag (this, item); + _drag->start_grab (event); + break; + + case AutomationLineItem: + assert (_drag == 0); + _drag = new LineDrag (this, item); + _drag->start_grab (event); + break; + + case RegionItem: + // XXX need automation mode to identify which + // line to use + // start_line_grab_from_regionview (item, event); + break; + + default: + break; + } + return true; + break; + + case MouseZoom: + if (event->type == GDK_BUTTON_PRESS) { + assert (_drag == 0); + _drag = new MouseZoomDrag (this, item); + _drag->start_grab (event); + } + + return true; + break; + + case MouseTimeFX: + if (internal_editing() && item_type == NoteItem) { + assert (_drag == 0); + _drag = new NoteResizeDrag (this, item); + _drag->start_grab (event); + return true; + } else if (!internal_editing() && item_type == RegionItem) { + assert (_drag == 0); + _drag = new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()); + _drag->start_grab (event); + return true; + } + break; + + case MouseAudition: + _drag = new ScrubDrag (this, item); + _drag->start_grab (event); + scrub_reversals = 0; + scrub_reverse_distance = 0; + last_scrub_x = event->button.x; + scrubbing_direction = 0; + track_canvas->get_window()->set_cursor (*transparent_cursor); + return true; + break; + + default: + break; } return false;