From 85be674b29dd61fe08a50f0b84c8402e9df61d94 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 30 Aug 2022 22:59:16 +0200 Subject: [PATCH] Refresh cinemas UI if the cinemas.xml file location is changed. --- src/lib/config.cc | 1 + src/wx/screens_panel.cc | 26 +++++++++++++++++++++++++- src/wx/screens_panel.h | 6 ++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/lib/config.cc b/src/lib/config.cc index cb2ec8885..c9b428571 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -1291,6 +1291,7 @@ Config::set_cinemas_file (boost::filesystem::path file) read_cinemas (f); } + changed (CINEMAS); changed (OTHER); } diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 5f903eda4..d5445b035 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -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(); + } +} + + diff --git a/src/wx/screens_panel.h b/src/wx/screens_panel.h index 7c72f5873..a91fbc0e0 100644 --- a/src/wx/screens_panel.h +++ b/src/wx/screens_panel.h @@ -19,6 +19,7 @@ */ +#include "lib/config.h" #include LIBDCP_DISABLE_WARNINGS #include @@ -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 item_to_cinema (wxTreeListItem item) const; std::shared_ptr 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; }; -- 2.30.2