#include <gtkmm2ext/tearoff.h>
#include "pbd/memento_command.h"
#include "pbd/basename.h"
+#include "pbd/stateful_diff_command.h"
#include "ardour_ui.h"
#include "actions.h"
case StreamItem:
/* for context click, select track */
if (event->button.button == 3) {
- set_selected_track_as_side_effect ();
+ selection->clear_tracks ();
+ set_selected_track_as_side_effect (true);
}
break;
case SelectionItem:
if (Keyboard::modifier_state_contains
- (event->button.state, Keyboard::ModifierMask(Keyboard::SecondaryModifier))) {
+ (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier))) {
// contains and not equals because I can't use alt as a modifier alone.
start_selection_grab (item, event);
- } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+ } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::SecondaryModifier)) {
/* grab selection for moving */
_drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionMove), event);
} else {
if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (rtv->route ());
if (t) {
- boost::shared_ptr<Playlist> pl = t->diskstream()->playlist ();
+ boost::shared_ptr<Playlist> pl = t->playlist ();
if (pl) {
boost::shared_ptr<Region> r = pl->top_region_at (event_frame (event));
case MouseTimeFX:
if (internal_editing() && item_type == NoteItem) {
+ /* drag notes if we're in internal edit mode */
_drags->set (new NoteResizeDrag (this, item), event);
return true;
- } else if (!internal_editing() && item_type == RegionItem) {
+ } else if (!internal_editing() || dynamic_cast<AudioRegionView*> (clicked_regionview)) {
+ /* do time-FX if we're not in internal edit mode, or we are but we clicked on an audio region */
_drags->set (new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
return true;
}
break;
case TempoMarkerItem:
- tm_marker_context_menu (&event->button, item);
+ tempo_or_meter_marker_context_menu (&event->button, item);
break;
case MeterMarkerItem:
- tm_marker_context_menu (&event->button, item);
+ tempo_or_meter_marker_context_menu (&event->button, item);
break;
case CrossfadeViewItem:
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(tv);
double speed = 1.0;
if (rtv && rtv->is_track()) {
- speed = rtv->get_diskstream()->speed();
+ speed = rtv->track()->speed();
}
nframes64_t where = get_preferred_edit_position();
void
-Editor::single_contents_trim (RegionView& rv, nframes64_t frame_delta, bool left_direction, bool swap_direction, bool obey_snap)
+Editor::single_contents_trim (RegionView& rv, nframes64_t frame_delta, bool left_direction, bool swap_direction)
{
boost::shared_ptr<Region> region (rv.region());
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
if (tv && tv->is_track()) {
- speed = tv->get_diskstream()->speed();
+ speed = tv->track()->speed();
}
if (left_direction) {
}
}
- if (obey_snap) {
- snap_to (new_bound);
- }
region->trim_start ((nframes64_t) (new_bound * speed), this);
rv.region_changed (PropertyChange (ARDOUR::Properties::start));
}
void
-Editor::single_start_trim (RegionView& rv, nframes64_t frame_delta, bool left_direction, bool obey_snap, bool no_overlap)
+Editor::single_start_trim (RegionView& rv, nframes64_t new_bound, bool no_overlap)
{
boost::shared_ptr<Region> region (rv.region());
return;
}
- nframes64_t new_bound;
-
double speed = 1.0;
TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
if (tv && tv->is_track()) {
- speed = tv->get_diskstream()->speed();
- }
-
- if (left_direction) {
- new_bound = (nframes64_t) (region->position()/speed) - frame_delta;
- } else {
- new_bound = (nframes64_t) (region->position()/speed) + frame_delta;
- }
-
- if (obey_snap) {
- snap_to (new_bound, (left_direction ? 0 : 1));
+ speed = tv->track()->speed();
}
nframes64_t pre_trim_first_frame = region->first_frame();
}
void
-Editor::single_end_trim (RegionView& rv, nframes64_t frame_delta, bool left_direction, bool obey_snap, bool no_overlap)
+Editor::single_end_trim (RegionView& rv, nframes64_t new_bound, bool no_overlap)
{
boost::shared_ptr<Region> region (rv.region());
return;
}
- nframes64_t new_bound;
-
double speed = 1.0;
TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
if (tv && tv->is_track()) {
- speed = tv->get_diskstream()->speed();
- }
-
- if (left_direction) {
- new_bound = (nframes64_t) ((region->last_frame() + 1)/speed) - frame_delta;
- } else {
- new_bound = (nframes64_t) ((region->last_frame() + 1)/speed) + frame_delta;
- }
-
- if (obey_snap) {
- snap_to (new_bound);
+ speed = tv->track()->speed();
}
nframes64_t pre_trim_last_frame = region->last_frame();
bool regions_touching = false;
- if (region_right != 0 && (pre_trim_last_frame == region_right->first_frame() - 1)){
- regions_touching = true;
+ if (region_right != 0 && (pre_trim_last_frame == region_right->first_frame() - 1)) {
+ regions_touching = true;
}
//Only trim region on the right if the last frame has gone beyond the right region's first frame.
}
if (!(*i)->region()->locked()) {
- boost::shared_ptr<Playlist> pl = (*i)->region()->playlist();
- XMLNode &before = pl->get_state();
-
+ (*i)->region()->clear_history ();
(*i)->region()->trim_front (new_bound, this);
-
- XMLNode &after = pl->get_state();
- _session->add_command(new MementoCommand<Playlist>(*pl.get(), &before, &after));
+ _session->add_command(new StatefulDiffCommand ((*i)->region()));
}
}
} else {
if (!rv->region()->locked()) {
- boost::shared_ptr<Playlist> pl = rv->region()->playlist();
- XMLNode &before = pl->get_state();
+ rv->region()->clear_history ();
rv->region()->trim_front (new_bound, this);
- XMLNode &after = pl->get_state();
- _session->add_command(new MementoCommand<Playlist>(*pl.get(), &before, &after));
+ _session->add_command(new StatefulDiffCommand (rv->region()));
}
}
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i)
{
if (!(*i)->region()->locked()) {
- boost::shared_ptr<Playlist> pl = (*i)->region()->playlist();
- XMLNode &before = pl->get_state();
+ (*i)->region()->clear_history();
(*i)->region()->trim_end (new_bound, this);
- XMLNode &after = pl->get_state();
- _session->add_command(new MementoCommand<Playlist>(*pl.get(), &before, &after));
+ _session->add_command(new StatefulDiffCommand ((*i)->region()));
}
}
} else {
if (!rv->region()->locked()) {
- boost::shared_ptr<Playlist> pl = rv->region()->playlist();
- XMLNode &before = pl->get_state();
+ rv->region()->clear_history ();
rv->region()->trim_end (new_bound, this);
- XMLNode &after = pl->get_state();
- _session->add_command (new MementoCommand<Playlist>(*pl.get(), &before, &after));
+ _session->add_command (new StatefulDiffCommand (rv->region()));
}
}
return;
}
- region->thaw ();
+ region->resume_property_changes ();
AudioRegionView* arv = dynamic_cast<AudioRegionView*>(&rv);
}
boost::shared_ptr<Playlist> playlist = rtv->playlist();
- double speed = rtv->get_diskstream()->speed();
+ double speed = rtv->track()->speed();
- XMLNode &before = playlist->get_state();
+ playlist->clear_history ();
boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
- playlist->add_region (new_region, (nframes64_t) (pos * speed));
- XMLNode &after = playlist->get_state();
- _session->add_command(new MementoCommand<Playlist>(*playlist.get(), &before, &after));
+ playlist->add_region (new_region, (nframes64_t) (pos * speed));
+ _session->add_command (new StatefulDiffCommand (playlist));
// playlist is frozen, so we have to update manually XXX this is disgusting
boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
- XMLNode *before = &(playlist->get_state());
+ playlist->clear_history ();
clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start);
- XMLNode *after = &(playlist->get_state());
- _session->add_command(new MementoCommand<Playlist>(*playlist, before, after));
+ _session->add_command(new StatefulDiffCommand (playlist));
commit_reversible_command ();
Editor::escape ()
{
if (_drags->active ()) {
- _drags->break_drag ();
+ _drags->abort ();
} else {
selection->clear ();
}