Fix crash when adding cinemas while a search is in force (#2378).
[dcpomatic.git] / src / wx / screens_panel.cc
index a726030ade2049e34a3575e9398acde44ee2a2f7..1d94d1acb9f8027a571403d1811698bdbb73f2ac 100644 (file)
@@ -32,6 +32,7 @@
 
 
 using std::cout;
+using std::list;
 using std::make_pair;
 using std::make_shared;
 using std::map;
@@ -167,18 +168,33 @@ ScreensPanel::setup_sensitivity ()
 }
 
 
+void
+ScreensPanel::convert_to_lower(string& s)
+{
+       transform(s.begin(), s.end(), s.begin(), ::tolower);
+}
+
+
+bool
+ScreensPanel::matches_search(shared_ptr<const Cinema> cinema, string lower_case_search)
+{
+       if (lower_case_search.empty()) {
+               return true;
+       }
+
+       auto name = cinema->name;
+       convert_to_lower(name);
+       return name.find(lower_case_search) != string::npos;
+}
+
+
 optional<wxTreeListItem>
 ScreensPanel::add_cinema (shared_ptr<Cinema> cinema, wxTreeListItem previous)
 {
        auto search = wx_to_std (_search->GetValue ());
-       transform (search.begin(), search.end(), search.begin(), ::tolower);
-
-       if (!search.empty ()) {
-               auto name = cinema->name;
-               transform (name.begin(), name.end(), name.begin(), ::tolower);
-               if (name.find (search) == string::npos) {
-                       return {};
-               }
+       convert_to_lower(search);
+       if (!matches_search(cinema, search)) {
+               return {};
        }
 
        auto id = _targets->InsertItem(_targets->GetRootItem(), previous, std_to_wx(cinema->name));
@@ -220,10 +236,7 @@ ScreensPanel::add_cinema_clicked ()
        if (dialog->ShowModal() == wxID_OK) {
                auto cinema = make_shared<Cinema>(dialog->name(), dialog->emails(), dialog->notes(), dialog->utc_offset_hour(), dialog->utc_offset_minute());
 
-               auto cinemas = Config::instance()->cinemas();
-               cinemas.sort(
-                       [this](shared_ptr<Cinema> a, shared_ptr<Cinema> b) { return _collator.compare(a->name, b->name) < 0; }
-                       );
+               auto cinemas = sorted_cinemas();
 
                try {
                        _ignore_cinemas_changed = true;
@@ -236,7 +249,12 @@ ScreensPanel::add_cinema_clicked ()
 
                wxTreeListItem previous = wxTLI_FIRST;
                bool found = false;
+               auto search = wx_to_std(_search->GetValue());
+               convert_to_lower(search);
                for (auto existing_cinema: cinemas) {
+                       if (!matches_search(existing_cinema, search)) {
+                               continue;
+                       }
                        if (_collator.compare(dialog->name(), existing_cinema->name) < 0) {
                                /* existing_cinema should be after the one we're inserting */
                                found = true;
@@ -480,15 +498,23 @@ ScreensPanel::selection_changed ()
 }
 
 
-void
-ScreensPanel::add_cinemas ()
+list<shared_ptr<Cinema>>
+ScreensPanel::sorted_cinemas() const
 {
        auto cinemas = Config::instance()->cinemas();
+
        cinemas.sort(
                [this](shared_ptr<Cinema> a, shared_ptr<Cinema> b) { return _collator.compare(a->name, b->name) < 0; }
                );
 
-       for (auto cinema: cinemas) {
+       return cinemas;
+}
+
+
+void
+ScreensPanel::add_cinemas ()
+{
+       for (auto cinema: sorted_cinemas()) {
                add_cinema (cinema, wxTLI_LAST);
        }
 }