C++11 tidying.
[dcpomatic.git] / src / wx / screens_panel.cc
index 5541d46d4639f6dd31a4e40d32548b9833953322..8d631ce905257d7ef625c34c74abc81459d19fb5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2015-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2015-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -18,6 +18,7 @@
 
 */
 
+
 #include "screens_panel.h"
 #include "wx_util.h"
 #include "cinema_dialog.h"
@@ -26,7 +27,7 @@
 #include "lib/config.h"
 #include "lib/cinema.h"
 #include "lib/screen.h"
-#include <boost/foreach.hpp>
+
 
 using std::list;
 using std::pair;
@@ -34,10 +35,12 @@ using std::cout;
 using std::map;
 using std::string;
 using std::make_pair;
-using boost::shared_ptr;
+using std::make_shared;
+using std::shared_ptr;
 using boost::optional;
 using namespace dcpomatic;
 
+
 ScreensPanel::ScreensPanel (wxWindow* parent)
        : wxPanel (parent, wxID_ANY)
        , _ignore_selection_change (false)
@@ -57,13 +60,13 @@ ScreensPanel::ScreensPanel (wxWindow* parent)
 #endif
        sizer->Add (_search, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP);
 
-       wxBoxSizer* targets = new wxBoxSizer (wxHORIZONTAL);
-       _targets = new wxTreeCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_HIDE_ROOT | wxTR_MULTIPLE | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT);
+       auto targets = new wxBoxSizer (wxHORIZONTAL);
+       _targets = new TreeCtrl (this);
        targets->Add (_targets, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP);
 
        add_cinemas ();
 
-       wxBoxSizer* target_buttons = new wxBoxSizer (wxVERTICAL);
+       auto target_buttons = new wxBoxSizer (wxVERTICAL);
 
        _add_cinema = new Button (this, _("Add Cinema..."));
        target_buttons->Add (_add_cinema, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
@@ -96,11 +99,13 @@ ScreensPanel::ScreensPanel (wxWindow* parent)
        SetSizer (sizer);
 }
 
+
 ScreensPanel::~ScreensPanel ()
 {
        _targets->Unbind (wxEVT_TREE_SEL_CHANGED, &ScreensPanel::selection_changed_shim, this);
 }
 
+
 void
 ScreensPanel::setup_sensitivity ()
 {
@@ -115,59 +120,70 @@ ScreensPanel::setup_sensitivity ()
        _remove_screen->Enable (_selected_screens.size() >= 1);
 }
 
