X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mouse.cc;h=5c106785e28559efafe7ee60fcb8c79c22680abb;hb=14226356d8e73aabe498ccad77e55bde8e6b6d6f;hp=8299151533fd471f6cd3feb5eee0141065eb949d;hpb=1b99e298e29abaadbe1c7cbb2ada6ce35fe822c5;p=ardour.git diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 8299151533..5c106785e2 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -214,13 +214,31 @@ Editor::mouse_mode_object_range_toggled() Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); assert (tact); - if (tact->get_active()) { - m = MouseObject; //Smart mode turned to ON, force editing to Object mode - } - set_mouse_mode(m, true); //call this so the button styles can get updated } +static Glib::RefPtr +get_mouse_mode_action(MouseMode m) +{ + switch (m) { + case MouseRange: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); + case MouseObject: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); + case MouseCut: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); + case MouseDraw: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); + case MouseTimeFX: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); + case MouseContent: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); + case MouseAudition: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); + } + return Glib::RefPtr(); +} + void Editor::set_mouse_mode (MouseMode m, bool force) { @@ -236,42 +254,8 @@ Editor::set_mouse_mode (MouseMode m, bool force) if ( m == MouseCut) m = MouseObject; } - Glib::RefPtr act; - - switch (m) { - case MouseRange: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); - break; - - case MouseCut: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); - break; - - case MouseObject: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); - break; - - case MouseDraw: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); - break; - - case MouseGain: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-gain")); - break; - - case MouseTimeFX: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); - break; - - case MouseAudition: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); - break; - } - - assert (act); - - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - assert (tact); + Glib::RefPtr act = get_mouse_mode_action(m); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); /* go there and back to ensure that the toggled handler is called to set up mouse_mode */ tact->set_active (false); @@ -283,47 +267,12 @@ Editor::set_mouse_mode (MouseMode m, bool force) void Editor::mouse_mode_toggled (MouseMode m) { - Glib::RefPtr act; - Glib::RefPtr tact; - if (ARDOUR::Profile->get_mixbus()) { if ( m == MouseCut) m = MouseObject; } - switch (m) { - case MouseRange: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); - break; - - case MouseObject: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); - break; - - case MouseCut: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); - break; - - case MouseDraw: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); - break; - - case MouseGain: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-gain")); - break; - - case MouseTimeFX: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); - break; - - case MouseAudition: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); - break; - } - - assert (act); - - tact = Glib::RefPtr::cast_dynamic (act); - assert (tact); + Glib::RefPtr act = get_mouse_mode_action(m); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); if (!tact->get_active()) { /* this was just the notification that the old mode has been @@ -333,24 +282,27 @@ Editor::mouse_mode_toggled (MouseMode m) return; } - switch (m) { - case MouseDraw: - act = ActionManager::get_action (X_("MouseMode"), X_("toggle-internal-edit")); - tact = Glib::RefPtr::cast_dynamic(act); - tact->set_active (true); - break; - default: - break; - } - if (_session && mouse_mode == MouseAudition) { /* stop transport and reset default speed to avoid oddness with auditioning */ _session->request_transport_speed (0.0, true); } + const bool was_internal = internal_editing(); + mouse_mode = m; + /* Switch snap type/mode if we're moving to/from an internal tool. Note + this must toggle the actions and not call set_snap_*() directly, + otherwise things get out of sync and the combo box stops working. */ + if (!was_internal && internal_editing()) { + snap_type_action(internal_snap_type)->set_active(true); + snap_mode_action(internal_snap_mode)->set_active(true); + } else if (was_internal && !internal_editing()) { + snap_type_action(pre_internal_snap_type)->set_active(true); + snap_mode_action(pre_internal_snap_mode)->set_active(true); + } + instant_save (); /* this should generate a new enter event which will @@ -365,90 +317,86 @@ Editor::mouse_mode_toggled (MouseMode m) update_time_selection_display (); + update_all_enter_cursors (); + MouseModeChanged (); /* EMIT SIGNAL */ } -void -Editor::update_time_selection_display () +bool +Editor::internal_editing() const { - if (smart_mode_action->get_active()) { - /* not sure what to do here */ - if (mouse_mode == MouseObject) { - } else { - } - } else { - switch (mouse_mode) { - case MouseRange: - selection->clear_objects (); - break; - default: - selection->clear_time (); - break; - } - } + return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw; } void -Editor::step_mouse_mode (bool next) +Editor::update_time_selection_display () { - switch (current_mouse_mode()) { - case MouseObject: - if (next) { - set_mouse_mode (MouseRange); - } else { - set_mouse_mode (MouseTimeFX); - } - break; - + switch (mouse_mode) { case MouseRange: - if (next) set_mouse_mode (MouseDraw); - else set_mouse_mode (MouseCut); + selection->clear_objects (); + selection->ClearMidiNoteSelection (); /* EMIT SIGNAL */ break; - - case MouseCut: - if (next) set_mouse_mode (MouseRange); - else set_mouse_mode (MouseDraw); + case MouseObject: + selection->clear_time (); + selection->clear_tracks (); + selection->ClearMidiNoteSelection (); /* EMIT SIGNAL */ break; - case MouseDraw: - if (next) set_mouse_mode (MouseCut); - else set_mouse_mode (MouseRange); - break; + /* Clear regions, but not time or tracks, since that + would destroy the range selection rectangle, which we need to stick + around for AutomationRangeDrag. */ + selection->clear_regions (); + selection->clear_playlists (); + break; + case MouseContent: + /* This handles internal edit. + Clear everything except points and notes. + */ + selection->clear_regions(); + selection->clear_lines(); + selection->clear_playlists (); - case MouseGain: - if (next) set_mouse_mode (MouseTimeFX); - else set_mouse_mode (MouseDraw); + selection->clear_time (); + selection->clear_tracks (); break; case MouseTimeFX: - if (next) { - set_mouse_mode (MouseAudition); - } else { - set_mouse_mode (MouseGain); - } + /* We probably want to keep region selection */ + selection->clear_points (); + selection->clear_lines(); + selection->clear_playlists (); + + selection->clear_time (); + selection->clear_tracks (); break; case MouseAudition: - if (next) set_mouse_mode (MouseObject); - else set_mouse_mode (MouseTimeFX); + /*Don't lose lines or points if no action in this mode */ + selection->clear_regions (); + selection->clear_playlists (); + selection->clear_time (); + selection->clear_tracks (); + break; + + default: + /*Clear everything */ + selection->clear_objects(); + selection->clear_time (); + selection->clear_tracks (); break; } } -bool -Editor::toggle_internal_editing_from_double_click (GdkEvent* event) +void +Editor::step_mouse_mode (bool next) { - if (_drags->active()) { - _drags->end_grab (event); - } - - ActionManager::do_action ("MouseMode", "toggle-internal-edit"); - - /* prevent reversion of edit cursor on button release */ - - pre_press_cursor = 0; - - return true; + const int n_mouse_modes = (int)MouseContent + 1; + int current = (int)current_mouse_mode(); + if (next) { + set_mouse_mode((MouseMode)((current + 1) % n_mouse_modes)); + } else { + set_mouse_mode((MouseMode)((current + n_mouse_modes - 1) % n_mouse_modes)); + } } void @@ -498,11 +446,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (((mouse_mode != MouseObject) && (mouse_mode != MouseAudition || item_type != RegionItem) && (mouse_mode != MouseTimeFX || item_type != RegionItem) && - (mouse_mode != MouseGain) && (mouse_mode != MouseDraw)) || - ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) || - (internal_editing() && mouse_mode != MouseTimeFX)) { - + ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) { return; } @@ -521,11 +466,15 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp Selection::Operation op = ArdourKeyboard::selection_type (event->button.state); bool press = (event->type == GDK_BUTTON_PRESS); + if (press) { + _mouse_changed_selection = false; + } + switch (item_type) { case RegionItem: if (press) { if (eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection = set_selected_regionview_from_click (press, op); } else { /* don't change the selection unless the clicked track is not currently selected. if @@ -538,7 +487,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp } } else { if (eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection |= set_selected_regionview_from_click (press, op); } } break; @@ -556,7 +505,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case StartCrossFadeItem: case EndCrossFadeItem: if (get_smart_mode() || eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection |= set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); } @@ -565,7 +514,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case ControlPointItem: set_selected_track_as_side_effect (op); if (eff_mouse_mode != MouseRange) { - set_selected_control_point_from_click (press, op); + _mouse_changed_selection |= set_selected_control_point_from_click (press, op); } break; @@ -574,6 +523,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (event->button.button == 3) { selection->clear_tracks (); set_selected_track_as_side_effect (op); + + /* We won't get a release.*/ + begin_reversible_selection_op (X_("Button 3 Menu Select")); + commit_reversible_selection_op (); } break; @@ -584,6 +537,12 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp default: break; } + + if ((!press) && _mouse_changed_selection) { + begin_reversible_selection_op (X_("Button Selection")); + commit_reversible_selection_op (); + _mouse_changed_selection = false; + } } bool @@ -595,6 +554,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT them to be modeless. */ + NoteBase* note = NULL; + switch (item_type) { case PlayheadCursorItem: _drags->set (new CursorDrag (this, *playhead_cursor, true), event); @@ -610,8 +571,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case TempoMarkerItem: { - TempoMarker* m = reinterpret_cast (item->get_data ("marker")); - assert (m); _drags->set ( new TempoMarkerDrag ( this, @@ -625,8 +584,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case MeterMarkerItem: { - MeterMarker* m = reinterpret_cast (item->get_data ("marker")); - assert (m); _drags->set ( new MeterMarkerDrag ( this, @@ -720,11 +677,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } } - /* there is no Range mode when in internal edit mode */ - if (eff == MouseRange && internal_editing()) { - eff = MouseObject; - } - switch (eff) { case MouseRange: switch (item_type) { @@ -751,19 +703,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case StreamItem: - if (internal_editing()) { - if (dynamic_cast (clicked_axisview)) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - return true; - } + if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) { + _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event); } else { - if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) { - _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event); - } else { - _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event); - } - return true; + _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event); } + return true; break; case RegionViewNameHighlight: @@ -774,47 +719,15 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; default: - if (!internal_editing()) { - if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) { - _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event); - } else { - _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event); - } + if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) { + _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event); + } else { + _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event); } } return true; break; - case MouseDraw: - switch (item_type) { - case NoteItem: - /* Existing note: allow trimming/motion */ - if (internal_editing()) { - /* trim notes if we're in internal edit mode and near the ends of the note */ - NoteBase* cn = reinterpret_cast(item->get_data ("notebase")); - assert (cn); - if (cn->big_enough_to_trim() && cn->mouse_near_ends()) { - _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor); - } else { - _drags->set (new NoteDrag (this, item), event); - } - return true; - } - break; - case StreamItem: - if (internal_editing()) { - if (dynamic_cast (clicked_axisview)) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - } - return true; - } - break; - - default: - break; - } - break; - case MouseCut: switch (item_type) { case RegionItem: @@ -827,7 +740,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case RegionViewName: case StreamItem: case AutomationTrackItem: - _drags->set (new RegionCutDrag (this, item, canvas_event_sample (event)), event, current_canvas_cursor); + _drags->set (new RegionCutDrag (this, item, canvas_event_sample (event)), event, get_canvas_cursor()); return true; break; default: @@ -835,18 +748,38 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } break; - case MouseObject: + case MouseContent: switch (item_type) { case NoteItem: /* Existing note: allow trimming/motion */ - if (internal_editing()) { - NoteBase* cn = reinterpret_cast (item->get_data ("notebase")); - assert (cn); - if (cn->big_enough_to_trim() && cn->mouse_near_ends()) { - _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor); + if ((note = reinterpret_cast (item->get_data ("notebase")))) { + if (note->big_enough_to_trim() && note->mouse_near_ends()) { + _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor()); } else { _drags->set (new NoteDrag (this, item), event); } + } + return true; + + case ControlPointItem: + _drags->set (new ControlPointDrag (this, item), event); + return true; + break; + + case StreamItem: + //in the past, we created a new midi region here, but perhaps that is best left to the Draw mode + break; + + case AutomationTrackItem: + /* rubberband drag to select automation points */ + _drags->set (new EditorRubberbandSelectDrag (this, item), event); + return true; + break; + + case RegionItem: + if (dynamic_cast(clicked_regionview)) { + /* rubberband drag to select automation points */ + _drags->set (new EditorRubberbandSelectDrag (this, item), event); return true; } break; @@ -854,7 +787,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } + break; + case MouseObject: if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && event->type == GDK_BUTTON_PRESS) { @@ -904,10 +839,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; } - if (internal_editing ()) { - break; - } - /* click on a normal region view */ if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { add_region_copy_drag (item, event, clicked_regionview); @@ -918,10 +849,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } -// if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE && !selection->regions.empty())) { -// _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove)); -// } - _drags->start_grab (event); return true; break; @@ -964,15 +891,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case StreamItem: - if (internal_editing()) { - if (dynamic_cast (clicked_axisview)) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - } - return true; - } else { - _drags->set (new EditorRubberbandSelectDrag (this, item), event); - } - break; + _drags->set (new EditorRubberbandSelectDrag (this, item), event); + return true; case AutomationTrackItem: { @@ -1020,7 +940,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT return true; break; - case MouseGain: + case MouseDraw: switch (item_type) { case GainLineItem: _drags->set (new LineDrag (this, item), event); @@ -1033,12 +953,13 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SelectionItem: { - AudioRegionView* arv = dynamic_cast (clicked_regionview); - if (arv) { - _drags->set (new AutomationRangeDrag (this, arv, selection->time), event, _cursors->up_down); + if (dynamic_cast(clicked_regionview) || + dynamic_cast(clicked_regionview)) { + _drags->set (new AutomationRangeDrag (this, clicked_regionview, selection->time), + event, _cursors->up_down); } else { double const y = event->button.y; - pair tvp = trackview_by_y_position (y); + pair tvp = trackview_by_y_position (y, false); if (tvp.first) { AutomationTimeAxisView* atv = dynamic_cast (tvp.first); if ( atv) { @@ -1054,7 +975,26 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case AutomationLineItem: _drags->set (new LineDrag (this, item), event); break; - + + case NoteItem: + if ((note = reinterpret_cast(item->get_data ("notebase")))) { + if (note->big_enough_to_trim() && note->mouse_near_ends()) { + /* Note is big and pointer is near the end, trim */ + _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor()); + } else { + /* Drag note */ + _drags->set (new NoteDrag (this, item), event); + } + return true; + } + return true; + + case StreamItem: + if (dynamic_cast (clicked_axisview)) { + _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); + } + return true; + default: break; } @@ -1062,12 +1002,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case MouseTimeFX: - if (internal_editing() && item_type == NoteItem ) { - /* drag notes if we're in internal edit mode */ - NoteBase* cn = reinterpret_cast(item->get_data ("notebase")); - assert (cn); - if (cn->big_enough_to_trim()) { - _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor); + if (item_type == NoteItem) { + /* resize-drag notes */ + if ((note = reinterpret_cast(item->get_data ("notebase")))) { + if (note->big_enough_to_trim()) { + _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor()); + } } return true; } else if (clicked_regionview) { @@ -1078,12 +1018,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case MouseAudition: - _drags->set (new ScrubDrag (this, item), event); + _drags->set (new ScrubDrag (this, item), event, _cursors->transparent); scrub_reversals = 0; scrub_reverse_distance = 0; last_scrub_x = event->button.x; scrubbing_direction = 0; - push_canvas_cursor (_cursors->transparent); return true; break; @@ -1102,11 +1041,6 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case MouseObject: switch (item_type) { case RegionItem: - if (internal_editing ()) { - /* no region drags in internal edit mode */ - return false; - } - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { add_region_copy_drag (item, event, clicked_regionview); } else { @@ -1132,9 +1066,7 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case LeftFrameHandle: case RightFrameHandle: - if (!internal_editing ()) { - _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event); - } + _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event); return true; break; @@ -1177,56 +1109,12 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp return false; } - pre_press_cursor = current_canvas_cursor; - _track_canvas->grab_focus(); if (_session && _session->actively_recording()) { return true; } - if (internal_editing()) { - bool leave_internal_edit_mode = false; - - switch (item_type) { - case NoteItem: - break; - - case RegionItem: - if (!dynamic_cast (clicked_regionview) && !dynamic_cast (clicked_regionview)) { - leave_internal_edit_mode = true; - } - break; - - case PlayheadCursorItem: - case MarkerItem: - case TempoMarkerItem: - case MeterMarkerItem: - case MarkerBarItem: - case TempoBarItem: - case MeterBarItem: - case RangeMarkerBarItem: - case CdMarkerBarItem: - case TransportMarkerBarItem: - case StreamItem: - case TimecodeRulerItem: - case SamplesRulerItem: - case MinsecRulerItem: - case BBTRulerItem: - /* button press on these items never does anything to - change the editing mode. - */ - break; - - default: - break; - } - - if (leave_internal_edit_mode) { - ActionManager::do_action ("MouseMode", "toggle-internal-edit"); - } - } - button_selection (item, event, item_type); if (!_drags->active () && @@ -1239,7 +1127,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } //not rolling, range mode click + join_play_range : locate the PH here - if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_follow_edits() ) { + if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && ARDOUR_UI::config()->get_follow_edits() ) { framepos_t where = canvas_event_sample (event); snap_to(where); _session->request_locate (where, false); @@ -1292,10 +1180,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT framepos_t where = canvas_event_sample (event); AutomationTimeAxisView* atv = 0; - if (pre_press_cursor) { - set_canvas_cursor (pre_press_cursor); - pre_press_cursor = 0; - } + _press_cursor_ctx.reset(); /* no action if we're recording */ @@ -1303,20 +1188,24 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT return true; } - /* see if we're finishing a drag */ + bool were_dragging = false; - bool were_dragging = false; - if (_drags->active ()) { - bool const r = _drags->end_grab (event); - if (r) { - /* grab dragged, so do nothing else */ - return true; - } + if (!Keyboard::is_context_menu_event (&event->button)) { - were_dragging = true; - } + /* see if we're finishing a drag */ + + if (_drags->active ()) { + bool const r = _drags->end_grab (event); + if (r) { + /* grab dragged, so do nothing else */ + return true; + } + + were_dragging = true; + } - update_region_layering_order_editor (); + update_region_layering_order_editor (); + } /* edit events get handled here */ @@ -1459,6 +1348,12 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT popup_control_point_context_menu (item, event); break; + case NoteItem: + if (internal_editing()) { + popup_note_context_menu (item, event); + } + break; + default: break; } @@ -1560,23 +1455,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } switch (eff) { - case MouseObject: case MouseDraw: - switch (item_type) { - case AutomationTrackItem: - atv = dynamic_cast(clicked_axisview); - if (atv) { - bool with_guard_points = Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier); - atv->add_automation_event (event, where, event->button.y, with_guard_points); - } - return true; - break; - default: - break; - } - break; - - case MouseGain: switch (item_type) { case RegionItem: { @@ -1595,8 +1474,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case AutomationTrackItem: { bool with_guard_points = Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier); - dynamic_cast(clicked_axisview)-> - add_automation_event (event, where, event->button.y, with_guard_points); + atv = dynamic_cast(clicked_axisview); + if (atv) { + atv->add_automation_event (event, where, event->button.y, with_guard_points); + } return true; break; } @@ -1606,7 +1487,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case MouseAudition: - pop_canvas_cursor (); if (scrubbing_direction == 0) { /* no drag, just a click */ switch (item_type) { @@ -1616,7 +1496,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } - } else { + } else if (_session) { /* make sure we stop */ _session->request_transport_speed (0.0); } @@ -1628,7 +1508,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } /* do any (de)selection operations that should occur on button release */ - button_selection (item, event, item_type); + button_selection (item, event, item_type); + return true; break; @@ -1694,11 +1575,11 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ * (e.g. the actual entered regionview) */ - choose_canvas_cursor_on_entry (&event->crossing, item_type); + choose_canvas_cursor_on_entry (item_type); switch (item_type) { case ControlPointItem: - if (mouse_mode == MouseGain || mouse_mode == MouseObject) { + if (mouse_mode == MouseDraw || mouse_mode == MouseObject) { cp = static_cast(item->get_data ("control_point")); cp->show (); @@ -1710,19 +1591,19 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; case GainLineItem: - if (mouse_mode == MouseGain) { + if (mouse_mode == MouseDraw) { ArdourCanvas::Line *line = dynamic_cast (item); if (line) { - line->set_outline_color (ARDOUR_UI::config()->get_EnteredGainLine()); + line->set_outline_color (ARDOUR_UI::config()->color ("entered gain line")); } } break; case AutomationLineItem: - if (mouse_mode == MouseGain || mouse_mode == MouseObject) { + if (mouse_mode == MouseDraw || mouse_mode == MouseObject) { ArdourCanvas::Line *line = dynamic_cast (item); if (line) { - line->set_outline_color (ARDOUR_UI::config()->get_EnteredAutomationLine()); + line->set_outline_color (ARDOUR_UI::config()->color ("entered automation line")); } } break; @@ -1740,7 +1621,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; } entered_marker = marker; - marker->set_color_rgba (ARDOUR_UI::config()->get_EnteredMarker()); + marker->set_color_rgba (ARDOUR_UI::config()->color ("entered marker")); // fall through case MeterMarkerItem: case TempoMarkerItem: @@ -1748,7 +1629,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case FadeInHandleItem: case FadeInTrimHandleItem: - if (mouse_mode == MouseObject && !internal_editing()) { + if (mouse_mode == MouseObject) { ArdourCanvas::Rectangle *rect = dynamic_cast (item); if (rect) { RegionView* rv = static_cast(item->get_data ("regionview")); @@ -1759,7 +1640,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case FadeOutHandleItem: case FadeOutTrimHandleItem: - if (mouse_mode == MouseObject && !internal_editing()) { + if (mouse_mode == MouseObject) { ArdourCanvas::Rectangle *rect = dynamic_cast (item); if (rect) { RegionView* rv = static_cast(item->get_data ("regionview")); @@ -1778,6 +1659,14 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case SelectionItem: break; + case WaveItem: + { + if (entered_regionview) { + entered_regionview->entered(); + } + } + break; + default: break; } @@ -1814,7 +1703,9 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) bool is_start; bool ret = true; - reset_canvas_cursor (); + if (!_enter_stack.empty()) { + _enter_stack.pop_back(); + } switch (item_type) { case ControlPointItem: @@ -1852,7 +1743,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) { ArdourCanvas::Rectangle *rect = dynamic_cast (item); if (rect) { - rect->set_fill_color (ARDOUR_UI::config()->get_InactiveFadeHandle()); + rect->set_fill_color (ARDOUR_UI::config()->color ("inactive fade handle")); } } break; @@ -1863,7 +1754,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) case FeatureLineItem: { ArdourCanvas::Line *line = dynamic_cast (item); - line->set_outline_color (ARDOUR_UI::config()->get_ZeroLine()); + line->set_outline_color (ARDOUR_UI::config()->color ("zero line")); } break; @@ -2042,7 +1933,6 @@ Editor::edit_control_point (ArdourCanvas::Item* item) } ControlPointDialog d (p); - ensure_float (d); if (d.run () != RESPONSE_ACCEPT) { return; @@ -2052,23 +1942,16 @@ Editor::edit_control_point (ArdourCanvas::Item* item) } void -Editor::edit_notes (TimeAxisViewItem& tavi) +Editor::edit_notes (MidiRegionView* mrv) { - MidiRegionView* mrv = dynamic_cast(&tavi); - - if (!mrv) { - return; - } - MidiRegionView::Selection const & s = mrv->selection(); if (s.empty ()) { return; } - EditNoteDialog* d = new EditNoteDialog (&(*s.begin())->region_view(), s); + EditNoteDialog* d = new EditNoteDialog (mrv, s); d->show_all (); - ensure_float (*d); d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &Editor::note_edit_done), d)); } @@ -2429,8 +2312,6 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start); _session->add_command(new StatefulDiffCommand (playlist)); - commit_reversible_command (); - c.disconnect (); if (latest_regionviews.empty()) { @@ -2441,8 +2322,11 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) /* we need to deselect all other regionviews, and select this one i'm ignoring undo stuff, because the region creation will take care of it */ + selection->set (latest_regionviews); + commit_reversible_command (); + _drags->set (new RegionMoveDrag (this, latest_regionviews.front()->get_canvas_group(), latest_regionviews.front(), latest_regionviews, false, false), event); } @@ -2458,49 +2342,6 @@ Editor::escape () reset_focus (); } -void -Editor::set_internal_edit (bool yn) -{ - if (_internal_editing == yn) { - return; - } - - _internal_editing = yn; - - if (yn) { - pre_internal_mouse_mode = mouse_mode; - pre_internal_snap_type = _snap_type; - pre_internal_snap_mode = _snap_mode; - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - (*i)->enter_internal_edit_mode (); - } - - set_snap_to (internal_snap_type); - set_snap_mode (internal_snap_mode); - - } else { - - internal_snap_mode = _snap_mode; - internal_snap_type = _snap_type; - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - (*i)->leave_internal_edit_mode (); - } - - if (mouse_mode == MouseDraw && pre_internal_mouse_mode != MouseDraw) { - /* we were drawing .. flip back to something sensible */ - set_mouse_mode (pre_internal_mouse_mode); - } - - set_snap_to (pre_internal_snap_type); - set_snap_mode (pre_internal_snap_mode); - } - - reset_canvas_cursor (); - MouseModeChanged (); -} - /** Update _join_object_range_state which indicate whether we are over the top * or bottom half of a route view, used by the `join object/range' tool * mode. Coordinates in canvas space. @@ -2508,7 +2349,7 @@ Editor::set_internal_edit (bool yn) void Editor::update_join_object_range_location (double y) { - if (_internal_editing || !get_smart_mode()) { + if (!get_smart_mode()) { _join_object_range_state = JOIN_OBJECT_RANGE_NONE; return; } @@ -2525,11 +2366,12 @@ Editor::update_join_object_range_location (double y) ArdourCanvas::Duple const item_space = entered_regionview->get_canvas_group()->canvas_to_item (ArdourCanvas::Duple (0, y)); double const c = item_space.y / entered_regionview->height(); - + _join_object_range_state = c <= 0.5 ? JOIN_OBJECT_RANGE_RANGE : JOIN_OBJECT_RANGE_OBJECT; - - if (_join_object_range_state != old) { - set_canvas_cursor (which_track_cursor ()); + + Editor::EnterContext* ctx = get_enter_context(RegionItem); + if (_join_object_range_state != old && ctx) { + ctx->cursor_ctx->change(which_track_cursor()); } } else if (entered_track) { @@ -2544,7 +2386,7 @@ Editor::update_join_object_range_location (double y) entered_route_view->canvas_display()->canvas_to_item (cx, cy); double track_height = entered_route_view->view()->child_height(); - if (Config->get_show_name_highlight()) { + if (ARDOUR_UI::config()->get_show_name_highlight()) { track_height -= TimeAxisViewItem::NAME_HIGHLIGHT_SIZE; } double const c = cy / track_height; @@ -2561,8 +2403,9 @@ Editor::update_join_object_range_location (double y) _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT; } - if (_join_object_range_state != old) { - set_canvas_cursor (which_track_cursor ()); + Editor::EnterContext* ctx = get_enter_context(StreamItem); + if (_join_object_range_state != old && ctx) { + ctx->cursor_ctx->change(which_track_cursor()); } } }