Merge branch 'master' of ssh://git.carlh.net/home/carl/git/dcpomatic
[dcpomatic.git] / src / lib / playlist.cc
index a55893291138d4b46a0b3b20d43d898349db1624..e4fc0f0723df7e100229dd1765d8ee831ba4c7da 100644 (file)
@@ -65,36 +65,38 @@ Playlist::~Playlist ()
 }
 
 void
-Playlist::content_changed (weak_ptr<Content> content, int property, bool frequent)
+Playlist::content_change (ChangeType type, weak_ptr<Content> content, int property, bool frequent)
 {
-       if (
-               property == ContentProperty::TRIM_START ||
-               property == ContentProperty::TRIM_END ||
-               property == ContentProperty::LENGTH ||
-               property == VideoContentProperty::FRAME_TYPE
-               ) {
-               /* Don't respond to position changes here, as:
-                  - sequencing after earlier/later changes is handled by move_earlier/move_later
-                  - any other position changes will be timeline drags which should not result in content
-                  being sequenced.
-               */
-               maybe_sequence ();
-       }
-
-       if (
-               property == ContentProperty::POSITION ||
-               property == ContentProperty::LENGTH ||
-               property == ContentProperty::TRIM_START ||
-               property == ContentProperty::TRIM_END) {
-
-               ContentList old = _content;
-               sort (_content.begin(), _content.end(), ContentSorter ());
-               if (_content != old) {
-                       OrderChanged ();
+       if (type == CHANGE_TYPE_DONE) {
+               if (
+                       property == ContentProperty::TRIM_START ||
+                       property == ContentProperty::TRIM_END ||
+                       property == ContentProperty::LENGTH ||
+                       property == VideoContentProperty::FRAME_TYPE
+                       ) {
+                       /* Don't respond to position changes here, as:
+                          - sequencing after earlier/later changes is handled by move_earlier/move_later
+                          - any other position changes will be timeline drags which should not result in content
+                          being sequenced.
+                       */
+                       maybe_sequence ();
+               }
+
+               if (
+                       property == ContentProperty::POSITION ||
+                       property == ContentProperty::LENGTH ||
+                       property == ContentProperty::TRIM_START ||
+                       property == ContentProperty::TRIM_END) {
+
+                       ContentList old = _content;
+                       sort (_content.begin(), _content.end(), ContentSorter ());
+                       if (_content != old) {
+                               OrderChanged ();
+                       }
                }
        }
 
-       ContentChanged (content, property, frequent);
+       ContentChange (type, content, property, frequent);
 }
 
 void
@@ -135,7 +137,7 @@ Playlist::maybe_sequence ()
 
        DCPTime next;
        BOOST_FOREACH (shared_ptr<Content> i, _content) {
-               if (i->caption.empty() || find (placed.begin(), placed.end(), i) != placed.end()) {
+               if (i->text.empty() || find (placed.begin(), placed.end(), i) != placed.end()) {
                        continue;
                }
 
@@ -156,7 +158,7 @@ Playlist::video_identifier () const
 
        BOOST_FOREACH (shared_ptr<const Content> i, _content) {
                bool burn = false;
-               BOOST_FOREACH (shared_ptr<TextContent> j, i->caption) {
+               BOOST_FOREACH (shared_ptr<TextContent> j, i->text) {
                        if (j->burn()) {
                                burn = true;
                        }
@@ -203,15 +205,18 @@ Playlist::as_xml (xmlpp::Node* node, bool with_content_paths)
 void
 Playlist::add (shared_ptr<Content> c)
 {
+       Change (CHANGE_TYPE_PENDING);
        _content.push_back (c);
        sort (_content.begin(), _content.end(), ContentSorter ());
        reconnect ();
-       Changed ();
+       Change (CHANGE_TYPE_DONE);
 }
 
 void
 Playlist::remove (shared_ptr<Content> c)
 {
+       Change (CHANGE_TYPE_PENDING);
+
        ContentList::iterator i = _content.begin ();
        while (i != _content.end() && *i != c) {
                ++i;
@@ -219,7 +224,9 @@ Playlist::remove (shared_ptr<Content> c)
 
        if (i != _content.end ()) {
                _content.erase (i);
-               Changed ();
+               Change (CHANGE_TYPE_DONE);
+       } else {
+               Change (CHANGE_TYPE_CANCELLED);
        }
 
        /* This won't change order, so it does not need a sort */
@@ -228,6 +235,8 @@ Playlist::remove (shared_ptr<Content> c)
 void
 Playlist::remove (ContentList c)
 {
+       Change (CHANGE_TYPE_PENDING);
+
        BOOST_FOREACH (shared_ptr<Content> i, c) {
                ContentList::iterator j = _content.begin ();
                while (j != _content.end() && *j != i) {
@@ -241,7 +250,7 @@ Playlist::remove (ContentList c)
 
        /* This won't change order, so it does not need a sort */
 
-       Changed ();
+       Change (CHANGE_TYPE_DONE);
 }
 
 class FrameRateCandidate
@@ -350,7 +359,7 @@ Playlist::reconnect ()
        _content_connections.clear ();
 
        BOOST_FOREACH (shared_ptr<Content> i, _content) {
-               _content_connections.push_back (i->Changed.connect (bind (&Playlist::content_changed, this, _1, _2, _3)));
+               _content_connections.push_back (i->Change.connect(boost::bind(&Playlist::content_change, this, _1, _2, _3, _4)));
        }
 }
 
@@ -368,11 +377,11 @@ Playlist::video_end () const
 }
 
 DCPTime
-Playlist::caption_end () const
+Playlist::text_end () const
 {
        DCPTime end;
        BOOST_FOREACH (shared_ptr<Content> i, _content) {
-               if (!i->caption.empty ()) {
+               if (!i->text.empty ()) {
                        end = max (end, i->end ());
                }
        }
@@ -447,6 +456,8 @@ Playlist::repeat (ContentList c, int n)
                range.second = max (range.second, i->end ());
        }
 
+       Change (CHANGE_TYPE_PENDING);
+
        DCPTime pos = range.second;
        for (int i = 0; i < n; ++i) {
                BOOST_FOREACH (shared_ptr<Content> j, c) {
@@ -460,7 +471,7 @@ Playlist::repeat (ContentList c, int n)
        sort (_content.begin(), _content.end(), ContentSorter ());
 
        reconnect ();
-       Changed ();
+       Change (CHANGE_TYPE_DONE);
 }
 
 void