-void
+
+optional<wxTreeItemId>
 ScreensPanel::add_cinema (shared_ptr<Cinema> c)
 {
-       string search = wx_to_std (_search->GetValue ());
+       auto search = wx_to_std (_search->GetValue ());
        transform (search.begin(), search.end(), search.begin(), ::tolower);
 
        if (!search.empty ()) {
-               string name = c->name;
+               auto name = c->name;
                transform (name.begin(), name.end(), name.begin(), ::tolower);
                if (name.find (search) == string::npos) {
-                       return;
+                       return optional<wxTreeItemId>();
                }
        }
 
-       _cinemas[_targets->AppendItem (_root, std_to_wx (c->name))] = c;
+       auto id = _targets->AppendItem(_root, std_to_wx(c->name));
 
-       list<shared_ptr<Screen> > sc = c->screens ();
-       for (list<shared_ptr<Screen> >::iterator i = sc.begin(); i != sc.end(); ++i) {
-               add_screen (c, *i);
+       _cinemas[id] = c;
+
+       for (auto i: c->screens()) {
+               add_screen (c, i);
        }
 
        _targets->SortChildren (_root);
+
+       return id;
 }
 
+
 optional<wxTreeItemId>
 ScreensPanel::add_screen (shared_ptr<Cinema> c, shared_ptr<Screen> s)
 {
-       CinemaMap::const_iterator i = _cinemas.begin();
+       auto i = _cinemas.begin();
        while (i != _cinemas.end() && i->second != c) {
                ++i;
        }
 
        if (i == _cinemas.end()) {
-               return optional<wxTreeItemId> ();
+               return {};
        }
 
        _screens[_targets->AppendItem (i->first, std_to_wx (s->name))] = s;
        return i->first;
 }
 
+
 void
 ScreensPanel::add_cinema_clicked ()
 {
-       CinemaDialog* d = new CinemaDialog (GetParent(), _("Add Cinema"));
+       auto d = new CinemaDialog (GetParent(), _("Add Cinema"));
        if (d->ShowModal () == wxID_OK) {
-               shared_ptr<Cinema> c (new Cinema (d->name(), d->emails(), d->notes(), d->utc_offset_hour(), d->utc_offset_minute()));
+               auto c = make_shared<Cinema>(d->name(), d->emails(), d->notes(), d->utc_offset_hour(), d->utc_offset_minute());
                Config::instance()->add_cinema (c);
-               add_cinema (c);
+               auto id = add_cinema (c);
+               if (id) {
+                       _targets->Unselect ();
+                       _targets->SelectItem (*id);
+               }
        }
 
        d->Destroy ();
 }
 
+
 void
 ScreensPanel::edit_cinema_clicked ()
 {
@@ -175,13 +191,13 @@ ScreensPanel::edit_cinema_clicked ()
                return;
        }
 
-       pair<wxTreeItemId, shared_ptr<Cinema> > c = *_selected_cinemas.begin();
+       auto c = *_selected_cinemas.begin();
 
-       CinemaDialog* d = new CinemaDialog (
+       auto d = new CinemaDialog (
                GetParent(), _("Edit cinema"), c.second->name, c.second->emails, c.second->notes, c.second->utc_offset_hour(), c.second->utc_offset_minute()
                );
 
-       if (d->ShowModal () == wxID_OK) {
+       if (d->ShowModal() == wxID_OK) {
                c.second->name = d->name ();
                c.second->emails = d->emails ();
                c.second->notes = d->notes ();
@@ -194,17 +210,29 @@ ScreensPanel::edit_cinema_clicked ()
        d->Destroy ();
 }
 
+
 void
 ScreensPanel::remove_cinema_clicked ()
 {
-       for (CinemaMap::iterator i = _selected_cinemas.begin(); i != _selected_cinemas.end(); ++i) {
-               Config::instance()->remove_cinema (i->second);
-               _targets->Delete (i->first);
+       if (_selected_cinemas.size() == 1) {
+               if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove the cinema '%s'?"), std_to_wx(_selected_cinemas.begin()->second->name)))) {
+                       return;
+               }
+       } else {
+               if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove %d cinemas?"), int(_selected_cinemas.size())))) {
+                       return;
+               }
+       }
+
+       for (auto const& i: _selected_cinemas) {
+               Config::instance()->remove_cinema (i.second);
+               _targets->Delete (i.first);
        }
 
        selection_changed ();
 }
 
+
 void
 ScreensPanel::add_screen_clicked ()
 {
@@ -212,15 +240,15 @@ ScreensPanel::add_screen_clicked ()
                return;
        }
 
-       shared_ptr<Cinema> c = _selected_cinemas.begin()->second;
+       auto c = _selected_cinemas.begin()->second;
 
-       ScreenDialog* d = new ScreenDialog (GetParent(), _("Add Screen"));
+       auto d = new ScreenDialog (GetParent(), _("Add Screen"));
        if (d->ShowModal () != wxID_OK) {
                d->Destroy ();
                return;
        }
 
-       BOOST_FOREACH (shared_ptr<Screen> i, c->screens ()) {
+       for (auto i: c->screens ()) {
                if (i->name == d->name()) {
                        error_dialog (
                                GetParent(),
@@ -233,9 +261,9 @@ ScreensPanel::add_screen_clicked ()
                }
        }
 
-       shared_ptr<Screen> s (new Screen (d->name(), d->notes(), d->recipient(), d->trusted_devices()));
+       auto s = std::make_shared<Screen>(d->name(), d->notes(), d->recipient(), d->trusted_devices());
        c->add_screen (s);
-       optional<wxTreeItemId> id = add_screen (c, s);
+       auto id = add_screen (c, s);
        if (id) {
                _targets->Expand (id.get ());
        }
@@ -245,6 +273,7 @@ ScreensPanel::add_screen_clicked ()
        d->Destroy ();
 }
 
+
 void
 ScreensPanel::edit_screen_clicked ()
 {
@@ -252,16 +281,16 @@ ScreensPanel::edit_screen_clicked ()
                return;
        }
 
-       pair<wxTreeItemId, shared_ptr<Screen> > s = *_selected_screens.begin();
+       auto s = *_selected_screens.begin();
 
-       ScreenDialog* d = new ScreenDialog (GetParent(), _("Edit screen"), s.second->name, s.second->notes, s.second->recipient, s.second->trusted_devices);
-       if (d->ShowModal () != wxID_OK) {
+       auto d = new ScreenDialog (GetParent(), _("Edit screen"), s.second->name, s.second->notes, s.second->recipient, s.second->trusted_devices);
+       if (d->ShowModal() != wxID_OK) {
                d->Destroy ();
                return;
        }
 
-       shared_ptr<Cinema> c = s.second->cinema;
-       BOOST_FOREACH (shared_ptr<Screen> i, c->screens ()) {
+       auto c = s.second->cinema;
+       for (auto i: c->screens ()) {
                if (i != s.second && i->name == d->name()) {
                        error_dialog (
                                GetParent(),
@@ -284,14 +313,25 @@ ScreensPanel::edit_screen_clicked ()
        d->Destroy ();
 }
 
+
 void
 ScreensPanel::remove_screen_clicked ()
 {
-       for (ScreenMap::iterator i = _selected_screens.begin(); i != _selected_screens.end(); ++i) {
-               CinemaMap::iterator j = _cinemas.begin ();
+       if (_selected_screens.size() == 1) {
+               if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove the screen '%s'?"), std_to_wx(_selected_screens.begin()->second->name)))) {
+                       return;
+               }
+       } else {
+               if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove %d screens?"), int(_selected_screens.size())))) {
+                       return;
+               }
+       }
+
+       for (auto const& i: _selected_screens) {
+               auto j = _cinemas.begin ();
                while (j != _cinemas.end ()) {
-                       list<shared_ptr<Screen> > sc = j->second->screens ();
-                       if (find (sc.begin(), sc.end(), i->second) != sc.end ()) {
+                       auto sc = j->second->screens ();
+                       if (find (sc.begin(), sc.end(), i.second) != sc.end ()) {
                                break;
                        }
 
@@ -302,27 +342,27 @@ ScreensPanel::remove_screen_clicked ()
                        continue;
                }
 
-               j->second->remove_screen (i->second);
-               _targets->Delete (i->first);
+               j->second->remove_screen (i.second);
+               _targets->Delete (i.first);
        }
 
        Config::instance()->changed (Config::CINEMAS);
 }
 
-list<shared_ptr<Screen> >
+
+list<shared_ptr<Screen>>
 ScreensPanel::screens () const
 {
-       list<shared_ptr<Screen> > s;
+       list<shared_ptr<Screen>> s;
 
-       for (CinemaMap::const_iterator i = _selected_cinemas.begin(); i != _selected_cinemas.end(); ++i) {
-               list<shared_ptr<Screen> > sc = i->second->screens ();
-               for (list<shared_ptr<Screen> >::const_iterator j = sc.begin(); j != sc.end(); ++j) {
-                       s.push_back (*j);
+       for (auto const& i: _selected_cinemas) {
+               for (auto j: i.second->screens()) {
+                       s.push_back (j);
                }
        }
 
-       for (ScreenMap::const_iterator i = _selected_screens.begin(); i != _selected_screens.end(); ++i) {
-               s.push_back (i->second);
+       for (auto const& i: _selected_screens) {
+               s.push_back (i.second);
        }
 
        s.sort ();
@@ -331,12 +371,14 @@ ScreensPanel::screens () const
        return s;
 }
 
+
 void
 ScreensPanel::selection_changed_shim (wxTreeEvent &)
 {
        selection_changed ();
 }
 
+
 void
 ScreensPanel::selection_changed ()
 {
@@ -351,11 +393,11 @@ ScreensPanel::selection_changed ()
        _selected_screens.clear ();
 
        for (size_t i = 0; i < s.GetCount(); ++i) {
-               CinemaMap::const_iterator j = _cinemas.find (s[i]);
+               auto j = _cinemas.find (s[i]);
                if (j != _cinemas.end ()) {
                        _selected_cinemas[j->first] = j->second;
                }
-               ScreenMap::const_iterator k = _screens.find (s[i]);
+               auto k = _screens.find (s[i]);
                if (k != _screens.end ()) {
                        _selected_screens[k->first] = k->second;
                }
@@ -365,16 +407,18 @@ ScreensPanel::selection_changed ()
        ScreensChanged ();
 }
 
+
 void
 ScreensPanel::add_cinemas ()
 {
        _root = _targets->AddRoot ("Foo");
 
-       BOOST_FOREACH (shared_ptr<Cinema> i, Config::instance()->cinemas ()) {
+       for (auto i: Config::instance()->cinemas()) {
                add_cinema (i);
        }
 }
 
+
 void
 ScreensPanel::search_changed ()
 {
@@ -386,28 +430,39 @@ ScreensPanel::search_changed ()
 
        _ignore_selection_change = true;
 
-       for (CinemaMap::const_iterator i = _selected_cinemas.begin(); i != _selected_cinemas.end(); ++i) {
+       for (auto const& i: _selected_cinemas) {
                /* The wxTreeItemIds will now be different, so we must search by cinema */
-               CinemaMap::const_iterator j = _cinemas.begin ();
-               while (j != _cinemas.end() && j->second != i->second) {
+               auto j = _cinemas.begin ();
+               while (j != _cinemas.end() && j->second != i.second) {
                        ++j;
                }
 
-               if (j != _cinemas.end ()) {
+               if (j != _cinemas.end()) {
                        _targets->SelectItem (j->first);
                }
        }
 
-       for (ScreenMap::const_iterator i = _selected_screens.begin(); i != _selected_screens.end(); ++i) {
-               ScreenMap::const_iterator j = _screens.begin ();
-               while (j != _screens.end() && j->second != i->second) {
+       for (auto const& i: _selected_screens) {
+               auto j = _screens.begin ();
+               while (j != _screens.end() && j->second != i.second) {
                        ++j;
                }
 
-               if (j != _screens.end ()) {
+               if (j != _screens.end()) {
                        _targets->SelectItem (j->first);
                }
        }
 
        _ignore_selection_change = false;
 }
+
+
+wxIMPLEMENT_DYNAMIC_CLASS (TreeCtrl, wxTreeCtrl);
+
+
+int
+TreeCtrl::OnCompareItems (wxTreeItemId const& a, wxTreeItemId const& b)
+{
+       return strcoll (wx_to_std(GetItemText(a)).c_str(), wx_to_std(GetItemText(b)).c_str());
+}
+