diff options
Diffstat (limited to 'src/wx/screens_panel.cc')
| -rw-r--r-- | src/wx/screens_panel.cc | 167 |
1 files changed, 107 insertions, 60 deletions
diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 3328fe61e..a081e2dfc 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -24,29 +24,31 @@ #include "wx_util.h" #include "cinema_dialog.h" #include "screen_dialog.h" +#include <boost/foreach.hpp> using std::list; using std::pair; using std::cout; using std::map; +using std::string; using std::make_pair; using boost::shared_ptr; ScreensPanel::ScreensPanel (wxWindow* parent) : wxPanel (parent, wxID_ANY) + , _ignore_selection_change (false) { wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL); + _search = new wxSearchCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (200, -1)); + _search->ShowCancelButton (true); + 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); - targets->Add (_targets, 1, wxEXPAND | wxTOP | wxRIGHT, DCPOMATIC_SIZER_GAP); + targets->Add (_targets, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP); - _root = _targets->AddRoot ("Foo"); - - list<shared_ptr<Cinema> > c = Config::instance()->cinemas (); - for (list<shared_ptr<Cinema> >::iterator i = c.begin(); i != c.end(); ++i) { - add_cinema (*i); - } + add_cinemas (); _targets->ExpandAll (); @@ -70,6 +72,7 @@ ScreensPanel::ScreensPanel (wxWindow* parent) sizer->Add (targets, 1, wxEXPAND); + _search->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ScreensPanel::search_changed, this)); _targets->Bind (wxEVT_COMMAND_TREE_SEL_CHANGED, &ScreensPanel::selection_changed, this); _add_cinema->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ScreensPanel::add_cinema_clicked, this)); @@ -88,45 +91,11 @@ ScreensPanel::~ScreensPanel () _targets->Unbind (wxEVT_COMMAND_TREE_SEL_CHANGED, &ScreensPanel::selection_changed, this); } -list<pair<wxTreeItemId, shared_ptr<Cinema> > > -ScreensPanel::selected_cinemas () const -{ - wxArrayTreeItemIds s; - _targets->GetSelections (s); - - list<pair<wxTreeItemId, shared_ptr<Cinema> > > c; - for (size_t i = 0; i < s.GetCount(); ++i) { - map<wxTreeItemId, shared_ptr<Cinema> >::const_iterator j = _cinemas.find (s[i]); - if (j != _cinemas.end ()) { - c.push_back (make_pair (j->first, j->second)); - } - } - - return c; -} - -list<pair<wxTreeItemId, shared_ptr<Screen> > > -ScreensPanel::selected_screens () const -{ - wxArrayTreeItemIds s; - _targets->GetSelections (s); - - list<pair<wxTreeItemId, shared_ptr<Screen> > > c; - for (size_t i = 0; i < s.GetCount(); ++i) { - map<wxTreeItemId, shared_ptr<Screen> >::const_iterator j = _screens.find (s[i]); - if (j != _screens.end ()) { - c.push_back (make_pair (j->first, j->second)); - } - } - - return c; -} - void ScreensPanel::setup_sensitivity () { - bool const sc = selected_cinemas().size() == 1; - bool const ss = selected_screens().size() == 1; + bool const sc = _selected_cinemas.size() == 1; + bool const ss = _selected_screens.size() == 1; _edit_cinema->Enable (sc); _remove_cinema->Enable (sc); @@ -136,10 +105,20 @@ ScreensPanel::setup_sensitivity () _remove_screen->Enable (ss); } - void ScreensPanel::add_cinema (shared_ptr<Cinema> c) { + string search = wx_to_std (_search->GetValue ()); + transform (search.begin(), search.end(), search.begin(), ::tolower); + + if (!search.empty ()) { + string name = c->name; + transform (name.begin(), name.end(), name.begin(), ::tolower); + if (name.find (search) == string::npos) { + return; + } + } + _cinemas[_targets->AppendItem (_root, std_to_wx (c->name))] = c; list<shared_ptr<Screen> > sc = c->screens (); @@ -153,7 +132,7 @@ ScreensPanel::add_cinema (shared_ptr<Cinema> c) void ScreensPanel::add_screen (shared_ptr<Cinema> c, shared_ptr<Screen> s) { - map<wxTreeItemId, shared_ptr<Cinema> >::const_iterator i = _cinemas.begin(); + CinemaMap::const_iterator i = _cinemas.begin(); while (i != _cinemas.end() && i->second != c) { ++i; } @@ -182,11 +161,11 @@ ScreensPanel::add_cinema_clicked () void ScreensPanel::edit_cinema_clicked () { - if (selected_cinemas().size() != 1) { + if (_selected_cinemas.size() != 1) { return; } - pair<wxTreeItemId, shared_ptr<Cinema> > c = selected_cinemas().front(); + pair<wxTreeItemId, shared_ptr<Cinema> > c = *_selected_cinemas.begin(); CinemaDialog* d = new CinemaDialog (this, "Edit cinema", c.second->name, c.second->emails); if (d->ShowModal () == wxID_OK) { @@ -202,11 +181,11 @@ ScreensPanel::edit_cinema_clicked () void ScreensPanel::remove_cinema_clicked () { - if (selected_cinemas().size() != 1) { + if (_selected_cinemas.size() != 1) { return; } - pair<wxTreeItemId, shared_ptr<Cinema> > c = selected_cinemas().front(); + pair<wxTreeItemId, shared_ptr<Cinema> > c = *_selected_cinemas.begin(); Config::instance()->remove_cinema (c.second); _targets->Delete (c.first); @@ -215,11 +194,11 @@ ScreensPanel::remove_cinema_clicked () void ScreensPanel::add_screen_clicked () { - if (selected_cinemas().size() != 1) { + if (_selected_cinemas.size() != 1) { return; } - shared_ptr<Cinema> c = selected_cinemas().front().second; + shared_ptr<Cinema> c = _selected_cinemas.begin()->second; ScreenDialog* d = new ScreenDialog (this, "Add Screen"); if (d->ShowModal () != wxID_OK) { @@ -238,11 +217,11 @@ ScreensPanel::add_screen_clicked () void ScreensPanel::edit_screen_clicked () { - if (selected_screens().size() != 1) { + if (_selected_screens.size() != 1) { return; } - pair<wxTreeItemId, shared_ptr<Screen> > s = selected_screens().front(); + pair<wxTreeItemId, shared_ptr<Screen> > s = *_selected_screens.begin(); ScreenDialog* d = new ScreenDialog (this, "Edit screen", s.second->name, s.second->recipient, s.second->trusted_devices); if (d->ShowModal () == wxID_OK) { @@ -259,18 +238,20 @@ ScreensPanel::edit_screen_clicked () void ScreensPanel::remove_screen_clicked () { - if (selected_screens().size() != 1) { + if (_selected_screens.size() != 1) { return; } - pair<wxTreeItemId, shared_ptr<Screen> > s = selected_screens().front(); + pair<wxTreeItemId, shared_ptr<Screen> > s = *_selected_screens.begin(); - map<wxTreeItemId, shared_ptr<Cinema> >::iterator i = _cinemas.begin (); + CinemaMap::iterator i = _cinemas.begin (); while (i != _cinemas.end ()) { list<shared_ptr<Screen> > sc = i->second->screens (); if (find (sc.begin(), sc.end(), s.second) != sc.end ()) { break; } + + ++i; } if (i == _cinemas.end()) { @@ -288,16 +269,14 @@ ScreensPanel::screens () const { list<shared_ptr<Screen> > s; - list<pair<wxTreeItemId, shared_ptr<Cinema> > > cinemas = selected_cinemas (); - for (list<pair<wxTreeItemId, shared_ptr<Cinema> > >::iterator i = cinemas.begin(); i != cinemas.end(); ++i) { + 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); } } - list<pair<wxTreeItemId, shared_ptr<Screen> > > screens = selected_screens (); - for (list<pair<wxTreeItemId, shared_ptr<Screen> > >::iterator i = screens.begin(); i != screens.end(); ++i) { + for (ScreenMap::const_iterator i = _selected_screens.begin(); i != _selected_screens.end(); ++i) { s.push_back (i->second); } @@ -310,6 +289,74 @@ ScreensPanel::screens () const void ScreensPanel::selection_changed (wxTreeEvent &) { + if (_ignore_selection_change) { + return; + } + + wxArrayTreeItemIds s; + _targets->GetSelections (s); + + _selected_cinemas.clear (); + _selected_screens.clear (); + + for (size_t i = 0; i < s.GetCount(); ++i) { + CinemaMap::const_iterator j = _cinemas.find (s[i]); + if (j != _cinemas.end ()) { + _selected_cinemas[j->first] = j->second; + } + ScreenMap::const_iterator k = _screens.find (s[i]); + if (k != _screens.end ()) { + _selected_screens[k->first] = k->second; + } + } + setup_sensitivity (); ScreensChanged (); } + +void +ScreensPanel::add_cinemas () +{ + _root = _targets->AddRoot ("Foo"); + + BOOST_FOREACH (shared_ptr<Cinema> i, Config::instance()->cinemas ()) { + add_cinema (i); + } +} + +void +ScreensPanel::search_changed () +{ + _targets->DeleteAllItems (); + _cinemas.clear (); + _screens.clear (); + + add_cinemas (); + + _ignore_selection_change = true; + + for (CinemaMap::const_iterator i = _selected_cinemas.begin(); i != _selected_cinemas.end(); ++i) { + /* 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) { + ++j; + } + + 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) { + ++j; + } + + if (j != _screens.end ()) { + _targets->SelectItem (j->first); + } + } + + _ignore_selection_change = false; +} |
