From: Carl Hetherington Date: Fri, 19 Jul 2013 12:39:14 +0000 (+0100) Subject: Allow repeat of multiple stuff. X-Git-Tag: v2.0.48~1337^2~196^2~1 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=3d9fdcf7e6a5d775a2688a071b69264b1a6971c7;p=dcpomatic.git Allow repeat of multiple stuff. --- diff --git a/src/lib/playlist.cc b/src/lib/playlist.cc index 31b16b646..e4494acb0 100644 --- a/src/lib/playlist.cc +++ b/src/lib/playlist.cc @@ -42,6 +42,7 @@ using std::min; using std::max; using std::string; using std::stringstream; +using std::pair; using boost::optional; using boost::shared_ptr; using boost::weak_ptr; @@ -291,14 +292,24 @@ Playlist::content () const } void -Playlist::repeat (shared_ptr c, int n) +Playlist::repeat (list > c, int n) { - Time pos = c->end (); + pair range (TIME_MAX, 0); + for (list >::iterator i = c.begin(); i != c.end(); ++i) { + range.first = min (range.first, (*i)->start ()); + range.second = max (range.second, (*i)->start ()); + range.first = min (range.first, (*i)->end ()); + range.second = max (range.second, (*i)->end ()); + } + + Time pos = range.second; for (int i = 0; i < n; ++i) { - shared_ptr copy = c->clone (); - copy->set_start (pos); - _content.push_back (copy); - pos = copy->end (); + for (list >::iterator i = c.begin(); i != c.end(); ++i) { + shared_ptr copy = (*i)->clone (); + copy->set_start (pos + copy->start() - range.first); + _content.push_back (copy); + } + pos += range.second - range.first; } reconnect (); diff --git a/src/lib/playlist.h b/src/lib/playlist.h index e949de0ea..1d69c34ba 100644 --- a/src/lib/playlist.h +++ b/src/lib/playlist.h @@ -77,7 +77,7 @@ public: void set_sequence_video (bool); void maybe_sequence_video (); - void repeat (boost::shared_ptr, int); + void repeat (std::list >, int); mutable boost::signals2::signal Changed; /** Third parameter is true if signals are currently being emitted frequently */ diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index e3eca8a1d..f9205fc5d 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -489,25 +489,32 @@ void Timeline::left_down (wxMouseEvent& ev) { shared_ptr view = event_to_view (ev); + shared_ptr content_view = dynamic_pointer_cast (view); _down_view.reset (); - if (view) { - shared_ptr cv = dynamic_pointer_cast (view); - if (cv) { - _down_view = cv; - _down_view_start = cv->content()->start (); - } + if (content_view) { + _down_view = content_view; + _down_view_start = content_view->content()->start (); } for (list >::iterator i = _views.begin(); i != _views.end(); ++i) { shared_ptr cv = dynamic_pointer_cast (*i); - if (cv) { + if (!cv) { + continue; + } + + if (!ev.ShiftDown ()) { cv->set_selected (view == *i); - if (view == *i) { - _film_editor->set_selection (cv->content ()); - } } + + if (view == *i) { + _film_editor->set_selection (cv->content ()); + } + } + + if (content_view && ev.ShiftDown ()) { + content_view->set_selected (!content_view->selected ()); } _left_down = true; @@ -618,8 +625,8 @@ Timeline::clear_selection () void Timeline::repeat (wxCommandEvent &) { - shared_ptr sel = selected (); - if (!sel) { + list > sel = selected (); + if (sel.empty ()) { return; } @@ -631,20 +638,27 @@ Timeline::repeat (wxCommandEvent &) return; } - film->playlist()->repeat (sel->content (), d.number ()); + list > content; + for (list >::iterator i = sel.begin(); i != sel.end(); ++i) { + content.push_back ((*i)->content ()); + } + + film->playlist()->repeat (content, d.number ()); d.Destroy (); } -shared_ptr +list > Timeline::selected () const { + list > sel; + for (list >::const_iterator i = _views.begin(); i != _views.end(); ++i) { shared_ptr cv = dynamic_pointer_cast (*i); if (cv && cv->selected()) { - return cv; + sel.push_back (cv); } } - return shared_ptr (); + return sel; } diff --git a/src/wx/timeline.h b/src/wx/timeline.h index a50f8e692..99094788f 100644 --- a/src/wx/timeline.h +++ b/src/wx/timeline.h @@ -76,7 +76,7 @@ private: void repeat (wxCommandEvent &); boost::shared_ptr event_to_view (wxMouseEvent &); - boost::shared_ptr selected () const; + std::list > selected () const; FilmEditor* _film_editor; boost::weak_ptr _film;