#include <pbd/error.h>
#include <gtkmm2ext/utils.h>
+#include <pbd/memento_command.h>
#include "ardour_ui.h"
#include "editor.h"
using namespace Gtk;
using namespace Editing;
-jack_nframes_t
+nframes_t
Editor::event_frame (GdkEvent* event, double* pcx, double* pcy)
{
double cx, cy;
switch (item_type) {
case RegionItem:
- c1 = set_selected_track_from_click (press, op, true, true);
+ c1 = set_selected_track_from_click (op, true);
c2 = set_selected_regionview_from_click (press, op, true);
commit = (c1 || c2);
break;
case RegionViewNameHighlight:
case RegionViewName:
- c1 = set_selected_track_from_click (press, op, true, true);
+ c1 = set_selected_track_from_click (op, true);
c2 = set_selected_regionview_from_click (press, op, true);
commit = (c1 || c2);
break;
case GainAutomationControlPointItem:
case PanAutomationControlPointItem:
case RedirectAutomationControlPointItem:
- c1 = set_selected_track_from_click (press, op, true, true);
- c2 = set_selected_control_point_from_click (press, op, false);
+ c1 = set_selected_track_from_click (op, true);
+ c2 = set_selected_control_point_from_click (op, false);
commit = (c1 || c2);
break;
case StreamItem:
- commit = set_selected_track_from_click (press, op, true, true);
+ commit = set_selected_track_from_click (op, true);
break;
case AutomationTrackItem:
- commit = set_selected_track_from_click (press, op, true, true);
+ commit = set_selected_track_from_click (op, true);
break;
default:
case StreamItem:
case RegionItem:
case AutomationTrackItem:
- commit = set_selected_track_from_click (press, op, true, true);
+ commit = set_selected_track_from_click (op, true);
break;
default:
bool
Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
- jack_nframes_t where = event_frame (event, 0, 0);
+ nframes_t where = event_frame (event, 0, 0);
track_canvas.grab_focus();
bool
Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
- jack_nframes_t where = event_frame (event, 0, 0);
+ nframes_t where = event_frame (event, 0, 0);
/* no action if we're recording */
void
Editor::set_edit_cursor (GdkEvent* event)
{
- jack_nframes_t pointer_frame = event_frame (event);
+ nframes_t pointer_frame = event_frame (event);
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
if (snap_type != SnapToEditCursor) {
void
Editor::set_playhead_cursor (GdkEvent* event)
{
- jack_nframes_t pointer_frame = event_frame (event);
+ nframes_t pointer_frame = event_frame (event);
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
snap_to (pointer_frame);
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- drag_info.pointer_frame_offset = drag_info.grab_frame - ((jack_nframes_t) arv->audio_region().fade_in().back()->when + arv->region().position());
+ drag_info.pointer_frame_offset = drag_info.grab_frame - ((nframes_t) arv->audio_region()->fade_in().back()->when + arv->region()->position());
}
void
Editor::fade_in_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- jack_nframes_t pos;
- jack_nframes_t fade_length;
+ nframes_t pos;
+ nframes_t fade_length;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
pos = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
snap_to (pos);
}
- if (pos < (arv->region().position() + 64)) {
+ if (pos < (arv->region()->position() + 64)) {
fade_length = 64; // this should be a minimum defined somewhere
- } else if (pos > arv->region().last_frame()) {
- fade_length = arv->region().length();
+ } else if (pos > arv->region()->last_frame()) {
+ fade_length = arv->region()->length();
} else {
- fade_length = pos - arv->region().position();
+ fade_length = pos - arv->region()->position();
}
arv->reset_fade_in_shape_width (fade_length);
- show_verbose_duration_cursor (arv->region().position(), arv->region().position() + fade_length, 10);
+ show_verbose_duration_cursor (arv->region()->position(), arv->region()->position() + fade_length, 10);
drag_info.first_move = false;
}
if (drag_info.first_move) return;
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- jack_nframes_t pos;
- jack_nframes_t fade_length;
+ nframes_t pos;
+ nframes_t fade_length;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
pos = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
snap_to (pos);
}
- if (pos < (arv->region().position() + 64)) {
+ if (pos < (arv->region()->position() + 64)) {
fade_length = 64; // this should be a minimum defined somewhere
}
- else if (pos > arv->region().last_frame()) {
- fade_length = arv->region().length();
+ else if (pos > arv->region()->last_frame()) {
+ fade_length = arv->region()->length();
}
else {
- fade_length = pos - arv->region().position();
+ fade_length = pos - arv->region()->position();
}
begin_reversible_command (_("change fade in length"));
- session->add_undo (arv->region().get_memento());
- arv->audio_region().set_fade_in_length (fade_length);
- session->add_redo_no_execute (arv->region().get_memento());
+ XMLNode &before = arv->audio_region()->get_state();
+
+ arv->audio_region()->set_fade_in_length (fade_length);
+
+ XMLNode &after = arv->audio_region()->get_state();
+ session->add_command(new MementoCommand<ARDOUR::AudioRegion>(*arv->audio_region().get(), &before, &after));
commit_reversible_command ();
fade_in_drag_motion_callback (item, event);
}
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- drag_info.pointer_frame_offset = drag_info.grab_frame - (arv->region().length() - (jack_nframes_t) arv->audio_region().fade_out().back()->when + arv->region().position());
+ drag_info.pointer_frame_offset = drag_info.grab_frame - (arv->region()->length() - (nframes_t) arv->audio_region()->fade_out().back()->when + arv->region()->position());
}
void
Editor::fade_out_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- jack_nframes_t pos;
- jack_nframes_t fade_length;
+ nframes_t pos;
+ nframes_t fade_length;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
pos = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
snap_to (pos);
}
- if (pos > (arv->region().last_frame() - 64)) {
+ if (pos > (arv->region()->last_frame() - 64)) {
fade_length = 64; // this should really be a minimum fade defined somewhere
}
- else if (pos < arv->region().position()) {
- fade_length = arv->region().length();
+ else if (pos < arv->region()->position()) {
+ fade_length = arv->region()->length();
}
else {
- fade_length = arv->region().last_frame() - pos;
+ fade_length = arv->region()->last_frame() - pos;
}
arv->reset_fade_out_shape_width (fade_length);
- show_verbose_duration_cursor (arv->region().last_frame() - fade_length, arv->region().last_frame(), 10);
+ show_verbose_duration_cursor (arv->region()->last_frame() - fade_length, arv->region()->last_frame(), 10);
drag_info.first_move = false;
}
if (drag_info.first_move) return;
AudioRegionView* arv = static_cast<AudioRegionView*>(drag_info.data);
- jack_nframes_t pos;
- jack_nframes_t fade_length;
+ nframes_t pos;
+ nframes_t fade_length;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
pos = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
snap_to (pos);
}
- if (pos > (arv->region().last_frame() - 64)) {
+ if (pos > (arv->region()->last_frame() - 64)) {
fade_length = 64; // this should really be a minimum fade defined somewhere
}
- else if (pos < arv->region().position()) {
- fade_length = arv->region().length();
+ else if (pos < arv->region()->position()) {
+ fade_length = arv->region()->length();
}
else {
- fade_length = arv->region().last_frame() - pos;
+ fade_length = arv->region()->last_frame() - pos;
}
begin_reversible_command (_("change fade out length"));
- session->add_undo (arv->region().get_memento());
- arv->audio_region().set_fade_out_length (fade_length);
- session->add_redo_no_execute (arv->region().get_memento());
+ XMLNode &before = arv->region()->get_state();
+
+ arv->audio_region()->set_fade_out_length (fade_length);
+
+ XMLNode &after = arv->region()->get_state();
+ session->add_command(new MementoCommand<ARDOUR::Region>(*arv->region().get(), &before, &after));
commit_reversible_command ();
fade_out_drag_motion_callback (item, event);
Editor::cursor_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
Cursor* cursor = (Cursor *) drag_info.data;
- jack_nframes_t adjusted_frame;
+ nframes_t adjusted_frame;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
adjusted_frame = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
void
Editor::marker_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t f_delta;
+ nframes_t f_delta;
Marker* marker = (Marker *) drag_info.data;
Location *real_location;
Location *copy_location;
bool move_both = false;
- jack_nframes_t newframe;
+ nframes_t newframe;
if (drag_info.pointer_frame_offset <= (long) drag_info.current_pointer_frame) {
newframe = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
}
newframe = 0;
}
- jack_nframes_t next = newframe;
+ nframes_t next = newframe;
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
snap_to (newframe, 0, true);
begin_reversible_command ( _("move marker") );
- session->add_undo( session->locations()->get_memento() );
+ XMLNode &before = session->locations()->get_state();
Location * location = find_location_from_marker (marker, is_start);
}
}
- session->add_redo_no_execute( session->locations()->get_memento() );
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), &before, &after));
commit_reversible_command ();
marker_drag_line->hide();
Editor::meter_marker_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
MeterMarker* marker = (MeterMarker *) drag_info.data;
- jack_nframes_t adjusted_frame;
+ nframes_t adjusted_frame;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
adjusted_frame = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
if (drag_info.copy == true) {
begin_reversible_command (_("copy meter mark"));
- session->add_undo (map.get_memento());
+ XMLNode &before = map.get_state();
map.add_meter (marker->meter(), when);
- session->add_redo_no_execute (map.get_memento());
+ XMLNode &after = map.get_state();
+ session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
commit_reversible_command ();
// delete the dummy marker we used for visual representation of copying.
delete marker;
} else {
begin_reversible_command (_("move meter mark"));
- session->add_undo (map.get_memento());
+ XMLNode &before = map.get_state();
map.move_meter (marker->meter(), when);
- session->add_redo_no_execute (map.get_memento());
+ XMLNode &after = map.get_state();
+ session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
commit_reversible_command ();
}
}
Editor::tempo_marker_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
TempoMarker* marker = (TempoMarker *) drag_info.data;
- jack_nframes_t adjusted_frame;
+ nframes_t adjusted_frame;
if ((long)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
adjusted_frame = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
TempoMap& map (session->tempo_map());
map.bbt_time (drag_info.last_pointer_frame, when);
-
+
if (drag_info.copy == true) {
begin_reversible_command (_("copy tempo mark"));
- session->add_undo (map.get_memento());
+ XMLNode &before = map.get_state();
map.add_tempo (marker->tempo(), when);
- session->add_redo_no_execute (map.get_memento());
+ XMLNode &after = map.get_state();
+ session->add_command (new MementoCommand<TempoMap>(map, &before, &after));
commit_reversible_command ();
// delete the dummy marker we used for visual representation of copying.
delete marker;
} else {
begin_reversible_command (_("move tempo mark"));
- session->add_undo (map.get_memento());
+ XMLNode &before = map.get_state();
map.move_tempo (marker->tempo(), when);
- session->add_redo_no_execute (map.get_memento());
+ XMLNode &after = map.get_state();
+ session->add_command (new MementoCommand<TempoMap>(map, &before, &after));
commit_reversible_command ();
}
}
cy = min ((double) cp->line.height(), cy);
//translate cx to frames
- jack_nframes_t cx_frames = unit_to_frame (cx);
+ nframes_t cx_frames = unit_to_frame (cx);
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier()) && !drag_info.x_constrained) {
snap_to (cx_frames);
{
double cx;
double cy;
- jack_nframes_t frame_within_region;
+ nframes_t frame_within_region;
/* need to get x coordinate in terms of parent (TimeAxisItemView)
origin.
cx = event->button.x;
cy = event->button.y;
line->parent_group().w2i (cx, cy);
- frame_within_region = (jack_nframes_t) floor (cx * frames_per_unit);
+ frame_within_region = (nframes_t) floor (cx * frames_per_unit);
if (!line->control_points_adjacent (frame_within_region, current_line_drag_info.before,
current_line_drag_info.after)) {
speed = tv->get_diskstream()->speed();
}
- drag_info.last_frame_position = (jack_nframes_t) (clicked_regionview->region().position() / speed);
+ drag_info.last_frame_position = (nframes_t) (clicked_regionview->region()->position() / speed);
drag_info.pointer_frame_offset = drag_info.grab_frame - drag_info.last_frame_position;
drag_info.last_trackview = &clicked_regionview->get_time_axis_view();
// we want a move threshold
}
drag_info.last_trackview = &clicked_regionview->get_time_axis_view();
- drag_info.last_frame_position = (jack_nframes_t) (clicked_regionview->region().position() / speed);
+ drag_info.last_frame_position = (nframes_t) (clicked_regionview->region()->position() / speed);
drag_info.pointer_frame_offset = drag_info.grab_frame - drag_info.last_frame_position;
// we want a move threshold
drag_info.want_move_threshold = true;
speed = tv->get_diskstream()->speed();
}
- drag_info.last_frame_position = (jack_nframes_t) (clicked_regionview->region().position() / speed);
+ drag_info.last_frame_position = (nframes_t) (clicked_regionview->region()->position() / speed);
drag_info.pointer_frame_offset = drag_info.grab_frame - drag_info.last_frame_position;
drag_info.last_trackview = &clicked_regionview->get_time_axis_view();
// we want a move threshold
double x_delta;
double y_delta = 0;
RegionView* rv = reinterpret_cast<RegionView*> (drag_info.data);
- jack_nframes_t pending_region_position = 0;
+ nframes_t pending_region_position = 0;
int32_t pointer_y_span = 0, canvas_pointer_y_span = 0, original_pointer_order;
int32_t visible_y_high = 0, visible_y_low = 512; //high meaning higher numbered.. not the height on the screen
bool clamp_y_axis = false;
rv = (*i);
- Playlist* to_playlist = rv->region().playlist();
+ Playlist* to_playlist = rv->region()->playlist();
RouteTimeAxisView* atv = dynamic_cast<RouteTimeAxisView*>(&rv->get_time_axis_view());
insert_result = affected_playlists.insert (to_playlist);
if (insert_result.second) {
- session->add_undo (to_playlist->get_memento ());
+ session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
}
latest_regionview = 0;
/* create a new region with the same name. */
// FIXME: ew. need a (virtual) Region::duplicate() or something?
- Region* newregion = NULL;
- if (dynamic_cast<AudioRegion*>(&rv->region()))
- newregion = new AudioRegion (dynamic_cast<AudioRegion&>(rv->region()));
- assert(newregion);
+
+ boost::shared_ptr<Region> newregion;
+ boost::shared_ptr<Region> ar;
+
+ if ((ar = boost::dynamic_pointer_cast<AudioRegion>(rv->region())) != 0) {
+ newregion = RegionFactory::create (ar);
+ }
+ assert(newregion != 0);
/* if the original region was locked, we don't care */
newregion->set_locked (false);
- to_playlist->add_region (*newregion, (jack_nframes_t) (rv->region().position() * atv->get_diskstream()->speed()));
+ to_playlist->add_region (newregion, (nframes_t) (rv->region()->position() * atv->get_diskstream()->speed()));
c.disconnect ();
if ((int32_t)drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
- jack_nframes_t sync_frame;
- jack_nframes_t sync_offset;
+ nframes_t sync_frame;
+ nframes_t sync_offset;
int32_t sync_dir;
pending_region_position = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
- sync_offset = rv->region().sync_offset (sync_dir);
- sync_frame = rv->region().adjust_to_sync (pending_region_position);
+ sync_offset = rv->region()->sync_offset (sync_dir);
+ sync_frame = rv->region()->adjust_to_sync (pending_region_position);
/* we snap if the snap modifier is not enabled.
*/
pending_region_position = 0;
}
- if (pending_region_position > max_frames - rv->region().length()) {
+ if (pending_region_position > max_frames - rv->region()->length()) {
pending_region_position = drag_info.last_frame_position;
}
if (-x_delta > ix1) {
x_delta = -ix1;
}
- } else if ((x_delta > 0) &&(rv->region().last_frame() > max_frames - x_delta)) {
- x_delta = max_frames - rv->region().last_frame();
+ } else if ((x_delta > 0) &&(rv->region()->last_frame() > max_frames - x_delta)) {
+ x_delta = max_frames - rv->region()->last_frame();
}
if (drag_info.first_move) {
insert_result = motion_frozen_playlists.insert (pl);
if (insert_result.second) {
pl->freeze();
- session->add_undo(pl->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*pl, &pl->get_state(), 0));
}
}
}
void
Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t where;
+ nframes_t where;
RegionView* rv = reinterpret_cast<RegionView *> (drag_info.data);
pair<set<Playlist*>::iterator,bool> insert_result;
bool nocommit = true;
speed = atv->get_diskstream()->speed();
}
- regionview_x_movement = (drag_info.last_frame_position != (jack_nframes_t) (rv->region().position()/speed));
+ regionview_x_movement = (drag_info.last_frame_position != (nframes_t) (rv->region()->position()/speed));
regionview_y_movement = (drag_info.last_trackview != &rv->get_time_axis_view());
//printf ("last_frame: %s position is %lu %g\n", rv->get_time_axis_view().name().c_str(), drag_info.last_frame_position, speed);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
- from_playlist = (*i)->region().playlist();
+ from_playlist = (*i)->region()->playlist();
to_playlist = atv2->playlist();
/* the from_playlist was frozen in the "first_move" case
insert_result = motion_frozen_playlists.insert(to_playlist);
if (insert_result.second) {
to_playlist->freeze();
- session->add_undo(to_playlist->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
}
}
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
- from_playlist = (*i)->region().playlist();
+ from_playlist = (*i)->region()->playlist();
to_playlist = atv2->playlist();
latest_regionview = 0;
- where = (jack_nframes_t) (unit_to_frame (ix1) * speed);
- Region* new_region = createRegion ((*i)->region());
+ where = (nframes_t) (unit_to_frame (ix1) * speed);
+ boost::shared_ptr<Region> new_region (RegionFactory::create ((*i)->region()));
- from_playlist->remove_region (&((*i)->region()));
-
+ from_playlist->remove_region (((*i)->region()));
+
sigc::connection c = atv2->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
- to_playlist->add_region (*new_region, where);
+ to_playlist->add_region (new_region, where);
c.disconnect ();
-
+
if (latest_regionview) {
selection->add (latest_regionview);
}
rv = (*i);
- if (rv->region().locked()) {
+ if (rv->region()->locked()) {
continue;
}
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
- where = (jack_nframes_t) (unit_to_frame (ix1) * ownspeed);
+ where = (nframes_t) (unit_to_frame (ix1) * ownspeed);
} else {
- where = rv->region().position();
+ where = rv->region()->position();
}
rv->get_time_axis_view().reveal_dependent_views (*rv);
/* no need to add an undo here, we did that when we added this playlist to motion_frozen playlists */
- rv->region().set_position (where, (void *) this);
+ rv->region()->set_position (where, (void *) this);
}
}
out:
for (set<Playlist*>::iterator p = motion_frozen_playlists.begin(); p != motion_frozen_playlists.end(); ++p) {
(*p)->thaw ();
- session->add_redo_no_execute ((*p)->get_memento());
+ session->add_command (new MementoCommand<Playlist>(*(*p), 0, & (*p)->get_state()));
}
motion_frozen_playlists.clear ();
if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::Control|Keyboard::Alt))) {
- align_region (rv.region(), SyncPoint, (jack_nframes_t) (edit_cursor->current_frame * speed));
+ align_region (rv.region(), SyncPoint, (nframes_t) (edit_cursor->current_frame * speed));
} else if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::Control|Keyboard::Shift))) {
- align_region (rv.region(), End, (jack_nframes_t) (edit_cursor->current_frame * speed));
+ align_region (rv.region(), End, (nframes_t) (edit_cursor->current_frame * speed));
} else {
- align_region (rv.region(), Start, (jack_nframes_t) (edit_cursor->current_frame * speed));
+ align_region (rv.region(), Start, (nframes_t) (edit_cursor->current_frame * speed));
}
}
}
void
-Editor::show_verbose_time_cursor (jack_nframes_t frame, double offset, double xpos, double ypos)
+Editor::show_verbose_time_cursor (nframes_t frame, double offset, double xpos, double ypos)
{
char buf[128];
SMPTE::Time smpte;
case AudioClock::MinSec:
/* XXX fix this to compute min/sec properly */
session->smpte_time (frame, smpte);
- secs = smpte.seconds + ((float) smpte.frames / session->smpte_frames_per_second);
+ secs = smpte.seconds + ((float) smpte.frames / Config->get_smpte_frames_per_second());
snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", smpte.hours, smpte.minutes, secs);
break;
}
void
-Editor::show_verbose_duration_cursor (jack_nframes_t start, jack_nframes_t end, double offset, double xpos, double ypos)
+Editor::show_verbose_duration_cursor (nframes_t start, nframes_t end, double offset, double xpos, double ypos)
{
char buf[128];
SMPTE::Time smpte;
case AudioClock::MinSec:
/* XXX fix this to compute min/sec properly */
session->smpte_duration (end - start, smpte);
- secs = smpte.seconds + ((float) smpte.frames / session->smpte_frames_per_second);
+ secs = smpte.seconds + ((float) smpte.frames / Config->get_smpte_frames_per_second());
snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", smpte.hours, smpte.minutes, secs);
break;
/* lets try to create new Region for the selection */
- vector<AudioRegion*> new_regions;
+ vector<boost::shared_ptr<AudioRegion> > new_regions;
create_region_from_selection (new_regions);
if (new_regions.empty()) {
/* XXX fix me one day to use all new regions */
- Region* region = new_regions.front();
+ boost::shared_ptr<Region> region (new_regions.front());
/* add it to the current stream/playlist.
Playlist* playlist = clicked_trackview->playlist();
- session->add_undo (playlist->get_memento ());
- clicked_trackview->playlist()->add_region (*region, selection->time[clicked_selection].start);
- session->add_redo_no_execute (playlist->get_memento ());
+ XMLNode *before = &(playlist->get_state());
+ clicked_trackview->playlist()->add_region (region, selection->time[clicked_selection].start);
+ XMLNode *after = &(playlist->get_state());
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, after));
commit_reversible_command ();
start_grab (event);
drag_info.last_trackview = clicked_trackview;
- drag_info.last_frame_position = latest_regionview->region().position();
+ drag_info.last_frame_position = latest_regionview->region()->position();
drag_info.pointer_frame_offset = drag_info.grab_frame - drag_info.last_frame_position;
show_verbose_time_cursor (drag_info.last_frame_position, 10);
void
Editor::start_selection_op (ArdourCanvas::Item* item, GdkEvent* event, SelectionOp op)
{
- jack_nframes_t start = 0;
- jack_nframes_t end = 0;
+ nframes_t start = 0;
+ nframes_t end = 0;
if (session == 0) {
return;
void
Editor::drag_selection (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t start = 0;
- jack_nframes_t end = 0;
- jack_nframes_t length;
- jack_nframes_t pending_position;
+ nframes_t start = 0;
+ nframes_t end = 0;
+ nframes_t length;
+ nframes_t pending_position;
if ((int32_t) drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
pending_position = drag_info.current_pointer_frame - drag_info.pointer_frame_offset;
speed = tv->get_diskstream()->speed();
}
- jack_nframes_t region_start = (jack_nframes_t) (clicked_regionview->region().position() / speed);
- jack_nframes_t region_end = (jack_nframes_t) (clicked_regionview->region().last_frame() / speed);
- jack_nframes_t region_length = (jack_nframes_t) (clicked_regionview->region().length() / speed);
+ nframes_t region_start = (nframes_t) (clicked_regionview->region()->position() / speed);
+ nframes_t region_end = (nframes_t) (clicked_regionview->region()->last_frame() / speed);
+ nframes_t region_length = (nframes_t) (clicked_regionview->region()->length() / speed);
motion_frozen_playlists.clear();
Editor::trim_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
{
RegionView* rv = clicked_regionview;
- jack_nframes_t frame_delta = 0;
+ nframes_t frame_delta = 0;
bool left_direction;
bool obey_snap = !Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier());
begin_reversible_command (trim_type);
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
- (*i)->region().freeze ();
+ (*i)->region()->freeze ();
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv)
arv->temporarily_hide_envelope ();
- Playlist * pl = (*i)->region().playlist();
+ Playlist * pl = (*i)->region()->playlist();
insert_result = motion_frozen_playlists.insert (pl);
if (insert_result.second) {
- session->add_undo (pl->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*pl, &pl->get_state(), 0));
}
}
}
switch (trim_op) {
case StartTrim:
- if ((left_direction == false) && (drag_info.current_pointer_frame <= rv->region().first_frame()/speed)) {
+ if ((left_direction == false) && (drag_info.current_pointer_frame <= rv->region()->first_frame()/speed)) {
break;
} else {
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
}
case EndTrim:
- if ((left_direction == true) && (drag_info.current_pointer_frame > (jack_nframes_t) (rv->region().last_frame()/speed))) {
+ if ((left_direction == true) && (drag_info.current_pointer_frame > (nframes_t) (rv->region()->last_frame()/speed))) {
break;
} else {
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
switch (trim_op) {
case StartTrim:
- show_verbose_time_cursor((jack_nframes_t) (rv->region().position()/speed), 10);
+ show_verbose_time_cursor((nframes_t) (rv->region()->position()/speed), 10);
break;
case EndTrim:
- show_verbose_time_cursor((jack_nframes_t) (rv->region().last_frame()/speed), 10);
+ show_verbose_time_cursor((nframes_t) (rv->region()->last_frame()/speed), 10);
break;
case ContentsTrim:
show_verbose_time_cursor(drag_info.current_pointer_frame, 10);
}
void
-Editor::single_contents_trim (RegionView& rv, jack_nframes_t frame_delta, bool left_direction, bool swap_direction, bool obey_snap)
+Editor::single_contents_trim (RegionView& rv, nframes_t frame_delta, bool left_direction, bool swap_direction, bool obey_snap)
{
- Region& region (rv.region());
+ boost::shared_ptr<Region> region (rv.region());
- if (region.locked()) {
+ if (region->locked()) {
return;
}
- jack_nframes_t new_bound;
+ nframes_t new_bound;
double speed = 1.0;
TimeAxisView* tvp = clicked_trackview;
if (left_direction) {
if (swap_direction) {
- new_bound = (jack_nframes_t) (region.position()/speed) + frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) + frame_delta;
} else {
- new_bound = (jack_nframes_t) (region.position()/speed) - frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) - frame_delta;
}
} else {
if (swap_direction) {
- new_bound = (jack_nframes_t) (region.position()/speed) - frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) - frame_delta;
} else {
- new_bound = (jack_nframes_t) (region.position()/speed) + frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) + frame_delta;
}
}
if (obey_snap) {
snap_to (new_bound);
}
- region.trim_start ((jack_nframes_t) (new_bound * speed), this);
+ region->trim_start ((nframes_t) (new_bound * speed), this);
rv.region_changed (StartChanged);
}
void
-Editor::single_start_trim (RegionView& rv, jack_nframes_t frame_delta, bool left_direction, bool obey_snap)
+Editor::single_start_trim (RegionView& rv, nframes_t frame_delta, bool left_direction, bool obey_snap)
{
- Region& region (rv.region());
+ boost::shared_ptr<Region> region (rv.region());
- if (region.locked()) {
+ if (region->locked()) {
return;
}
- jack_nframes_t new_bound;
+ nframes_t new_bound;
double speed = 1.0;
TimeAxisView* tvp = clicked_trackview;
}
if (left_direction) {
- new_bound = (jack_nframes_t) (region.position()/speed) - frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) - frame_delta;
} else {
- new_bound = (jack_nframes_t) (region.position()/speed) + frame_delta;
+ new_bound = (nframes_t) (region->position()/speed) + frame_delta;
}
if (obey_snap) {
snap_to (new_bound, (left_direction ? 0 : 1));
}
- region.trim_front ((jack_nframes_t) (new_bound * speed), this);
+ region->trim_front ((nframes_t) (new_bound * speed), this);
rv.region_changed (Change (LengthChanged|PositionChanged|StartChanged));
}
void
-Editor::single_end_trim (RegionView& rv, jack_nframes_t frame_delta, bool left_direction, bool obey_snap)
+Editor::single_end_trim (RegionView& rv, nframes_t frame_delta, bool left_direction, bool obey_snap)
{
- Region& region (rv.region());
+ boost::shared_ptr<Region> region (rv.region());
- if (region.locked()) {
+ if (region->locked()) {
return;
}
- jack_nframes_t new_bound;
+ nframes_t new_bound;
double speed = 1.0;
TimeAxisView* tvp = clicked_trackview;
}
if (left_direction) {
- new_bound = (jack_nframes_t) ((region.last_frame() + 1)/speed) - frame_delta;
+ new_bound = (nframes_t) ((region->last_frame() + 1)/speed) - frame_delta;
} else {
- new_bound = (jack_nframes_t) ((region.last_frame() + 1)/speed) + frame_delta;
+ new_bound = (nframes_t) ((region->last_frame() + 1)/speed) + frame_delta;
}
if (obey_snap) {
snap_to (new_bound);
}
- region.trim_end ((jack_nframes_t) (new_bound * speed), this);
+ region->trim_end ((nframes_t) (new_bound * speed), this);
rv.region_changed (LengthChanged);
}
for (set<Playlist*>::iterator p = motion_frozen_playlists.begin(); p != motion_frozen_playlists.end(); ++p) {
//(*p)->thaw ();
- session->add_redo_no_execute ((*p)->get_memento());
- }
+ session->add_command (new MementoCommand<Playlist>(*(*p), 0, &(*p)->get_state()));
+ }
motion_frozen_playlists.clear ();
Editor::point_trim (GdkEvent* event)
{
RegionView* rv = clicked_regionview;
- jack_nframes_t new_bound = drag_info.current_pointer_frame;
+ nframes_t new_bound = drag_info.current_pointer_frame;
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
snap_to (new_bound);
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin();
i != selection->regions.by_layer().end(); ++i)
{
- if (!(*i)->region().locked()) {
- session->add_undo ((*i)->region().playlist()->get_memento());
- (*i)->region().trim_front (new_bound, this);
- session->add_redo_no_execute ((*i)->region().playlist()->get_memento());
+ if (!(*i)->region()->locked()) {
+ Playlist *pl = (*i)->region()->playlist();
+ XMLNode &before = pl->get_state();
+ (*i)->region()->trim_front (new_bound, this);
+ XMLNode &after = pl->get_state();
+ session->add_command(new MementoCommand<Playlist>(*pl, &before, &after));
}
}
} else {
- if (!rv->region().locked()) {
- session->add_undo (rv->region().playlist()->get_memento());
- rv->region().trim_front (new_bound, this);
- session->add_redo_no_execute (rv->region().playlist()->get_memento());
+ if (!rv->region()->locked()) {
+ Playlist *pl = rv->region()->playlist();
+ XMLNode &before = pl->get_state();
+ rv->region()->trim_front (new_bound, this);
+ XMLNode &after = pl->get_state();
+ session->add_command(new MementoCommand<Playlist>(*pl, &before, &after));
}
}
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i)
{
- if (!(*i)->region().locked()) {
- session->add_undo ((*i)->region().playlist()->get_memento());
- (*i)->region().trim_end (new_bound, this);
- session->add_redo_no_execute ((*i)->region().playlist()->get_memento());
+ if (!(*i)->region()->locked()) {
+ Playlist *pl = (*i)->region()->playlist();
+ XMLNode &before = pl->get_state();
+ (*i)->region()->trim_end (new_bound, this);
+ XMLNode &after = pl->get_state();
+ session->add_command(new MementoCommand<Playlist>(*pl, &before, &after));
}
}
} else {
- if (!rv->region().locked()) {
- session->add_undo (rv->region().playlist()->get_memento());
- rv->region().trim_end (new_bound, this);
- session->add_redo_no_execute (rv->region().playlist()->get_memento());
+ if (!rv->region()->locked()) {
+ Playlist *pl = rv->region()->playlist();
+ XMLNode &before = pl->get_state();
+ rv->region()->trim_end (new_bound, this);
+ XMLNode &after = pl->get_state();
+ session->add_command (new MementoCommand<Playlist>(*pl, &before, &after));
}
}
void
Editor::thaw_region_after_trim (RegionView& rv)
{
- Region& region (rv.region());
+ boost::shared_ptr<Region> region (rv.region());
- if (region.locked()) {
+ if (region->locked()) {
return;
}
- region.thaw (_("trimmed region"));
- session->add_redo_no_execute (region.playlist()->get_memento());
+ region->thaw (_("trimmed region"));
+ XMLNode &after = region->playlist()->get_state();
+ session->add_command (new MementoCommand<Playlist>(*(region->playlist()), 0, &after));
AudioRegionView* arv = dynamic_cast<AudioRegionView*>(&rv);
if (arv)
void
Editor::drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t start = 0;
- jack_nframes_t end = 0;
+ nframes_t start = 0;
+ nframes_t end = 0;
ArdourCanvas::SimpleRect *crect = (range_marker_op == CreateRangeMarker) ? range_bar_drag_rect: transport_bar_drag_rect;
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
switch (range_marker_op) {
case CreateRangeMarker:
+ {
begin_reversible_command (_("new range marker"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
newloc = new Location(temp_location->start(), temp_location->end(), "unnamed", Location::IsRangeMarker);
session->locations()->add (newloc, true);
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), &before, &after));
commit_reversible_command ();
range_bar_drag_rect->hide();
range_marker_drag_rect->hide();
break;
+ }
case CreateTransportMarker:
// popup menu to pick loop or punch
if (Keyboard::no_modifier_keys_pressed (&event->button)) {
- jack_nframes_t start;
- jack_nframes_t end;
+ nframes_t start;
+ nframes_t end;
start = session->locations()->first_mark_before (drag_info.grab_frame);
end = session->locations()->first_mark_after (drag_info.grab_frame);
void
Editor::drag_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t start;
- jack_nframes_t end;
+ nframes_t start;
+ nframes_t end;
if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
snap_to (drag_info.current_pointer_frame);
}
void
-Editor::reposition_zoom_rect (jack_nframes_t start, jack_nframes_t end)
+Editor::reposition_zoom_rect (nframes_t start, nframes_t end)
{
double x1 = frame_to_pixel (start);
double x2 = frame_to_pixel (end);
void
Editor::drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event)
{
- jack_nframes_t start;
- jack_nframes_t end;
+ nframes_t start;
+ nframes_t end;
double y1;
double y2;
ArdourPrompter prompter (false);
prompter.set_prompt (_("Name for region:"));
- prompter.set_initial_text (clicked_regionview->region().name());
+ prompter.set_initial_text (clicked_regionview->region()->name());
prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT);
prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
prompter.show_all ();
string str;
prompter.get_result(str);
if (str.length()) {
- clicked_regionview->region().set_name (str);
+ clicked_regionview->region()->set_name (str);
}
break;
}
return;
}
- if (drag_info.current_pointer_frame > rv->region().position()) {
- rv->get_time_axis_view().show_timestretch (rv->region().position(), drag_info.current_pointer_frame);
+ if (drag_info.current_pointer_frame > rv->region()->position()) {
+ rv->get_time_axis_view().show_timestretch (rv->region()->position(), drag_info.current_pointer_frame);
}
drag_info.last_pointer_frame = drag_info.current_pointer_frame;
return;
}
- jack_nframes_t newlen = drag_info.last_pointer_frame - clicked_regionview->region().position();
- float percentage = (float) ((double) newlen - (double) clicked_regionview->region().length()) / ((double) newlen) * 100.0f;
+ nframes_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position();
+ float percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f;
begin_reversible_command (_("timestretch"));
}
void
-Editor::mouse_brush_insert_region (RegionView* rv, jack_nframes_t pos)
+Editor::mouse_brush_insert_region (RegionView* rv, nframes_t pos)
{
/* no brushing without a useful snap setting */
/* don't brush a copy over the original */
- if (pos == rv->region().position()) {
+ if (pos == rv->region()->position()) {
return;
}
Playlist* playlist = atv->playlist();
double speed = atv->get_diskstream()->speed();
- session->add_undo (playlist->get_memento());
- playlist->add_region (*(new AudioRegion (arv->audio_region())), (jack_nframes_t) (pos * speed));
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
+ playlist->add_region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (arv->audio_region())), (nframes_t) (pos * speed));
+ XMLNode &after = playlist->get_state();
+ session->add_command(new MementoCommand<Playlist>(*playlist, &before, &after));
// playlist is frozen, so we have to update manually
- playlist->StateChanged (Change (~0)); /* EMIT SIGNAL */
+ playlist->Modified(); /* EMIT SIGNAL */
}
gint