From f1f30972e5d1dee08a607a05b6d782540c11595e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 11 Mar 2022 23:34:00 +0100 Subject: [PATCH] Use a vector> to store screens and cinemas instead of a map. In this way, ordering will be preserved (part of #2208). --- src/wx/screens_panel.cc | 42 ++++++++++++++++++++++++++++++----------- src/wx/screens_panel.h | 21 +++++++++++++-------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 90fb71246..2075515f3 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -137,7 +137,7 @@ ScreensPanel::add_cinema (shared_ptr cinema) auto id = _targets->AppendItem(_targets->GetRootItem(), std_to_wx(cinema->name)); - _cinemas[id] = cinema; + _cinemas.push_back(make_pair(id, cinema)); for (auto screen: cinema->screens()) { add_screen (cinema, screen); @@ -159,7 +159,7 @@ ScreensPanel::add_screen (shared_ptr cinema, shared_ptr screen) return {}; } - _screens[_targets->AppendItem(cinema_iter->first, std_to_wx(screen->name))] = screen; + _screens.push_back(make_pair(_targets->AppendItem(cinema_iter->first, std_to_wx(screen->name)), screen)); return cinema_iter->first; } @@ -375,7 +375,7 @@ ScreensPanel::screens () const for (auto item = _targets->GetFirstItem(); item.IsOk(); item = _targets->GetNextItem(item)) { if (_targets->GetCheckedState(item) == wxCHK_CHECKED) { - auto screen_iter = _screens.find(item); + auto screen_iter = screen_by_tree_list_item(item); if (screen_iter != _screens.end()) { output.push_back (screen_iter->second); } @@ -400,20 +400,20 @@ ScreensPanel::selection_changed () return; } - wxTreeListItems s; - _targets->GetSelections (s); + wxTreeListItems selection; + _targets->GetSelections (selection); _selected_cinemas.clear (); _selected_screens.clear (); - for (size_t i = 0; i < s.size(); ++i) { - auto cinema = _cinemas.find (s[i]); + for (size_t i = 0; i < selection.size(); ++i) { + auto cinema = cinema_by_tree_list_item(selection[i]); if (cinema != _cinemas.end ()) { - _selected_cinemas[cinema->first] = cinema->second; + _selected_cinemas.push_back(*cinema); } - auto screen = _screens.find (s[i]); + auto screen = screen_by_tree_list_item(selection[i]); if (screen != _screens.end ()) { - _selected_screens[screen->first] = screen->second; + _selected_screens.push_back(*screen); } } @@ -471,7 +471,8 @@ ScreensPanel::search_changed () void ScreensPanel::checkbox_changed (wxTreeListEvent& ev) { - if (_cinemas.find(ev.GetItem()) != _cinemas.end()) { + auto cinema_iter = cinema_by_tree_list_item(ev.GetItem()); + if (cinema_iter != _cinemas.end()) { /* 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)) { @@ -503,3 +504,22 @@ ScreensPanel::checkbox_changed (wxTreeListEvent& ev) } +ScreensPanel::Cinemas::iterator +ScreensPanel::cinema_by_tree_list_item (wxTreeListItem item) +{ + return std::find_if( + _cinemas.begin(), _cinemas.end(), + [item](pair> const& s) { return s.first == item; } + ); +} + + +ScreensPanel::Screens::const_iterator +ScreensPanel::screen_by_tree_list_item (wxTreeListItem item) const +{ + return std::find_if( + _screens.begin(), _screens.end(), + [item](pair> const& s) { return s.first == item; } + ); +} + diff --git a/src/wx/screens_panel.h b/src/wx/screens_panel.h index fc7e9751c..c0b90dfcf 100644 --- a/src/wx/screens_panel.h +++ b/src/wx/screens_panel.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Carl Hetherington + Copyright (C) 2015-2022 Carl Hetherington This file is part of DCP-o-matic. @@ -18,6 +18,7 @@ */ + #include "lib/warnings.h" DCPOMATIC_DISABLE_WARNINGS #include @@ -28,6 +29,7 @@ DCPOMATIC_ENABLE_WARNINGS #include #include + namespace dcpomatic { class Screen; } @@ -63,6 +65,12 @@ private: void checkbox_changed (wxTreeListEvent& ev); boost::optional>> cinema_for_operation () const; + typedef std::vector>> Cinemas; + typedef std::vector>> Screens; + + Cinemas::iterator cinema_by_tree_list_item (wxTreeListItem item); + Screens::const_iterator screen_by_tree_list_item (wxTreeListItem item) const; + wxSearchCtrl* _search; wxTreeListCtrl* _targets; wxButton* _add_cinema; @@ -72,13 +80,10 @@ private: wxButton* _edit_screen; wxButton* _remove_screen; - typedef std::map> CinemaMap; - typedef std::map> ScreenMap; - - CinemaMap _cinemas; - ScreenMap _screens; - CinemaMap _selected_cinemas; - ScreenMap _selected_screens; + Cinemas _cinemas; + Screens _screens; + Cinemas _selected_cinemas; + Screens _selected_screens; bool _ignore_selection_change; -- 2.30.2