X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mouse.cc;h=d75dce80791f640ce2eb03a10f3d08d463be638f;hb=129ace60e24aa7b5297563d389edbae1d70a3a80;hp=5820218a2a59a8a451b8fac1682dd2919d31b571;hpb=db8b575c30845bafc34b87bacd52129c95d1c478;p=ardour.git diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 5820218a2a..d75dce8079 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -31,6 +31,7 @@ #include #include "pbd/memento_command.h" #include "pbd/basename.h" +#include "pbd/stateful_diff_command.h" #include "ardour_ui.h" #include "actions.h" @@ -498,7 +499,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp 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; @@ -634,10 +636,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT 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 { @@ -776,7 +778,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { boost::shared_ptr t = boost::dynamic_pointer_cast (rtv->route ()); if (t) { - boost::shared_ptr pl = t->diskstream()->playlist (); + boost::shared_ptr pl = t->playlist (); if (pl) { boost::shared_ptr r = pl->top_region_at (event_frame (event)); @@ -888,9 +890,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT 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 (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; } @@ -1148,11 +1152,11 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT 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: @@ -1926,7 +1930,7 @@ Editor::region_view_item_click (AudioRegionView& rv, GdkEventButton* event) RouteTimeAxisView* rtv = dynamic_cast(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(); @@ -2115,7 +2119,7 @@ Editor::cancel_selection () 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 (rv.region()); @@ -2130,7 +2134,7 @@ Editor::single_contents_trim (RegionView& rv, nframes64_t frame_delta, bool left RouteTimeAxisView* tv = dynamic_cast(tvp); if (tv && tv->is_track()) { - speed = tv->get_diskstream()->speed(); + speed = tv->track()->speed(); } if (left_direction) { @@ -2147,15 +2151,12 @@ Editor::single_contents_trim (RegionView& rv, nframes64_t frame_delta, bool left } } - 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 (rv.region()); @@ -2163,24 +2164,12 @@ Editor::single_start_trim (RegionView& rv, nframes64_t frame_delta, bool left_di return; } - nframes64_t new_bound; - double speed = 1.0; TimeAxisView* tvp = clicked_axisview; RouteTimeAxisView* tv = dynamic_cast(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(); @@ -2210,7 +2199,7 @@ Editor::single_start_trim (RegionView& rv, nframes64_t frame_delta, bool left_di } 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 (rv.region()); @@ -2218,24 +2207,12 @@ Editor::single_end_trim (RegionView& rv, nframes64_t frame_delta, bool left_dire return; } - nframes64_t new_bound; - double speed = 1.0; TimeAxisView* tvp = clicked_axisview; RouteTimeAxisView* tv = dynamic_cast(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(); @@ -2249,8 +2226,8 @@ Editor::single_end_trim (RegionView& rv, nframes64_t frame_delta, bool left_dire 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. @@ -2287,23 +2264,17 @@ Editor::point_trim (GdkEvent* event, nframes64_t new_bound) } if (!(*i)->region()->locked()) { - boost::shared_ptr 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(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } } } else { if (!rv->region()->locked()) { - boost::shared_ptr 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(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } } @@ -2318,22 +2289,18 @@ Editor::point_trim (GdkEvent* event, nframes64_t new_bound) for (list::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) { if (!(*i)->region()->locked()) { - boost::shared_ptr 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(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } } } else { if (!rv->region()->locked()) { - boost::shared_ptr 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(*pl.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (rv->region())); } } @@ -2354,7 +2321,7 @@ Editor::thaw_region_after_trim (RegionView& rv) return; } - region->thaw (); + region->resume_property_changes (); AudioRegionView* arv = dynamic_cast(&rv); @@ -2451,13 +2418,12 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) } boost::shared_ptr 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 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.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 @@ -2560,10 +2526,9 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) boost::shared_ptr 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, before, after)); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); @@ -2586,7 +2551,7 @@ void Editor::escape () { if (_drags->active ()) { - _drags->break_drag (); + _drags->abort (); } else { selection->clear (); }