Fix previous.
[dcpomatic.git] / src / wx / screens_panel.cc
index 5f903eda4851c22745e1935703225cfed54a7623..10adad7e53b78cc44839704beac00104529fbc35 100644 (file)
@@ -45,6 +45,9 @@ using std::shared_ptr;
 using std::string;
 using std::vector;
 using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
 using namespace dcpomatic;
 
 
@@ -124,6 +127,8 @@ ScreensPanel::ScreensPanel (wxWindow* parent)
                ucol_setAttribute(_collator, UCOL_STRENGTH, UCOL_PRIMARY, &status);
                ucol_setAttribute(_collator, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
        }
+
+       _config_connection = Config::instance()->Changed.connect(boost::bind(&ScreensPanel::config_changed, this, _1));
 }
 
 
@@ -238,6 +243,8 @@ ScreensPanel::add_cinema_clicked ()
                        );
 
                try {
+                       _ignore_cinemas_changed = true;
+                       ScopeGuard sg = [this]() { _ignore_cinemas_changed = false; };
                        Config::instance()->add_cinema(cinema);
                } catch (FileError& e) {
                        error_dialog(GetParent(), _("Could not write cinema details to the cinemas.xml file.  Check that the location of cinemas.xml is valid in DCP-o-matic's preferences."), std_to_wx(e.what()));
@@ -321,6 +328,8 @@ ScreensPanel::remove_cinema_clicked ()
        }
 
        for (auto const& cinema: _selected_cinemas) {
+               _ignore_cinemas_changed = true;
+               ScopeGuard sg = [this]() { _ignore_cinemas_changed = false; };
                Config::instance()->remove_cinema(cinema);
                auto item = cinema_to_item(cinema);
                DCPOMATIC_ASSERT(item);
@@ -501,7 +510,7 @@ ScreensPanel::add_cinemas ()
 
 
 void
-ScreensPanel::search_changed ()
+ScreensPanel::clear_and_re_add()
 {
        _targets->DeleteAllItems ();
 
@@ -511,6 +520,13 @@ ScreensPanel::search_changed ()
        _screen_to_item.clear ();
 
        add_cinemas ();
+}
+
+
+void
+ScreensPanel::search_changed ()
+{
+       clear_and_re_add();
 
        _ignore_selection_change = true;
 
@@ -668,6 +684,9 @@ ScreensPanel::compare (string const& utf8_a, string const& utf8_b)
 bool
 ScreensPanel::notify_cinemas_changed()
 {
+       _ignore_cinemas_changed = true;
+       ScopeGuard sg = [this]() { _ignore_cinemas_changed = false; };
+
        try {
                Config::instance()->changed(Config::CINEMAS);
        } catch (FileError& e) {
@@ -679,3 +698,12 @@ ScreensPanel::notify_cinemas_changed()
 }
 
 
+void
+ScreensPanel::config_changed(Config::Property property)
+{
+       if (property == Config::Property::CINEMAS && !_ignore_cinemas_changed) {
+               clear_and_re_add();
+       }
+}
+
+