summaryrefslogtreecommitdiff
path: root/src/wx/screens_panel.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-12-23 22:03:35 +0000
committerCarl Hetherington <cth@carlh.net>2015-12-23 22:03:35 +0000
commit377979a5f00c3c2b0dd0ca95e2b9371f4739658f (patch)
treeff3f5a0fc723447003fdce5a9d8768a52f815c1a /src/wx/screens_panel.cc
parent1c2f5d29c129028f9ae5b4b064a06dfa1c1c1214 (diff)
Add search button to screens panel.
Diffstat (limited to 'src/wx/screens_panel.cc')
-rw-r--r--src/wx/screens_panel.cc94
1 files changed, 87 insertions, 7 deletions
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 <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;
+}