Keep maps of wxTreeListItem to Cinema/Screen.
authorCarl Hetherington <cth@carlh.net>
Thu, 17 Mar 2022 23:57:42 +0000 (00:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 18 Mar 2022 21:50:23 +0000 (22:50 +0100)
src/wx/screens_panel.cc
src/wx/screens_panel.h

index f255d441325ced7d636c29c51468e221e5dcd840..8cdba50d446bf15f4599f0a0aacb067e309d19f5 100644 (file)
@@ -143,6 +143,7 @@ ScreensPanel::add_cinema (shared_ptr<Cinema> cinema)
        auto id = _targets->AppendItem(_targets->GetRootItem(), std_to_wx(cinema->name));
 
        _cinemas.push_back(make_pair(id, cinema));
+       _item_to_cinema[id] = cinema;
 
        for (auto screen: cinema->screens()) {
                add_screen (cinema, screen);
@@ -164,7 +165,11 @@ ScreensPanel::add_screen (shared_ptr<Cinema> cinema, shared_ptr<Screen> screen)
                return {};
        }
 
-       _screens.push_back(make_pair(_targets->AppendItem(cinema_iter->first, std_to_wx(screen->name)), screen));
+       auto id = _targets->AppendItem(cinema_iter->first, std_to_wx(screen->name));
+
+       _screens.push_back(make_pair(id, screen));
+       _item_to_screen[id] = screen;
+
        return cinema_iter->first;
 }
 
@@ -380,9 +385,8 @@ ScreensPanel::screens () const
 
        for (auto item = _targets->GetFirstItem(); item.IsOk(); item = _targets->GetNextItem(item)) {
                if (_targets->GetCheckedState(item) == wxCHK_CHECKED) {
-                       auto screen_iter = screen_by_tree_list_item(item);
-                       if (screen_iter != _screens.end()) {
-                               output.push_back (screen_iter->second);
+                       if (auto screen = item_to_screen(item)) {
+                               output.push_back (screen);
                        }
                }
        }
@@ -412,13 +416,11 @@ ScreensPanel::selection_changed ()
        _selected_screens.clear ();
 
        for (size_t i = 0; i < selection.size(); ++i) {
-               auto cinema = cinema_by_tree_list_item(selection[i]);
-               if (cinema != _cinemas.end ()) {
-                       _selected_cinemas.push_back(*cinema);
+               if (auto cinema = item_to_cinema(selection[i])) {
+                       _selected_cinemas.push_back(make_pair(selection[i], cinema));
                }
-               auto screen = screen_by_tree_list_item(selection[i]);
-               if (screen != _screens.end ()) {
-                       _selected_screens.push_back(*screen);
+               if (auto screen = item_to_screen(selection[i])) {
+                       _selected_screens.push_back(make_pair(selection[i], screen));
                }
        }
 
@@ -442,6 +444,8 @@ ScreensPanel::search_changed ()
        _cinemas.clear ();
        _screens.clear ();
 
+       _item_to_cinema.clear ();
+       _item_to_screen.clear ();
        add_cinemas ();
 
        _ignore_selection_change = true;
@@ -476,8 +480,7 @@ ScreensPanel::search_changed ()
 void
 ScreensPanel::checkbox_changed (wxTreeListEvent& ev)
 {
-       auto cinema_iter = cinema_by_tree_list_item(ev.GetItem());
-       if (cinema_iter != _cinemas.end()) {
+       if (item_to_cinema(ev.GetItem())) {
                /* Cinema: check/uncheck all children */
                auto const checked = _targets->GetCheckedState(ev.GetItem());
                for (auto child = _targets->GetFirstChild(ev.GetItem()); child.IsOk(); child = _targets->GetNextSibling(child)) {
@@ -509,23 +512,27 @@ ScreensPanel::checkbox_changed (wxTreeListEvent& ev)
 }
 
 
-ScreensPanel::Cinemas::iterator
-ScreensPanel::cinema_by_tree_list_item (wxTreeListItem item)
+shared_ptr<Cinema>
+ScreensPanel::item_to_cinema (wxTreeListItem item) const
 {
-       return std::find_if(
-               _cinemas.begin(), _cinemas.end(),
-               [item](pair<wxTreeListItem, shared_ptr<Cinema>> const& s) { return s.first == item; }
-               );
+       auto iter = _item_to_cinema.find (item);
+       if (iter == _item_to_cinema.end()) {
+               return {};
+       }
+
+       return iter->second;
 }
 
 
-ScreensPanel::Screens::const_iterator
-ScreensPanel::screen_by_tree_list_item (wxTreeListItem item) const
+shared_ptr<Screen>
+ScreensPanel::item_to_screen (wxTreeListItem item) const
 {
-       return std::find_if(
-               _screens.begin(), _screens.end(),
-               [item](pair<wxTreeListItem, shared_ptr<Screen>> const& s) { return s.first == item; }
-               );
+       auto iter = _item_to_screen.find (item);
+       if (iter == _item_to_screen.end()) {
+               return {};
+       }
+
+       return iter->second;
 }
 
 
index 4b7a801413a5c3e3d5b80c5a17ce1b241dcc3c29..78023264af47660455692b0407bda7e54c2941da 100644 (file)
@@ -69,8 +69,8 @@ private:
        typedef std::vector<std::pair<wxTreeListItem, std::shared_ptr<Cinema>>> Cinemas;
        typedef std::vector<std::pair<wxTreeListItem, std::shared_ptr<dcpomatic::Screen>>> Screens;
 
-       Cinemas::iterator cinema_by_tree_list_item (wxTreeListItem item);
-       Screens::const_iterator screen_by_tree_list_item (wxTreeListItem item) const;
+       std::shared_ptr<Cinema> item_to_cinema (wxTreeListItem item) const;
+       std::shared_ptr<dcpomatic::Screen> item_to_screen (wxTreeListItem item) const;
 
        wxSearchCtrl* _search;
        wxTreeListCtrl* _targets;
@@ -86,6 +86,9 @@ private:
        Cinemas _selected_cinemas;
        Screens _selected_screens;
 
+       std::map<wxTreeListItem, std::shared_ptr<Cinema>> _item_to_cinema;
+       std::map<wxTreeListItem, std::shared_ptr<dcpomatic::Screen>> _item_to_screen;
+
        bool _ignore_selection_change;
 
        class Comparator : public wxTreeListItemComparator