Refresh cinemas UI if the cinemas.xml file location is changed.
authorCarl Hetherington <cth@carlh.net>
Tue, 30 Aug 2022 20:59:16 +0000 (22:59 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 30 Aug 2022 20:59:16 +0000 (22:59 +0200)
src/lib/config.cc
src/wx/screens_panel.cc
src/wx/screens_panel.h

index cb2ec8885569daf56736690c70b52b6f5b725905..c9b42857149a665da7fdc901c8fdfeb41751bf21 100644 (file)
@@ -1291,6 +1291,7 @@ Config::set_cinemas_file (boost::filesystem::path file)
                read_cinemas (f);
        }
 
+       changed (CINEMAS);
        changed (OTHER);
 }
 
index 5f903eda4851c22745e1935703225cfed54a7623..d5445b035a27c21aedcb7bf358617d48a337cf7d 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));
 }
 
 
@@ -501,7 +506,7 @@ ScreensPanel::add_cinemas ()
 
 
 void
-ScreensPanel::search_changed ()
+ScreensPanel::clear_and_re_add()
 {
        _targets->DeleteAllItems ();
 
@@ -511,6 +516,13 @@ ScreensPanel::search_changed ()
        _screen_to_item.clear ();
 
        add_cinemas ();
+}
+
+
+void
+ScreensPanel::search_changed ()
+{
+       clear_and_re_add();
 
        _ignore_selection_change = true;
 
@@ -668,6 +680,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 +694,12 @@ ScreensPanel::notify_cinemas_changed()
 }
 
 
+void
+ScreensPanel::config_changed(Config::Property property)
+{
+       if (property == Config::Property::CINEMAS && !_ignore_cinemas_changed) {
+               clear_and_re_add();
+       }
+}
+
+
index 7c72f587362eb0544e269aa87f1eb45518ccab4c..a91fbc0e055e41a49aa5c6e98dd753f4593e0083 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 
+#include "lib/config.h"
 #include <dcp/warnings.h>
 LIBDCP_DISABLE_WARNINGS
 #include <wx/srchctrl.h>
@@ -72,6 +73,8 @@ private:
        void check_all ();
        void uncheck_all ();
        bool notify_cinemas_changed();
+       void clear_and_re_add();
+       void config_changed(Config::Property);
 
        std::shared_ptr<Cinema> item_to_cinema (wxTreeListItem item) const;
        std::shared_ptr<dcpomatic::Screen> item_to_screen (wxTreeListItem item) const;
@@ -109,4 +112,7 @@ private:
        bool _ignore_check_change = false;
 
        UCollator* _collator = nullptr;
+
+       boost::signals2::scoped_connection _config_connection;
+       bool _ignore_cinemas_changed = false;
 };