/*
- 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.
*/
+
#include "screens_panel.h"
#include "wx_util.h"
#include "cinema_dialog.h"
#include "lib/config.h"
#include "lib/cinema.h"
#include "lib/screen.h"
-#include <boost/foreach.hpp>
+
using std::list;
using std::pair;
using std::map;
using std::string;
using std::make_pair;
+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)
#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);
SetSizer (sizer);
}
+
ScreensPanel::~ScreensPanel ()
{
_targets->Unbind (wxEVT_TREE_SEL_CHANGED, &ScreensPanel::selection_changed_shim, this);
}
+
void
ScreensPanel::setup_sensitivity ()
{
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 optional<wxTreeItemId>();
}
}
- wxTreeItemId id = _targets->AppendItem(_root, std_to_wx(c->name));
+ auto id = _targets->AppendItem(_root, std_to_wx(c->name));
_cinemas[id] = c;
- BOOST_FOREACH (shared_ptr<Screen> i, c->screens()) {
+ for (auto i: c->screens()) {
add_screen (c, i);
}
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);
- optional<wxTreeItemId> id = add_cinema (c);
+ auto id = add_cinema (c);
if (id) {
_targets->Unselect ();
_targets->SelectItem (*id);
d->Destroy ();
}
+
void
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 ();
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);
+ for (auto const& i: _selected_cinemas) {
+ Config::instance()->remove_cinema (i.second);
+ _targets->Delete (i.first);
}
selection_changed ();
}
+
void
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(),
}
}
- 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 ());
}
d->Destroy ();
}
+
void
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(),
d->Destroy ();
}
+
void
ScreensPanel::remove_screen_clicked ()
{
}
}
- for (ScreenMap::iterator i = _selected_screens.begin(); i != _selected_screens.end(); ++i) {
- CinemaMap::iterator j = _cinemas.begin ();
+ 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;
}
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 ();
return s;
}
+
void
ScreensPanel::selection_changed_shim (wxTreeEvent &)
{
selection_changed ();
}
+
void
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;
}
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 ()
{
_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());
+}
+