diff options
-rw-r--r-- | gtk2_ardour/ardour.menus.in | 3 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 6 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui2.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 63 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 14 | ||||
-rw-r--r-- | gtk2_ardour/editor_actions.cc | 9 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 27 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 128 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 89 | ||||
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 6 | ||||
-rw-r--r-- | 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 @@ <menuitem action='ToggleClick'/> <menuitem action='toggle-follow-playhead'/> <menuitem action='panic'/> - <separator/> + <separator/> </menu> <menu name='Edit' action='Edit'> @@ -222,6 +222,7 @@ <menuitem action='set-tempo-from-region'/> <menuitem action='set-tempo-from-edit-range'/> </menu> + <menuitem action='set-mouse-mode-object-range'/> #ifndef GTKOSX <separator/> <menuitem action='ToggleRCOptionsEditor'/> 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<Action> act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object-range")); + if (act) { + RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::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<SizeGroup> 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_hbox2->set_spacing (2); - mouse_mode_box->set_spacing (2); + mouse_mode_hbox->set_spacing (2); - 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_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_vbox1->pack_start (*mouse_mode_hbox1, false, false); - mouse_mode_vbox2->pack_start (*mouse_mode_hbox2, false, false); + mouse_mode_vbox->pack_start (*mouse_mode_hbox); - 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_align->add (*mouse_mode_vbox); + mouse_mode_align->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<Gtk::ToggleAction> 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<ActionGroup> 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<ToggleAction>::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<ToggleAction>::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); @@ -309,6 +309,21 @@ Editor::set_canvas_cursor () } void +Editor::mouse_mode_object_range_toggled() +{ + MouseMode m = mouse_mode; + + Glib::RefPtr<Action> act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); + assert (act); + Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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) { if (_drags->active ()) { @@ -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<TimeAxisView*, int> tvp = trackview_by_y_position (y); if (tvp.first) { AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (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<TimeAxisView*, int> 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<RouteTimeAxisView*> (tvp.first); +/* RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tvp.first); if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (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 (!rs.empty() || !selection->points.empty()) { + if (!selection->regions.empty()) { + rs = get_regions_from_selection (); + } + switch (effective_mouse_mode()) { +/* + * case MouseGain: { + //find regions's gain line + AudioRegionView *rview = dynamic_cast<AudioRegionView*>(clicked_regionview); + AutomationTimeAxisView *tview = dynamic_cast<AutomationTimeAxisView*>(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<AutomationList>(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<AutomationList>(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; |