Check for conflicing refer-to-DCP settings.
authorCarl Hetherington <cth@carlh.net>
Wed, 17 Aug 2016 14:36:00 +0000 (15:36 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 17 Aug 2016 14:36:00 +0000 (15:36 +0100)
This adds a general fix_conflicting_settings() to Film which should
fix the problem and give a message to tell the user why the "fix"
is being carried out.  Should help with #929.

ChangeLog
src/lib/film.cc
src/lib/film.h
src/wx/film_editor.cc

index 78d198ffa376ddc0e6eed5e04cd99ac23094c74c..cbb2d00bfd4f22632adf38c60f47f026e365ffb1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2016-08-17  c.hetherington  <cth@carlh.net>
 
+       * Spot and "fix" impossible refer-to-DCP settings (#929).
+
        * Label tweak to clarify how JPEG2000 bandwidth control works (#904).
 
        * Scroll audio mapping view labels correctly (#919).
index 7d183d03226e4a2ef73e68c79e2ef2cccb02f6d4..edb9112177ef7362fdc5da2585a7565552c1772a 100644 (file)
@@ -1451,3 +1451,39 @@ Film::content_summary (DCPTimePeriod period) const
 {
        return _playlist->content_summary (period);
 }
+
+list<string>
+Film::fix_conflicting_settings ()
+{
+       list<string> notes;
+
+       list<boost::filesystem::path> was_referencing;
+       BOOST_FOREACH (shared_ptr<Content> i, content()) {
+               shared_ptr<DCPContent> d = dynamic_pointer_cast<DCPContent> (i);
+               if (d) {
+                       list<string> reasons;
+                       bool was = false;
+                       if (!d->can_reference_video(reasons) && d->reference_video()) {
+                               d->set_reference_video (false);
+                               was = true;
+                       }
+                       if (!d->can_reference_audio(reasons) && d->reference_audio()) {
+                               d->set_reference_audio (false);
+                               was = true;
+                       }
+                       if (!d->can_reference_subtitle(reasons) && d->reference_subtitle()) {
+                               d->set_reference_subtitle (false);
+                               was = true;
+                       }
+                       if (was) {
+                               was_referencing.push_back (d->path(0).parent_path().filename());
+                       }
+               }
+       }
+
+       BOOST_FOREACH (boost::filesystem::path d, was_referencing) {
+               notes.push_back (String::compose (_("The DCP %1 was being referred to by this film.  This not now possible because the reel sizes in the film no longer agree with those in the imported DCP.\n\nSetting the 'Reel type' to 'split by video content' will probably help.\n\nAfter doing that you would need to re-tick the appropriate 'refer to existing DCP' checkboxes."), d.string()));
+       }
+
+       return notes;
+}
index d63065f8df3fe6facba393a151e1792388f49e42..82d1f78c043fe21329a0c80a1d74ff0e4921a1ad 100644 (file)
@@ -164,6 +164,8 @@ public:
         */
        std::string content_summary (DCPTimePeriod period) const;
 
+       std::list<std::string> fix_conflicting_settings ();
+
        /** Identifiers for the parts of our state;
            used for signalling changes.
        */
index 822ae286a8f2989cc96db377fa9125eefcb8efff..a5e1e82e9b5ed747d4847d7e52bd2550cee1886c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "content_panel.h"
 #include <wx/wx.h>
 #include <wx/notebook.h>
+#include <boost/foreach.hpp>
 #include <iostream>
 
 using std::cout;
 using std::string;
+using std::list;
 using boost::shared_ptr;
 using boost::optional;
 
@@ -75,6 +77,11 @@ FilmEditor::film_changed (Film::Property p)
                return;
        }
 
+       list<string> notes = _film->fix_conflicting_settings ();
+       BOOST_FOREACH (string i, notes) {
+               message_dialog (this, std_to_wx (i));
+       }
+
        _content_panel->film_changed (p);
        _dcp_panel->film_changed (p);