From 5fef65538040fbac1b9edd1847a269aa925a49c9 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 8 Dec 2014 23:00:00 -0500 Subject: [PATCH] Remove internal edit mode and add "content" tool. --- gtk2_ardour/ardour-sae.menus | 1 + gtk2_ardour/audio_region_view.cc | 21 +-- gtk2_ardour/audio_region_view.h | 2 +- gtk2_ardour/audio_streamview.cc | 6 - gtk2_ardour/audio_time_axis.cc | 16 -- gtk2_ardour/audio_time_axis.h | 3 - gtk2_ardour/automation_region_view.cc | 9 +- gtk2_ardour/automation_region_view.h | 2 +- gtk2_ardour/automation_streamview.cc | 3 - gtk2_ardour/editing_syms.h | 1 + gtk2_ardour/editor.bindings | 2 +- gtk2_ardour/editor.cc | 58 +------ gtk2_ardour/editor.h | 14 +- gtk2_ardour/editor_actions.cc | 20 +-- gtk2_ardour/editor_canvas.cc | 69 ++------ gtk2_ardour/editor_mouse.cc | 241 +++++++------------------- gtk2_ardour/editor_ops.cc | 21 +-- gtk2_ardour/editor_selection.cc | 10 +- gtk2_ardour/enums.cc | 1 + gtk2_ardour/ergonomic-us.bindings.in | 2 +- gtk2_ardour/icons/tool_content.png | Bin 0 -> 377 bytes gtk2_ardour/midi_region_view.cc | 26 +-- gtk2_ardour/midi_streamview.cc | 18 -- gtk2_ardour/midi_streamview.h | 2 - gtk2_ardour/midi_time_axis.cc | 32 ---- gtk2_ardour/midi_time_axis.h | 3 - gtk2_ardour/mnemonic-us.bindings.in | 2 +- gtk2_ardour/note_base.cc | 7 +- gtk2_ardour/patch_change.cc | 3 +- gtk2_ardour/public_editor.h | 19 +- gtk2_ardour/region_view.h | 2 +- gtk2_ardour/streamview.cc | 16 -- gtk2_ardour/streamview.h | 3 - gtk2_ardour/time_axis_view.h | 3 - gtk2_ardour/time_axis_view_item.cc | 11 +- gtk2_ardour/time_info_box.cc | 74 ++++---- gtk2_ardour/trx.menus.in | 2 +- 37 files changed, 187 insertions(+), 538 deletions(-) create mode 100644 gtk2_ardour/icons/tool_content.png diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus index 66f3d1caf3..d03449ff4f 100644 --- a/gtk2_ardour/ardour-sae.menus +++ b/gtk2_ardour/ardour-sae.menus @@ -317,6 +317,7 @@ + diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index d5882514c7..70bcca0dcd 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -568,7 +568,7 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, f if (fade_in_handle->visible()) { //see comment for drag_start - entered(false); + entered(); } if (pwidth < 5) { @@ -653,7 +653,7 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, if (fade_out_handle->visible()) { //see comment for drag_start - entered(false); + entered(); } /* don't show shape if its too small */ @@ -1051,9 +1051,9 @@ AudioRegionView::update_envelope_visibility () } if (Config->get_show_region_gain() || trackview.editor().current_mouse_mode() == Editing::MouseDraw || trackview.editor().current_mouse_mode() == Editing::MouseRange ) { - gain_line->add_visibility (AutomationLine::Line); + gain_line->set_visibility (AutomationLine::VisibleAspects(AutomationLine::ControlPoints|AutomationLine::Line)); } else { - gain_line->hide (); + gain_line->set_visibility (AutomationLine::VisibleAspects(0)); } } @@ -1298,17 +1298,14 @@ AudioRegionView::add_ghost (TimeAxisView& tv) } void -AudioRegionView::entered (bool internal_editing) +AudioRegionView::entered () { trackview.editor().set_current_trimmable (_region); trackview.editor().set_current_movable (_region); - - if (gain_line) { - /* these may or may not be visible depending on mouse mode */ - gain_line->add_visibility (AutomationLine::ControlPoints); - } - if (!internal_editing && ( trackview.editor().current_mouse_mode() == Editing::MouseObject ) ) { + update_envelope_visibility(); + + if ((trackview.editor().current_mouse_mode() == Editing::MouseObject)) { if (start_xfade_rect) { start_xfade_rect->set_outline (true); } @@ -1614,7 +1611,7 @@ AudioRegionView::drag_end () // if fade_in_trim_handle or fade_out_trim_handle should // be visible. -- If the fade_in_handle is visible // we have focus and are not in internal edit mode. - entered(false); + entered(); } } diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 9c2c9f7c12..598142099e 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -109,7 +109,7 @@ class AudioRegionView : public RegionView void show_region_editor (); - virtual void entered (bool); + virtual void entered (); virtual void exited (); void thaw_after_trim (); diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 1c54233131..a083c2a196 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -143,12 +143,6 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr r, bool wai region_views.push_front (region_view); - if (_trackview.editor().internal_editing()) { - region_view->hide_rect (); - } else { - region_view->show_rect (); - } - /* catch region going away */ r->DropReferences.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::remove_region_view, this, boost::weak_ptr (r)), gui_context()); diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 60bcf8d6af..533c5ffc35 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -314,19 +314,3 @@ AudioTimeAxisView::build_automation_action_menu (bool for_selection) { RouteTimeAxisView::build_automation_action_menu (for_selection); } - -void -AudioTimeAxisView::enter_internal_edit_mode () -{ - if (audio_view()) { - audio_view()->enter_internal_edit_mode (); - } -} - -void -AudioTimeAxisView::leave_internal_edit_mode () -{ - if (audio_view()) { - audio_view()->leave_internal_edit_mode (); - } -} diff --git a/gtk2_ardour/audio_time_axis.h b/gtk2_ardour/audio_time_axis.h index 4a44905d3b..521cef8c2a 100644 --- a/gtk2_ardour/audio_time_axis.h +++ b/gtk2_ardour/audio_time_axis.h @@ -76,9 +76,6 @@ class AudioTimeAxisView : public RouteTimeAxisView /* Overridden from parent to store display state */ guint32 show_at (double y, int& nth, Gtk::VBox *parent); - void enter_internal_edit_mode (); - void leave_internal_edit_mode (); - void create_automation_child (const Evoral::Parameter& param, bool show); void first_idle (); diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc index c5afcadfe0..ec1fa523a4 100644 --- a/gtk2_ardour/automation_region_view.cc +++ b/gtk2_ardour/automation_region_view.cc @@ -106,13 +106,12 @@ AutomationRegionView::canvas_group_event (GdkEvent* ev) PublicEditor& e = trackview.editor (); - if (!trackview.editor().internal_editing() && - e.current_mouse_mode() != Editing::MouseDraw) { + if (!trackview.editor().internal_editing()) { // not in internal edit mode, so just act like a normal region return RegionView::canvas_group_event (ev); } - if (ev->type == GDK_BUTTON_PRESS && e.current_mouse_mode() == Editing::MouseObject) { + if (ev->type == GDK_BUTTON_PRESS && e.current_mouse_mode() == Editing::MouseContent) { /* XXX: icky dcast to Editor */ e.drags()->set (new EditorRubberbandSelectDrag (dynamic_cast (&e), group), ev); @@ -128,7 +127,7 @@ AutomationRegionView::canvas_group_event (GdkEvent* ev) if (e.drags()->end_grab (ev)) { return true; } else if (e.current_mouse_mode() != Editing::MouseDraw && - e.current_mouse_mode() != Editing::MouseObject) { + e.current_mouse_mode() != Editing::MouseContent) { return RegionView::canvas_group_event (ev); } @@ -285,7 +284,7 @@ AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed) void -AutomationRegionView::entered (bool) +AutomationRegionView::entered () { if (_line) { _line->track_entered(); diff --git a/gtk2_ardour/automation_region_view.h b/gtk2_ardour/automation_region_view.h index a41c57c782..c9b7d47f18 100644 --- a/gtk2_ardour/automation_region_view.h +++ b/gtk2_ardour/automation_region_view.h @@ -79,7 +79,7 @@ protected: void region_resized (const PBD::PropertyChange&); bool canvas_group_event(GdkEvent* ev); void add_automation_event (GdkEvent* event, framepos_t when, double y, bool with_guard_points); - void entered (bool); + void entered(); void exited(); private: diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc index a336bd6db5..16dab909c7 100644 --- a/gtk2_ardour/automation_streamview.cc +++ b/gtk2_ardour/automation_streamview.cc @@ -286,9 +286,6 @@ AutomationStreamView::clear () void AutomationStreamView::get_selectables (framepos_t start, framepos_t end, double botfrac, double topfrac, list& results) { - if (!_trackview.editor().internal_editing()) { - return; // TODO: selection of automation regions - } for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { AutomationRegionView* arv = dynamic_cast (*i); if (arv) { diff --git a/gtk2_ardour/editing_syms.h b/gtk2_ardour/editing_syms.h index 610aff2a86..a958776305 100644 --- a/gtk2_ardour/editing_syms.h +++ b/gtk2_ardour/editing_syms.h @@ -72,6 +72,7 @@ MOUSEMODE(MouseCut) MOUSEMODE(MouseTimeFX) MOUSEMODE(MouseAudition) MOUSEMODE(MouseDraw) +MOUSEMODE(MouseContent) /* Changing this order will break the menu */ ZOOMFOCUS(ZoomFocusLeft) diff --git a/gtk2_ardour/editor.bindings b/gtk2_ardour/editor.bindings index 7c23fb2cdc..4ef4acbd86 100644 --- a/gtk2_ardour/editor.bindings +++ b/gtk2_ardour/editor.bindings @@ -35,7 +35,7 @@ - + diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index e3c03db510..c91337bb6e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -400,7 +400,6 @@ Editor::Editor () zoom_focus = ZoomFocusLeft; _edit_point = EditAtMouse; - _internal_editing = false; current_canvas_cursor = 0; _visible_track_count = -1; @@ -670,11 +669,6 @@ Editor::Editor () _snap_mode = SnapOff; set_snap_mode (_snap_mode); set_mouse_mode (MouseObject, true); - pre_internal_mouse_mode = MouseObject; - pre_internal_snap_type = _snap_type; - pre_internal_snap_mode = _snap_mode; - internal_snap_type = _snap_type; - internal_snap_mode = _snap_mode; set_edit_point_preference (EditAtMouse, true); _playlist_selector = new PlaylistSelector(); @@ -877,7 +871,7 @@ Editor::set_entered_regionview (RegionView* rv) entered_regionview = rv; if (entered_regionview != 0) { - entered_regionview->entered (internal_editing ()); + entered_regionview->entered (); } if (!_all_region_actions_sensitized && _last_region_menu_was_main) { @@ -2092,12 +2086,6 @@ Editor::set_snap_mode (SnapMode mode) { string str = snap_mode_strings[(int)mode]; - if (_internal_editing) { - internal_snap_mode = mode; - } else { - pre_internal_snap_mode = mode; - } - _snap_mode = mode; if (str != snap_mode_selector.get_text ()) { @@ -2249,23 +2237,6 @@ Editor::set_state (const XMLNode& node, int /*version*/) snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode)); } - if ((prop = node.property ("internal-snap-to"))) { - internal_snap_type = (SnapType) string_2_enum (prop->value(), internal_snap_type); - } - - if ((prop = node.property ("internal-snap-mode"))) { - internal_snap_mode = (SnapMode) string_2_enum (prop->value(), internal_snap_mode); - } - - if ((prop = node.property ("pre-internal-snap-to"))) { - pre_internal_snap_type = (SnapType) string_2_enum (prop->value(), pre_internal_snap_type); - } - - - if ((prop = node.property ("pre-internal-snap-mode"))) { - pre_internal_snap_mode = (SnapMode) string_2_enum (prop->value(), pre_internal_snap_mode); - } - if ((prop = node.property ("mouse-mode"))) { MouseMode m = str2mousemode(prop->value()); set_mouse_mode (m, true); @@ -2287,16 +2258,6 @@ Editor::set_state (const XMLNode& node, int /*version*/) reset_y_origin (atof (prop->value ())); } - if ((prop = node.property ("internal-edit"))) { - bool yn = string_is_affirmative (prop->value()); - RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("toggle-internal-edit")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - tact->set_active (!yn); - tact->set_active (yn); - } - } - if ((prop = node.property ("join-object-range"))) { RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object-range")); bool yn = string_is_affirmative (prop->value()); @@ -2467,10 +2428,6 @@ Editor::get_state () node->add_property ("zoom", buf); node->add_property ("snap-to", enum_2_string (_snap_type)); node->add_property ("snap-mode", enum_2_string (_snap_mode)); - node->add_property ("internal-snap-to", enum_2_string (internal_snap_type)); - node->add_property ("internal-snap-mode", enum_2_string (internal_snap_mode)); - node->add_property ("pre-internal-snap-to", enum_2_string (pre_internal_snap_type)); - node->add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode)); node->add_property ("edit-point", enum_2_string (_edit_point)); snprintf (buf, sizeof(buf), "%d", _visible_track_count); node->add_property ("visible-track-count", buf); @@ -2488,7 +2445,6 @@ Editor::get_state () node->add_property ("stationary-playhead", _stationary_playhead ? "yes" : "no"); node->add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ())); node->add_property ("mouse-mode", enum2str(mouse_mode)); - node->add_property ("internal-edit", _internal_editing ? "yes" : "no"); node->add_property ("join-object-range", smart_mode_action->get_active () ? "yes" : "no"); Glib::RefPtr act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer")); @@ -2863,7 +2819,7 @@ Editor::setup_toolbar () mouse_mode_size_group->add_widget (mouse_timefx_button); mouse_mode_size_group->add_widget (mouse_audition_button); mouse_mode_size_group->add_widget (mouse_draw_button); - mouse_mode_size_group->add_widget (internal_edit_button); + mouse_mode_size_group->add_widget (mouse_content_button); mouse_mode_size_group->add_widget (zoom_in_button); mouse_mode_size_group->add_widget (zoom_out_button); @@ -2902,7 +2858,7 @@ Editor::setup_toolbar () mouse_mode_hbox->pack_start (mouse_timefx_button, false, false); mouse_mode_hbox->pack_start (mouse_audition_button, false, false); mouse_mode_hbox->pack_start (mouse_draw_button, false, false); - mouse_mode_hbox->pack_start (internal_edit_button, false, false, 0); + mouse_mode_hbox->pack_start (mouse_content_button, false, false); } mouse_mode_vbox->pack_start (*mouse_mode_hbox); @@ -3193,7 +3149,7 @@ Editor::setup_tooltips () ARDOUR_UI::instance()->set_tip (mouse_draw_button, _("Draw/Edit Gain/Notes/Automation")); ARDOUR_UI::instance()->set_tip (mouse_timefx_button, _("Stretch/Shrink Regions and MIDI Notes")); ARDOUR_UI::instance()->set_tip (mouse_audition_button, _("Listen to Specific Regions")); - ARDOUR_UI::instance()->set_tip (internal_edit_button, _("Note Level Editing")); + ARDOUR_UI::instance()->set_tip (mouse_content_button, _("Select/move contents (notes and automation)")); ARDOUR_UI::instance()->set_tip (*_group_tabs, _("Groups: click to (de)activate\nContext-click for other operations")); ARDOUR_UI::instance()->set_tip (nudge_forward_button, _("Nudge Region/Selection Later")); ARDOUR_UI::instance()->set_tip (nudge_backward_button, _("Nudge Region/Selection Earlier")); @@ -5110,12 +5066,6 @@ Editor::add_routes (RouteList& routes) rtv->effective_gain_display (); - if (internal_editing()) { - rtv->enter_internal_edit_mode (); - } else { - rtv->leave_internal_edit_mode (); - } - rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added)); rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed)); } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index fa86833dc6..168f3dcc90 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -178,9 +178,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Editing::MidiEditMode current_midi_edit_mode () const; void remove_midi_note (ArdourCanvas::Item *, GdkEvent *); - bool internal_editing() const { return _internal_editing ; } - void set_internal_edit (bool yn); - bool toggle_internal_editing_from_double_click (GdkEvent*); + bool internal_editing() const; void foreach_time_axis_view (sigc::slot); void add_to_idle_resize (TimeAxisView*, int32_t); @@ -546,12 +544,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_samples_per_pixel (framecnt_t); Editing::MouseMode mouse_mode; - Editing::MouseMode pre_internal_mouse_mode; - Editing::SnapType pre_internal_snap_type; - Editing::SnapMode pre_internal_snap_mode; - Editing::SnapType internal_snap_type; - Editing::SnapMode internal_snap_mode; - bool _internal_editing; Editing::MouseMode effective_mouse_mode () const; enum JoinObjectRangeState { @@ -1641,6 +1633,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourButton mouse_draw_button; ArdourButton mouse_move_button; ArdourButton mouse_timefx_button; + ArdourButton mouse_content_button; ArdourButton mouse_audition_button; ArdourButton mouse_cut_button; @@ -1651,9 +1644,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void mouse_mode_object_range_toggled (); bool ignore_mouse_mode_toggle; - ArdourButton internal_edit_button; - void toggle_internal_editing (); - bool mouse_select_button_release (GdkEventButton*); Gtk::VBox automation_box; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index befd2fa1ae..7c3365f91b 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -476,6 +476,11 @@ Editor::register_actions () mouse_timefx_button.set_image (::get_icon("tool_stretch")); mouse_timefx_button.set_name ("mouse mode button"); + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Content Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseContent)); + mouse_content_button.set_related_action (act); + mouse_content_button.set_image (::get_icon("tool_content")); + mouse_content_button.set_name ("mouse mode button"); + if(!Profile->get_mixbus()) { act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseCut)); mouse_cut_button.set_related_action (act); @@ -485,11 +490,6 @@ Editor::register_actions () ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true)); - act = ActionManager::register_toggle_action (mouse_mode_actions, "toggle-internal-edit", _("Edit MIDI"), sigc::mem_fun(*this, &Editor::toggle_internal_editing)); - internal_edit_button.set_related_action (act); - internal_edit_button.set_image (::get_icon("tool_note")); - internal_edit_button.set_name ("mouse mode button"); - RadioAction::Group edit_point_group; ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead))); ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtMouse))); @@ -1758,16 +1758,6 @@ Editor::reset_canvas_action_sensitivity (bool onoff) } } -void -Editor::toggle_internal_editing () -{ - Glib::RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("toggle-internal-edit")); - if (act) { - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - set_internal_edit (tact->get_active()); - } -} - void Editor::register_region_actions () { diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 0c2faf8213..d923489d7c 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -1023,41 +1023,16 @@ Editor::which_grabber_cursor () const { Gdk::Cursor* c = _cursors->grabber; - if (_internal_editing) { - switch (mouse_mode) { - case MouseDraw: - c = _cursors->midi_pencil; - break; - - case MouseObject: - c = _cursors->grabber_note; - break; - - case MouseTimeFX: - c = _cursors->midi_resize; - break; - - case MouseRange: - c = _cursors->grabber_note; - break; - - default: - break; - } - - } else { - - switch (_edit_point) { - case EditAtMouse: - c = _cursors->grabber_edit_point; - break; - default: - boost::shared_ptr m = _movable.lock(); - if (m && m->locked()) { - c = _cursors->speaker; - } - break; + switch (_edit_point) { + case EditAtMouse: + c = _cursors->grabber_edit_point; + break; + default: + boost::shared_ptr m = _movable.lock(); + if (m && m->locked()) { + c = _cursors->speaker; } + break; } return c; @@ -1096,9 +1071,6 @@ Editor::which_mode_cursor () const switch (mouse_mode) { case MouseRange: mode_cursor = _cursors->selector; - if (_internal_editing) { - mode_cursor = which_grabber_cursor(); - } break; case MouseCut: @@ -1106,6 +1078,7 @@ Editor::which_mode_cursor () const break; case MouseObject: + case MouseContent: /* don't use mode cursor, pick a grabber cursor based on the item */ break; @@ -1123,7 +1096,7 @@ Editor::which_mode_cursor () const } /* up-down cursor as a cue that automation can be dragged up and down when in join object/range mode */ - if (!_internal_editing && get_smart_mode() ) { + if (get_smart_mode()) { double x, y; get_pointer_position (x, y); @@ -1161,18 +1134,14 @@ Editor::which_track_cursor () const { Gdk::Cursor* cursor = 0; - assert (mouse_mode == MouseObject || get_smart_mode()); - - if (!_internal_editing) { - switch (_join_object_range_state) { - case JOIN_OBJECT_RANGE_NONE: - case JOIN_OBJECT_RANGE_OBJECT: - cursor = which_grabber_cursor (); - break; - case JOIN_OBJECT_RANGE_RANGE: - cursor = _cursors->selector; - break; - } + switch (_join_object_range_state) { + case JOIN_OBJECT_RANGE_NONE: + case JOIN_OBJECT_RANGE_OBJECT: + cursor = which_grabber_cursor (); + break; + case JOIN_OBJECT_RANGE_RANGE: + cursor = _cursors->selector; + break; } return cursor; diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 19351d49e4..68899e67a2 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -259,6 +259,10 @@ Editor::set_mouse_mode (MouseMode m, bool force) act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); break; + case MouseContent: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); + break; + case MouseAudition: act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); break; @@ -307,6 +311,10 @@ Editor::mouse_mode_toggled (MouseMode m) act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); break; + case MouseContent: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); + break; + case MouseAudition: act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); break; @@ -350,6 +358,12 @@ Editor::mouse_mode_toggled (MouseMode m) MouseModeChanged (); /* EMIT SIGNAL */ } +bool +Editor::internal_editing() const +{ + return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw; +} + void Editor::update_time_selection_display () { @@ -366,7 +380,7 @@ Editor::update_time_selection_display () void Editor::step_mouse_mode (bool next) { - const int n_mouse_modes = (int)MouseDraw + 1; + 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)); @@ -375,22 +389,6 @@ Editor::step_mouse_mode (bool next) } } -bool -Editor::toggle_internal_editing_from_double_click (GdkEvent* event) -{ - 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; -} - void Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemType item_type) { @@ -439,9 +437,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp (mouse_mode != MouseAudition || item_type != RegionItem) && (mouse_mode != MouseTimeFX || item_type != RegionItem) && (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; } @@ -534,6 +530,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); @@ -655,11 +653,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) { @@ -686,19 +679,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: @@ -709,12 +695,10 @@ 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; @@ -740,26 +724,42 @@ 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()) { + 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, current_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: + if (dynamic_cast (clicked_axisview)) { + _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); return true; } break; + case AutomationTrackItem: + /* rubberband drag to select automation points */ + _drags->set (new EditorRubberbandSelectDrag (this, item), event); + break; + default: break; } + break; + case MouseObject: if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && event->type == GDK_BUTTON_PRESS) { @@ -809,10 +809,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); @@ -823,10 +819,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; @@ -869,15 +861,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: { @@ -961,28 +946,23 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; 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()) { + 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, current_canvas_cursor); } else { + /* Drag note */ _drags->set (new NoteDrag (this, item), event); } return true; } - break; + return true; case StreamItem: - if (internal_editing()) { - if (dynamic_cast (clicked_axisview)) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - } - return true; + if (dynamic_cast (clicked_axisview)) { + _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); } - break; + return true; default: break; @@ -991,12 +971,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, current_canvas_cursor); + } } return true; } else if (clicked_regionview) { @@ -1031,11 +1011,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 { @@ -1061,9 +1036,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; @@ -1114,48 +1087,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp 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 () && @@ -1663,7 +1594,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")); @@ -1674,7 +1605,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")); @@ -2374,44 +2305,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 (); - } - - 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. @@ -2419,7 +2312,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; } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 9f2f4acccf..77dad5bf29 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3853,20 +3853,15 @@ Editor::cut_copy (CutCopyOp op) return; } - if (internal_editing()) { - - switch (effective_mouse_mode()) { - case MouseObject: - case MouseRange: - begin_reversible_command (opname + ' ' + X_("MIDI")); - cut_copy_midi (op); - commit_reversible_command (); - break; - default: - break; - } - + switch (mouse_mode) { + case MouseDraw: + case MouseContent: + begin_reversible_command (opname + ' ' + X_("MIDI")); + cut_copy_midi (op); + commit_reversible_command (); return; + default: + break; } bool did_edit = false; diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 2699ba72f3..93dd7c15fb 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1384,7 +1384,7 @@ Editor::select_all_objects (Selection::Operation op) TrackViewList ts = track_views; - if (_internal_editing) { + if (internal_editing()) { bool midi_selected = false; @@ -1452,7 +1452,7 @@ Editor::invert_selection () { list touched; - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); if (mrv) { @@ -1695,7 +1695,7 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) } } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); if (mrv) { @@ -1748,7 +1748,7 @@ Editor::select_all_selectables_using_edit (bool after) } } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); mrv->select_range (start, end); @@ -1791,7 +1791,7 @@ Editor::select_all_selectables_between (bool /*within*/) return; } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); mrv->select_range (start, end); diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index f109050515..4cae1f5db4 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -181,6 +181,7 @@ setup_gtk_ardour_enums () REGISTER_ENUM(MouseTimeFX); REGISTER_ENUM(MouseAudition); REGISTER_ENUM(MouseCut); + REGISTER_ENUM(MouseContent); REGISTER (mouse_mode); } diff --git a/gtk2_ardour/ergonomic-us.bindings.in b/gtk2_ardour/ergonomic-us.bindings.in index 9c7efb9b99..46a8675f0a 100644 --- a/gtk2_ardour/ergonomic-us.bindings.in +++ b/gtk2_ardour/ergonomic-us.bindings.in @@ -216,9 +216,9 @@ ; (gtk_accel_path "/Main/AudioFileFormat" "") ; (gtk_accel_path "/Transport/Transport" "") (gtk_accel_path "/MouseMode/set-mouse-mode-timefx" "t") +(gtk_accel_path "/MouseMode/set-mouse-mode-content" "e") ; (gtk_accel_path "/RegionList/SortByRegionName" "") ; (gtk_accel_path "/Main/KeyMouse Actions" "") -(gtk_accel_path "/MouseMode/set-mouse-mode-gain" "g") ; (gtk_accel_path "/Snap/snap-to-frame" "") ; (gtk_accel_path "/Editor/SnapTo" "") (gtk_accel_path "/Transport/TransitionToReverse" "<@PRIMARY@>downarrow") diff --git a/gtk2_ardour/icons/tool_content.png b/gtk2_ardour/icons/tool_content.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab448cb66b4234bf5744fc0e2ca8ecad66dd0cd GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3HF=pW8M9DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVkB37{N8m>1Hc6n6WQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyv_Lr)jS5RLP_lMM5k0|Z>|_uIuU@^lnFsZly1W{E!|yGMJC z$gL}u%Rcj`2w8jGaxa6P}s&SbjUD zo}s?P(&i6;)B)SWx*tAnZ>*W-&s{F}KHoKP#rx{k#2?&i&a;$o98~`_Y1ztSg&~tv zn9TNx_MZ(6Jt^^-)rRqWq0IZX#DICvnd0<+o|#jeHOnpbx@Om+SOFIM+}o>kycwe( zJd28$x%J!bb+3c1i_XBl`U>?#p#sOERHV~F}Cx_SLB_Q%zw_nodc RW&%CS;OXk;vd$@?2>=8qkzoJ; literal 0 HcmV?d00001 diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 85ea05fe3f..8533cefdc0 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -351,7 +351,6 @@ MidiRegionView::canvas_group_event(GdkEvent* ev) return RegionView::canvas_group_event (ev); } - const MouseMode m = trackview.editor().current_mouse_mode(); bool r; switch (ev->type) { @@ -369,15 +368,6 @@ MidiRegionView::canvas_group_event(GdkEvent* ev) // reset entered_regionview (among other things) return RegionView::canvas_group_event (ev); - case GDK_2BUTTON_PRESS: - // cannot use double-click to exit internal mode if single-click is being used - if ((m != MouseDraw) && - (m != MouseObject || - !Keyboard::modifier_state_contains (ev->button.state, Keyboard::insert_note_modifier()))) { - return trackview.editor().toggle_internal_editing_from_double_click (ev); - } - break; - case GDK_SCROLL: if (scroll (&ev->scroll)) { return true; @@ -484,7 +474,7 @@ MidiRegionView::button_press (GdkEventButton* ev) Editor* editor = dynamic_cast (&trackview.editor()); MouseMode m = editor->current_mouse_mode(); - if (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { + if (m == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { pre_press_cursor = editor->get_canvas_cursor (); editor->set_canvas_cursor (editor->cursors()->midi_pencil); } @@ -533,7 +523,7 @@ MidiRegionView::button_release (GdkEventButton* ev) clear_selection (); break; - case MouseObject: + case MouseContent: case MouseTimeFX: { clear_selection(); @@ -598,18 +588,18 @@ MidiRegionView::motion (GdkEventMotion* ev) { PublicEditor& editor = trackview.editor (); - if (!_ghost_note && editor.current_mouse_mode() == MouseObject && + if (!_ghost_note && editor.current_mouse_mode() == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()) && _mouse_state != AddDragging) { create_ghost_note (ev->x, ev->y); - } else if (_ghost_note && editor.current_mouse_mode() == MouseObject && + } else if (_ghost_note && editor.current_mouse_mode() == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { update_ghost_note (ev->x, ev->y); - } else if (_ghost_note && editor.current_mouse_mode() == MouseObject) { + } else if (_ghost_note && editor.current_mouse_mode() == MouseContent) { remove_ghost_note (); editor.verbose_cursor()->hide (); @@ -632,13 +622,13 @@ MidiRegionView::motion (GdkEventMotion* ev) MouseMode m = editor.current_mouse_mode(); - if (m == MouseDraw || (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()))) { + if (m == MouseDraw || (m == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()))) { editor.drags()->set (new NoteCreateDrag (dynamic_cast (&editor), group, this), (GdkEvent *) ev); _mouse_state = AddDragging; remove_ghost_note (); editor.verbose_cursor()->hide (); return true; - } else if (m == MouseObject) { + } else if (m == MouseContent) { editor.drags()->set (new MidiRubberbandSelectDrag (dynamic_cast (&editor), this), (GdkEvent *) ev); if (!Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { clear_selection (); @@ -3224,7 +3214,7 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo { Editor* editor = dynamic_cast(&trackview.editor()); Editing::MouseMode mm = editor->current_mouse_mode(); - bool trimmable = (mm == MouseObject || mm == MouseTimeFX || mm == MouseDraw); + bool trimmable = (mm == MouseContent || mm == MouseTimeFX || mm == MouseDraw); if (can_set_cursor) { if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) { diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 3d2c54d87f..f47091b3a6 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -153,12 +153,6 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr r, bool wait region_views.push_front (region_view); - if (_trackview.editor().internal_editing()) { - region_view->hide_rect (); - } else { - region_view->show_rect (); - } - /* display events and find note range */ display_region (region_view, wait_for_data); @@ -660,15 +654,3 @@ MidiStreamView::resume_updates () _canvas_group->redraw (); } - -void -MidiStreamView::leave_internal_edit_mode () -{ - StreamView::leave_internal_edit_mode (); - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - MidiRegionView* mrv = dynamic_cast (*i); - if (mrv) { - mrv->clear_selection (); - } - } -} diff --git a/gtk2_ardour/midi_streamview.h b/gtk2_ardour/midi_streamview.h index 8d5c233b7d..7733f87074 100644 --- a/gtk2_ardour/midi_streamview.h +++ b/gtk2_ardour/midi_streamview.h @@ -79,8 +79,6 @@ class MidiStreamView : public StreamView void redisplay_track (); - void leave_internal_edit_mode (); - inline double contents_height() const { return (child_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 2); } diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 1d55b7dffa..b23d86194a 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -404,22 +404,6 @@ MidiTimeAxisView::~MidiTimeAxisView () delete _step_editor; } -void -MidiTimeAxisView::enter_internal_edit_mode () -{ - if (midi_view()) { - midi_view()->enter_internal_edit_mode (); - } -} - -void -MidiTimeAxisView::leave_internal_edit_mode () -{ - if (midi_view()) { - midi_view()->leave_internal_edit_mode (); - } -} - void MidiTimeAxisView::check_step_edit () { @@ -1322,10 +1306,6 @@ MidiTimeAxisView::route_active_changed () void MidiTimeAxisView::set_note_selection (uint8_t note) { - if (!_editor.internal_editing()) { - return; - } - uint16_t chn_mask = midi_track()->get_playback_channel_mask(); if (_view->num_selected_regionviews() == 0) { @@ -1342,10 +1322,6 @@ MidiTimeAxisView::set_note_selection (uint8_t note) void MidiTimeAxisView::add_note_selection (uint8_t note) { - if (!_editor.internal_editing()) { - return; - } - const uint16_t chn_mask = midi_track()->get_playback_channel_mask(); if (_view->num_selected_regionviews() == 0) { @@ -1362,10 +1338,6 @@ MidiTimeAxisView::add_note_selection (uint8_t note) void MidiTimeAxisView::extend_note_selection (uint8_t note) { - if (!_editor.internal_editing()) { - return; - } - const uint16_t chn_mask = midi_track()->get_playback_channel_mask(); if (_view->num_selected_regionviews() == 0) { @@ -1382,10 +1354,6 @@ MidiTimeAxisView::extend_note_selection (uint8_t note) void MidiTimeAxisView::toggle_note_selection (uint8_t note) { - if (!_editor.internal_editing()) { - return; - } - const uint16_t chn_mask = midi_track()->get_playback_channel_mask(); if (_view->num_selected_regionviews() == 0) { diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index f8f77244d0..ebc51b1427 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -75,9 +75,6 @@ class MidiTimeAxisView : public RouteTimeAxisView void set_height (uint32_t); - void enter_internal_edit_mode (); - void leave_internal_edit_mode (); - boost::shared_ptr add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool); void show_all_automation (bool apply_to_selection = false); diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 8c3126315f..981aae4a28 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -137,7 +137,6 @@ This mode provides many different operations on both regions and control points, ;; note that ctrl-w is special and consumed by the keyboard snooper -@mmode|MouseMode/toggle-internal-edit|e|toggle MIDI note editing @select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP @rop|Region/export-region|<@PRIMARY@><@LEVEL4@>e|export selected region(s) @sess|Main/ExportSession|<@LEVEL4@>e|export session @@ -160,6 +159,7 @@ This mode provides many different operations on both regions and control points, @sess|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files @sess|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input @mmode|MouseMode/set-mouse-mode-object|o|object mode +@mmode|MouseMode/set-mouse-mode-content|e|content mode @sess|Main/Open|<@PRIMARY@>o|open an existing session @sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session @wvis|Window/toggle-session-options-editor|<@WINDOW@>o|toggle preferences dialog diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc index 71d8dd98fc..9fba9be10a 100644 --- a/gtk2_ardour/note_base.cc +++ b/gtk2_ardour/note_base.cc @@ -254,7 +254,8 @@ NoteBase::set_mouse_fractions (GdkEvent* ev) bool NoteBase::event_handler (GdkEvent* ev) { - if (!_region.get_time_axis_view().editor().internal_editing()) { + PublicEditor& editor = _region.get_time_axis_view().editor(); + if (!editor.internal_editing()) { return false; } @@ -276,7 +277,7 @@ NoteBase::event_handler (GdkEvent* ev) case GDK_BUTTON_PRESS: set_mouse_fractions (ev); if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state) && _selected) { - _region.get_time_axis_view().editor().edit_notes (_region); + editor.edit_notes (_region); return true; } break; @@ -292,7 +293,7 @@ NoteBase::event_handler (GdkEvent* ev) break; } - return _region.get_time_axis_view().editor().canvas_note_event (ev, _item); + return editor.canvas_note_event (ev, _item); } bool diff --git a/gtk2_ardour/patch_change.cc b/gtk2_ardour/patch_change.cc index 925a0f3b23..ebad5518cf 100644 --- a/gtk2_ardour/patch_change.cc +++ b/gtk2_ardour/patch_change.cc @@ -157,9 +157,8 @@ PatchChange::event_handler (GdkEvent* ev) { /* XXX: icky dcast */ Editor* e = dynamic_cast (&_region.get_time_axis_view().editor()); - + if (!e->internal_editing()) { - // not in internal edit mode, so no patch change editing return false; } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index c2972116a1..884a1b351b 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -173,25 +173,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi */ virtual Editing::MouseMode current_mouse_mode () const = 0; - /** Switch into a mode in which editing is primarily focused on "within" regions, - rather than regions as black-box objects. For Ardour3, this is aimed at - editing MIDI regions but may expand in the future to other types of regions. - */ - - virtual void set_internal_edit (bool yn) = 0; - - /** Driven by a double-click, switch in or out of a mode in which - editing is primarily focused on "within" regions, rather than - regions as black-box objects. For Ardour3, this is aimed at editing - MIDI regions but may expand in the future to other types of - regions. - */ - - virtual bool toggle_internal_editing_from_double_click (GdkEvent*) = 0; - - /** @return Whether editing is currently in "internal" mode or not + /** @return Whether the current mouse mode is an "internal" editing mode. */ - virtual bool internal_editing() const = 0; /** Possibly start the audition of a region. If @param r is 0, or not an AudioRegion diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h index cb6b56912f..389faf8921 100644 --- a/gtk2_ardour/region_view.h +++ b/gtk2_ardour/region_view.h @@ -89,7 +89,7 @@ class RegionView : public TimeAxisViewItem void remove_ghost_in (TimeAxisView&); void remove_ghost (GhostRegion*); - virtual void entered (bool) {} + virtual void entered () {} virtual void exited () {} virtual void enable_display(bool yn) { _enable_display = yn; } diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 1ee0114c52..18953aee09 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -712,19 +712,3 @@ StreamView::setup_new_rec_layer_time (boost::shared_ptr region) _new_rec_layer_time = max_framepos; } } - -void -StreamView::enter_internal_edit_mode () -{ - for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - (*i)->hide_rect (); - } -} - -void -StreamView::leave_internal_edit_mode () -{ - for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { - (*i)->show_rect (); - } -} diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index d211ca10c3..73b1f0a420 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -76,9 +76,6 @@ public: virtual int set_samples_per_pixel (double); gdouble get_samples_per_pixel () const { return _samples_per_pixel; } - virtual void enter_internal_edit_mode (); - virtual void leave_internal_edit_mode (); - void set_layer_display (LayerDisplay); LayerDisplay layer_display () const { return _layer_display; } diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h index ab990f875a..7ea0f580f5 100644 --- a/gtk2_ardour/time_axis_view.h +++ b/gtk2_ardour/time_axis_view.h @@ -106,9 +106,6 @@ class TimeAxisView : public virtual AxisView /** @return maximum allowable value of order */ static int max_order () { return _max_order; } - virtual void enter_internal_edit_mode () {} - virtual void leave_internal_edit_mode () {} - ArdourCanvas::Container* canvas_display () { return _canvas_display; } ArdourCanvas::Container* ghost_group () { return _ghost_group; } diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index 78c5b3299a..9df14240f5 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -857,13 +857,10 @@ TimeAxisViewItem::frame_handle_crossing (GdkEvent* ev, ArdourCanvas::Rectangle* item->set_fill (false); break; case GDK_ENTER_NOTIFY: - if (trackview.editor().effective_mouse_mode() == Editing::MouseObject && - !trackview.editor().internal_editing()) { - /* never set this to be visible in internal - edit mode. Note, however, that we do need to - undo visibility (LEAVE_NOTIFY case above) no - matter what the mode is. - */ + if (trackview.editor().effective_mouse_mode() == Editing::MouseObject) { + /* Never set this to be visible in other modes. Note, however, + that we do need to undo visibility (LEAVE_NOTIFY case above) no + matter what the mode is. */ item->set_fill (true); } break; diff --git a/gtk2_ardour/time_info_box.cc b/gtk2_ardour/time_info_box.cc index 5d11c35c79..afd48715b3 100644 --- a/gtk2_ardour/time_info_box.cc +++ b/gtk2_ardour/time_info_box.cc @@ -243,51 +243,40 @@ TimeInfoBox::selection_changed () switch (Editor::instance().current_mouse_mode()) { + case Editing::MouseContent: + /* displaying MIDI note selection is tricky */ + selection_start->set_off (true); + selection_end->set_off (true); + selection_length->set_off (true); + break; + case Editing::MouseObject: - if (Editor::instance().internal_editing()) { - /* displaying MIDI note selection is tricky */ - - selection_start->set_off (true); - selection_end->set_off (true); - selection_length->set_off (true); + if (selection.regions.empty()) { + if (selection.points.empty()) { + Glib::RefPtr act = ActionManager::get_action ("MouseMode", "set-mouse-mode-object-range"); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - } else { - if (selection.regions.empty()) { - if (selection.points.empty()) { - Glib::RefPtr act = ActionManager::get_action ("MouseMode", "set-mouse-mode-object-range"); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - - if (tact && tact->get_active() && !selection.time.empty()) { - /* show selected range */ - selection_start->set_off (false); - selection_end->set_off (false); - selection_length->set_off (false); - selection_start->set (selection.time.start()); - selection_end->set (selection.time.end_frame()); - selection_length->set (selection.time.length()); - } else { - selection_start->set_off (true); - selection_end->set_off (true); - selection_length->set_off (true); - } - } else { - s = max_framepos; - e = 0; - for (PointSelection::iterator i = selection.points.begin(); i != selection.points.end(); ++i) { - framepos_t const p = (*i)->line().session_position ((*i)->model ()); - s = min (s, p); - e = max (e, p); - } + if (tact && tact->get_active() && !selection.time.empty()) { + /* show selected range */ selection_start->set_off (false); selection_end->set_off (false); selection_length->set_off (false); - selection_start->set (s); - selection_end->set (e); - selection_length->set (e - s + 1); + selection_start->set (selection.time.start()); + selection_end->set (selection.time.end_frame()); + selection_length->set (selection.time.length()); + } else { + selection_start->set_off (true); + selection_end->set_off (true); + selection_length->set_off (true); } } else { - s = selection.regions.start(); - e = selection.regions.end_frame(); + s = max_framepos; + e = 0; + for (PointSelection::iterator i = selection.points.begin(); i != selection.points.end(); ++i) { + framepos_t const p = (*i)->line().session_position ((*i)->model ()); + s = min (s, p); + e = max (e, p); + } selection_start->set_off (false); selection_end->set_off (false); selection_length->set_off (false); @@ -295,6 +284,15 @@ TimeInfoBox::selection_changed () selection_end->set (e); selection_length->set (e - s + 1); } + } else { + s = selection.regions.start(); + e = selection.regions.end_frame(); + selection_start->set_off (false); + selection_end->set_off (false); + selection_length->set_off (false); + selection_start->set (s); + selection_end->set (e); + selection_length->set (e - s + 1); } break; diff --git a/gtk2_ardour/trx.menus.in b/gtk2_ardour/trx.menus.in index a428368b48..d4a7e3187a 100644 --- a/gtk2_ardour/trx.menus.in +++ b/gtk2_ardour/trx.menus.in @@ -5,8 +5,8 @@ + -