From e63da83c530f8c2f81bfba4ec6d77c7adad8a50d Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Mon, 26 Nov 2012 22:43:10 +0000 Subject: [PATCH] tweak Smart Mode to be more like Mixbus. Smart mode is just a modifier on Object mode which provides Range selection in the top half of the waveform. probably lots of corner cases to clear up before its all over, but at least we can use Mixbus as a consistent target rather than making it all up again. git-svn-id: svn://localhost/ardour2/branches/3.0@13551 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour.menus.in | 3 +- gtk2_ardour/ardour_ui.cc | 6 +- gtk2_ardour/ardour_ui2.cc | 1 - gtk2_ardour/editor.cc | 63 ++++++++-------- gtk2_ardour/editor.h | 14 +--- gtk2_ardour/editor_actions.cc | 9 ++- gtk2_ardour/editor_drag.cc | 27 +------ gtk2_ardour/editor_mouse.cc | 128 +++++++++++++------------------- gtk2_ardour/editor_ops.cc | 89 ++++++++++++++++------ gtk2_ardour/editor_selection.cc | 6 +- gtk2_ardour/public_editor.h | 2 + 11 files changed, 164 insertions(+), 184 deletions(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 27a94cae3d..c9472db56c 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -151,7 +151,7 @@ - + @@ -222,6 +222,7 @@ + #ifndef GTKOSX diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index a5eb449739..2c97591d0e 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1622,10 +1622,6 @@ ARDOUR_UI::transport_roll () _session->request_play_range (0, true); } - if ( ((editor->current_mouse_mode() == Editing::MouseRange) || get_smart_mode()) && Config->get_always_play_range()) { - _session->request_play_range (&editor->get_selection().time, true); - } - if (!rolling) { _session->request_transport_speed (1.0f); } @@ -1688,7 +1684,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if ( ((editor->current_mouse_mode() == Editing::MouseRange) || editor->get_smart_mode()) && Config->get_always_play_range()) { + if ( Config->get_always_play_range() ) { _session->request_play_range (&editor->get_selection().time, true); } diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 3b060a73ea..81b5175389 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -46,7 +46,6 @@ #include "public_editor.h" #include "audio_clock.h" #include "actions.h" -#include "button_joiner.h" #include "main_clock.h" #include "utils.h" #include "theme_manager.h" diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 330646a42d..c9008f9d55 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -80,7 +80,6 @@ #include "audio_time_axis.h" #include "automation_time_axis.h" #include "bundle_manager.h" -#include "button_joiner.h" #include "canvas-noevent-text.h" #include "canvas_impl.h" #include "crossfade_edit.h" @@ -2317,7 +2316,13 @@ Editor::set_state (const XMLNode& node, int /*version*/) } if ((prop = node.property ("join-object-range"))) { - ActionManager::set_toggle_action ("MouseMode", "set-mouse-mode-object-range", string_is_affirmative (prop->value ())); + RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object-range")); + if (act) { + RefPtr tact = RefPtr::cast_dynamic(act); + tact->set_active (!yn); + tact->set_active (yn); + } + set_mouse_mode(mouse_mode, true); } if ((prop = node.property ("edit-point"))) { @@ -2828,14 +2833,12 @@ Editor::setup_toolbar () mode_box->set_spacing(4); HBox* mouse_mode_box = manage (new HBox); - HBox* mouse_mode_hbox1 = manage (new HBox); - HBox* mouse_mode_hbox2 = manage (new HBox); - VBox* mouse_mode_vbox1 = manage (new VBox); - VBox* mouse_mode_vbox2 = manage (new VBox); - Alignment* mouse_mode_align1 = manage (new Alignment); - Alignment* mouse_mode_align2 = manage (new Alignment); + HBox* mouse_mode_hbox = manage (new HBox); + VBox* mouse_mode_vbox = manage (new VBox); + Alignment* mouse_mode_align = manage (new Alignment); Glib::RefPtr mouse_mode_size_group = SizeGroup::create (SIZE_GROUP_BOTH); +// mouse_mode_size_group->add_widget (smart_mode_button); mouse_mode_size_group->add_widget (mouse_move_button); mouse_mode_size_group->add_widget (mouse_select_button); mouse_mode_size_group->add_widget (mouse_zoom_button); @@ -2848,30 +2851,24 @@ Editor::setup_toolbar () /* make them just a bit bigger */ mouse_move_button.set_size_request (-1, 25); - smart_mode_joiner = manage (new ButtonJoiner ("mouse mode button", mouse_move_button, mouse_select_button, true)); - smart_mode_joiner->set_related_action (smart_mode_action); + mouse_mode_hbox->set_spacing (2); - mouse_mode_hbox2->set_spacing (2); - mouse_mode_box->set_spacing (2); + mouse_mode_hbox->pack_start (smart_mode_button, false, false); + mouse_mode_hbox->pack_start (mouse_move_button, false, false); + mouse_mode_hbox->pack_start (mouse_select_button, false, false); + mouse_mode_hbox->pack_start (mouse_zoom_button, false, false); + mouse_mode_hbox->pack_start (mouse_gain_button, false, false); + 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, 8); - mouse_mode_hbox1->pack_start (*smart_mode_joiner, false, false); - mouse_mode_hbox2->pack_start (mouse_zoom_button, false, false); - mouse_mode_hbox2->pack_start (mouse_gain_button, false, false); - mouse_mode_hbox2->pack_start (mouse_timefx_button, false, false); - mouse_mode_hbox2->pack_start (mouse_audition_button, false, false); - mouse_mode_hbox2->pack_start (mouse_draw_button, false, false); - mouse_mode_hbox2->pack_start (internal_edit_button, false, false, 8); + mouse_mode_vbox->pack_start (*mouse_mode_hbox); - mouse_mode_vbox1->pack_start (*mouse_mode_hbox1, false, false); - mouse_mode_vbox2->pack_start (*mouse_mode_hbox2, false, false); + mouse_mode_align->add (*mouse_mode_vbox); + mouse_mode_align->set (0.5, 1.0, 0.0, 0.0); - mouse_mode_align1->add (*mouse_mode_vbox1); - mouse_mode_align1->set (0.5, 1.0, 0.0, 0.0); - mouse_mode_align2->add (*mouse_mode_vbox2); - mouse_mode_align2->set (0.5, 1.0, 0.0, 0.0); - - mouse_mode_box->pack_start (*mouse_mode_align1, false, false); - mouse_mode_box->pack_start (*mouse_mode_align2, false, false); + mouse_mode_box->pack_start (*mouse_mode_align, false, false); edit_mode_strings.push_back (edit_mode_to_string (Slide)); if (!Profile->get_sae()) { @@ -3049,14 +3046,14 @@ Editor::setup_toolbar () void Editor::setup_tooltips () { - ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Select/Move Objects")); - ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges")); + ARDOUR_UI::instance()->set_tip (smart_mode_button, _("Smart Mode (add Range functions to Object mode)")); + ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Object Mode (select/move Objects)")); + ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Range Mode (select/move Ranges)")); ARDOUR_UI::instance()->set_tip (mouse_draw_button, _("Draw/Edit MIDI Notes")); ARDOUR_UI::instance()->set_tip (mouse_gain_button, _("Draw Region Gain")); ARDOUR_UI::instance()->set_tip (mouse_zoom_button, _("Select Zoom Range")); 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 (smart_mode_joiner, _("Smart Mode (Select/Move Objects + Ranges)")); ARDOUR_UI::instance()->set_tip (internal_edit_button, _("Note Level Editing")); 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")); @@ -4200,9 +4197,7 @@ Editor::set_frames_per_unit (double fpu) zoom_range_clock->set (frames); } - bool const showing_time_selection = - mouse_mode == MouseRange || - (mouse_mode == MouseObject && _join_object_range_state != JOIN_OBJECT_RANGE_NONE); + bool const showing_time_selection = selection->time.length() > 0; if (showing_time_selection && selection->time.start () != selection->time.end_frame ()) { for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index ca4a3ec87a..113ddcf377 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1586,11 +1586,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourButton mouse_timefx_button; ArdourButton mouse_audition_button; - ButtonJoiner* smart_mode_joiner; + ArdourButton smart_mode_button; Glib::RefPtr smart_mode_action; void mouse_mode_toggled (Editing::MouseMode m); - void mouse_mode_object_range_toggled () {} + void mouse_mode_object_range_toggled (); bool ignore_mouse_mode_toggle; ArdourButton internal_edit_button; @@ -2100,16 +2100,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int time_fx (ARDOUR::RegionList&, float val, bool pitching); - bool doing_range_stuff() const { - return (mouse_mode == Editing::MouseRange && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) || - _join_object_range_state == JOIN_OBJECT_RANGE_RANGE; - } - - bool doing_object_stuff() const { - return (mouse_mode == Editing::MouseObject && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) || - _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT; - } - void toggle_sound_midi_notes (); /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */ diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index f37453ea6a..54894f9746 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -404,6 +404,12 @@ Editor::register_actions () Glib::RefPtr mouse_mode_actions = ActionGroup::create (X_("MouseMode")); RadioAction::Group mouse_mode_group; + act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled)); + smart_mode_action = Glib::RefPtr::cast_static (act); + smart_mode_button.set_related_action (smart_mode_action); + smart_mode_button.set_text (_("Smart")); + smart_mode_button.set_name ("mouse mode button"); + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject)); mouse_move_button.set_related_action (act); mouse_move_button.set_image (::get_icon("tool_object")); @@ -419,9 +425,6 @@ Editor::register_actions () mouse_draw_button.set_image (::get_icon("midi_tool_pencil")); mouse_draw_button.set_name ("mouse mode button"); - act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Link Object / Range Tools"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled)); - smart_mode_action = Glib::RefPtr::cast_static (act); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-gain", _("Gain Tool"), sigc::bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseGain)); mouse_gain_button.set_related_action (act); mouse_gain_button.set_image (::get_icon("tool_gain")); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 07971e4d22..c0155a8b62 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3607,9 +3607,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) s->request_play_range (&_editor->selection->time, true); } else { if (Config->get_always_play_range()) { - if (_editor->doing_range_stuff()) { - s->request_locate (_editor->get_selection().time.start()); - } + s->request_locate (_editor->get_selection().time.start()); } } } @@ -3617,28 +3615,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) } else { /* just a click, no pointer movement. */ - - if (Keyboard::no_modifier_keys_pressed (&event->button)) { - if (!_time_selection_at_start) { - if (_editor->clicked_regionview) { - if (_editor->get_selection().selected (_editor->clicked_regionview)) { - /* range select the entire current - region selection - */ - _editor->select_range (_editor->get_selection().regions.start(), - _editor->get_selection().regions.end_frame()); - } else { - /* range select this (unselected) - * region - */ - _editor->select_range (_editor->clicked_regionview->region()->position(), - _editor->clicked_regionview->region()->last_frame()); - } - } - } else { - _editor->selection->clear_time(); - } - } + _editor->selection->clear_time(); if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) { _editor->selection->set (_editor->clicked_axisview); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 1096afad87..ad50f744ce 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -293,7 +293,7 @@ Editor::set_canvas_cursor () } /* up-down cursor as a cue that automation can be dragged up and down when in join object/range mode */ - if (smart_mode_action->get_active()) { + if ( get_smart_mode() ) { double x, y; get_pointer_position (x, y); ArdourCanvas::Item* i = track_canvas->get_item_at (x, y); @@ -308,6 +308,21 @@ Editor::set_canvas_cursor () set_canvas_cursor (current_canvas_cursor, true); } +void +Editor::mouse_mode_object_range_toggled() +{ + MouseMode m = mouse_mode; + + Glib::RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); + assert (act); + 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 +} + void Editor::set_mouse_mode (MouseMode m, bool force) { @@ -360,26 +375,7 @@ Editor::set_mouse_mode (MouseMode m, bool force) tact->set_active (false); tact->set_active (true); - MouseModeChanged (); /* EMIT SIGNAL */ - - if ( (mouse_mode != MouseRange) && (mouse_mode != MouseGain) ) { - - cancel_time_selection(); //disable the range, because an invisible operating range can cause confusing operation - - } else { - - /* - in range mode,show the range selection. - */ - - cancel_selection(); - - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { - if ((*i)->get_selected()) { - (*i)->show_selection (selection->time); - } - } - } + //NOTE: this will result in a call to mouse_mode_toggled which does the heavy lifting } void @@ -451,29 +447,25 @@ Editor::mouse_mode_toggled (MouseMode m) instant_save (); - if (!internal_editing()) { - if (mouse_mode != MouseRange && mouse_mode != MouseGain && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) { - - /* in all modes except range, gain and joined object/range, hide the range selection, - show the object (region) selection. - */ - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - (*i)->hide_selection (); - } - - } else { - - /* - in range or object/range mode, show the range selection. - */ - - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { - (*i)->show_selection (selection->time); - } + //TODO: set button styles for smart buttons +/* + if ( smart_mode_action->get_active() ) { + if( mouse_mode == MouseObject ) { //smart active and object active + smart_mode_button.set_active(1); + smart_mode_button.set_name("smart mode button"); + mouse_move_button.set_name("smart mode button"); + } else { //smart active but object inactive + smart_mode_button.set_active(0); + smart_mode_button.set_name("smart mode button"); + mouse_move_button.set_name("mouse mode button"); } + } else { + smart_mode_button.set_active(0); + smart_mode_button.set_name("mouse mode button"); + mouse_move_button.set_name("mouse mode button"); } - +*/ + set_canvas_cursor (); set_gain_envelope_visibility (); @@ -579,11 +571,9 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp */ if (((mouse_mode != MouseObject) && - (_join_object_range_state != JOIN_OBJECT_RANGE_OBJECT) && (mouse_mode != MouseAudition || item_type != RegionItem) && (mouse_mode != MouseTimeFX || item_type != RegionItem) && (mouse_mode != MouseGain) && - (mouse_mode != MouseRange) && (mouse_mode != MouseDraw)) || ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) || (internal_editing() && mouse_mode != MouseTimeFX)) { @@ -608,12 +598,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp switch (item_type) { case RegionItem: - if (!doing_range_stuff()) { - set_selected_regionview_from_click (press, op); - } - if (press) { - if (doing_range_stuff()) { + if ( mouse_mode != MouseRange ) { + set_selected_regionview_from_click (press, op); + } else { /* don't change the selection unless the clicked track is not currently selected. if so, "collapse" the selection to just this @@ -630,7 +618,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case RegionViewName: case LeftFrameHandle: case RightFrameHandle: - if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + if ( mouse_mode != MouseRange ) { set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); @@ -643,7 +631,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case FadeOutItem: case StartCrossFadeItem: case EndCrossFadeItem: - if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + if ( mouse_mode != MouseRange ) { set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); @@ -652,7 +640,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case ControlPointItem: set_selected_track_as_side_effect (op); - if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + if ( mouse_mode != MouseRange ) { set_selected_control_point_from_click (press, op); } break; @@ -820,7 +808,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT pair tvp = trackview_by_y_position (y); if (tvp.first) { AutomationTimeAxisView* atv = dynamic_cast (tvp.first); - if (smart_mode_action->get_active() && atv) { + if ( get_smart_mode() && atv) { /* smart "join" mode: drag automation */ _drags->set (new AutomationRangeDrag (this, atv, selection->time), event, _cursors->up_down); } else { @@ -854,7 +842,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case LeftFrameHandle: case RightFrameHandle: - if (!internal_editing() && doing_object_stuff() && !clicked_regionview->region()->locked()) { + if (!internal_editing() && !clicked_regionview->region()->locked()) { RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id); _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event); return true; @@ -975,9 +963,9 @@ 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)); - } +// 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); break; @@ -1054,7 +1042,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SelectionItem: { - if (smart_mode_action->get_active()) { + if ( get_smart_mode() ) { /* we're in "smart" joined mode, and we've clicked on a Selection */ double const y = event->button.y + vertical_adjustment.get_value() - canvas_timebars_vsize; pair tvp = trackview_by_y_position (y); @@ -1068,7 +1056,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT /* if we're over a track and a region, and in the `object' part of a region, put a selection around the region and drag both */ - RouteTimeAxisView* rtv = dynamic_cast (tvp.first); +/* RouteTimeAxisView* rtv = dynamic_cast (tvp.first); if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { boost::shared_ptr t = boost::dynamic_pointer_cast (rtv->route ()); if (t) { @@ -1089,6 +1077,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } } } +*/ } } break; @@ -1362,7 +1351,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() && ( (mouse_mode == MouseRange) || _join_object_range_state == JOIN_OBJECT_RANGE_RANGE ) && Config->get_always_play_range() ) { + if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_always_play_range() ) { framepos_t where = event_frame (event, 0, 0); snap_to(where); _session->request_locate (where, false); @@ -1439,16 +1428,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT were_dragging = true; } - //a mouse click (no drag) in the range area of an audio track. maybe locate the playhead here - if ( !_drags->active () && (effective_mouse_mode() == MouseRange) && Config->get_always_play_range() && (item_type != AutomationTrackItem) && !Keyboard::is_context_menu_event (&event->button)) { - if ( _join_object_range_state == JOIN_OBJECT_RANGE_RANGE ) { - framepos_t pos = event_frame (event, 0, 0); - snap_to(pos); - _session->request_locate (pos, false); - return true; - } - } - update_region_layering_order_editor (); /* edit events get handled here */ @@ -1492,7 +1471,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } /* context menu events get handled here */ - if (Keyboard::is_context_menu_event (&event->button)) { context_click_event = *event; @@ -1847,7 +1825,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; case RegionViewNameHighlight: - if (is_drawable() && doing_object_stuff() && entered_regionview) { + if (is_drawable() && effective_mouse_mode() == MouseObject && entered_regionview) { set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview); _over_region_trim_target = true; } @@ -1855,7 +1833,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case LeftFrameHandle: case RightFrameHandle: - if (is_drawable() && doing_object_stuff() && !internal_editing() && entered_regionview) { + if (is_drawable() && effective_mouse_mode() == MouseObject && !internal_editing() && entered_regionview) { set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview); } break; @@ -1981,7 +1959,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ } break; case SelectionItem: - if (smart_mode_action->get_active()) { + if ( get_smart_mode() ) { set_canvas_cursor (); } break; @@ -2814,7 +2792,7 @@ Editor::update_join_object_range_location (double /*x*/, double y) that we're over requires searching the playlist. */ - if (!smart_mode_action->get_active() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + 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 92b986d0d1..80afe57d76 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3641,7 +3641,7 @@ Editor::copy () bool Editor::can_cut_copy () const { - switch (current_mouse_mode()) { + switch (effective_mouse_mode()) { case MouseObject: if (!selection->regions.empty() || !selection->points.empty()) { @@ -3700,7 +3700,8 @@ Editor::cut_copy (CutCopyOp op) } } - cut_buffer->clear (); + if ( op != Clear ) //"Delete" doesn't change copy/paste buf + cut_buffer->clear (); if (entered_marker) { @@ -3719,7 +3720,7 @@ Editor::cut_copy (CutCopyOp op) if (internal_editing()) { - switch (current_mouse_mode()) { + switch (effective_mouse_mode()) { case MouseObject: case MouseRange: cut_copy_midi (op); @@ -3730,19 +3731,62 @@ Editor::cut_copy (CutCopyOp op) } else { - RegionSelection rs; + RegionSelection rs; - /* we only want to cut regions if some are selected */ + /* we only want to cut regions if some are selected */ - if (doing_object_stuff()) { - rs = get_regions_from_selection (); + if (!selection->regions.empty()) { + rs = get_regions_from_selection (); + } + + switch (effective_mouse_mode()) { +/* + * case MouseGain: { + //find regions's gain line + AudioRegionView *rview = dynamic_cast(clicked_regionview); + AutomationTimeAxisView *tview = dynamic_cast(clicked_trackview); + if (rview) { + AudioRegionGainLine *line = rview->get_gain_line(); + if (!line) break; + + //cut region gain points in the selection + AutomationList& alist (line->the_list()); + XMLNode &before = alist.get_state(); + AutomationList* what_we_got = 0; + if ((what_we_got = alist.cut (selection->time.front().start - rview->audio_region()->position(), selection->time.front().end - rview->audio_region()->position())) != 0) { + session->add_command(new MementoCommand(alist, &before, &alist.get_state())); + delete what_we_got; + what_we_got = 0; + } + + rview->set_envelope_visible(true); + rview->audio_region()->set_envelope_active(true); + + } else if (tview) { + AutomationLine *line = *(tview->lines.begin()); + if (!line) break; + + //cut auto points in the selection + AutomationList& alist (line->the_list()); + XMLNode &before = alist.get_state(); + AutomationList* what_we_got = 0; + if ((what_we_got = alist.cut (selection->time.front().start, selection->time.front().end)) != 0) { + session->add_command(new MementoCommand(alist, &before, &alist.get_state())); + delete what_we_got; + what_we_got = 0; + } + } else + break; + } break; +*/ + case MouseObject: + case MouseRange: if (!rs.empty() || !selection->points.empty()) { - begin_reversible_command (opname + _(" objects")); if (!rs.empty()) { cut_copy_regions (op, rs); - + if (op == Cut || op == Delete) { selection->clear_regions (); } @@ -3755,16 +3799,11 @@ Editor::cut_copy (CutCopyOp op) selection->clear_points (); } } - commit_reversible_command (); - goto out; - } - if (!selection->time.empty() && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) { - /* don't cause suprises */ - goto out; - } - } - if (doing_range_stuff()) { + commit_reversible_command (); + break; + } + if (selection->time.empty()) { framepos_t start, end; if (!get_edit_op_range (start, end)) { @@ -3772,18 +3811,22 @@ Editor::cut_copy (CutCopyOp op) } selection->set (start, end); } - + begin_reversible_command (opname + _(" range")); cut_copy_ranges (op); commit_reversible_command (); - + if (op == Cut || op == Delete) { selection->clear_time (); } + + break; + + default: + break; } } - out: if (op == Delete || op == Cut || op == Clear) { _drags->abort (); } @@ -5443,9 +5486,7 @@ Editor::set_playhead_cursor () void Editor::split_region () { - if (((mouse_mode == MouseRange) || - (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) && - !selection->time.empty()) { + if ( !selection->time.empty()) { separate_regions_between (selection->time); return; } diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index ffce8af25f..d299b2fd9e 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -962,9 +962,7 @@ Editor::track_selection_changed () (*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end()); } - if (yn && - ((mouse_mode == MouseRange) || - ((mouse_mode == MouseObject) && (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT)))) { + if (yn) { (*i)->reshow_selection (selection->time); } else { (*i)->hide_selection (); @@ -1801,7 +1799,7 @@ Editor::select_range_between () framepos_t start; framepos_t end; - if (mouse_mode == MouseRange && !selection->time.empty()) { + if ( !selection->time.empty() ) { selection->clear_time (); } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 84256aa130..21db5c8e22 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -216,6 +216,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { virtual bool show_measures () const = 0; virtual bool redraw_measures () = 0; + virtual Editing::MouseMode effective_mouse_mode () const = 0; + /** Open main export dialog */ virtual void export_audio () = 0;