From: Carl Hetherington Date: Wed, 23 Dec 2015 22:03:35 +0000 (+0000) Subject: Add search button to screens panel. X-Git-Tag: v2.6.11~1^2~5 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=377979a5f00c3c2b0dd0ca95e2b9371f4739658f Add search button to screens panel. --- diff --git a/ChangeLog b/ChangeLog index 8489fe048..fef8bbf74 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2015-12-23 Carl Hetherington + * Add basic search function to KDM creator screens list (#739). + * Version 2.6.10 released. 2015-12-23 Carl Hetherington diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index bc7fd43df..b475dbb6d 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 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 | wxRIGHT, DCPOMATIC_SIZER_GAP); - _root = _targets->AddRoot ("Foo"); - - list > c = Config::instance()->cinemas (); - for (list >::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)); @@ -136,10 +139,20 @@ ScreensPanel::setup_sensitivity () _remove_screen->Enable (ss); } - void ScreensPanel::add_cinema (shared_ptr 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 > sc = c->screens (); @@ -312,6 +325,73 @@ 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) { + map >::const_iterator j = _cinemas.find (s[i]); + if (j != _cinemas.end ()) { + _selected_cinemas.push_back (j->second); + } + map >::const_iterator k = _screens.find (s[i]); + if (k != _screens.end ()) { + _selected_screens.push_back (k->second); + } + } + setup_sensitivity (); ScreensChanged (); } + +void +ScreensPanel::add_cinemas () +{ + _root = _targets->AddRoot ("Foo"); + + BOOST_FOREACH (shared_ptr i, Config::instance()->cinemas ()) { + add_cinema (i); + } +} + +void +ScreensPanel::search_changed () +{ + _targets->DeleteAllItems (); + _cinemas.clear (); + _screens.clear (); + + add_cinemas (); + + _ignore_selection_change = true; + + BOOST_FOREACH (shared_ptr i, _selected_cinemas) { + map >::const_iterator j = _cinemas.begin (); + while (j != _cinemas.end() && j->second != i) { + ++j; + } + + if (j != _cinemas.end ()) { + _targets->SelectItem (j->first); + } + } + + BOOST_FOREACH (shared_ptr i, _selected_screens) { + map >::const_iterator j = _screens.begin (); + while (j != _screens.end() && j->second != i) { + ++j; + } + + if (j != _screens.end ()) { + _targets->SelectItem (j->first); + } + } + + _ignore_selection_change = false; +} diff --git a/src/wx/screens_panel.h b/src/wx/screens_panel.h index 6cfff0a60..829208880 100644 --- a/src/wx/screens_panel.h +++ b/src/wx/screens_panel.h @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -38,6 +39,7 @@ public: boost::signals2::signal ScreensChanged; private: + void add_cinemas (); void add_cinema (boost::shared_ptr); void add_screen (boost::shared_ptr, boost::shared_ptr); void add_cinema_clicked (); @@ -49,7 +51,9 @@ private: std::list > > selected_cinemas () const; std::list > > selected_screens () const; void selection_changed (wxTreeEvent &); + void search_changed (); + wxSearchCtrl* _search; wxTreeCtrl* _targets; wxButton* _add_cinema; wxButton* _edit_cinema; @@ -60,4 +64,7 @@ private: wxTreeItemId _root; std::map > _cinemas; std::map > _screens; + std::list > _selected_cinemas; + std::list > _selected_screens; + bool _ignore_selection_change; };