#include "ardour/dB.h"
#include "ardour/location.h"
#include "ardour/midi_region.h"
+#include "ardour/midi_track.h"
#include "ardour/operations.h"
#include "ardour/playlist_factory.h"
#include "ardour/quantize.h"
#include "ardour/strip_silence.h"
#include "ardour/transient_detector.h"
+#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"
commit_reversible_command ();
} else {
- distance = get_nudge_distance (playhead_cursor->current_frame, next_distance);
- _session->request_locate (playhead_cursor->current_frame + distance);
+ distance = get_nudge_distance (playhead_cursor->current_frame (), next_distance);
+ _session->request_locate (playhead_cursor->current_frame () + distance);
}
}
} else {
- distance = get_nudge_distance (playhead_cursor->current_frame, next_distance);
+ distance = get_nudge_distance (playhead_cursor->current_frame (), next_distance);
- if (playhead_cursor->current_frame > distance) {
- _session->request_locate (playhead_cursor->current_frame - distance);
+ if (playhead_cursor->current_frame () > distance) {
+ _session->request_locate (playhead_cursor->current_frame () - distance);
} else {
_session->goto_start();
}
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<Region> 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
void
Editor::cursor_to_region_boundary (bool with_selection, int32_t dir)
{
- framepos_t pos = playhead_cursor->current_frame;
+ framepos_t pos = playhead_cursor->current_frame ();
framepos_t target;
if (!_session) {
Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t dir)
{
boost::shared_ptr<Region> r;
- framepos_t pos = cursor->current_frame;
+ framepos_t pos = cursor->current_frame ();
if (!_session) {
return;
void
Editor::scroll_playhead (bool forward)
{
- framepos_t pos = playhead_cursor->current_frame;
- framecnt_t delta = (framecnt_t) floor (current_page_frames() / 0.8);
+ framepos_t pos = playhead_cursor->current_frame ();
+ framecnt_t delta = (framecnt_t) floor (current_page_samples() / 0.8);
if (forward) {
if (pos == max_framepos) {
Location* loc = find_location_from_marker (*i, ignored);
if (loc->is_mark()) {
- loc->set_start (playhead_cursor->current_frame);
+ loc->set_start (playhead_cursor->current_frame ());
} else {
- loc->set (playhead_cursor->current_frame,
- playhead_cursor->current_frame + loc->length());
+ loc->set (playhead_cursor->current_frame (),
+ playhead_cursor->current_frame () + loc->length());
}
}
}
void
Editor::scroll_backward (float pages)
{
- framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
+ 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;
void
Editor::scroll_forward (float pages)
{
- framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
+ 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;
Editor::scroll_tracks_down ()
{
double vert_value = vertical_adjustment.get_value() + vertical_adjustment.get_page_size();
- if (vert_value > vertical_adjustment.get_upper() - _canvas_height) {
- vert_value = vertical_adjustment.get_upper() - _canvas_height;
+ if (vert_value > vertical_adjustment.get_upper() - _visible_canvas_height) {
+ vert_value = vertical_adjustment.get_upper() - _visible_canvas_height;
}
vertical_adjustment.set_value (vert_value);
{
double vert_value = vertical_adjustment.get_value() + 60;
- if (vert_value > vertical_adjustment.get_upper() - _canvas_height) {
- vert_value = vertical_adjustment.get_upper() - _canvas_height;
+ if (vert_value > vertical_adjustment.get_upper() - _visible_canvas_height) {
+ vert_value = vertical_adjustment.get_upper() - _visible_canvas_height;
}
vertical_adjustment.set_value (vert_value);
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<TimeAxisView*,double> 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<TimeAxisView*,double> 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
}
bool
-Editor::clamp_frames_per_unit (double& fpu) const
+Editor::clamp_samples_per_pixel (framecnt_t& fpp) const
{
bool clamped = false;
- if (fpu < 2.0) {
- fpu = 2.0;
+ if (fpp < 1) {
+ fpp = 1;
clamped = true;
}
- if (max_framepos / fpu < 800) {
- fpu = max_framepos / 800.0;
+ if (max_framepos / fpp < 800) {
+ fpp = max_framepos / 800;
clamped = true;
}
{
ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser)
- double nfpu = frames_per_unit;
+ framecnt_t nspp = samples_per_pixel;
if (coarser) {
- nfpu = min (9e6, nfpu * 1.61803399);
+ nspp *= 2;
} else {
- nfpu = max (1.0, nfpu / 1.61803399);
+ nspp /= 2;
}
- temporal_zoom (nfpu);
+ temporal_zoom (nspp);
}
void
-Editor::temporal_zoom (double fpu)
+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;
framepos_t leftmost_after_zoom = 0;
framepos_t where;
bool in_track_canvas;
- double nfpu;
+ framecnt_t nfpp;
double l;
- clamp_frames_per_unit (fpu);
- if (fpu == frames_per_unit) {
+ clamp_samples_per_pixel (fpp);
+ if (fpp == samples_per_pixel) {
return;
}
- nfpu = fpu;
-
// 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 (nfpu > 8e+08) {
- nfpu = 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 (_canvas_width * nfpu);
+ new_page_size = (framepos_t) floor (_visible_canvas_width * nfpp);
half_page_size = new_page_size / 2;
switch (zoom_focus) {
case ZoomFocusPlayhead:
/* centre playhead */
- l = playhead_cursor->current_frame - (new_page_size * 0.5);
+ l = playhead_cursor->current_frame () - (new_page_size * 0.5);
if (l < 0) {
leftmost_after_zoom = 0;
if (!mouse_frame (where, in_track_canvas)) {
/* use playhead instead */
- where = playhead_cursor->current_frame;
+ where = playhead_cursor->current_frame ();
if (where < half_page_size) {
leftmost_after_zoom = 0;
// leftmost_after_zoom = min (leftmost_after_zoom, _session->current_end_frame());
- reposition_and_zoom (leftmost_after_zoom, nfpu);
+ reposition_and_zoom (leftmost_after_zoom, nfpp);
}
void
}
framepos_t range = end - start;
- double new_fpu = (double)range / (double)_canvas_width;
- framepos_t extra_samples = (framepos_t) floor (one_centimeter_in_pixels * new_fpu);
+ double new_fpp = (double) range / (double) _visible_canvas_width;
+ framepos_t extra_samples = (framepos_t) floor (one_centimeter_in_pixels * new_fpp);
if (start > extra_samples) {
start -= extra_samples;
temporal_zoom_by_frame (start, end);
if (both_axes) {
- uint32_t per_track_height = (uint32_t) floor ((_canvas_height - canvas_timebars_vsize - 10.0) / tracks.size());
+ uint32_t per_track_height = (uint32_t) floor ((_visible_canvas_height - 10.0) / tracks.size());
/* set visible track heights appropriately */
framepos_t range = end - start;
- double new_fpu = (double)range / (double)_canvas_width;
+ double const new_fpp = (double) range / (double) _visible_canvas_width;
- framepos_t new_page = (framepos_t) floor (_canvas_width * new_fpu);
- framepos_t middle = (framepos_t) floor( (double)start + ((double)range / 2.0f ));
- framepos_t new_leftmost = (framepos_t) floor( (double)middle - ((double)new_page/2.0f));
+ framepos_t new_page = (framepos_t) floor (_visible_canvas_width * new_fpp);
+ framepos_t middle = (framepos_t) floor ((double) start + ((double) range / 2.0f));
+ framepos_t new_leftmost = (framepos_t) floor ((double) middle - ((double) new_page / 2.0f));
if (new_leftmost > middle) {
new_leftmost = 0;
new_leftmost = 0;
}
- reposition_and_zoom (new_leftmost, new_fpu);
+ reposition_and_zoom (new_leftmost, new_fpp);
}
void
return;
}
double range_before = frame - leftmost_frame;
- double new_fpu;
+ double new_fpp;
- new_fpu = frames_per_unit;
+ new_fpp = samples_per_pixel;
if (coarser) {
- new_fpu *= 1.61803399;
+ new_fpp *= 1.61803399;
range_before *= 1.61803399;
} else {
- new_fpu = max(1.0,(new_fpu/1.61803399));
+ new_fpp = max(1.0,(new_fpp/1.61803399));
range_before /= 1.61803399;
}
- if (new_fpu == frames_per_unit) {
+ if (new_fpp == samples_per_pixel) {
return;
}
new_leftmost = 0;
}
- reposition_and_zoom (new_leftmost, new_fpu);
+ reposition_and_zoom (new_leftmost, new_fpp);
}
return;
}
- Location *location = _session->locations()->first_location_after (playhead_cursor->current_frame);
+ framepos_t pos = _session->locations()->first_mark_after (playhead_cursor->current_frame());
- if (location) {
- _session->request_locate (location->start(), _session->transport_rolling());
- } else {
- _session->request_locate (_session->current_end_frame());
+ if (pos < 0) {
+ return;
}
+
+ _session->request_locate (pos, _session->transport_rolling());
}
void
return;
}
- Location *location = _session->locations()->first_location_before (playhead_cursor->current_frame);
+ framepos_t pos = _session->locations()->first_mark_before (playhead_cursor->current_frame());
- if (location) {
- _session->request_locate (location->start(), _session->transport_rolling());
- } else {
- _session->goto_start ();
+ if (pos < 0) {
+ return;
}
+
+ _session->request_locate (pos, _session->transport_rolling());
}
void
void
Editor::insert_region_list_drag (boost::shared_ptr<Region> region, int x, int y)
{
- double wx, wy;
double cx, cy;
framepos_t where;
RouteTimeAxisView *rtv = 0;
boost::shared_ptr<Playlist> playlist;
- track_canvas->window_to_world (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;
}
void
Editor::insert_route_list_drag (boost::shared_ptr<Route> route, int x, int y)
{
- double wx, wy;
double cx, cy;
RouteTimeAxisView *dest_rtv = 0;
RouteTimeAxisView *source_rtv = 0;
- track_canvas->window_to_world (x, y, wx, wy);
- wx += horizontal_position ();
- wy += vertical_adjustment.get_value();
-
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<TimeAxisView*, int> const tv = trackview_by_y_position (cy);
if (tv.first == 0) {
if (_session->config.get_external_sync()) {
switch (Config->get_sync_source()) {
- case JACK:
+ case Engine:
break;
default:
/* transport controlled by the master */
_session->request_play_range (&selection->time, true);
}
+framepos_t
+Editor::get_preroll ()
+{
+ return 1.0 /*Config->get_edit_preroll_seconds()*/ * _session->frame_rate();
+}
+
+
+void
+Editor::maybe_locate_with_edit_preroll ( framepos_t location )
+{
+ if ( _session->transport_rolling() || !Config->get_always_play_range() )
+ return;
+
+ location -= get_preroll();
+
+ //don't try to locate before the beginning of time
+ if ( location < 0 )
+ location = 0;
+
+ //if follow_playhead is on, keep the playhead on the screen
+ if ( _follow_playhead )
+ if ( location < leftmost_frame )
+ location = leftmost_frame;
+
+ _session->request_locate( location );
+}
+
+void
+Editor::play_with_preroll ()
+{
+ if (selection->time.empty()) {
+ return;
+ } else {
+ framepos_t preroll = get_preroll();
+
+ framepos_t start = 0;
+ if (selection->time[clicked_selection].start > preroll)
+ start = selection->time[clicked_selection].start - preroll;
+
+ framepos_t end = selection->time[clicked_selection].end + preroll;
+
+ AudioRange ar (start, end, 0);
+ list<AudioRange> lar;
+ lar.push_back (ar);
+
+ _session->request_play_range (&lar, true);
+ }
+}
+
void
Editor::play_location (Location& location)
{
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);
returns a single range.
*/
- if (mouse_mode == MouseRange && !selection->time.empty()) {
+ if (!selection->time.empty()) {
separate_regions_between (selection->time);
if (front) {
(*i)->region()->trim_front (where);
+ maybe_locate_with_edit_preroll ( where );
} else {
(*i)->region()->trim_end (where);
+ maybe_locate_with_edit_preroll ( where );
}
_session->add_command (new StatefulDiffCommand ((*i)->region()));
/* 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;
if (rtv && rtv->track() && replace && enable_processing && !rtv->track()->bounceable (rtv->track()->main_outs(), false)) {
MessageDialog d (
_("You can't perform this operation because the processing of the signal "
- "will cause one or more of the tracks will end up with a region with more channels than this track has inputs.\n\n"
+ "will cause one or more of the tracks to end up with a region with more channels than this track has inputs.\n\n"
"You can do this without processing, which is a different operation.")
);
d.set_title (_("Cannot bounce"));
bool
Editor::can_cut_copy () const
{
- switch (current_mouse_mode()) {
+ switch (effective_mouse_mode()) {
case MouseObject:
if (!selection->regions.empty() || !selection->points.empty()) {
}
}
- cut_buffer->clear ();
+ if ( op != Clear ) //"Delete" doesn't change copy/paste buf
+ cut_buffer->clear ();
if (entered_marker) {
if (internal_editing()) {
- switch (current_mouse_mode()) {
+ 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 {
-
- RegionSelection rs;
-
- /* we only want to cut regions if some are selected */
+ return;
+ }
- if (doing_object_stuff()) {
- rs = get_regions_from_selection ();
- if (!rs.empty() || !selection->points.empty()) {
+ bool did_edit = false;
- begin_reversible_command (opname + _(" objects"));
+ 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 (!rs.empty()) {
- cut_copy_regions (op, rs);
+ if (!selection->regions.empty() || !selection->points.empty()) {
- 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 ();
- goto out;
- }
- if (!selection->time.empty() && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) {
- /* don't cause suprises */
- goto out;
}
- }
-
- if (doing_range_stuff()) {
- 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"));
- cut_copy_ranges (op);
- commit_reversible_command ();
+ did_edit = true;
+ cut_copy_ranges (op);
+
if (op == Cut || op == Delete) {
selection->clear_time ();
}
}
+ break;
+
+ default:
+ break;
}
-
- out:
+
+ if (did_edit) {
+ commit_reversible_command ();
+ }
+
if (op == Delete || op == Cut || op == Clear) {
_drags->abort ();
}
void
Editor::center_playhead ()
{
- float page = _canvas_width * frames_per_unit;
- center_screen_internal (playhead_cursor->current_frame, page);
+ float const page = _visible_canvas_width * samples_per_pixel;
+ center_screen_internal (playhead_cursor->current_frame (), page);
}
void
Editor::center_edit_point ()
{
- float page = _canvas_width * frames_per_unit;
+ float const page = _visible_canvas_width * samples_per_pixel;
center_screen_internal (get_preferred_edit_position(), page);
}
vector<Evoral::Sequence<Evoral::MusicalTime>::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);
MidiRegionView* const mrv = dynamic_cast<MidiRegionView*>(*r);
if (mrv) {
- boost::shared_ptr<Playlist> playlist = mrv->region()->playlist();
- boost::shared_ptr<MidiRegion> 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> playlist = mrv->region()->playlist();
+ boost::shared_ptr<MidiSource> new_source = _session->create_midi_source_by_stealing_name (mrv->midi_view()->track());
+ boost::shared_ptr<MidiRegion> 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;
const framepos_t p = get_preferred_edit_position (false, from_context);
- cerr << "Got " << rs.size() << " regions to add patch change to\n";
-
/* XXX: bit of a hack; use the MIDNAM from the first selected region;
there may be more than one, but the PatchChangeDialog can only offer
one set of patch menus.
_session->commit_reversible_command ();
}
+void
+Editor::toggle_region_video_lock ()
+{
+ if (_ignore_region_action) {
+ return;
+ }
+
+ RegionSelection rs = get_regions_from_selection_and_entered ();
+
+ if (!_session || rs.empty()) {
+ return;
+ }
+
+ _session->begin_reversible_command (_("Toggle Video Lock"));
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+ (*i)->region()->clear_changes ();
+ (*i)->region()->set_video_locked (!(*i)->region()->video_locked());
+ _session->add_command (new StatefulDiffCommand ((*i)->region()));
+ }
+
+ _session->commit_reversible_command ();
+}
+
void
Editor::toggle_region_lock_style ()
{
_session->request_locate (where, _session->transport_rolling());
}
}
+
+ if ( Config->get_always_play_range() )
+ cancel_time_selection();
}
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;
}
struct EditorOrderRouteSorter {
bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- return a->order_key (EditorSort) < b->order_key (EditorSort);
+ return a->order_key () < b->order_key ();
}
};
return;
double const current_view_min_y = vertical_adjustment.get_value();
- double const current_view_max_y = vertical_adjustment.get_value() + vertical_adjustment.get_page_size() - canvas_timebars_vsize;
+ double const current_view_max_y = vertical_adjustment.get_value() + vertical_adjustment.get_page_size();
double const track_min_y = track->y_position ();
double const track_max_y = track->y_position () + track->effective_height ();
new_value = track_min_y;
} else {
// Track is below the current view
- new_value = track->y_position () + track->effective_height() + canvas_timebars_vsize - vertical_adjustment.get_page_size();
+ new_value = track->y_position () + track->effective_height() - vertical_adjustment.get_page_size();
}
vertical_adjustment.set_value(new_value);
} else if (t.frame() == start) {
_session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
} else {
- _session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), start);
+ Timecode::BBT_Time bbt;
+ _session->tempo_map().bbt_time (start, bbt);
+ _session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), bbt);
}
XMLNode& after (_session->tempo_map().get_state());
void
Editor::playhead_forward_to_grid ()
{
- if (!_session) return;
- framepos_t pos = playhead_cursor->current_frame;
+ if (!_session) {
+ return;
+ }
+
+ framepos_t pos = playhead_cursor->current_frame ();
if (pos < max_framepos - 1) {
pos += 2;
snap_to_internal (pos, 1, false);
void
Editor::playhead_backward_to_grid ()
{
- if (!_session) return;
- framepos_t pos = playhead_cursor->current_frame;
+ if (!_session) {
+ return;
+ }
+
+ framepos_t pos = playhead_cursor->current_frame ();
if (pos > 2) {
pos -= 2;
snap_to_internal (pos, -1, false);
for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) {
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*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);
++visible_tracks;
}
- uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / visible_tracks);
+ uint32_t h = (uint32_t) floor ((_visible_canvas_height - child_heights) / visible_tracks);
double first_y_pos = DBL_MAX;
if (h < TimeAxisView::preset_height (HeightSmall)) {
request signal handler will cause the vertical adjustment setting to fail
*/
- controls_layout.property_height () = full_canvas_height - canvas_timebars_vsize;
+ controls_layout.property_height () = _full_canvas_height;
vertical_adjustment.set_value (first_y_pos);
redo_visual_stack.push_back (current_visual_state (true));
void
Editor::toggle_midi_input_active (bool flip_others)
{
- bool onoff;
+ bool onoff = false;
boost::shared_ptr<RouteList> rl (new RouteList);
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {