Add search button to screens panel.
authorCarl Hetherington <cth@carlh.net>
Wed, 23 Dec 2015 22:03:35 +0000 (22:03 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 23 Dec 2015 22:03:35 +0000 (22:03 +0000)
ChangeLog
src/wx/screens_panel.cc
src/wx/screens_panel.h

index 8489fe048813a8bf80003d2f163500d327341209..fef8bbf740a87e0db77e7359f9966b4d8518b8c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2015-12-23  Carl Hetherington  <cth@carlh.net>
 
+       * Add basic search function to KDM creator screens list (#739).
+
        * Version 2.6.10 released.
 
 2015-12-23  Carl Hetherington  <cth@carlh.net>
index bc7fd43df69efe75e216674833120f7b4f1142d9..b475dbb6dc0a4886740d5a20a0cb1175de2f9822 100644 (file)
 #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 | 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));
@@ -136,10 +139,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 ();
@@ -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<wxTreeItemId, shared_ptr<Cinema> >::const_iterator j = _cinemas.find (s[i]);
+               if (j != _cinemas.end ()) {
+                       _selected_cinemas.push_back (j->second);
+               }
+               map<wxTreeItemId, shared_ptr<Screen> >::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<Cinema> 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<Cinema> i, _selected_cinemas) {
+               map<wxTreeItemId, shared_ptr<Cinema> >::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<Screen> i, _selected_screens) {
+               map<wxTreeItemId, shared_ptr<Screen> >::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;
+}
index 6cfff0a60f44d77bbe687c217a75d07fa253e77b..829208880e843cf1cb3cadcb0c62340fb6f3cef7 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <wx/wx.h>
+#include <wx/srchctrl.h>
 #include <wx/treectrl.h>
 #include <boost/shared_ptr.hpp>
 #include <list>
@@ -38,6 +39,7 @@ public:
        boost::signals2::signal<void ()> ScreensChanged;
 
 private:
+       void add_cinemas ();
        void add_cinema (boost::shared_ptr<Cinema>);
        void add_screen (boost::shared_ptr<Cinema>, boost::shared_ptr<Screen>);
        void add_cinema_clicked ();
@@ -49,7 +51,9 @@ private:
        std::list<std::pair<wxTreeItemId, boost::shared_ptr<Cinema> > > selected_cinemas () const;
        std::list<std::pair<wxTreeItemId, boost::shared_ptr<Screen> > > 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<wxTreeItemId, boost::shared_ptr<Cinema> > _cinemas;
        std::map<wxTreeItemId, boost::shared_ptr<Screen> > _screens;
+       std::list<boost::shared_ptr<Cinema> > _selected_cinemas;
+       std::list<boost::shared_ptr<Screen> > _selected_screens;
+       bool _ignore_selection_change;
 };