X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.cc;h=f080ed24fb1c0ecc0513932de63db2fcb35f1b95;hb=8509b5fddc538853a80c97dfdb5b425996bf9662;hp=06a2d9d8f5dbbd526bcd84b789f4a937475a2577;hpb=1d42ed077e555a83a93bac436547e7c378ee0c00;p=ardour.git diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 06a2d9d8f5..f080ed24fb 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -235,7 +235,7 @@ pane_size_watcher (Paned* pane) X: hard to access Quartz: impossible to access - + so stop that by preventing it from ever getting too narrow. 35 pixels is basically a rough guess at the tab width. @@ -313,7 +313,7 @@ Editor::Editor () PublicEditor::_instance = this; _have_idled = false; - + selection = new Selection (this); cut_buffer = new Selection (this); _selection_memento = new SelectionMemento (); @@ -323,6 +323,7 @@ Editor::Editor () clicked_regionview = 0; clicked_axisview = 0; clicked_routeview = 0; + clicked_selection = 0; clicked_control_point = 0; last_update_frame = 0; last_paste_pos = 0; @@ -742,7 +743,7 @@ Editor::Editor () signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released)); - + /* allow external control surfaces/protocols to do various things */ ControlProtocol::ZoomToSession.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_session, this), gui_context()); @@ -822,6 +823,10 @@ Editor::~Editor() delete _snapshots; delete _locations; delete _playlist_selector; + + for (list::iterator i = selection_op_history.begin(); i != selection_op_history.end(); ++i) { + delete *i; + } } XMLNode* @@ -1014,12 +1019,12 @@ Editor::control_unselect () } void -Editor::control_select (uint32_t rid, Selection::Operation op) +Editor::control_select (uint32_t rid, Selection::Operation op) { /* handles the (static) signal from the ControlProtocol class that * requests setting the selected track to a given RID */ - + if (!_session) { return; } @@ -1190,7 +1195,7 @@ Editor::generic_event_handler (GdkEvent* ev) case GDK_NOTIFY_UNKNOWN: case GDK_NOTIFY_INFERIOR: case GDK_NOTIFY_ANCESTOR: - break; + break; case GDK_NOTIFY_VIRTUAL: case GDK_NOTIFY_NONLINEAR: case GDK_NOTIFY_NONLINEAR_VIRTUAL: @@ -1464,18 +1469,18 @@ Editor::fill_xfade_menu (Menu_Helpers::MenuList& items, bool start) sigc::bind (sigc::mem_fun (*this, emf), FadeLinear) ) ); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Constant power"), *(*images)[FadeConstantPower], sigc::bind (sigc::mem_fun (*this, emf), FadeConstantPower) )); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Symmetric"), @@ -1483,25 +1488,25 @@ Editor::fill_xfade_menu (Menu_Helpers::MenuList& items, bool start) sigc::bind (sigc::mem_fun (*this, emf), FadeSymmetric) ) ); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Slow"), *(*images)[FadeSlow], sigc::bind (sigc::mem_fun (*this, emf), FadeSlow) )); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Fast"), *(*images)[FadeFast], sigc::bind (sigc::mem_fun (*this, emf), FadeFast) )); - + dynamic_cast(&items.back())->set_always_show_image (); } @@ -1890,14 +1895,13 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) edit_items.push_back (SeparatorElem()); edit_items.push_back (MenuElem (_("Crop Region to Range"), sigc::mem_fun(*this, &Editor::crop_region_to_selection))); - edit_items.push_back (MenuElem (_("Fill Range with Region"), sigc::mem_fun(*this, &Editor::region_fill_selection))); edit_items.push_back (MenuElem (_("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_range), false))); edit_items.push_back (SeparatorElem()); edit_items.push_back (MenuElem (_("Consolidate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, false))); - edit_items.push_back (MenuElem (_("Consolidate Range With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, true))); + edit_items.push_back (MenuElem (_("Consolidate Range with Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, true))); edit_items.push_back (MenuElem (_("Bounce Range to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, false))); - edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true))); + edit_items.push_back (MenuElem (_("Bounce Range to Region List with Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true))); edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection))); if (ARDOUR_UI::instance()->video_timeline->get_duration() > 0) { edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*(ARDOUR_UI::instance()), &ARDOUR_UI::export_video), true))); @@ -1916,8 +1920,8 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); - play_items.push_back (MenuElem (_("Play From Start"), sigc::mem_fun(*this, &Editor::play_from_start))); + play_items.push_back (MenuElem (_("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); + play_items.push_back (MenuElem (_("Play from Start"), sigc::mem_fun(*this, &Editor::play_from_start))); play_items.push_back (MenuElem (_("Play Region"), sigc::mem_fun(*this, &Editor::play_selected_region))); play_items.push_back (SeparatorElem()); play_items.push_back (MenuElem (_("Loop Region"), sigc::bind (sigc::mem_fun (*this, &Editor::set_loop_from_region), true))); @@ -1939,8 +1943,8 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) select_items.push_back (MenuElem (_("Set Range to Punch Range"), sigc::mem_fun(*this, &Editor::set_selection_from_punch))); select_items.push_back (MenuElem (_("Set Range to Selected Regions"), sigc::mem_fun(*this, &Editor::set_selection_from_region))); select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true))); - select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false))); + select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true, true))); + select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false, true))); select_items.push_back (MenuElem (_("Select All After Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true))); select_items.push_back (MenuElem (_("Select All Before Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, false))); select_items.push_back (MenuElem (_("Select All Between Playhead and Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), false))); @@ -1998,8 +2002,8 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); - play_items.push_back (MenuElem (_("Play From Start"), sigc::mem_fun(*this, &Editor::play_from_start))); + play_items.push_back (MenuElem (_("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); + play_items.push_back (MenuElem (_("Play from Start"), sigc::mem_fun(*this, &Editor::play_from_start))); edit_items.push_back (MenuElem (_("Play"), *play_menu)); /* Selection */ @@ -2013,8 +2017,8 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) select_items.push_back (MenuElem (_("Invert Selection in Track"), sigc::mem_fun(*this, &Editor::invert_selection_in_track))); select_items.push_back (MenuElem (_("Invert Selection"), sigc::mem_fun(*this, &Editor::invert_selection))); select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true))); - select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false))); + select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true, true))); + select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false, true))); select_items.push_back (MenuElem (_("Select All After Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true))); select_items.push_back (MenuElem (_("Select All Before Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, false))); @@ -2101,7 +2105,7 @@ Editor::set_snap_to (SnapType st) case SnapToBeatDiv2: { ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), current_bbt_points_begin, current_bbt_points_end); compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(), @@ -2587,9 +2591,9 @@ Editor::trackview_by_y_position (double y, bool trackview_relative_offset) const } for (TrackViewList::const_iterator iter = track_views.begin(); iter != track_views.end(); ++iter) { - + std::pair const r = (*iter)->covers_y_position (y); - + if (r.first) { return r; } @@ -2948,7 +2952,7 @@ Editor::setup_toolbar () if (!ARDOUR::Profile->get_mixbus()) { mouse_mode_hbox->pack_start (mouse_cut_button, false, false); } - + if (!ARDOUR::Profile->get_trx()) { mouse_mode_hbox->pack_start (mouse_timefx_button, false, false); mouse_mode_hbox->pack_start (mouse_audition_button, false, false); @@ -3059,7 +3063,7 @@ Editor::setup_toolbar () if (!ARDOUR::Profile->get_trx()) { _zoom_tearoff = manage (new TearOff (_zoom_box)); - + _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), &_zoom_tearoff->tearoff_window())); _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), @@ -3068,7 +3072,7 @@ Editor::setup_toolbar () &_zoom_tearoff->tearoff_window())); _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), &_zoom_tearoff->tearoff_window(), 0)); - } + } if (Profile->get_sae() || Profile->get_mixbus() ) { _zoom_tearoff->set_can_be_torn_off (false); @@ -3169,7 +3173,7 @@ void Editor::build_edit_mode_menu () { using namespace Menu_Helpers; - + edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Slide], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Slide))); // edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Splice], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Splice))); edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Ripple], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Ripple))); @@ -3233,7 +3237,7 @@ Editor::build_snap_type_menu () void Editor::setup_tooltips () { - set_tooltip (smart_mode_button, _("Smart Mode (add Range functions to Grab mode)")); + set_tooltip (smart_mode_button, _("Smart Mode (add range functions to Grab Mode)")); set_tooltip (mouse_move_button, _("Grab Mode (select/move objects)")); set_tooltip (mouse_cut_button, _("Cut Mode (split regions)")); set_tooltip (mouse_select_button, _("Range Mode (select time ranges)")); @@ -3248,13 +3252,13 @@ Editor::setup_tooltips () set_tooltip (zoom_out_button, _("Zoom Out")); set_tooltip (zoom_preset_selector, _("Zoom to Time Scale")); set_tooltip (zoom_out_full_button, _("Zoom to Session")); - set_tooltip (zoom_focus_selector, _("Zoom focus")); + set_tooltip (zoom_focus_selector, _("Zoom Focus")); set_tooltip (tav_expand_button, _("Expand Tracks")); set_tooltip (tav_shrink_button, _("Shrink Tracks")); set_tooltip (visible_tracks_selector, _("Number of visible tracks")); set_tooltip (snap_type_selector, _("Snap/Grid Units")); set_tooltip (snap_mode_selector, _("Snap/Grid Mode")); - set_tooltip (edit_point_selector, _("Edit point")); + set_tooltip (edit_point_selector, _("Edit Point")); set_tooltip (edit_mode_selector, _("Edit Mode")); set_tooltip (nudge_clock, _("Nudge Clock\n(controls distance used to nudge regions and selections)")); } @@ -3400,11 +3404,11 @@ Editor::commit_reversible_selection_op () The user has undone some selection ops and then made a new one, making anything earlier in the list invalid. */ - + list::iterator it = selection_op_history.begin(); list::iterator e_it = it; advance (e_it, selection_op_history_it); - + for ( ; it != e_it; ++it) { delete *it; } @@ -3534,8 +3538,10 @@ Editor::history_changed () if (redo_action && _session) { if (_session->redo_depth() == 0) { label = _("Redo"); + redo_action->set_sensitive (false); } else { label = string_compose(_("Redo (%1)"), _session->next_redo()); + redo_action->set_sensitive (true); } redo_action->property_label() = label; } @@ -3600,7 +3606,7 @@ Editor::duplicate_range (bool with_dialog) } else if (get_smart_mode()) { if (selection->time.length()) { duplicate_selection (times); - } else + } else duplicate_some_regions (rs, times); } else { duplicate_some_regions (rs, times); @@ -3764,7 +3770,7 @@ Editor::set_zoom_preset (int64_t ms) temporal_zoom_session(); return; } - + ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); temporal_zoom( (sample_rate * ms / 1000) / _visible_canvas_width ); } @@ -3779,7 +3785,7 @@ Editor::set_visible_track_count (int32_t n) allocation happens, we will get called again and then we can do the real work. */ - + if (_visible_canvas_height <= 1) { return; } @@ -3787,7 +3793,7 @@ Editor::set_visible_track_count (int32_t n) int h; string str; DisplaySuspender ds; - + if (_visible_track_count > 0) { h = trackviews_height() / _visible_track_count; std::ostringstream s; @@ -3803,7 +3809,7 @@ Editor::set_visible_track_count (int32_t n) h = trackviews_height() / n; str = _("All"); } else { - /* negative value means that the visible track count has + /* negative value means that the visible track count has been overridden by explicit track height changes. */ visible_tracks_selector.set_text (X_("*")); @@ -3813,7 +3819,7 @@ Editor::set_visible_track_count (int32_t n) for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { (*i)->set_height (h, TimeAxisView::HeightPerLane); } - + if (str != visible_tracks_selector.get_text()) { visible_tracks_selector.set_text (str); } @@ -3967,8 +3973,8 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) void Editor::detach_tearoff (Box* /*b*/, Window* /*w*/) { - if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) && - (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) && + if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) && + (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) && (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) { top_hbox.remove (toolbar_frame); } @@ -3995,10 +4001,10 @@ Editor::set_show_measures (bool yn) ARDOUR::TempoMap::BBTPointList::const_iterator begin; ARDOUR::TempoMap::BBTPointList::const_iterator end; - + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end); draw_measures (begin, end); - } + } instant_save (); } @@ -4154,19 +4160,34 @@ Editor::playlist_deletion_dialog (boost::shared_ptr pl) label.show (); + dialog.add_button (_("Delete All Unused"), RESPONSE_YES); // needs clarification. this and all remaining ones dialog.add_button (_("Delete Playlist"), RESPONSE_ACCEPT); - dialog.add_button (_("Keep Playlist"), RESPONSE_REJECT); + Button* keep = dialog.add_button (_("Keep Playlist"), RESPONSE_REJECT); + dialog.add_button (_("Keep Remaining"), RESPONSE_NO); // ditto dialog.add_button (_("Cancel"), RESPONSE_CANCEL); + // by default gtk uses the left most button + keep->grab_focus (); + switch (dialog.run ()) { + case RESPONSE_NO: + /* keep this and all remaining ones */ + return -2; + break; + + case RESPONSE_YES: + /* delete this and all others */ + return 2; + break; + case RESPONSE_ACCEPT: /* delete the playlist */ - return 0; + return 1; break; case RESPONSE_REJECT: /* keep the playlist */ - return 1; + return 0; break; default: @@ -4329,7 +4350,7 @@ Editor::copy_playlists (TimeAxisView* v) void Editor::clear_playlists (TimeAxisView* v) { - begin_reversible_command (_("clear playlists")); + begin_reversible_command (_("clear playlists")); vector > playlists; _session->playlists->get (playlists); mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::select.property_id); @@ -4434,7 +4455,7 @@ Editor::current_visual_state (bool with_tracks) vs->leftmost_frame = leftmost_frame; vs->zoom_focus = zoom_focus; - if (with_tracks) { + if (with_tracks) { *vs->gui_state = *ARDOUR_UI::instance()->gui_object_state; } @@ -4498,11 +4519,11 @@ Editor::use_visual_state (VisualState& vs) set_zoom_focus (vs.zoom_focus); reposition_and_zoom (vs.leftmost_frame, vs.samples_per_pixel); - + if (vs.gui_state) { *ARDOUR_UI::instance()->gui_object_state = *vs.gui_state; - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { (*i)->clear_property_cache(); (*i)->reset_visual_state (); } @@ -4612,7 +4633,7 @@ Editor::idle_visual_changer () pending_visual_change.idle_handler_id = -1; pending_visual_change.being_handled = true; - + VisualChange vc = pending_visual_change; pending_visual_change.pending = (VisualChange::Type) 0; @@ -4636,7 +4657,7 @@ Editor::visual_changer (const VisualChange& vc) ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - + compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), current_bbt_points_begin, current_bbt_points_end); compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), @@ -4713,10 +4734,7 @@ Editor::get_preferred_edit_position (EditIgnoreOption ignore, bool from_context_ switch (ep) { case EditAtPlayhead: if (_dragging_playhead) { - if (!mouse_frame (where, ignored)) { - /* XXX not right but what can we do ? */ - return 0; - } + where = *_control_scroll_target; } else { where = _session->audible_frame(); } @@ -4911,7 +4929,7 @@ Editor::get_regions_from_selection_and_edit_point () if (!tracks.empty()) { /* no region selected or entered, but some selected tracks: * act on all regions on the selected tracks at the edit point - */ + */ framepos_t const where = get_preferred_edit_position (); get_regions_at(regions, where, tracks); } @@ -4948,7 +4966,7 @@ Editor::get_regions_from_selection_and_mouse (framepos_t pos) if (!tracks.empty()) { /* no region selected or entered, but some selected tracks: * act on all regions on the selected tracks at the edit point - */ + */ get_regions_at(regions, pos, tracks); } } @@ -4978,17 +4996,17 @@ Editor::get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) cons { for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { RouteTimeAxisView* rtav; - + if ((rtav = dynamic_cast (*i)) != 0) { boost::shared_ptr pl; std::vector > results; boost::shared_ptr tr; - + if ((tr = rtav->track()) == 0) { /* bus */ continue; } - + if ((pl = (tr->playlist())) != 0) { boost::shared_ptr r = pl->region_by_id (id); if (r) { @@ -5014,7 +5032,7 @@ Editor::get_per_region_note_selection (listget_per_region_note_selection (selection); } } - + } void @@ -5070,8 +5088,9 @@ void Editor::first_idle () { MessageDialog* dialog = 0; - + if (track_views.size() > 1) { + Timers::TimerSuspender t; dialog = new MessageDialog ( *this, string_compose (_("Please wait while %1 loads visual data."), PROGRAM_NAME), @@ -5606,7 +5625,7 @@ Editor::reset_x_origin_to_follow_playhead () } else { framepos_t l = 0; - + if (frame < leftmost_frame) { /* moving left */ if (_session->transport_rolling()) { @@ -5630,7 +5649,7 @@ Editor::reset_x_origin_to_follow_playhead () if (l < 0) { l = 0; } - + center_screen_internal (l + (current_page_samples() / 2), current_page_samples ()); } } @@ -5697,9 +5716,9 @@ Editor::super_rapid_screen_update () } else { - if (!_dragging_playhead && _session->requested_return_frame() < 0 && !pending_visual_change.being_handled) { + if (!_dragging_playhead && _follow_playhead && _session->requested_return_frame() < 0 && !pending_visual_change.being_handled) { framepos_t const frame = playhead_cursor->current_frame (); - double target = ((double)frame - (double)current_page_samples()/3.0); + double target = ((double)frame - (double)current_page_samples()/2.0); if (target <= 0.0) { target = 0.0; } @@ -5775,7 +5794,7 @@ Editor::session_going_away () clear_marker_display (); stop_step_editing (); - + /* get rid of any existing editor mixer strip */ WindowTitle title(Glib::get_application_name()); @@ -5851,7 +5870,7 @@ Editor::setup_fade_images () _fade_out_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadeout-fast-cut"))); _fade_out_images[FadeSlow] = new Gtk::Image (get_icon_path (X_("fadeout-slow-cut"))); _fade_out_images[FadeConstantPower] = new Gtk::Image (get_icon_path (X_("fadeout-constant-power"))); - + _xfade_in_images[FadeLinear] = new Gtk::Image (get_icon_path (X_("fadein-linear"))); _xfade_in_images[FadeSymmetric] = new Gtk::Image (get_icon_path (X_("fadein-symmetric"))); _xfade_in_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadein-fast-cut"))); @@ -5922,10 +5941,10 @@ void Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* event) { using namespace Menu_Helpers; - + MenuList& items = _control_point_context_menu.items (); items.clear (); - + items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &Editor::edit_control_point), item))); items.push_back (MenuElem (_("Delete"), sigc::bind (sigc::mem_fun (*this, &Editor::remove_control_point), item))); if (!can_remove_control_point (item)) { @@ -5951,20 +5970,41 @@ Editor::popup_note_context_menu (ArdourCanvas::Item* item, GdkEvent* event) MidiRegionView& mrv = note->region_view(); const RegionSelection rs = get_regions_from_selection_and_entered (); + const uint32_t sel_size = mrv.selection_size (); MenuList& items = _note_context_menu.items(); items.clear(); - items.push_back(MenuElem(_("Delete"), - sigc::mem_fun(mrv, &MidiRegionView::delete_selection))); + if (sel_size > 0) { + items.push_back(MenuElem(_("Delete"), + sigc::mem_fun(mrv, &MidiRegionView::delete_selection))); + } + items.push_back(MenuElem(_("Edit..."), - sigc::bind(sigc::mem_fun(*this, &Editor::edit_notes), &mrv))); + sigc::bind(sigc::mem_fun(*this, &Editor::edit_notes), &mrv))); + if (sel_size != 1) { + items.back().set_sensitive (false); + } + + items.push_back(MenuElem(_("Transpose..."), + sigc::bind(sigc::mem_fun(*this, &Editor::transpose_regions), rs))); + + items.push_back(MenuElem(_("Legatize"), - sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, false))); + sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, false))); + if (sel_size < 2) { + items.back().set_sensitive (false); + } + items.push_back(MenuElem(_("Quantize..."), sigc::bind(sigc::mem_fun(*this, &Editor::quantize_regions), rs))); + items.push_back(MenuElem(_("Remove Overlap"), - sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, true))); + sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, true))); + if (sel_size < 2) { + items.back().set_sensitive (false); + } + items.push_back(MenuElem(_("Transform..."), sigc::bind(sigc::mem_fun(*this, &Editor::transform_regions), rs)));