X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fscreens_panel.cc;h=562ea8f3895d0d67423ee135ae8b76bf4ef35900;hb=09287979ce90e809880cd17fb20deb23669f68e4;hp=5f903eda4851c22745e1935703225cfed54a7623;hpb=6b9450088fc7dc119476f72b2faaee1ed417db53;p=dcpomatic.git diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 5f903eda4..562ea8f38 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)); } @@ -238,24 +243,28 @@ 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())); return; } - optional item; + wxTreeListItem previous = wxTLI_FIRST; + bool found = false; for (auto existing_cinema: cinemas) { - if (!item && compare(dialog->name(), existing_cinema->name) < 0) { - if (auto existing_item = cinema_to_item(existing_cinema)) { - item = add_cinema (cinema, *existing_item); - } + if (compare(dialog->name(), existing_cinema->name) < 0) { + /* existing_cinema should be after the one we're inserting */ + found = true; + break; } + auto item = cinema_to_item(existing_cinema); + DCPOMATIC_ASSERT(item); + previous = *item; } - if (!item) { - item = add_cinema (cinema, wxTLI_LAST); - } + auto item = add_cinema(cinema, found ? previous : wxTLI_LAST); if (item) { _targets->UnselectAll (); @@ -321,6 +330,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 +512,7 @@ ScreensPanel::add_cinemas () void -ScreensPanel::search_changed () +ScreensPanel::clear_and_re_add() { _targets->DeleteAllItems (); @@ -511,6 +522,13 @@ ScreensPanel::search_changed () _screen_to_item.clear (); add_cinemas (); +} + + +void +ScreensPanel::search_changed () +{ + clear_and_re_add(); _ignore_selection_change = true; @@ -668,6 +686,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 +700,12 @@ ScreensPanel::notify_cinemas_changed() } +void +ScreensPanel::config_changed(Config::Property property) +{ + if (property == Config::Property::CINEMAS && !_ignore_cinemas_changed) { + clear_and_re_add(); + } +} + +