X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=08d6297faae3162c388f7a76b9cf411307d224b1;hb=152935e736eaf06f85bc7f5cb27337a62d95edd4;hp=c4f084170abd1f757dbbba3650fb18a82ebfaa23;hpb=6ae4f104371ed433a79c8845de97428d964edd8b;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c4f084170a..08d6297faa 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -58,37 +58,38 @@ #include "canvas/canvas.h" #include "ardour_ui.h" -#include "debug.h" -#include "editor.h" -#include "time_axis_view.h" -#include "route_time_axis.h" +#include "audio_region_view.h" +#include "audio_streamview.h" #include "audio_time_axis.h" #include "automation_time_axis.h" #include "control_point.h" -#include "streamview.h" -#include "audio_streamview.h" -#include "audio_region_view.h" -#include "midi_region_view.h" -#include "rgb_macros.h" -#include "selection_templates.h" -#include "selection.h" +#include "debug.h" #include "editing.h" -#include "gtk-custom-hruler.h" -#include "gui_thread.h" -#include "keyboard.h" -#include "utils.h" +#include "editor.h" +#include "editor_cursors.h" #include "editor_drag.h" -#include "strip_silence_dialog.h" -#include "editor_routes.h" #include "editor_regions.h" -#include "quantize_dialog.h" -#include "interthread_progress_window.h" +#include "editor_routes.h" +#include "gtk-custom-hruler.h" +#include "gui_thread.h" #include "insert_time_dialog.h" -#include "normalize_dialog.h" -#include "editor_cursors.h" +#include "interthread_progress_window.h" +#include "keyboard.h" +#include "midi_region_view.h" #include "mouse_cursors.h" +#include "normalize_dialog.h" #include "patch_change_dialog.h" +#include "quantize_dialog.h" +#include "region_gain_line.h" +#include "rgb_macros.h" +#include "route_time_axis.h" +#include "selection.h" +#include "selection_templates.h" +#include "streamview.h" +#include "strip_silence_dialog.h" +#include "time_axis_view.h" #include "transpose_dialog.h" +#include "utils.h" #include "i18n.h" @@ -511,6 +512,60 @@ Editor::nudge_backward_capture_offset () commit_reversible_command (); } +struct RegionSelectionPositionSorter { + bool operator() (RegionView* a, RegionView* b) { + return a->region()->position() < b->region()->position(); + } +}; + +void +Editor::sequence_regions () +{ + framepos_t r_end; + framepos_t r_end_prev; + + int iCount=0; + + if (!_session) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); + rs.sort(RegionSelectionPositionSorter()); + + if (!rs.empty()) { + + begin_reversible_command (_("sequence regions")); + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + boost::shared_ptr r ((*i)->region()); + + r->clear_changes(); + + if(r->locked()) + { + continue; + } + if(r->position_locked()) + { + continue; + } + if(iCount>0) + { + r_end_prev=r_end; + r->set_position(r_end_prev); + } + + _session->add_command (new StatefulDiffCommand (r)); + + r_end=r->position() + r->length(); + + iCount++; + } + commit_reversible_command (); + } +} + + /* DISPLAY MOTION */ void @@ -1146,7 +1201,7 @@ void Editor::scroll_playhead (bool forward) { framepos_t pos = playhead_cursor->current_frame (); - framecnt_t delta = (framecnt_t) floor (current_page_frames() / 0.8); + framecnt_t delta = (framecnt_t) floor (current_page_samples() / 0.8); if (forward) { if (pos == max_framepos) { @@ -1211,7 +1266,7 @@ Editor::cursor_align (bool playhead_to_edit) void Editor::scroll_backward (float pages) { - framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * frames_per_pixel); + framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * samples_per_pixel); framepos_t const cnt = (framepos_t) floor (pages * one_page); framepos_t frame; @@ -1227,7 +1282,7 @@ Editor::scroll_backward (float pages) void Editor::scroll_forward (float pages) { - framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * frames_per_pixel); + framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * samples_per_pixel); framepos_t const cnt = (framepos_t) floor (pages * one_page); framepos_t frame; @@ -1275,6 +1330,69 @@ Editor::scroll_tracks_up_line () reset_y_origin (vertical_adjustment.get_value() - 60); } +bool +Editor::scroll_down_one_track () +{ + double vertical_pos = vertical_adjustment.get_value () + vertical_adjustment.get_page_size() - 1.0; + + TrackViewList::reverse_iterator next = track_views.rend(); + std::pair res; + + for (TrackViewList::reverse_iterator t = track_views.rbegin(); t != track_views.rend(); ++t) { + if ((*t)->hidden()) { + continue; + } + + res = (*t)->covers_y_position (vertical_pos); + + if (res.first) { + break; + } + + next = t; + } + + /* move to the track below the first one that covers the */ + + if (next != track_views.rend()) { + ensure_track_visible (*next); + return true; + } + + return false; +} + +bool +Editor::scroll_up_one_track () +{ + double vertical_pos = vertical_adjustment.get_value (); + + TrackViewList::iterator prev = track_views.end(); + std::pair res; + + for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) { + + if ((*t)->hidden()) { + continue; + } + + res = (*t)->covers_y_position(vertical_pos); + + if (res.first) { + break; + } + + prev = t; + } + + if (prev != track_views.end()) { + ensure_track_visible (*prev); + return true; + } + + return false; +} + /* ZOOM */ void @@ -1331,17 +1449,17 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all) } bool -Editor::clamp_frames_per_pixel (double& fpp) const +Editor::clamp_samples_per_pixel (framecnt_t& fpp) const { bool clamped = false; - if (fpp < 2.0) { - fpp = 2.0; + if (fpp < 1) { + fpp = 1; clamped = true; } if (max_framepos / fpp < 800) { - fpp = max_framepos / 800.0; + fpp = max_framepos / 800; clamped = true; } @@ -1353,25 +1471,25 @@ Editor::temporal_zoom_step (bool coarser) { ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser) - double nfpp = frames_per_pixel; + framecnt_t nspp = samples_per_pixel; if (coarser) { - nfpp = min (9e6, nfpp * 1.61803399); + nspp *= 2; } else { - nfpp = max (1.0, nfpp / 1.61803399); + nspp /= 2; } - temporal_zoom (nfpp); + temporal_zoom (nspp); } void -Editor::temporal_zoom (double fpp) +Editor::temporal_zoom (framecnt_t fpp) { if (!_session) { return; } - framepos_t current_page = current_page_frames(); + framepos_t current_page = current_page_samples(); framepos_t current_leftmost = leftmost_frame; framepos_t current_rightmost; framepos_t current_center; @@ -1380,22 +1498,24 @@ Editor::temporal_zoom (double fpp) framepos_t leftmost_after_zoom = 0; framepos_t where; bool in_track_canvas; - double nfpp; + framecnt_t nfpp; double l; - clamp_frames_per_pixel (fpp); - if (fpp == frames_per_pixel) { + clamp_samples_per_pixel (fpp); + if (fpp == samples_per_pixel) { return; } - nfpp = fpp; - // Imposing an arbitrary limit to zoom out as too much zoom out produces // segfaults for lack of memory. If somebody decides this is not high enough I // believe it can be raisen to higher values but some limit must be in place. - if (nfpp > 8e+08) { - nfpp = 8e+08; - } + // + // This constant represents 1 day @ 48kHz on a 1600 pixel wide display + // all of which is used for the editor track displays. The whole day + // would be 4147200000 samples, so 2592000 samples per pixel. + + nfpp = min (fpp, (framecnt_t) 2592000); + nfpp = max ((framecnt_t) 1, fpp); new_page_size = (framepos_t) floor (_visible_canvas_width * nfpp); half_page_size = new_page_size / 2; @@ -1660,7 +1780,7 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) double range_before = frame - leftmost_frame; double new_fpp; - new_fpp = frames_per_pixel; + new_fpp = samples_per_pixel; if (coarser) { new_fpp *= 1.61803399; @@ -1670,7 +1790,7 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) range_before /= 1.61803399; } - if (new_fpp == frames_per_pixel) { + if (new_fpp == samples_per_pixel) { return; } @@ -1964,22 +2084,19 @@ Editor::unhide_ranges () void Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) { - double wx, wy; double cx, cy; framepos_t where; RouteTimeAxisView *rtv = 0; boost::shared_ptr playlist; - _track_canvas_viewport->window_to_canvas (x, y, wx, wy); - GdkEvent event; event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; + event.button.x = x; + event.button.y = y; - where = event_frame (&event, &cx, &cy); + where = window_event_sample (&event, &cx, &cy); - if (where < leftmost_frame || where > leftmost_frame + current_page_frames()) { + if (where < leftmost_frame || where > leftmost_frame + current_page_samples()) { /* clearly outside canvas area */ return; } @@ -2009,19 +2126,16 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) void Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) { - double wx, wy; double cx, cy; RouteTimeAxisView *dest_rtv = 0; RouteTimeAxisView *source_rtv = 0; - _track_canvas_viewport->window_to_canvas (x, y, wx, wy); - GdkEvent event; event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; + event.button.x = x; + event.button.y = y; - event_frame (&event, &cx, &cy); + window_event_sample (&event, &cx, &cy); std::pair const tv = trackview_by_y_position (cy); if (tv.first == 0) { @@ -2108,7 +2222,7 @@ Editor::transition_to_rolling (bool fwd) if (_session->config.get_external_sync()) { switch (Config->get_sync_source()) { - case JACK: + case Engine: break; default: /* transport controlled by the master */ @@ -2383,7 +2497,6 @@ Editor::rename_region () d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); d.set_size_request (300, -1); - d.set_position (Gtk::WIN_POS_MOUSE); entry.set_text (rs.front()->region()->name()); entry.select_region (0, -1); @@ -3482,7 +3595,7 @@ Editor::freeze_route () /* wait for just a little while, because the above call is asynchronous */ - ::usleep (250000); + Glib::usleep (250000); if (clicked_routeview == 0 || !clicked_routeview->is_audio_track()) { return; @@ -3724,110 +3837,96 @@ Editor::cut_copy (CutCopyOp op) switch (effective_mouse_mode()) { case MouseObject: case MouseRange: + begin_reversible_command (opname + ' ' + X_("MIDI")); cut_copy_midi (op); + commit_reversible_command (); break; default: break; } - } else { + return; + } - RegionSelection rs; + bool did_edit = false; - /* we only want to cut regions if some are selected */ + switch (effective_mouse_mode()) { + case MouseGain: + if (!selection->points.empty()) { + begin_reversible_command (opname + _(" points")); + did_edit = true; + cut_copy_points (op); + if (op == Cut || op == Delete) { + selection->clear_points (); + } + } + break; + + case MouseObject: - if (!selection->regions.empty()) { - rs = selection->regions; - } + if (!selection->regions.empty() || !selection->points.empty()) { - 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 (); - } - } + string thing_name; - if (!selection->points.empty()) { - cut_copy_points (op); + if (selection->regions.empty()) { + thing_name = _("points"); + } else if (selection->points.empty()) { + thing_name = _("regions"); + } else { + thing_name = _("objects"); + } + + begin_reversible_command (opname + ' ' + thing_name); + did_edit = true; - if (op == Cut || op == Delete) { - selection->clear_points (); - } + if (!selection->regions.empty()) { + cut_copy_regions (op, selection->regions); + + if (op == Cut || op == Delete) { + selection->clear_regions (); } - - commit_reversible_command (); - break; - } + } - if (selection->time.empty()) { - framepos_t start, end; - if (!get_edit_op_range (start, end)) { - return; + if (!selection->points.empty()) { + cut_copy_points (op); + + if (op == Cut || op == Delete) { + selection->clear_points (); } + } + } + break; + + case MouseRange: + if (selection->time.empty()) { + framepos_t start, end; + /* no time selection, see if we can get an edit range + and use that. + */ + if (get_edit_op_range (start, end)) { selection->set (start, end); } - + } + if (!selection->time.empty()) { begin_reversible_command (opname + _(" range")); + + did_edit = true; cut_copy_ranges (op); - commit_reversible_command (); if (op == Cut || op == Delete) { selection->clear_time (); } - - break; - - default: - break; } + break; + + default: + break; } - + + if (did_edit) { + commit_reversible_command (); + } + if (op == Delete || op == Cut || op == Clear) { _drags->abort (); } @@ -4425,14 +4524,14 @@ Editor::reset_point_selection () void Editor::center_playhead () { - float const page = _visible_canvas_width * frames_per_pixel; + float const page = _visible_canvas_width * samples_per_pixel; center_screen_internal (playhead_cursor->current_frame (), page); } void Editor::center_edit_point () { - float const page = _visible_canvas_width * frames_per_pixel; + float const page = _visible_canvas_width * samples_per_pixel; center_screen_internal (get_preferred_edit_position(), page); } @@ -4713,7 +4812,7 @@ Editor::apply_midi_note_edit_op_to_region (MidiOperator& op, MidiRegionView& mrv vector::Notes> v; v.push_back (selected); - framepos_t pos_frames = mrv.midi_region()->position(); + framepos_t pos_frames = mrv.midi_region()->position() - mrv.midi_region()->start(); double pos_beats = _session->tempo_map().framewalk_to_beats(0, pos_frames); return op (mrv.midi_region()->model(), pos_beats, v); @@ -4773,12 +4872,17 @@ Editor::fork_region () MidiRegionView* const mrv = dynamic_cast(*r); if (mrv) { - boost::shared_ptr playlist = mrv->region()->playlist(); - boost::shared_ptr newregion = mrv->midi_region()->clone (); - - playlist->clear_changes (); - playlist->replace_region (mrv->region(), newregion, mrv->region()->position()); - _session->add_command(new StatefulDiffCommand (playlist)); + try { + boost::shared_ptr playlist = mrv->region()->playlist(); + boost::shared_ptr new_source = _session->create_midi_source_by_stealing_name (mrv->midi_view()->track()); + boost::shared_ptr newregion = mrv->midi_region()->clone (new_source); + + playlist->clear_changes (); + playlist->replace_region (mrv->region(), newregion, mrv->region()->position()); + _session->add_command(new StatefulDiffCommand (playlist)); + } catch (...) { + error << string_compose (_("Could not unlink %1"), mrv->region()->name()) << endmsg; + } } r = tmp; @@ -5529,7 +5633,7 @@ Editor::split_region () struct EditorOrderRouteSorter { bool operator() (boost::shared_ptr a, boost::shared_ptr b) { - return a->order_key (EditorSort) < b->order_key (EditorSort); + return a->order_key () < b->order_key (); } }; @@ -6450,12 +6554,13 @@ Editor::remove_tracks () for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) { RouteTimeAxisView* rtv = dynamic_cast (*x); - if (rtv) { - if (rtv->is_track()) { - ntracks++; - } else { - nbusses++; - } + if (!rtv) { + continue; + } + if (rtv->is_track()) { + ntracks++; + } else { + nbusses++; } routes.push_back (rtv->_route); @@ -6957,7 +7062,7 @@ Editor::uncombine_regions () void Editor::toggle_midi_input_active (bool flip_others) { - bool onoff; + bool onoff = false; boost::shared_ptr rl (new RouteList); for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {