diff options
Diffstat (limited to 'gtk2_ardour/editor.cc')
-rw-r--r-- | gtk2_ardour/editor.cc | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index f7e641fbb2..e3c03db510 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -305,6 +305,8 @@ Editor::Editor () selection = new Selection (this); cut_buffer = new Selection (this); + _selection_memento = new SelectionMemento (); + before.clear(); clicked_regionview = 0; clicked_axisview = 0; @@ -1392,6 +1394,7 @@ Editor::set_session (Session *t) /* register for undo history */ _session->register_with_memento_command_factory(id(), this); + _session->register_with_memento_command_factory(_selection_memento->id(), _selection_memento); ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated)); @@ -3317,6 +3320,7 @@ void Editor::begin_reversible_command (string name) { if (_session) { + before.push_back (&_selection_memento->get_state ()); _session->begin_reversible_command (name); } } @@ -3325,6 +3329,7 @@ void Editor::begin_reversible_command (GQuark q) { if (_session) { + before.push_back (&_selection_memento->get_state ()); _session->begin_reversible_command (q); } } @@ -3333,6 +3338,14 @@ void Editor::commit_reversible_command () { if (_session) { + if (before.size() == 1) { + _session->add_command (new MementoCommand<SelectionMemento>(*(_selection_memento), before.front(), &_selection_memento->get_state ())); + } + + if (!before.empty()) { + before.pop_back(); + } + _session->commit_reversible_command (); } } @@ -4182,7 +4195,7 @@ Editor::copy_playlists (TimeAxisView* v) void Editor::clear_playlists (TimeAxisView* v) { - begin_reversible_command (_("clear playlists")); + begin_reversible_command (_("clear playlists")); vector<boost::shared_ptr<ARDOUR::Playlist> > playlists; _session->playlists->get (playlists); mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::select.property_id); @@ -4220,6 +4233,12 @@ Editor::on_key_release_event (GdkEventKey* ev) // return key_press_focus_accelerator_handler (*this, ev); } +double +Editor::get_y_origin () const +{ + return vertical_adjustment.get_value (); +} + /** Queue up a change to the viewport x origin. * @param frame New x origin. */ @@ -4629,8 +4648,7 @@ Editor::set_punch_range (framepos_t start, framepos_t end, string cmd) _session->set_auto_punch_location (loc); XMLNode &after = _session->locations()->get_state(); _session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after)); - } - else { + } else { XMLNode &before = tpl->get_state(); tpl->set_hidden (false, this); tpl->set (start, end); @@ -4808,6 +4826,35 @@ Editor::get_regions_from_selection_and_entered () } void +Editor::get_regionviews_by_id (PBD::ID const & id, RegionSelection & regions) const +{ + for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* tatv; + + if ((tatv = dynamic_cast<RouteTimeAxisView*> (*i)) != 0) { + boost::shared_ptr<Playlist> pl; + std::vector<boost::shared_ptr<Region> > results; + boost::shared_ptr<Track> tr; + + if ((tr = tatv->track()) == 0) { + /* bus */ + continue; + } + + if ((pl = (tr->playlist())) != 0) { + boost::shared_ptr<Region> r = pl->region_by_id (id); + if (r) { + RegionView* marv = tatv->view()->find_view (r); + if (marv) { + regions.push_back (marv); + } + } + } + } + } +} + +void Editor::get_regions_corresponding_to (boost::shared_ptr<Region> region, vector<RegionView*>& regions, bool src_comparison) { for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { @@ -4966,8 +5013,15 @@ Editor::located () } void -Editor::region_view_added (RegionView *) +Editor::region_view_added (RegionView * rv) { + for (list<PBD::ID>::iterator pr = selection->regions.pending.begin (); pr != selection->regions.pending.end (); ++pr) { + if (rv->region ()->id () == (*pr)) { + selection->add (rv); + selection->regions.pending.erase (pr); + break; + } + } _summary->set_background_dirty (); } |