}
}
+void
+Playlist::remove (ContentList c)
+{
+ for (ContentList::iterator i = c.begin(); i != c.end(); ++i) {
+ ContentList::iterator j = _content.begin ();
+ while (j != _content.end() && *j != *i) {
+ ++j;
+ }
+
+ if (j != _content.end ()) {
+ _content.erase (j);
+ }
+ }
+
+ Changed ();
+}
+
bool
Playlist::has_subtitles () const
{
}
/** @return content in an undefined order */
-Playlist::ContentList
+ContentList
Playlist::content () const
{
return _content;
}
void
-Playlist::repeat (list<shared_ptr<Content> > c, int n)
+Playlist::repeat (ContentList c, int n)
{
pair<Time, Time> range (TIME_MAX, 0);
- for (list<shared_ptr<Content> >::iterator i = c.begin(); i != c.end(); ++i) {
+ for (ContentList::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 ());
Time pos = range.second;
for (int i = 0; i < n; ++i) {
- for (list<shared_ptr<Content> >::iterator i = c.begin(); i != c.end(); ++i) {
+ for (ContentList::iterator i = c.begin(); i != c.end(); ++i) {
shared_ptr<Content> copy = (*i)->clone ();
copy->set_start (pos + copy->start() - range.first);
_content.push_back (copy);
_content->DeleteAllItems ();
- Playlist::ContentList content = _film->content ();
- for (Playlist::ContentList::iterator i = content.begin(); i != content.end(); ++i) {
+ ContentList content = _film->content ();
+ for (ContentList::iterator i = content.begin(); i != content.end(); ++i) {
int const t = _content->GetItemCount ();
_content->InsertItem (t, std_to_wx ((*i)->summary ()));
if ((*i)->summary() == selected_summary) {
return shared_ptr<Content> ();
}
- Playlist::ContentList c = _film->content ();
+ ContentList c = _film->content ();
if (s < 0 || size_t (s) >= c.size ()) {
return shared_ptr<Content> ();
}
void
FilmEditor::set_selection (weak_ptr<Content> wc)
{
- Playlist::ContentList content = _film->content ();
+ ContentList content = _film->content ();
for (size_t i = 0; i < content.size(); ++i) {
if (content[i] == wc.lock ()) {
_content->SetItemState (i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
, _track (t)
, _selected (false)
{
- _content_connection = c->Changed.connect (bind (&ContentView::content_changed, this, _2));
+ _content_connection = c->Changed.connect (bind (&ContentView::content_changed, this, _2, _3));
}
dcpomatic::Rect<int> bbox () const
return _timeline.tracks_position().y + t * _timeline.track_height();
}
- void content_changed (int p)
+ void content_changed (int p, bool frequent)
{
if (p == ContentProperty::START || p == ContentProperty::LENGTH) {
force_redraw ();
}
+
+ if (!frequent) {
+ _timeline.setup_pixels_per_time_unit ();
+ _timeline.Refresh ();
+ }
}
boost::weak_ptr<Content> _content;
};
enum {
- ID_repeat
+ ID_repeat,
+ ID_remove
};
Timeline::Timeline (wxWindow* parent, FilmEditor* ed, shared_ptr<Film> film)
Connect (wxID_ANY, wxEVT_RIGHT_DOWN, wxMouseEventHandler (Timeline::right_down), 0, this);
Connect (wxID_ANY, wxEVT_MOTION, wxMouseEventHandler (Timeline::mouse_moved), 0, this);
Connect (wxID_ANY, wxEVT_SIZE, wxSizeEventHandler (Timeline::resized), 0, this);
+
Connect (ID_repeat, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Timeline::repeat), 0, this);
+ Connect (ID_remove, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Timeline::remove), 0, this);
playlist_changed ();
gc->SetFont (gc->CreateFont (*wxNORMAL_FONT));
- for (list<shared_ptr<View> >::iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
(*i)->paint (gc);
}
_views.clear ();
_views.push_back (_time_axis_view);
- Playlist::ContentList content = fl->playlist()->content ();
+ ContentList content = fl->playlist()->content ();
- for (Playlist::ContentList::iterator i = content.begin(); i != content.end(); ++i) {
+ for (ContentList::iterator i = content.begin(); i != content.end(); ++i) {
if (dynamic_pointer_cast<VideoContent> (*i)) {
_views.push_back (shared_ptr<View> (new VideoContentView (*this, *i, 0)));
}
void
Timeline::assign_tracks ()
{
- for (list<shared_ptr<View> >::iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
if (cv) {
cv->set_track (0);
}
}
- for (list<shared_ptr<View> >::iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
shared_ptr<AudioContentView> acv = dynamic_pointer_cast<AudioContentView> (*i);
if (!acv) {
continue;
int t = 1;
while (1) {
- list<shared_ptr<View> >::iterator j = _views.begin();
+ ViewList::iterator j = _views.begin();
while (j != _views.end()) {
shared_ptr<AudioContentView> test = dynamic_pointer_cast<AudioContentView> (*j);
if (!test) {
shared_ptr<View>
Timeline::event_to_view (wxMouseEvent& ev)
{
- list<shared_ptr<View> >::iterator i = _views.begin();
+ ViewList::iterator i = _views.begin();
Position<int> const p (ev.GetX(), ev.GetY());
while (i != _views.end() && !(*i)->bbox().contains (p)) {
++i;
_down_view_start = content_view->content()->start ();
}
- for (list<shared_ptr<View> >::iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
if (!cv) {
continue;
if (!_menu) {
_menu = new wxMenu;
_menu->Append (ID_repeat, _("Repeat..."));
+ _menu->AppendSeparator ();
+ _menu->Append (ID_remove, _("Remove"));
}
PopupMenu (_menu, ev.GetPosition ());
void
Timeline::clear_selection ()
{
- for (list<shared_ptr<View> >::iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
if (cv) {
cv->set_selected (false);
void
Timeline::repeat (wxCommandEvent &)
{
- list<shared_ptr<ContentView> > sel = selected ();
+ ContentList sel = selected_content ();
if (sel.empty ()) {
return;
}
return;
}
- list<shared_ptr<Content> > content;
- for (list<shared_ptr<ContentView> >::iterator i = sel.begin(); i != sel.end(); ++i) {
- content.push_back ((*i)->content ());
+ film->playlist()->repeat (sel, d.number ());
+ d.Destroy ();
+}
+
+void
+Timeline::remove (wxCommandEvent &)
+{
+ ContentList sel = selected_content ();
+ if (sel.empty ()) {
+ return;
}
- film->playlist()->repeat (content, d.number ());
- d.Destroy ();
+ shared_ptr<const Film> film = _film.lock ();
+ if (!film) {
+ return;
+ }
+
+ film->playlist()->remove (sel);
}
-list<shared_ptr<ContentView> >
-Timeline::selected () const
+Timeline::ContentViewList
+Timeline::selected_views () const
{
- list<shared_ptr<ContentView> > sel;
+ ContentViewList sel;
- for (list<shared_ptr<View> >::const_iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (ViewList::const_iterator i = _views.begin(); i != _views.end(); ++i) {
shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
if (cv && cv->selected()) {
sel.push_back (cv);
return sel;
}
-
+
+ContentList
+Timeline::selected_content () const
+{
+ ContentList sel;
+ ContentViewList views = selected_views ();
+
+ for (ContentViewList::const_iterator i = views.begin(); i != views.end(); ++i) {
+ sel.push_back ((*i)->content ());
+ }
+
+ return sel;
+}
int tracks () const;
+ void setup_pixels_per_time_unit ();
+
private:
void paint (wxPaintEvent &);
void left_down (wxMouseEvent &);
void right_down (wxMouseEvent &);
void mouse_moved (wxMouseEvent &);
void playlist_changed ();
- void setup_pixels_per_time_unit ();
void resized (wxSizeEvent &);
void assign_tracks ();
void set_start_from_event (wxMouseEvent &);
void clear_selection ();
+
void repeat (wxCommandEvent &);
+ void remove (wxCommandEvent &);
+
+ typedef std::vector<boost::shared_ptr<View> > ViewList;
+ typedef std::vector<boost::shared_ptr<ContentView> > ContentViewList;
boost::shared_ptr<View> event_to_view (wxMouseEvent &);
- std::list<boost::shared_ptr<ContentView> > selected () const;
+ ContentViewList selected_views () const;
+ ContentList selected_content () const;
FilmEditor* _film_editor;
boost::weak_ptr<Film> _film;
- std::list<boost::shared_ptr<View> > _views;
+ ViewList _views;
boost::shared_ptr<TimeAxisView> _time_axis_view;
int _tracks;
double _pixels_per_time_unit;